Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ Ρ ΠΎΡΡ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Ρ Π²Π°ΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ 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. Π§Π΅ΡΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ β ΡΡΡΠ΄ΠΈΡΠΎΠ²Π°Π» com Π·ΠΎΠ½Ρ Ρ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΠ°ΡΠΎΠ² 2-Ρ . ΠΡΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΡΠ°ΠΌ β ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅. ΠΠΎ Π½Π° ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΡΠ°ΠΏΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π½Π°ΠΌ(Π±ΠΈΠ·Π½Π΅ΡΡ) Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±ΡΡΡΡΠΎ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΠΏΡΠΈΠΊΡΡΡΠΈΡΡ SSL Let’sEnctypt ΠΊ nginx ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΈ Π½Π΅ Π±ΠΎΠ»Π΅Π΅.
Π ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ certbot
sudo apt-get install certbot
ΠΠ°Π»Π΅Π΅ ΠΌΡ ΡΠ³Π΅Π½Π΅ΡΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ wildcard Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°
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 ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π»Ρ Π²Π°Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ.
Π΅ΡΠ»ΠΈ Π²Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, Π½ΠΎ certbot Π΅Π³ΠΎ Π½Π΅ Π½Π°ΡΠ΅Π» β ΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅ΡΠ΅Π· 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 Web-app.
P.S. ΠΡΠΎΡΡ ΠΏΡΠΈΠ½ΡΡΡ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΡΠΎ Π²ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π² ΡΠ΅ΠΊΡΡΠ΅ β Π½Π΅ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½Ρ, ΡΠ΅ΠΉΡΠ°Ρ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ Dev, ΠΏΠΎ ΡΡΠΎΠΌΡ Ρ
ΠΎΡΡ Π²Π°Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ Π½Π΅ ΠΊΡΠΈΡΠΈΠΊΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ- ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π· Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com