Certificado SSL para aplicativo web Docker

Neste artigo, quero compartilhar com vocês uma maneira de criar um certificado SSL para seu aplicativo da web que está funcionando no Docker, pois na parte de língua russa da internet — não encontrei uma solução semelhante.

Certificado SSL para aplicativo web Docker

Saiba mais abaixo.

Estávamos com o docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 e uma pitada de Let’s Encrypt. Não é que seja absolutamente necessário implementar a produção no Docker. Mas uma vez que você começa a montar Docker, torna-se difícil parar.

Então, para começar, apresentarei as configurações padrão — que tínhamos na etapa de desenvolvimento, ou seja, sem a porta 443 e SSL em geral:

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 \/ {
        # tente servir o arquivo diretamente, fallback para 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 implementar SSL. Para ser honesto, estudei a zona com cerca de duas horas. Todas as opções propostas lá são interessantes. Mas neste momento do projeto, nós (o negócio) precisávamos rapidamente e de maneira confiável anexar SSL Let’s Encrypt para nginx ao container e nada mais.

Primeiramente, instalamos no servidor certbot
sudo apt-get install certbot

Em seguida, geramos certificados wildcard para nosso de domínio

sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns


após executar o certbot, ele fornecerá 2 registros TXT que devem ser especificados nas configurações DNS.

_acme-challenge.stomup.ru TXT {aChaveQueCertBotTeDeu}


E pressionamos enter.

Depois disso, o certbot verificará a existência desses registros no DNS e criará os certificados para você.
se você adicionou o certificado, mas certbot não o encontrou — tente reiniciar o comando em 5-10 minutos..

E aqui estamos, orgulhosos possuidores de um certificado Let’s Encrypt por 90 dias, mas agora precisamos integrá-lo ao Docker.

Para isso, de maneira bem simples, no arquivo docker-compose.yml, na seção nginx, vinculamos os 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"

Conectamos? Ótimo — vamos continuar:

Agora precisamos alterar a configuração nginx para trabalhar com 443 a porta e SSL em geral:

Exemplo de configuração 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;
	}
}

Após essas manobras, vamos para o diretório do Docker-compose, digitamos docker-compose up -d. E verificamos a funcionalidade do SSL. Tudo deve funcionar.

Lembre-se de que o certificado Let’sEncrypt é emitido por 90 dias e será necessário renová-lo com o comando sudo certbot renew, e depois reinicie o projeto com o comando docker-compose restart

Como alternativa, adicione essa sequência no crontab.

Na minha opinião, essa é a maneira mais simples de conectar o SSL a uma aplicação web Docker.

P.S. Por favor, leve em conta que todos os scripts apresentados no texto não são definitivos, o projeto está em uma fase de desenvolvimento profundo, por isso, peço que não critiquem as configurações - elas ainda passarão por muitas alterações.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster