Gestion des certificats SSL avec Certbot + Nginx (Docker)
Cette documentation décrit toutes les étapes pour gérer les certificats SSL Let’s Encrypt avec Certbot et un reverse-proxy Nginx tournant dans Docker.
Architecture utilisée
- reverse-proxy (nginx:alpine)
- Ports exposés :
80(HTTP),443(HTTPS) -
Montages :
mon-serveur_certbot-etc:/etc/letsencrypt:romon-serveur_certbot-www:/var/www/certbot:ro
-
certbot (certbot/certbot:latest)
- Utilisé uniquement en conteneur éphémère pour générer/renouveler les certificats
- Montages :
mon-serveur_certbot-etc:/etc/letsencryptmon-serveur_certbot-www:/var/www/certbot
Configuration Nginx
Bloc HTTP (redirection vers HTTPS avec exception pour ACME)
server {
listen 80;
server_name exemple.julickmellah.fr;
# Autoriser Let's Encrypt ACME challenge
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
# Tout le reste redirigé en HTTPS
location / {
return 301 https://$host$request_uri;
}
}
````
### Bloc HTTPS (reverse proxy vers le service en backend)
```nginx
server {
listen 443 ssl;
server_name exemple.julickmellah.fr;
# Certificats générés par Certbot
ssl_certificate /etc/letsencrypt/live/exemple.julickmellah.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exemple.julickmellah.fr/privkey.pem;
# Proxy vers le service (ex : GitLab)
location / {
proxy_pass http://gitlab:80;
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;
}
}
Ajouter un nouveau domaine
-
Ajouter la configuration Nginx (HTTP + HTTPS) pour le nouveau domaine
- Exemple :
registry.julickmellah.fr - Recharger Nginx pour appliquer la configuration :
- Exemple :
docker exec -it reverse-proxy nginx -s reload
docker run --rm \
-v mon-serveur_certbot-etc:/etc/letsencrypt \
-v mon-serveur_certbot-www:/var/www/certbot \
certbot/certbot certonly \
--webroot -w /var/www/certbot \
-d registry.julickmellah.fr \
--email ton.email@domaine.tld --agree-tos --no-eff-email
docker exec -it reverse-proxy nginx -s reload
Renouveler tous les certificats existants
Dry-run (test sans consommer de quota)
docker run --rm \
-v mon-serveur_certbot-etc:/etc/letsencrypt \
-v mon-serveur_certbot-www:/var/www/certbot \
certbot/certbot renew \
--webroot -w /var/www/certbot --dry-run
Renouvellement réel
docker run --rm \
-v mon-serveur_certbot-etc:/etc/letsencrypt \
-v mon-serveur_certbot-www:/var/www/certbot \
certbot/certbot renew \
--webroot -w /var/www/certbot
Recharger Nginx ensuite
docker exec -it reverse-proxy nginx -s reload
Script d’automatisation (cron)
Créer un fichier renew-certs.sh sur le host :
#!/usr/bin/env bash
set -euo pipefail
# Renouveler tous les certificats
docker run --rm \
-v mon-serveur_certbot-etc:/etc/letsencrypt \
-v mon-serveur_certbot-www:/var/www/certbot \
certbot/certbot renew --webroot -w /var/www/certbot
# Recharger Nginx pour appliquer les nouveaux certificats
docker exec reverse-proxy nginx -s reload
Rendre le script exécutable :
chmod +x /srv/docker/mon-serveur/renew-certs.sh
Programmer une tâche cron (exécution 1 fois par mois) :
0 3 1 * * /srv/docker/mon-serveur/renew-certs.sh >> /var/log/certbot-renew.log 2>&1
Résumé des commandes utiles
Générer un certificat pour un nouveau domaine
docker run --rm \
-v mon-serveur_certbot-etc:/etc/letsencrypt \
-v mon-serveur_certbot-www:/var/www/certbot \
certbot/certbot certonly \
--webroot -w /var/www/certbot \
-d nouveau.domaine.fr \
--email ton.email@domaine.tld --agree-tos --no-eff-email
Vérifier la présence des certificats
docker run --rm -v mon-serveur_certbot-etc:/etc/letsencrypt alpine ls -lah /etc/letsencrypt/live
Renouveler tous les certificats
docker run --rm \
-v mon-serveur_certbot-etc:/etc/letsencrypt \
-v mon-serveur_certbot-www:/var/www/certbot \
certbot/certbot renew --webroot -w /var/www/certbot
Recharger Nginx
docker exec -it reverse-proxy nginx -s reload