"""Settings de production : secrets et hôtes fournis par l'environnement.""" import os from .base import * # noqa: F401,F403 SECRET_KEY = os.environ['DJANGO_SECRET_KEY'] DEBUG = False ALLOWED_HOSTS = [h for h in os.environ.get('DJANGO_ALLOWED_HOSTS', '').split(',') if h] CSRF_TRUSTED_ORIGINS = [o for o in os.environ.get('DJANGO_CSRF_TRUSTED_ORIGINS', '').split(',') if o] # DB_ENGINE=mariadb (opt-in, voir "sudo ./install.sh install-mariadb") bascule # vers MariaDB/MySQL via PyMySQL (pas de mysqlclient : évite une dépendance de # compilation C côté paquets système) ; sqlite reste le défaut, sans rien à # installer/configurer en plus. # # DB_ENGINE=postgresql (opt-in) : contrairement à mariadb, pas de # sous-commande install.sh dédiée pour l'instant — provisionner le serveur # PostgreSQL/la base/l'utilisateur reste manuel, puis renseigner DB_* # ci-dessous dans .env. Driver requirements-postgresql.txt # (psycopg[binary], pas de compilation C nécessaire non plus) à installer # à la main dans le venv (pip install -r requirements-postgresql.txt) # avant de basculer DB_ENGINE. DB_ENGINE = os.environ.get('DB_ENGINE', 'sqlite') if DB_ENGINE == 'mariadb': import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.environ.get('DB_NAME', 'fail2ban_emitter'), 'USER': os.environ.get('DB_USER', 'fail2ban_emitter'), 'PASSWORD': os.environ.get('DB_PASSWORD', ''), 'HOST': os.environ.get('DB_HOST', '127.0.0.1'), 'PORT': os.environ.get('DB_PORT', '3306'), } } elif DB_ENGINE == 'postgresql': DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('DB_NAME', 'fail2ban_emitter'), 'USER': os.environ.get('DB_USER', 'fail2ban_emitter'), 'PASSWORD': os.environ.get('DB_PASSWORD', ''), 'HOST': os.environ.get('DB_HOST', '127.0.0.1'), 'PORT': os.environ.get('DB_PORT', '5432'), } } else: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.environ.get('DJANGO_DB_PATH', str(BASE_DIR / 'db.sqlite3')), } } STATIC_ROOT = BASE_DIR / 'staticfiles' STORAGES = { 'staticfiles': { 'BACKEND': 'whitenoise.storage.CompressedManifestStaticFilesStorage', }, } MIDDLEWARE = ['whitenoise.middleware.WhiteNoiseMiddleware'] + MIDDLEWARE # Pas de TLS géré ici (pas de reverse proxy devant l'émetteur pour l'instant) : # forcer le HTTPS casserait l'accès (redirection en boucle, cookies rejetés). # À activer (DJANGO_SECURE_SSL=true) une fois un reverse proxy TLS en place. DJANGO_SECURE_SSL = os.environ.get('DJANGO_SECURE_SSL', 'false').lower() == 'true' SECURE_SSL_REDIRECT = DJANGO_SECURE_SSL SESSION_COOKIE_SECURE = DJANGO_SECURE_SSL CSRF_COOKIE_SECURE = DJANGO_SECURE_SSL # Daphne ne voit que la connexion interne en clair depuis nginx (proxy_pass # http://127.0.0.1:8050) : sans ceci, request.is_secure() est toujours faux # côté Django, qui redirige alors indéfiniment (SECURE_SSL_REDIRECT actif # mais jamais satisfait) — le gabarit generic/nginx/fail2ban-emitter.example.conf # pose bien X-Forwarded-Proto, encore faut-il que Django lui fasse confiance. if DJANGO_SECURE_SSL: SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')