Neste artigo, quero compartilhar com você uma maneira de criar um certificado SSL para seu aplicativo Web Docker, como na parte em russo da Internet - não encontrei uma solução semelhante.

Mais detalhes sob o corte.
Tivemos o docker v.17.05, o docker-compose v.1.21, o Ubuntu Server 18 e um litro de Let'sEncrypt limpo. Não que seja necessário implantar a produção no Docker. Mas se você começou a coletar o Docker, fica difícil parar.Portanto, para começar, darei a você as configurações padrão - que tínhamos no estágio de desenvolvimento, ou seja, sem 443 portas e SSL em geral:
docker-compose.ymlversion: '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; }
Em seguida, precisamos realmente implementar o SSL. Sinceramente - estudei a zona com I da ordem de 2 horas. Todas as opções propostas são interessantes. Mas, no estágio atual do projeto, nós (a empresa) precisávamos rapidamente e confiavelmente
fixar o SSL Let'sEnctypt no contêiner
nginx e não mais.
Primeiro, instalamos o
certbot no servidor
sudo apt-get install certbot
Em seguida, geramos certificados curinga para nosso domínio
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
após a execução, o certbot nos fornecerá 2 registros TXT que precisam ser especificados nas configurações de DNS.
_acme-challenge.stomup.ru TXT {CertBot}
E pressione enter.
Depois disso, o certbot verificará a disponibilidade desses registros no DNS e criará certificados para você.
se você adicionou um certificado, mas o certbot não o encontrou, tente reiniciar o comando após 5 a 10 minutos .
Bem, aqui somos os orgulhosos proprietários do certificado Let'sEncrypt por 90 dias, mas agora precisamos enviá-lo ao Docker.
Para fazer isso, da maneira mais banal, no docker-compose.yml, na seção nginx, vinculamos diretórios.
Exemplo de Docker-compose.yml com 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"
Você ligou? Super - continuar:
Agora precisamos alterar a configuração do
nginx para funcionar com a porta
443 e
SSL em geral:
Exemplo de configuração do Main.conf com 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; } }
Na verdade, depois dessas manipulações - vamos ao diretório com Docker-compose, escrevemos docker-compose up -d. E verificamos a funcionalidade do SSL. Tudo deve decolar.
O principal é não esquecer que o certificado Let'sEnctypt é emitido por 90 dias e você precisará atualizá-lo através do
sudo certbot renew
e, em seguida, reiniciar o projeto com o
docker-compose restart
Como alternativa, adicione esta sequência ao crontab.
Na minha opinião, esta é a maneira mais fácil de conectar SSL ao aplicativo da Web Docker.
PS Por favor, leve em consideração que todos os scripts apresentados no texto não são finais, agora o projeto está no estágio profundo do desenvolvedor, portanto, peço que você não critique os arquivos de configuração - eles serão modificados muitas vezes.