I denne artikkelen vil jeg dele med deg hvordan du oppretter et SSL-sertifikat for ditt web-applikasjon som kjÞrer pÄ Docker, fordi jeg ikke fant en lignende lÞsning i den russisktalende delen av internett.

Les mer under kat.
Vi hadde docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 og en ren installasjon av LetâsEncrypt. Det er ikke nĂždvendigvis nĂždvendig Ă„ sette opp produksjon pĂ„ Docker. Men hvis du har begynt Ă„ bygge med Docker, blir det vanskelig Ă„ stoppe.
SĂ„ fĂžrst vil jeg gi standardinnstillingene â som vi hadde i utviklingsfasen, altsĂ„ uten port 443 og SSL generelt:
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 \/ {
# prĂžv Ă„ levere fil direkte, fall tilbake til 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;
}
Deretter mĂ„ vi implementere SSL. Ărlig talt â jeg studerte com-sonen i omtrent 2 timer. Alle foreslĂ„tte alternativer der er interessante. Men pĂ„ det nĂ„vĂŠrende stadiet av prosjektet, trenger vi (virksomheten) Ă„ raskt og pĂ„litelig fĂ„ pĂ„ plass SSL LetâsEncrypt til nginx til containeren og ikke mer.
FÞrst installerte vi pÄ serveren certbot
sudo apt-get install certbot
Deretter genererte vi wildcard-sertifikatene for vÄr domenet
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
etter Ä ha utfÞrt certbot, vil det gi oss 2 TXT-poster som mÄ angis i DNS-innstillingene.
_acme-challenge.stomup.ru TXT {denNĂžkkelenSomCertBotGavDeg}
Og trykker enter.
Etter dette vil certbot sjekke for disse postene i DNS og opprette sertifikatene for deg.
hvis du la til sertifikatet, men certbot det ikke ble funnet â prĂžv Ă„ kjĂžre kommandoen pĂ„ nytt etter 5-10 minutter..
NĂ„ er vi stolte eiere av et LetâsEncrypt-sertifikat i 90 dager, men nĂ„ mĂ„ vi sette det opp i Docker.
For Ä gjÞre dette, mÄ vi enkelt koble sammen direktiver i docker-compose.yml i nginx-seksjonen.
Eksempel pÄ docker-compose.yml med 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"
Koblet sammen? Supert â vi fortsetter:
NÄ mÄ vi endre konfigurasjonen nginx for Ä jobbe med 443 porten og SSL generelt:
Eksempel pÄ konfigurasjon main.conf med 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;
}
}
Etter disse manipuleringene gÄr vi til katalogen med Docker-compose, skriver docker-compose up -d, og sjekker om SSL fungerer. Alt bÞr komme opp.
Husk at LetâsEncrypt-sertifikatet utstedes i 90 dager, sĂ„ du mĂ„ oppdatere det med kommandoen sudo certbot renew, og deretter starte prosjektet pĂ„ nytt med kommandoen docker-compose restart
Som et alternativ kan du legge til denne sekvensen i crontab.
Etter min mening er dette den enkleste mÄten Ä koble SSL til Docker Web-app.
P.S. VĂŠr oppmerksom pĂ„ at alle skriptene som er presentert i teksten ikke er endelige, prosjektet er for Ăžyeblikket i dyp utvikling, sĂ„ jeg ber dere om ikke Ă„ kritisere konfigurasjonene â de vil bli endret mange ganger.
Kilde: habr.com
