# Reverse proxy nginx devant le tableau de bord Django (ASGI/Daphne, # 127.0.0.1:8050) — WebSocket (Django Channels) inclus. PAS déployé # automatiquement par install.sh : à copier et adapter manuellement. # # Pas de location /static/ dédiée ici : l'émetteur sert ses statiques # lui-même via WhiteNoise (emitter/config/settings/production.py, # CompressedManifestStaticFilesStorage), donc tout — /static/ compris — # passe par le proxy_pass général vers Daphne. Ça évite une dépendance aux # droits Unix sur staticfiles/ pour l'utilisateur nginx (ex. un $HOME en # 700 empêche www-data de traverser jusqu'au dossier, même si staticfiles/ # lui-même est world-readable — vécu en déployant banishing.miraceti.net). # # Marche à suivre : # 1. sudo apt-get install nginx # 2. sudo certbot certonly --nginx -d __DASHBOARD_DOMAIN__ (ou webroot, # selon la méthode déjà utilisée pour les autres domaines de ce VPS) # 3. sed "s#__DASHBOARD_DOMAIN__#dashboard.example.org#g" \ # generic/nginx/fail2ban-emitter.example.conf \ # | sudo tee /etc/nginx/sites-available/fail2ban-emitter.conf # 4. sudo ln -s /etc/nginx/sites-available/fail2ban-emitter.conf /etc/nginx/sites-enabled/ # 5. sudo nginx -t && sudo systemctl reload nginx # 6. Dans .env : DJANGO_ALLOWED_HOSTS=__DASHBOARD_DOMAIN__, # DJANGO_CSRF_TRUSTED_ORIGINS=https://__DASHBOARD_DOMAIN__, # DJANGO_SECURE_SSL=true, puis redémarrer fail2ban-emitter-web.service # # Le renouvellement certbot recharge nginx automatiquement (paquet Debian, # renewal-hooks intégré) — pas besoin d'un deploy-hook dédié comme pour # mosquitto (nginx peut lire /etc/letsencrypt directement, contrairement à # un utilisateur système non-root sans accès en lecture). server { listen 80; listen [::]:80; server_name __DASHBOARD_DOMAIN__; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri; } } server { # Forme choisie automatiquement par install.sh (deploy_nginx) selon la # version nginx détectée sur CE noeud : la directive séparée "http2 on;" # n'existe qu'à partir de nginx 1.25.1 ("unknown directive http2" sur # une version plus ancienne — vécu en conditions réelles) ; avant cette # version, c'est l'inverse : la forme séparée n'existe pas encore, seul # "listen ... http2" est valide. Ne jamais coder l'une des deux en dur # ci-dessous (marqueur substitué par install.sh — ne pas le répéter # ailleurs dans ce fichier, y compris en commentaire : la substitution # est un remplacement global, toute autre occurrence littérale serait # aussi affectée). __HTTP2_LISTEN_BLOCK__ server_name __DASHBOARD_DOMAIN__; ssl_certificate /etc/letsencrypt/live/__DASHBOARD_DOMAIN__/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/__DASHBOARD_DOMAIN__/privkey.pem; location /ws/ { proxy_pass http://127.0.0.1:8050; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 3600s; } location / { proxy_pass http://127.0.0.1:8050; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }