Sa artikulong ito, nais kong ibahagi sa iyo ang isang paraan para sa paglikha ng isang SSL certificate para sa iyong web application na tumatakbo sa Docker, dahil... Hindi ako nakahanap ng ganoong solusyon sa bahagi ng Internet sa wikang Ruso.
Higit pang mga detalye sa ilalim ng hiwa.
Mayroon kaming docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 at isang pint ng purong Let'sEncrypt. Ito ay hindi na kinakailangan upang i-deploy ang produksyon sa Docker. Ngunit kapag sinimulan mo na ang paggawa ng Docker, nagiging mahirap itong ihinto.
Kaya, upang magsimula sa, ibibigay ko ang mga karaniwang setting - na mayroon kami sa yugto ng dev, i.e. walang port 443 at SSL sa pangkalahatan:
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 / {
# 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;
}
Susunod, kailangan talaga nating ipatupad ang SSL. To be honest, mga 2 hours akong nag-aral sa com zone. Ang lahat ng mga opsyon na inaalok doon ay kawili-wili. Ngunit sa kasalukuyang yugto ng proyekto, kailangan namin (ang negosyo) na mabilis at mapagkakatiwalaan na i-screw SSL Let'sEnctypt ΠΊ nginx lalagyan at wala nang iba pa.
Una sa lahat, na-install namin ito sa server certbot
sudo apt-get install certbot
Susunod, nakabuo kami ng mga wildcard na certificate para sa aming domain
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
pagkatapos ng execution, bibigyan kami ng certbot ng 2 TXT record na kailangang tukuyin sa mga setting ng DNS.
_acme-challenge.stomup.ru TXT {ΡΠΎΡΠΠ»ΡΡΠΠΎΡΠΎΡΡΠΉΠΠ°ΠΌΠΡΠ΄Π°Π»CertBot}
At pindutin ang enter.
Pagkatapos nito, titingnan ng certbot ang pagkakaroon ng mga talang ito sa DNS at gagawa ng mga certificate para sa iyo.
kung nagdagdag ka ng sertipiko ngunit certbot Hindi ko nahanap - subukang i-restart ang command pagkatapos ng 5-10 minuto.
Well, narito kami ang mapagmataas na may-ari ng isang Let'sEncrypt certificate sa loob ng 90 araw, ngunit ngayon ay kailangan naming i-upload ito sa Docker.
Upang gawin ito, sa pinakawalang halaga na paraan, sa docker-compose.yml, sa seksyon ng nginx, ini-link namin ang mga direktoryo.
Halimbawa docker-compose.yml na may 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"
Naka-link? Mahusay - magpatuloy tayo:
Ngayon kailangan nating baguhin ang config nginx magtrabaho kasama si 443 daungan at SSL pangkalahatan:
Halimbawa ng main.conf config na may 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;
}
}
Sa totoo lang, pagkatapos ng mga manipulasyong ito, pumunta kami sa direktoryo na may Docker-compose, sumulat ng docker-compose up -d. At sinusuri namin ang functionality ng SSL. Ang lahat ay dapat mag-alis.
Ang pangunahing bagay ay huwag kalimutan na ang sertipiko ng Let'sEnctypt ay inisyu sa loob ng 90 araw at kakailanganin mong i-renew ito sa pamamagitan ng utos sudo certbot renew
, at pagkatapos ay i-restart ang proyekto gamit ang command docker-compose restart
Ang isa pang opsyon ay idagdag ang sequence na ito sa crontab.
Sa palagay ko ito ang pinakamadaling paraan upang ikonekta ang SSL sa Docker Web-app.
PS Mangyaring isaalang-alang na ang lahat ng mga script na ipinakita sa teksto ay hindi pangwakas, ang proyekto ay nasa malalim na yugto ng Dev, kaya nais kong hilingin sa iyo na huwag punahin ang mga config - mababago sila nang maraming beses.
Pinagmulan: www.habr.com