Impostazione della ricezione automatica dei certificati letsencrypt utilizzando docker su Linux

Recentemente ho cambiato il server virtuale e ho dovuto configurare di nuovo tutto. Preferisco che il sito sia accessibile tramite https e che i certificati letsencrypt vengano ottenuti e rinnovati automaticamente. Ciò può essere ottenuto utilizzando due immagini docker nginx-proxy e nginx-proxy-companion.

Questa è una guida su come configurare un sito web su Docker, con un proxy che riceve automaticamente i certificati SSL. Viene utilizzato il server virtuale CentOS 7.

Presumo che il server sia già stato acquistato, configurato, loggato utilizzando una chiave, fail2ban installato, ecc.

Per prima cosa devi installare docker.

  1. Per prima cosa devi installare le dipendenze
    $ sudo yum install -y yum-utils  device-mapper-persistent-data lvm2
  2. Connetti il ​​deposito
    $ sudo yum-config-manager  --add-repo  https://download.docker.com/linux/centos/docker-ce.repo
  3. Quindi installa l'edizione docker community
    $ sudo yum install docker-ce docker-ce-cli containerd.io
  4. Aggiungi la finestra mobile all'avvio ed esegui
    $ sudo systemctl enable docker
    $ sudo systemctl start docker
  5. Aggiungi un utente al gruppo docker per poter eseguire docker senza sudo
    $ usermod -aG docker user

Il passaggio successivo è installare docker-compose. L'utility può essere installata in diversi modi, ma io preferisco installarla tramite pip manager e virtualenv, per non ingombrare il sistema con pacchetti non necessari.

  1. Installa pip
    $ sudo yum install python-pip
  2. Installa virtualenv
    $ pip install virtualenv
  3. Successivamente è necessario creare una cartella con il progetto e inizializzarla. La cartella con tutto il necessario per gestire i pacchetti si chiamerà ve.
    $ mkdir docker
    $ cd docker
    $ virtualenv ve
  4. Per iniziare a utilizzare l'ambiente virtuale, è necessario eseguire il seguente comando nella cartella del progetto.
    $ source ve/bin/activate
  5. Puoi installare docker-compose.
    pip install docker-compose

    Affinché i contenitori possano vedersi, creeremo una rete. Per impostazione predefinita, viene utilizzato il driver bridge.

    $ docker network create network

    Successivamente è necessario configurare docker-compose, il proxy sarà nella cartella proxy, il sito di test sarà nella cartella test. Ad esempio, sto utilizzando il nome di dominio example.com

    $ mkdir proxy
    $ mkdir test
    $ touch proxy/docker-compose.yml
    $ touch test/docker-compose.yml

    Contenuto proxy/docker-compose.yml

    version: '3'
    
    networks:
      default:
        external:
          name: network
    
    services:
      nginx-proxy:
        container_name: nginx-proxy
        image: jwilder/nginx-proxy
        ports:
          - 80:80
          - 443:443
        volumes:
          - certs:/etc/nginx/certs
          - vhost.d:/etc/nginx/vhost.d
          - html:/usr/share/nginx/html
          - /var/run/docker.sock:/tmp/docker.sock:ro
    
      nginx-proxy-letsencrypt:
        container_name: nginx-proxy-letsencrypt
        image: jrcs/letsencrypt-nginx-proxy-companion
        volumes: 
          - certs:/etc/nginx/certs
          - vhost.d:/etc/nginx/vhost.d
          - html:/usr/share/nginx/html
          - /var/run/docker.sock:/var/run/docker.sock:ro
        environment:
          - NGINX_PROXY_CONTAINER=nginx-proxy
    
    volumes:
      certs:
      vhost.d:
      html:

    Variabile d'ambiente NGINX_PROXY_CONTAINER è necessario che il contenitore letsencrypt veda il contenitore proxy. Le cartelle /etc/nginx/certs /etc/nginx/vhost.d e /usr/share/nginx/html devono essere condivise da entrambi i contenitori. Affinché il contenitore letsencrypt funzioni correttamente, l'applicazione deve essere accessibile sia sulla porta 80 che sulla porta 443.

    Contenuto test/docker-compose.yml

    version: '3'
    
    networks:
      default:
        external:
          name: network
    
    services:
    
      nginx:
        container_name: nginx
        image: nginx:latest
        environment:
          - VIRTUAL_HOST=example.com
          - LETSENCRYPT_HOST=example.com
          - [email protected]

    Qui sono necessarie variabili d'ambiente affinché il proxy elabori correttamente la richiesta al server e richieda un certificato per il nome di dominio corretto.

    Non resta che eseguire docker-compose

    $ cd proxy
    $ docker-compose up -d
    $ cd ../test
    $ docker-compose up -d

Fonte: habr.com

Aggiungi un commento