Dans cet article, je souhaite partager avec vous comment créer un certificat SSL pour votre application web fonctionnant sur Docker, car je n'ai pas trouvé de solution similaire dans la partie russophone d'Internet.

Pour en savoir plus, cliquez ci-dessous.
Nous avions Docker v.17.05, docker-compose v.1.21, Ubuntu Server 18, et une pinte de LetâsEncrypt. Ce n'est pas que dĂ©ployer un environnement de production sur Docker soit nĂ©cessaire. Mais une fois que vous avez commencĂ© Ă assembler Docker, il devient difficile de s'arrĂȘter.
Alors, je vais d'abord présenter les configurations standard que nous avions à l'étape de développement, c'est-à -dire sans le port 443 et SSL en général :
docker-compose.yml
version: '2'
services:
php:
build: ./php-fpm
volumes:
- ./StomUp:/var/www/StomUp
- ./php-fpm/php.ini:/usr/local/etc/php/php.ini
depends_on:
- mysql
container_name: "StomPHP"
web:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./StomUp:/var/www/StomUp
- ./nginx/main.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
mysql:
image: mysql:5.7
command: mysqld --sql_mode=""
environment:
MYSQL_ROOT_PASSWORD: xxx
ports:
- "3333:3306"
nginx/main.conf
server {
listen 80;
server_name *.stomup.ru stomup.ru;
root /var/www/StomUp/public;
client_max_body_size 5M;
location / {
# essayer de servir le fichier directement, sinon retour Ă index.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/index.php(\/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+.php)(\/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
internal;
}
location ~ .php$ {
return 404;
}
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
Ensuite, nous devons mettre en Ćuvre SSL. HonnĂȘtement, j'ai Ă©tudiĂ© la zone com pendant environ deux heures. Toutes les options proposĂ©es lĂ -bas sont intĂ©ressantes. Mais Ă ce stade du projet, nous (l'entreprise) avions besoin de l'intĂ©grer rapidement et de maniĂšre fiable. SSL LetâsEnctypt sur nginx au conteneur, et pas plus.
Tout d'abord, nous avons installé sur le serveur certbot
sudo apt-get install certbot
Ensuite, nous avons généré des certificats wildcard pour notre de domaine
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
aprÚs avoir exécuté certbot, deux enregistrements TXT vous seront fournis, que vous devez indiquer dans les paramÚtres DNS.
_acme-challenge.stomup.ru TXT {laCléQueCertBotVousADonne}
Et nous appuyons sur enter.
AprÚs cela, certbot vérifiera la présence de ces enregistrements dans DNS et créera pour vous des certificats.
si vous avez ajouté le certificat mais certbot qu'il n'a pas été trouvé, essayez de redémarrer la commande dans 5-10 minutes..
Eh bien, nous avons maintenant un certificat LetâsEncrypt valable pour 90 jours, mais maintenant nous devons l'intĂ©grer dans Docker.
Pour ce faire, nous allons simplement lier les répertoires dans le fichier docker-compose.yml, dans la section nginx.
Exemple de docker-compose.yml avec SSL
version: '2'
services:
php:
build: . /php-fpm
volumes:
- . /StomUp: /var /www /StomUp
- /etc /letsencrypt /live /stomup.ru /: /etc /letsencrypt /live /stomup.ru /
- . /php-fpm /php.ini: /usr /local /etc /php /php.ini
depends_on:
- mysql
container_name: "StomPHP"
web:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- . /StomUp: /var /www /StomUp
- /etc /letsencrypt /: /etc /letsencrypt /
- . /nginx /main.conf: /etc /nginx /conf.d /default.conf
depends_on:
- php
mysql:
image: mysql:5.7
command: mysqld --sql_mode=""
environment:
MYSQL_ROOT_PASSWORD: xxx
ports:
- "3333:3306"
LiĂ© ? Super â continuons :
Nous devons maintenant modifier la configuration nginx pour travailler avec 443 le port et SSL en général :
Exemple de config main.conf avec SSL
#
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name *.stomup.ru stomup.ru;
set $base /var/www/StomUp;
root $base/public;
# SSL
ssl_certificate /etc/letsencrypt/live/stomup.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/stomup.ru/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/stomup.ru/chain.pem;
client_max_body_size 5M;
location / {
# try to serve file directly, fallback to index.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/index.php(/|$) {
#fastcgi_pass unix:/var/run/php7.2-fpm.sock;
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
internal;
}
location ~ .php$ {
return 404;
}
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
# HTTP redirect
server {
listen 80;
listen [::]:80;
server_name *.stomup.ru stomup.ru;
location / {
return 301 https://stomup.ru$request_uri;
}
}
AprĂšs ces manĆuvres, dirigez-vous vers le rĂ©pertoire avec Docker-compose, tapez docker-compose up -d. Et vĂ©rifiez le bon fonctionnement de SSL. Tout devrait fonctionner.
N'oubliez pas que le certificat LetâsEncrypt est valide pendant 90 jours et vous devrez le renouveler via la commande sudo certbot renew, puis redĂ©marrez le projet avec la commande docker-compose restart
Une option serait d'ajouter cette séquence dans crontab.
Ă mon avis, c'est la maniĂšre la plus simple de connecter SSL Ă une application Web Docker.
P.S. Veuillez noter que tous les scripts présentés dans le texte ne sont pas définitifs, le projet est actuellement en phase de développement approfondi, donc je vous demande de ne pas critiquer les configurations - elles seront beaucoup modifiées à l'avenir.
Source : habr.com
