From c7f753cf0952986cf5d9f9d68a6f7cdb3c4b1574 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Mon, 13 Jul 2020 21:27:36 +0200 Subject: [PATCH] :seedling: Add README, improve settings --- Dockerfile | 2 +- README.md | 65 +++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + tfjm/settings.py | 21 ++++++++++++++ tfjm/settings_dev.py | 11 -------- tfjm/settings_prod.py | 23 ++++----------- 6 files changed, 94 insertions(+), 29 deletions(-) create mode 100644 README.md diff --git a/Dockerfile b/Dockerfile index 703c497..71017de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM python:3-alpine ENV PYTHONUNBUFFERED 1 # Install LaTeX requirements -RUN apk add --no-cache gettext texlive nginx gcc libc-dev libffi-dev postgresql-dev +RUN apk add --no-cache gettext texlive nginx gcc libc-dev libffi-dev postgresql-dev mariadb-connector-c-dev RUN apk add --no-cache bash diff --git a/README.md b/README.md new file mode 100644 index 0000000..a9459c3 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# Plateforme d'inscription du TFJM² + +La plateforme du TFJM² est née pour l'édition 2020 du tournoi. D'abord codée en PHP, elle a subi une refonte totale en +Python, à l'aide du framework Web [Django](https://www.djangoproject.com/). + +Cette plateforme permet aux participants et encadrants de s'inscrire et de déposer leurs autorisations nécessaires. +Ils pourront ensuite déposer leurs solutions et notes de synthèse pour le premier tour en temps voulu. La plateforme +offre également un accès pour les organisateurs et les jurys leur permettant de communiquer avec les équipes et de +récupérer les documents nécessaires. + +Un wiki plus détaillé arrivera ultérieurement. L'interface organisateur et jury est vouée à être plus poussée. + +L'instance de production est disponible à l'adresse [inscription.tfjm.org](https://inscription.tfjm.org). + +## Installation + +Le plus simple pour installer la plateforme est d'utiliser l'image Docker incluse, qui fait tourner un serveur Nginx +exposé sur le port 80 avec le serveur Django. Ci-dessous une configuration Docker-Compose, à adapter selon vos besoins : + +```yaml + inscription-tfjm: + build: ./inscription-tfjm + links: + - postgres + ports: + - "80:80" + env_file: + - ./inscription-tfjm.env + volumes: + # - ./inscription-tfjm:/code + - ./inscription-tfjm/media:/code/media +``` + +Le volume `/code` n'est à ajouter uniquement en développement, et jamais en production. + +Il faut remplir les variables d'environnement suivantes : + +```env +TFJM_STAGE= # dev ou prod +TFJM_YEAR=2021 # Année de la session du TFJM² +DJANGO_DB_TYPE= # MySQL, PostgreSQL ou SQLite (par défaut) +DJANGO_DB_HOST= # Hôte de la base de données +DJANGO_DB_NAME= # Nom de la base de données +DJANGO_DB_USER= # Utilisateur de la base de données +DJANGO_DB_PASSWORD= # Mot de passe pour accéder à la base de données +SMTP_HOST= # Hôte SMTP pour l'envoi de mails +SMTP_PORT=465 # Port du serveur SMTP +SMTP_HOST_USER= # Utilisateur du compte SMTP +SMTP_HOST_PASSWORD= # Mot de passe du compte SMTP +FROM_EMAIL=contact@tfjm.org # Nom de l'expéditeur des mails +SERVER_EMAIL=contact@tfjm.org # Adresse e-mail expéditrice +``` + +Si le type de base de données sélectionné est SQLite, la variable `DJANGO_DB_HOST` sera utilisée en guise de chemin vers +le fichier de base de données (par défaut, `db.sqlite3`). + +En développement, il est recommandé d'utiliser SQLite pour des raisons de simplicité. Les paramètres de mail ne seront +pas utilisés, et les mails qui doivent être envoyés seront envoyés dans la console. + +En production, il est recommandé de ne pas utiliser SQLite pour des raisons de performances. + +La dernière différence entre le développment et la production est qu'en développement, chaque modification d'un fichier +est détectée et le serveur se relance automatiquement dès lors. + +Une fois le site lancé, le premier compte créé sera un compte administrateur. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index abaa4b4..4338302 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ django-polymorphic django-tables2 djangorestframework django-rest-polymorphic +mysqlclient psycopg2-binary ptpython gunicorn \ No newline at end of file diff --git a/tfjm/settings.py b/tfjm/settings.py index 064941c..af3f842 100644 --- a/tfjm/settings.py +++ b/tfjm/settings.py @@ -179,6 +179,27 @@ CRISPY_TEMPLATE_PACK = 'bootstrap4' DJANGO_TABLES2_TEMPLATE = 'django_tables2/bootstrap4.html' +_db_type = os.getenv('DJANGO_DB_TYPE', 'sqlite').lower() + +if _db_type == 'mysql' or _db_type.startswith('postgres') or _db_type == 'psql': + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql' if _db_type == 'mysql' else 'django.db.backends.postgresql_psycopg2', + 'NAME': os.environ.get('DJANGO_DB_NAME', 'tfjm'), + 'USER': os.environ.get('DJANGO_DB_USER', 'tfjm'), + 'PASSWORD': os.environ.get('DJANGO_DB_PASSWORD', 'CHANGE_ME_IN_ENV_SETTINGS'), + 'HOST': os.environ.get('DJANGO_DB_HOST', 'localhost'), + 'PORT': os.environ.get('DJANGO_DB_PORT', ''), # Use default port + } + } +else: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, os.getenv('DJANGO_DB_HOST', 'db.sqlite3')), + } + } + if os.getenv("TFJM_STAGE", "dev") == "prod": from .settings_prod import * else: diff --git a/tfjm/settings_dev.py b/tfjm/settings_dev.py index 3648467..bf6e856 100644 --- a/tfjm/settings_dev.py +++ b/tfjm/settings_dev.py @@ -1,15 +1,4 @@ # Database # https://docs.djangoproject.com/en/3.0/ref/settings/#databases -import os - -from tfjm.settings import BASE_DIR - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } -} - EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' diff --git a/tfjm/settings_prod.py b/tfjm/settings_prod.py index f934739..fde3682 100644 --- a/tfjm/settings_prod.py +++ b/tfjm/settings_prod.py @@ -1,16 +1,5 @@ import os -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': os.environ.get('DJANGO_DB_NAME', 'tfjm'), - 'USER': os.environ.get('DJANGO_DB_USER', 'tfjm'), - 'PASSWORD': os.environ.get('DJANGO_DB_PASSWORD', 'CHANGE_ME_IN_ENV_SETTINGS'), - 'HOST': os.environ.get('DJANGO_DB_HOST', 'localhost'), - 'PORT': os.environ.get('DJANGO_DB_PORT', ''), # Use default port - } -} - # Break it, fix it! DEBUG = False @@ -22,13 +11,13 @@ SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'CHANGE_ME_IN_ENV_SETTINGS') # Emails EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_SSL = True -EMAIL_HOST = os.getenv("EMAIL_HOST") -EMAIL_PORT = os.getenv("EMAIL_PORT") -EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER") -EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") +EMAIL_HOST = os.getenv("SMTP_HOST") +EMAIL_PORT = os.getenv("SMTP_PORT") +EMAIL_HOST_USER = os.getenv("SMTP_HOST_USER") +EMAIL_HOST_PASSWORD = os.getenv("SMTP_HOST_PASSWORD") -DEFAULT_FROM_EMAIL = 'Contact TFJM² ' -SERVER_EMAIL = 'contact@tfjm.org' +DEFAULT_FROM_EMAIL = os.getenv('FROM_EMAIL', 'Contact TFJM² ') +SERVER_EMAIL = os.getenv('SERVER_EMAIL', 'contact@tfjm.org') # Security settings SECURE_CONTENT_TYPE_NOSNIFF = False