V tomto článku se s vámi chci podělit o způsob vytvoření SSL certifikátu pro vaši webovou aplikaci běžící na Dockeru, protože v české části internetu jsem takové řešení nenašel.

Další informace naleznete níže.
Měli jsme docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 a kontejner s čistým Let’sEncrypt. Není nutné nasazovat produkční prostředí na Docker, ale jakmile začnete používat Docker, je těžké přestat.
Takže začnu standardními nastaveními, která jsme měli ve fázi vývoje, tedy bez portu 443 a SSL celkově:
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 \/ {
# pokusit se přímo poskytnout soubor, jako fallback použít 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;
}
Dále je třeba implementovat SSL. Upřímně řečeno, studoval jsem zónu com asi 2 hodiny. Všechny navrhované varianty jsou zajímavé. Ale v této fázi projektu jsme (podnik) potřebovali rychle a spolehlivě implementovat SSL Let’sEncrypt k nginx do kontejneru a nic víc.
Nejprve jsme na server nainstalovali certbot
sudo apt-get install certbot
Poté jsme vygenerovali wildcard certifikáty pro náš domény
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
po spuštění certbot poskytne 2 TXT záznamy, které je třeba uvést v nastavení DNS.
_acme-challenge.stomup.ru TXT {tenKlicKteryVamVydalCertBot}
A stiskneme enter.
Poté certbot zkontroluje tyto záznamy v DNS a vytvoří pro vás certifikáty.
pokud jste přidali certifikát, ale certbot nebyl nalezen — zkuste znovu spustit příkaz za 5-10 minut.
Takže teď jsme hrdými vlastníky Let’sEncrypt certifikátu na 90 dní, ale nyní ho musíme dostat do Dockeru.
Pro tento účel jednoduše v docker-compose.yml, v sekci nginx — propojujeme adresáře.
Příklad docker-compose.yml s 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"
Propojili jsme? Skvělé — pokračujeme:
Teď musíme upravit konfiguraci nginx pro práci s 443 portem a SSL celkově:
Příklad konfiguračního souboru main.conf s 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;
}
}
Po těchto manipulacích jdeme do adresáře s Docker-compose, píšeme docker-compose up -d. A ověřujeme funkčnost SSL. Mělo by to vše fungovat.
Hlavně nezapomínejte, že certifikát Let’sEncrypt se vydává na 90 dní a budete ho muset obnovit pomocí příkazu sudo certbot renew, a poté restartovat projekt příkazem docker-compose restart
Jako variantu — přidat tuto sekvenci do crontabu.
Podle mého názoru je to nejjednodušší způsob, jak připojit SSL k Docker Web-app.
P.S. Prosím vezměte na vědomí, že všechny skripty uvedené v textu nejsou konečné, projekt je nyní v hluboké fázi vývoje, proto vás prosím, abyste nekritizovali konfigurace — ty se budou ještě mnohokrát měnit.
Zdroj: habr.com
