Di vê gotarê de, ez dixwazim bi we re rêbazek ji bo afirandina sertîfîkayek SSL-ê ji bo serîlêdana weya webê ya ku li ser Docker-ê tê xebitandin bi we re parve bikim, ji ber ... Min di beşa Înternetê ya bi zimanê rûsî de çareseriyek wusa nedît.
Zêdetir hûrgulî di bin qutbûnê de.
Me docker v.17.05, docker-compose v.1.21, Servera Ubuntu 18 û pincek Let'sEncrypt paqij bû. Ne ew e ku pêdivî ye ku hilberîna li ser Docker were bicîh kirin. Lê gava ku hûn dest bi avakirina Docker-ê dikin, rawestandina wê dijwar dibe.
Ji ber vê yekê, ji bo destpêkê, ez ê mîhengên standard bidim - yên ku me di qonaxa dev de hebûn, ango. bêyî porta 443 û SSL bi gelemperî:
docker-berhevkirin.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;
}
Dûv re, em bi rastî hewce ne ku SSL bicîh bikin. Bi rastî, min nêzîkî 2 saetan li ser com zone xwendin. Hemî vebijarkên ku li wir têne pêşkêş kirin balkêş in. Lê di qonaxa heyî ya projeyê de, me (karsaz) hewce bû ku zû û pêbawer bişewitînin SSL Let'sEnctypt к nginx konteynir û ne tiştek din.
Berî her tiştî, me ew li ser serverê saz kir certbot
sudo apt-get install certbot
Dûv re, me ji bo domaina xwe sertîfîkayên wildcard çêkirin
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
piştî darvekirinê, certbot dê 2 tomarên TXT yên ku divê di mîhengên DNS de bêne diyar kirin peyda bike.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
Û Enter bikirtînin.
Piştî vê yekê, certbot dê hebûna van tomaran di DNS-ê de kontrol bike û ji we re sertîfîkayan biafirîne.
heke we belgeyek lê zêde kiribe certbot ew nedît - biceribînin ku piştî 5-10 hûrdeman fermanê ji nû ve bidin destpêkirin.
Welê, li vir em xwediyên serbilind ên sertîfîkayek Let'sEncrypt 90 rojan in, lê naha pêdivî ye ku em wê li Docker bar bikin.
Ji bo vê yekê, bi awayê herî piçûk, di docker-compose.yml de, di beşa nginx de, em peldankan girêdidin.
Mînak docker-compose.yml bi 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"
Girêdayî? Baş e - em berdewam bikin:
Naha divê em konfigurasyonê biguherînin nginx bi kar bikin 443 bender û SSL giştîve:
Mînak main.conf veavakirina bi 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;
}
}
Bi rastî, piştî van manipulasyonan, em bi Docker-compose diçin pelrêça, docker-compose up -d dinivîsin. Û em fonksiyona SSL-ê kontrol dikin. Divê her tişt jê derkeve.
Ya sereke ev e ku hûn ji bîr nekin ku sertîfîkaya Let'sEnctypt 90 rojan tê derxistin û hûn ê hewce bikin ku wê bi fermanê nû bikin. sudo certbot renew
, û paşê bi fermanê projeyê ji nû ve bidin destpêkirin docker-compose restart
Vebijêrkek din ev e ku hûn vê rêzikê li crontab zêde bikin.
Bi dîtina min ev awayê herî hêsan e ku hûn SSL bi Docker Web-app ve girêdin.
PS Ji kerema xwe bihesibînin ku hemî nivîsarên ku di nivîsê de têne pêşkêş kirin ne dawîn in, proje naha di qonaxa Dev ya kûr de ye, ji ber vê yekê ez dixwazim ji we bipirsim ku hûn konfigurasyonan rexne nekin - ew ê gelek caran werin guheztin.
Source: www.habr.com