Contexte : point d'entrée unique du trafic web : nginx termine le TLS et relaie chaque domaine vers le CT qui l'héberge · Testé sur : CT 210 Reverse-PCT-210, nginx 1.18 (Ubuntu), Certbot · Dernière vérification : 02/10/2026
La Livebox redirige les ports 80 et 443, et eux seuls, vers le CT 210. Le reverse proxy nginx qui y tourne :
vmbr0 de l'hôte.Ce choix, fait dès 2023, limite le nombre de ports ouverts sur Internet à deux, sépare chaque service dans son propre conteneur et centralise la gestion des certificats.
Point de rupture unique : si le CT 210 tombe, tous les sites deviennent injoignables depuis Internet. Toute modification se fait avec une sauvegarde préalable et un
nginx -t.
| Élément | Valeur |
|---|---|
| Machine | CT 210 Reverse-PCT-210, 192.168.1.210 en IP fixe (bail statique en plus) |
| Logiciel | nginx 1.18 et Certbot (Let's Encrypt) |
| Vhosts | fichiers dans /etc/nginx/sites-available/, activés par des liens symboliques dans /etc/nginx/sites-enabled/ |
| Certificats | /etc/letsencrypt/live/<domaine>/, renouvellement automatique par certbot.timer |
| Ports en écoute | 80 (redirection 301 uniquement) et 443 |
| Sauvegardes de configuration | archives /root/nginx-avant-*.tgz sur le CT 210 |
| Domaine | Backend | Particularités |
|---|---|---|
| cloud.massyl.fr | http://192.168.1.105:8080 | Nextcloud ; Nextcloud fait confiance au proxy 192.168.1.210 |
| wiki.massyl.fr | http://192.168.1.103:8082 | Wiki.js ; client_max_body_size 10m, en-têtes WebSocket |
| 2sinnovation.com | http://192.168.1.109:80 | site 2S Innovation et API Node |
| www.2sinnovation.com | — | redirection 301 vers https://2sinnovation.com |
| me.2sinnovation.com | http://192.168.1.109:80 | répondait 404 au 30/09/2026 |
| yness.fr | http://192.168.1.111:80 | deux blocs location avec proxy_pass : /api/chat/stream et / |
| me.massyl.fr | fichiers statiques locaux | servi directement par le CT 210 |
Vhosts archivés (/etc/nginx/sites-archived/, renouvellement du certificat mis de côté dans /etc/letsencrypt/renewal-desactive/) : zabbix.massyl.com, gophish.massyl.com, plex.massyl.fr, portainer.massyl.fr, eve-ng.massyl.com, cyberlab.2sinnovation.com, transport.2sinnovation.com et minecraft.massyl.fr. Seuls 5 certificats restent renouvelés : 2sinnovation.com, cloud.massyl.fr, me.massyl.fr, wiki.massyl.fr et yness.fr.
Codes de réponse attendus lors d'un test : 200 pour un site, 302 pour Nextcloud (redirection vers la connexion), 307 pour yness.fr, 301 sur le port 80. Un 502 signifie que la machine derrière est éteinte, pas que nginx est en panne.
max-age=31536000 (un an) sur tous les vhosts, harmonisé le 02/10/2026 (cloud.massyl.fr et me.massyl.fr étaient à six mois) ; après une première visite, le navigateur n'essaie plus jamais HTTP.server_tokens off (nginx n'affiche plus sa version) et en-tête X-Powered-By des backends masqué.vmbr0 de l'hôte. Passer ce tronçon en HTTPS demanderait un certificat par CT et une reconfiguration de Nextcloud et Wiki.js : chantier distinct, non planifié.À adapter pour un nouveau service (domaine, adresse et port du backend) :
server {
listen 80;
server_name exemple.massyl.fr;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name exemple.massyl.fr;
ssl_certificate /etc/letsencrypt/live/exemple.massyl.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exemple.massyl.fr/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
add_header Strict-Transport-Security "max-age=31536000" always;
proxy_hide_header X-Powered-By;
location / {
proxy_pass http://192.168.1.NNN:PORT;
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;
}
}
Toutes les commandes se lancent depuis l'hôte alpha (ssh <compte-dedie>@192.168.1.213), soit par sudo pct exec 210 -- <commande>, soit dans un shell ouvert par sudo pct enter 210. Les exemples ci-dessous sont à taper dans ce shell.
tar czf /root/nginx-avant-<objet>-$(date +%Y%m%d-%H%M).tgz /etc/nginx
Éditez le fichier dans sites-available. Pour une modification par sed, ajoutez toujours --follow-symlinks si vous visez sites-enabled :
sed -i --follow-symlinks 's#192.168.1.ANCIEN#192.168.1.NOUVEAU#' /etc/nginx/sites-enabled/<vhost>
Sans
--follow-symlinks,sed -iremplace le lien symbolique par un fichier ordinaire : le fichier desites-availablen'est pas modifié et les deux copies divergent sans bruit.
nginx -t && systemctl reload nginx
Ne jamais lancer systemctl reload nginx sans un nginx -t réussi : une erreur de syntaxe couperait tous les sites.
Depuis le CT 210, sans dépendre du DNS public :
curl -sk -o /dev/null -w '%{http_code}\n' -H "Host: cloud.massyl.fr" https://127.0.0.1/
Puis depuis l'extérieur du LAN (connexion 4G par exemple), car la box ne fait pas de loopback NAT :
curl -sI https://cloud.massyl.fr
curl -sI http://cloud.massyl.fr
La première réponse doit porter l'en-tête Strict-Transport-Security, la seconde être une redirection 301 vers https://.
Ajoutez une entrée au journal des changements et mettez à jour l'inventaire si un backend a changé.
Un vhost qui ne sert plus est archivé, jamais supprimé :
mkdir -p /etc/nginx/sites-archived
mv /etc/nginx/sites-enabled/<vhost> /etc/nginx/sites-archived/<vhost>.lien-desactive-$(date +%Y%m%d)
nginx -t && systemctl reload nginx
# mettre aussi le renouvellement du certificat de côté
mkdir -p /etc/letsencrypt/renewal-desactive
mv /etc/letsencrypt/renewal/<domaine>.conf /etc/letsencrypt/renewal-desactive/
certbot certificates
systemctl list-timers certbot.timer
certbot renew --dry-run
https://192.168.1.105 échoue toujours en TLS. Pour tester en local, gardez le nom et faites-le résoudre vers 192.168.1.210 (fichier hosts du poste).privkey.pem) ne quitte jamais le serveur.tail -f /var/log/nginx/access.log /var/log/nginx/error.log
grep -i mirall /var/log/nginx/access.log | tail -5
La seconde commande montre les dernières connexions des clients de synchronisation Nextcloud : utile pour savoir si un client atteint vraiment le serveur.
Admin sécurisé. Voir la fiche Zabbix.certbot renew --dry-run.transport.2sinnovation.com, dont le vhost est archivé.| Date | Changement |
|---|---|
| 28/03/2023 | Première version de la page : reverse proxy dans un conteneur dédié, sur un NUC sous Proxmox VE 7.3.3 ; une VM Debian 11 servait de passerelle d'administration à distance ; noms de domaine mis à jour par DynHost d'OVH, l'IP publique étant alors dynamique |
| 30/09/2026 | Backends mis à jour pour la convention « IP = numéro du CT », avec nginx -t à chaque étape ; transport.2sinnovation.com archivé ; sauvegarde nginx-avant-dhcp-20260930-2307.tgz |
| 30/09/2026 | HTTPS partout : redirections 301, HSTS sur tous les vhosts, TLS 1.0 et 1.1 retirés, minecraft.massyl.fr archivé, cloud.massyl.fr converti en lien symbolique ; sauvegarde nginx-avant-https-20260930-2355.tgz |
| 01/10/2026 | Durcissement : server_tokens off, X-Powered-By masqué, vhost wiki avec client_max_body_size 10m et WebSocket ; sauvegarde nginx-avant-durcissement-20261001.tgz |
| 01/10/2026 | Page réécrite lors de la refonte du wiki ; vhost zabbix.massyl.com archivé |
| 02/10/2026 | Vhosts morts archivés (gophish, plex, portainer, eve-ng, cyberlab) et leurs renouvellements de certificat mis de côté ; HSTS harmonisé à un an ; sauvegardes nginx-avant-archivage-vhosts-20261002.tgz et nginx-avant-hsts-20261002.tgz |
Le principe n'a pas changé depuis 2023 : un seul point d'entrée pour les ports 80 et 443, et un conteneur par service. Les détails du schéma (versions, VM passerelle) sont en revanche obsolètes.

Pour la mise à jour d'un nom de domaine sur une IP publique dynamique, voir DynDNS et adresse IP dynamique.