Recentemente ho cambiato il server virtuale e ho dovuto configurare tutto da capo. Preferisco che il sito sia accessibile tramite https e che i certificati letsencrypt siano ottenuti e rinnovati automaticamente. Questo può essere realizzato utilizzando due immagini docker: nginx-proxy e nginx-proxy-companion.
Questa guida spiega come configurare un sito su docker, con un proxy che ottiene automaticamente Certificati SSL. Si utilizza un server virtuale CentOS 7.
Presumo che il server sia già stato acquistato, configurato, l'accesso avvenga tramite chiave, e che sia stato installato fail2ban, ecc.
Per iniziare, è necessario installare docker.
- Per prima cosa è necessario installare le dipendenze
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 - Collegare il repository
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - Poi installare la community edition di docker
$ sudo yum install docker-ce docker-ce-cli containerd.io - Aggiungere docker all'avvio automatico e avviarlo
$ sudo systemctl enable docker $ sudo systemctl start docker - Aggiungere l'utente al gruppo docker per poter eseguire docker senza sudo
$ usermod -aG docker user
Il passo successivo consiste nell'installare docker-compose. L'utilità può essere installata in diversi modi, ma io preferisco utilizzare il gestore pip e virtualenv per non appesantire il sistema con pacchetti superflui.
- Installa pip
$ sudo yum install python-pip - Installa virtualenv
$ pip install virtualenv - Successivamente, è necessario creare una cartella per il progetto e inizializzarla. La cartella per la gestione dei pacchetti sarà chiamata ve.
$ mkdir docker $ cd docker $ virtualenv ve - Per utilizzare l'ambiente virtuale, è necessario eseguire il seguente comando nella cartella del progetto.
$ source ve/bin/activate - È possibile installare docker-compose.
pip install docker-composeAffinché i contenitori possano vedere l'uno l'altro, creiamo una rete. In default viene utilizzato il driver bridge.
$ docker network create networkDopo, è necessario configurare docker-compose; il proxy si troverà nella cartella proxy e il sito di prova nella cartella test. Per esempio, utilizzo il nome di dominio example.com.
$ mkdir proxy $ mkdir test $ touch proxy/docker-compose.yml $ touch test/docker-compose.ymlContenuto 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 è necessaria affinché 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. Per il corretto funzionamento del contenitore letsencrypt, l'applicazione deve essere accessibile sulla porta 80 e 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 - LETSENCRYPT_EMAIL=admin@example.comQui le variabili d'ambiente sono necessarie affinché il proxy gestisca correttamente le richieste al server e richieda un certificato per il nome di dominio corretto.
Rimane solo da avviare docker-compose
$ cd proxy $ docker-compose up -d $ cd ../test $ docker-compose up -d
Fonte: habr.com
