Bu yazıda mən sizinlə Docker-də işləyən veb tətbiqiniz üçün SSL sertifikatı yaratmaq üsulunu bölüşmək istəyirəm, çünki... İnternetin rusdilli hissəsində belə bir həll tapmadım.
Daha çox məlumat kəsik altında.
Bizdə docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 və bir pint təmiz Let'sEncrypt var idi. Docker-də istehsalı yerləşdirmək lazım deyil. Ancaq Docker-i qurmağa başladıqdan sonra dayandırmaq çətinləşir.
Beləliklə, başlamaq üçün standart parametrləri verəcəyəm - inkişaf mərhələsində bizdə olan, yəni. port 443 və ümumiyyətlə SSL olmadan:
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;
}
Sonra, əslində SSL tətbiq etməliyik. Düzünü desəm, com zonasını öyrənməyə 2 saata yaxın vaxt sərf etdim. Orada təklif olunan bütün variantlar maraqlıdır. Ancaq layihənin hazırkı mərhələsində bizə (biznes) tez və etibarlı şəkildə vida etmək lazım idi SSL Let'sEnctypt к nginx konteyner və başqa heç nə.
Əvvəlcə onu serverə quraşdırdıq sertifikat
sudo apt-get install certbot
Sonra, biz domenimiz üçün joker sertifikatlar yaratdıq
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
icra edildikdən sonra certbot bizə DNS parametrlərində göstərilməli olan 2 TXT qeydini təqdim edəcək.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
Və enter düyməsini basın.
Bundan sonra certbot bu qeydlərin DNS-də olub-olmadığını yoxlayacaq və sizin üçün sertifikatlar yaradacaq.
sertifikat əlavə etmisinizsə, lakin sertifikat tapmadı - 5-10 dəqiqədən sonra əmri yenidən başladın.
Yaxşı, biz 90 gün ərzində Let'sEncrypt sertifikatının fəxri sahibləriyik, lakin indi onu Docker-ə yükləməliyik.
Bunun üçün ən mənasız şəkildə docker-compose.yml-də nginx bölməsində kataloqları əlaqələndiririk.
SSL ilə docker-compose.yml nümunəsi
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"
Əlaqələndirildi? Əla - davam edək:
İndi konfiqurasiyanı dəyişdirməliyik nginx ilə işləmək 443 port və SSL ümumiyyətlə:
SSL ilə main.conf konfiqurasiyasına nümunə
#
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;
}
}
Əslində bu manipulyasiyalardan sonra Docker-compose ilə qovluğa gedirik, docker-compose up -d yazırıq. Və biz SSL-in funksionallığını yoxlayırıq. Hər şey uçmalıdır.
Əsas odur ki, Let'sEnctypt sertifikatının 90 gün müddətinə verildiyini unutma və onu əmr vasitəsilə yeniləməlisən. sudo certbot renew
, və sonra komanda ilə layihəni yenidən başladın docker-compose restart
Başqa bir seçim bu ardıcıllığı crontab-a əlavə etməkdir.
Fikrimcə, bu, SSL-i Docker Veb tətbiqinə qoşmağın ən asan yoludur.
P.S. Nəzərə alın ki, mətndə təqdim olunan bütün skriptlər yekun deyil, layihə hazırda dərin inkişaf mərhələsindədir, ona görə də sizdən konfiqurasiyaları tənqid etməməyinizi xahiş edirəm - onlar dəfələrlə dəyişdiriləcək.
Mənbə: www.habr.com