J'essaie d'ajouter une terminaison TLS/SSL automatique à un Nginx dans un docker-compose déployé via le docker -machine (DigitalOcean).
J'ai trouvé quelques ressources Nice [ humankode/how-to-set-up ... , medium/nginx-and-lets-encrypt ... ] sur la façon de faites-le par le docker-compose mais ils disent tous les deux du point de vue d'être sur le serveur. Je veux vraiment éviter ça. J'adorerais le faire localement, sur mon ordinateur portable, tout regrouper et l'envoyer. Ou, même le faire à distance sans faire de ssh.
Quelques tentatives ont échoué mais on a l'impression qu'elles étaient proches. Le principal obstacle semble être avec les fichiers/volumes. En suivant le guide medium/nginx-and-lets-encrytp ... J'ai des problèmes avec la sauvegarde d'OpenSSL privkey.pem. L'autre tutoriel ( humankode), à ma connaissance, fait tout sur le serveur et c'est là que vivent les volumes.
Ma dernière tentative a été de configurer des certificats sur la machine via le Tutoriel DigitalOcean et d'essayer de les inclure dans ma build docker-compose. Pas de chance.
Il y a eu de nombreuses modifications mais mes paramètres sont similaires à:
version: '3.7'
services:
nginx:
image: nginx:1.15.9-Alpine
container_name: nginx
build:
context: ./nginx
dockerfile: Dockerfile
restart: always
volumes:
- /etc/letsencrypt
- /var/www/certbot
ports:
- "80:80"
- "443:443"
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
image: certbot/certbot
restart: unless-stopped
volumes:
- "/etc/letsencrypt"
- "/var/www/certbot"
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
FROM nginx:1.15.9-Alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY prod.conf /etc/nginx/conf.d/
# PRODUCTION
server {
listen 80;
listen [::]:80;
server_name example.site;
location ~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
location / {
return 301 https://$Host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.site;
ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
J'aurais besoin de plus de détails sur les erreurs que vous recevez, mais en gros tout va plus ou moins bien dans votre configuration. Je vois une erreur possible dans la partie volumes. Mais étape par étape, car vous posez quelques questions intéressantes:
Vous pouvez tout tester localement, mais je crains (ou je n'ai pas pu trouver le chemin) que vous ne puissiez pas le faire avec Let's encrypt automatiquement parce que certbot trouve un domaine disponible approprié sur Internet (donc localement est inaccessible). Ce que j'ai fait, c'est de générer les certificats (j'en ai validés), puis de modifier les hôtes sur votre machine avec le domaine pointant vers localhost (ou Docker toolbox IP dans le cas de Windows) que vous sélectionnez avec des certificats valides. C'est une solution de contournement mais cela peut fonctionner.
Dans l'exemple Medium, volumes
sont créés en tant que Host volumes
pour les deux conteneurs:
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
Cela signifie que les certificats doivent être placés dans le dossier ./data/certbot/conf
ou /path/to/Host
de la machine hôte Docker et ils sont mappés sur /etc/letsencrypt
dossier dans le conteneur. Vous utilisez des volumes anonymes (j'ai eu des problèmes dans le passé lorsque je les ai utilisés). Cochez cette question stackoverflow pour plus d'explications sur le type de volumes.
Enfin si vous préférez une autre solution plus dynamique qui inclut automatiquement https
vous pouvez vérifier ne réponse stackoverflow sur la façon d'utiliser nginx comme proxy inverse afin de faciliter votre déploiement. Il existe également un exemple de déploiement ELK de docker compose