Бул макалада мен сиз менен Dockerде иштеген веб-тиркемеңиз үчүн SSL сертификатын түзүү ыкмасын бөлүшкүм келет, анткени... Мен интернеттин орус тилдүү бөлүгүнөн мындай чечимди тапкан жокмун.
Кеңири маалымат кесип астында.
Бизде docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 жана бир литр таза Let'sEncrypt болгон. Бул Dockerде өндүрүштү жайылтуу зарыл эмес. Бирок Dockerди кура баштагандан кийин, аны токтотуу кыйын болуп калат.
Ошентип, баштоо үчүн мен стандарттык орнотууларды берем - бизде иштеп чыгуу стадиясында болгон, б.а. порт 443 жана жалпысынан SSL жок:
ютуб-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;
}
Андан кийин, биз чынында SSL ишке ашыруу керек. Чынын айтсам, ком зонаны изилдөөгө 2 сааттай убакыт короттум. Ал жерде сунушталган бардык варианттар кызыктуу. Бирок долбоордун азыркы этабында, биз (бизнес) тез жана ишенимдүү буроо керек SSL Let'sEnctypt к жөргөмүш контейнер жана башка эч нерсе жок.
Биринчиден, биз аны серверге орноттук certbot
sudo apt-get install certbot
Андан кийин, биз доменибиз үчүн коймо белги сертификаттарын түздүк
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
аткарылгандан кийин, certbot бизге DNS жөндөөлөрүндө көрсөтүлүшү керек болгон 2 TXT жазуусу менен камсыз кылат.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
Жана enter басыңыз.
Андан кийин, certbot бул жазуулардын DNSде бар-жогун текшерип, сиз үчүн сертификаттарды түзөт.
эгерде сиз күбөлүк кошкон болсоңуз, бирок certbot аны тапкан жокмун - 5-10 мүнөттөн кийин буйрукту кайра иштетип көрүңүз.
Ооба, бул жерде биз 90 күн бою Let'sEncrypt сертификатынын сыймыктануу ээлерибиз, бирок азыр аны Dockerге жүктөп беришибиз керек.
Бул үчүн, эң жөнөкөй жол менен, docker-compose.yml, nginx бөлүмүндө биз каталогдорду байланыштырабыз.
Мисалы, SSL менен docker-compose.yml
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"
Байланышканбы? Жакшы - уланталы:
Эми биз конфигурацияны өзгөртүүбүз керек жөргөмүш менен иштөө 443 порт жана SSL жалпысынан:
SSL менен main.conf конфигурациясынын мисалы
#
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;
}
}
Чынында, бул манипуляциялардан кийин биз Docker-compose менен каталогго барабыз, docker-compose up -d деп жазабыз. Жана биз SSL функциясын текшеребиз. Баарын алып кетиш керек.
Эң негизгиси, Let'sEnctypt сертификаты 90 күнгө берилээрин унутпаңыз жана сиз аны буйрук аркылуу жаңыртышыңыз керек. sudo certbot renew
, анан буйрук менен долбоорду кайра баштаңыз docker-compose restart
Дагы бир вариант бул ырааттуулукту crontabга кошуу.
Менин оюмча, бул SSLди Docker Web колдонмосуна туташтыруунун эң оңой жолу.
PS Текстте берилген бардык скрипттер акыркы эмес экенин эске алыңыз, долбоор азыр терең иштеп чыгуу стадиясында, андыктан конфигурацияларды сынга албашыңызды суранат элем - алар көп жолу өзгөртүлөт.
Source: www.habr.com