Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ Ρ Π²Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π·Π° Π²Π°ΡΠ΅ΡΠΎ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ°Π±ΠΎΡΠ΅ΡΠΎ Π½Π° Docker, Π·Π°ΡΠΎΡΠΎ... ΠΠ΅ Π½Π°ΠΌΠ΅ΡΠΈΡ ΡΠ°ΠΊΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΡΡΡΠΊΠΎΠ΅Π·ΠΈΡΠ½Π°ΡΠ° ΡΠ°ΡΡ Π½Π° ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ.
ΠΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΠΎΠ΄ ΠΊΡΠΎΠΉΠΊΠ°ΡΠ°.
ΠΠΌΠ°Ρ
ΠΌΠ΅ docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 ΠΈ ΠΏΠΈΠ½ΡΠ° ΡΠΈΡΡ Let'sEncrypt. ΠΠ΅ ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ Π½Π° Docker. ΠΠΎ ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ Docker, ΡΡΠ°Π²Π° ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠΏΡΠ΅ΡΠ΅.
Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΡΠΎ Π½Π°ΡΠ°Π»ΠΎ ΡΠ΅ Π΄Π°ΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ - ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ°Ρ ΠΌΠ΅ Π½Π° Π΅ΡΠ°ΠΏ dev, Ρ.Π΅. Π±Π΅Π· ΠΏΠΎΡΡ 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 ΠΊ Nginx ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈ Π½ΠΈΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅.
ΠΡΡΠ²ΠΎ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ
ΠΌΠ΅ Π½Π° ΡΡΡΠ²ΡΡΠ° certbot
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 ΠΈ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈ Π·Π° Π²Π°Ρ.
Π°ΠΊΠΎ ΡΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, Π½ΠΎ 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.
PS ΠΠΎΠ»Ρ, ΠΈΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ Π² ΡΠ΅ΠΊΡΡΠ°, Π½Π΅ ΡΠ° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΈ, ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΡΠ΅Π³Π° Π΅ Π½Π° Π΅ΡΠ°ΠΏ Deep Dev, ΡΠ°ΠΊΠ° ΡΠ΅ Π±ΠΈΡ
ΠΈΡΠΊΠ°Π» Π΄Π° Π²ΠΈ ΠΏΠΎΠΌΠΎΠ»Ρ Π΄Π° Π½Π΅ ΠΊΡΠΈΡΠΈΠΊΡΠ²Π°ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ - ΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠΎΠΌΠ΅Π½ΡΠ½ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com