Во оваа статија, сакам да споделам со вас метод за креирање SSL сертификат за вашата веб апликација која работи на Docker, бидејќи ... Не најдов такво решение во делот на Интернет на руски јазик.
Повеќе детали под сечењето.
Имавме docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 и половина литар чист Let'sEncrypt. Не е дека е неопходно да се распореди производството на Docker. Но, штом ќе започнете да го градите Docker, станува тешко да се запре.
Значи, за почеток, ќе ги дадам стандардните поставки - што ги имавме во фазата на dev, т.е. без порта 443 и SSL воопшто:
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;
}
Следно, ние всушност треба да имплементираме SSL. Да бидам искрен, поминав околу 2 часа проучувајќи ја ком зоната. Сите опции што се нудат таму се интересни. Но, во сегашната фаза на проектот, ние (бизнисот) требаше брзо и сигурно да се навртуваме SSL Let'sEnctypt к nginx контејнер и ништо повеќе.
Прво на сите, го инсталиравме на серверот сертификат
sudo apt-get install certbot
Следно, генериравме сертификати со џокер за нашиот домен
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
по извршувањето, certbot ќе ни обезбеди 2 TXT записи кои треба да се наведат во поставките за DNS.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
И притиснете enter.
После ова, certbot ќе го провери присуството на овие записи во DNS и ќе создаде сертификати за вас.
ако сте додале сертификат но сертификат не го најдов - обидете се да ја рестартирате командата по 5-10 минути.
Па, еве ние сме горди сопственици на Let'sEncrypt сертификат за 90 дена, но сега треба да го поставиме на Docker.
За да го направите ова, на најбанален начин, во docker-compose.yml, во делот nginx, ги поврзуваме директориумите.
Пример docker-compose.yml со 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"
Поврзано? Одлично - да продолжиме:
Сега треба да ја смениме конфигурацијата nginx да се работи со 443 пристаниште и SSL генерално:
Пример конфигурација main.conf со 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;
}
}
Всушност, по овие манипулации, одиме во директориумот со Docker-compose, пишуваме docker-compose up -d. И ја проверуваме функционалноста на SSL. Сè треба да полета.
Главната работа е да не заборавите дека сертификатот Let'sEnctypt се издава 90 дена и ќе треба да го обновите преку командата sudo certbot renew
, а потоа рестартирајте го проектот со командата docker-compose restart
Друга опција е да ја додадете оваа низа во crontab.
Според мое мислење, ова е најлесниот начин за поврзување на SSL со веб-апликацијата Docker.
П.С. Ве молиме имајте предвид дека сите скрипти претставени во текстот не се конечни, проектот сега е во фаза на длабок развој, затоа би сакал да ве замолам да не ги критикувате конфигурациите - тие ќе бидат модифицирани многу пати.
Извор: www.habr.com