Le serveur est verrouillé et le domaine pointe dessus. Cette page met un serveur web devant : elle ouvre les ports web, installe Caddy depuis son dépôt officiel, crée la racine web avec une page d'attente, écrit un seul Caddyfile, et vérifie depuis ton portable que https:// répond avec un certificat valide. La page suivante remplace la page d'attente par le vrai site.
Avant de commencer
$dig +short A Ouvrir les ports web
$sudo ufw allow 80/tcp$sudo ufw allow 443/tcp$sudo ufw allow 443/udpInstaller Caddy
$sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl gnupg$curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg$curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list$sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg$sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list$sudo apt update && sudo apt install -y caddy$systemctl is-active caddyactive
Créer la racine web et une page d'attente
$sudo install -d -m 755 /releases/placeholder$echo '<!doctype html><meta charset="utf-8"><title></title><p> est en cours de mise en place. Revenez bientôt.</p>' | sudo tee /releases/placeholder/index.html$echo '<!doctype html><meta charset="utf-8"><title>Introuvable</title><p>404 : rien ici.</p>' | sudo tee /releases/placeholder/404.html$sudo ln -sfn releases/placeholder /currentÉcrire le Caddyfile
Le bloc ci-dessous est le /etc/caddy/Caddyfile en entier, déjà réglé selon les deux choix de cette page, HSTS et masquage des IP dans les logs : change-les dans le panneau et le fichier suit. Copie la commande et colle-la dans le terminal. Elle remplace le fichier par défaut d'un coup ; il n'y a rien à y ajouter ensuite.
{ email }www. { redir https://{uri} permanent} { root * /current encode zstd gzip file_server handle_errors 404 { rewrite * /404.html file_server } header { X-Content-Type-Options "nosniff" Referrer-Policy "strict-origin-when-cross-origin" X-Frame-Options "DENY" Permissions-Policy "camera=(), microphone=(), geolocation=()" -Server } @static path /_next/static/* header @static Cache-Control "public, max-age=31536000, immutable" @media path *.jpg *.jpeg *.png *.webp *.avif *.svg *.mp3 *.opus *.wav *.mp4 header @media Cache-Control "public, max-age=604800" header Strict-Transport-Security "max-age=86400" log { output file /var/log/caddy/access.log { roll_size 10MiB roll_keep 10 } format filter { request>remote_ip ip_mask 16 32 request>client_ip ip_mask 16 32 } }}HSTS. La ligne Strict-Transport-Security du fichier suit ton choix.
Valider et recharger
$sudo -u caddy caddy validate --config /etc/caddy/Caddyfile$sudo systemctl reload caddy$sudo journalctl -u caddy -fSi le certificat échoue
Lis d'abord la ligne d'erreur dans le journal : elle nomme la cause. Ces requêtes, depuis ton portable, couvrent le côté DNS. Par ordre de probabilité :
$dig +short A $dig +short A www.$dig +short AAAA $dig +short CAA - DNS : les deux requêtes A doivent répondre
. Juste après un changement, attends que l'ancien TTL expire. - AAAA faux : si la requête AAAA répond quelque chose, ce doit être
. Let's Encrypt essaie l'IPv6 en premier, donc un AAAA périmé fait échouer la validation même quand l'IPv4 est parfaite. Pas d'AAAA du tout, ça va. - Port 80 fermé :
sudo ufw statusdoit montrer80/tcp ALLOW; si le Network Firewall d'OVH est actif, ouvre le 80 là-bas aussi. - CAA : la requête CAA doit être vide ou contenir
letsencrypt.org. Quand Let's Encrypt échoue, Caddy se rabat sur ZeroSSL, dont l'identifiant CAA estsectigo.com. - Limites de débit : Let's Encrypt accepte 5 validations échouées par nom d'hôte et par heure. Pendant que tu cherches, fais pointer Caddy vers la CA de test (staging) : ouvre le fichier à la main sur le serveur,
$sudo vim /etc/caddy/Caddyfilepuis ajoute cette ligne dans le bloc d'options globales, en haut, sous email, et valide puis recharge comme plus haut :
acme_ca https://acme-staging-v02.api.letsencrypt.org/directoryLes certificats de staging ne sont pas reconnus par les navigateurs, donc curl va râler : c'est normal. Une fois le succès affiché dans le journal, recolle la commande du Caddyfile de l'étape précédente (elle réécrit le fichier sans la ligne), puis valide et recharge : Caddy range les certificats par CA et en demande un vrai.
Vérifier depuis ton portable
$curl -sI https:/// | head -1HTTP/2 200
$curl -sI https://www./ | head -1HTTP/2 301
$curl -sI https://www./ | grep -i '^location'location: https:///
$curl -s -o /dev/null -w '%{http_code}' https:///nope/404
$curl -sI https:/// | grep -ci '^strict-transport-security'1
Terminé
répond maintenant en HTTPS avec un certificat Let's Encrypt que Caddy renouvelle tout seul, bien avant l'expiration. www et le HTTP simple redirigent vers https://, HTTP/3 est disponible, les ressources statiques sont mises en cache pour longtemps, et le log d'accès tourne tout seul avec des adresses masquées. Les visiteurs voient la page d'attente.
La page suivante, Déployer des versions atomiques avec rsync, construit le site Next.js sur ton portable, l'envoie comme nouvelle release sous , et bascule le lien current pour la mettre en ligne.