# ============================================================================= # Nginx, frontal TLS de la stack (§9.8) # https:// → Open WebUI (port 443) # https://:5678 → n8n, réservé aux administrateurs # https:///sante → état de santé de la RAG API (supervision, §16.10) # http:// → redirection vers https # Toute requête qui n'arrive pas par (adresse IP, autre nom) est # refusée sans réponse. # # Nginx est le seul service qui publie des ports sur la VM : Open WebUI et n8n # ne sont joignables que par le réseau interne de Docker. # # est remplacé par deploy.sh (variable RAG_FQDN du .env). À la main : # sed -i "s//rag.votre-domaine.ch/g" nginx/rag.conf # # Certificat : /etc/nginx/tls/rag.crt (certificat suivi de l'autorité # intermédiaire) et rag.key, montés depuis /etc/rag-tls. Certificat de # l'autorité interne, ou auto-signé pour un essai (§9.8). # ============================================================================= ssl_certificate /etc/nginx/tls/rag.crt; ssl_certificate_key /etc/nginx/tls/rag.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; # Pas de numéro de version dans les en-têtes et les pages d'erreur server_tokens off; # Résolution des noms par le DNS interne de Docker, revue toutes les 10 s : # un conteneur recréé change d'adresse, Nginx la suit sans redémarrer. resolver 127.0.0.11 valid=10s ipv6=off; # WebSocket (Open WebUI et n8n s'en servent pour l'affichage en direct) map $http_upgrade $connection_upgrade { default upgrade; '' close; } # ----------------------------------------------------------------------------- # Serveurs par défaut : tout ce qui n'arrive pas par # (balayage de l'adresse IP, autre nom) est refusé sans réponse. # ----------------------------------------------------------------------------- server { listen 80 default_server; server_name _; return 444; } server { listen 443 ssl default_server; listen 5678 ssl default_server; server_name _; # Refus dès la négociation TLS : aucun certificat n'est présenté ssl_reject_handshake on; } # ----------------------------------------------------------------------------- # Port 80 : redirection vers https, rien d'autre # ----------------------------------------------------------------------------- server { listen 80; server_name ; return 301 https://$host$request_uri; } # ----------------------------------------------------------------------------- # Open WebUI # ----------------------------------------------------------------------------- server { listen 443 ssl; http2 on; server_name ; # Pièces jointes déposées dans la conversation client_max_body_size 50m; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header Referrer-Policy "same-origin" always; # HSTS : seulement avec un certificat d'une autorité reconnue par TOUS les # postes qui ouvrent l'interface. Avec un certificat auto-signé, ou pour un # poste qui ne connaît pas l'autorité, la page deviendrait inaccessible : # le navigateur n'offre plus de passer l'avertissement (§9.8). # add_header Strict-Transport-Security "max-age=31536000" always; # État de santé de la RAG API, pour la supervision externe (§16.10). # Réponse minimale {"status":"ok"}, sans information interne. location = /sante { set $sante http://rag-api:8080; rewrite ^ /health break; proxy_pass $sante; access_log off; } location / { set $amont http://open-webui:8080; proxy_pass $amont; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $http_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 https; # Réponses envoyées au fil de l'eau (streaming) : pas de mise en tampon, # et un délai qui couvre une question longue (rédaction + vérification). proxy_buffering off; proxy_read_timeout 600s; proxy_send_timeout 600s; } } # ----------------------------------------------------------------------------- # n8n, sur le même nom, port 5678 # ----------------------------------------------------------------------------- server { listen 5678 ssl; http2 on; server_name ; client_max_body_size 16m; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "same-origin" always; location / { set $amont http://n8n:5678; proxy_pass $amont; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $http_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 https; proxy_buffering off; proxy_read_timeout 600s; } }