web-dev-qa-db-fra.com

docker-machine + docker-compose + ssl (permet de crypter via nginx et certbot)

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 à:

docker-compose.yml

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;'"

nginx/Dockerfile

FROM nginx:1.15.9-Alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY prod.conf /etc/nginx/conf.d/

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;
4
Dawid Laszuk

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:

  1. 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.

  2. 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

1
Carlos Cavero