SSL certifikát pro Docker webovou aplikaci

V tomto článku se s vámi chci podělit o způsob vytvoření SSL certifikátu pro vaši webovou aplikaci běžící na Dockeru, protože v české části internetu jsem takové řešení nenašel.

SSL certifikát pro Docker webovou aplikaci

Další informace naleznete níže.

Měli jsme docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 a kontejner s čistým Let’sEncrypt. Není nutné nasazovat produkční prostředí na Docker, ale jakmile začnete používat Docker, je těžké přestat.

Takže začnu standardními nastaveními, která jsme měli ve fázi vývoje, tedy bez portu 443 a SSL celkově:

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 \/ {
        # pokusit se přímo poskytnout soubor, jako fallback použít 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ále je třeba implementovat SSL. Upřímně řečeno, studoval jsem zónu com asi 2 hodiny. Všechny navrhované varianty jsou zajímavé. Ale v této fázi projektu jsme (podnik) potřebovali rychle a spolehlivě implementovat SSL Let’sEncrypt k nginx do kontejneru a nic víc.

Nejprve jsme na server nainstalovali certbot
sudo apt-get install certbot

Poté jsme vygenerovali wildcard certifikáty pro náš domény

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


po spuštění certbot poskytne 2 TXT záznamy, které je třeba uvést v nastavení DNS.

_acme-challenge.stomup.ru TXT {tenKlicKteryVamVydalCertBot}


A stiskneme enter.

Poté certbot zkontroluje tyto záznamy v DNS a vytvoří pro vás certifikáty.
pokud jste přidali certifikát, ale certbot nebyl nalezen — zkuste znovu spustit příkaz za 5-10 minut.

Takže teď jsme hrdými vlastníky Let’sEncrypt certifikátu na 90 dní, ale nyní ho musíme dostat do Dockeru.

Pro tento účel jednoduše v docker-compose.yml, v sekci nginx — propojujeme adresáře.

Příklad docker-compose.yml s 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"

Propojili jsme? Skvělé — pokračujeme:

Teď musíme upravit konfiguraci nginx pro práci s 443 portem a SSL celkově:

Příklad konfiguračního souboru main.conf s 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;
	}
}

Po těchto manipulacích jdeme do adresáře s Docker-compose, píšeme docker-compose up -d. A ověřujeme funkčnost SSL. Mělo by to vše fungovat.

Hlavně nezapomínejte, že certifikát Let’sEncrypt se vydává na 90 dní a budete ho muset obnovit pomocí příkazu sudo certbot renew, a poté restartovat projekt příkazem docker-compose restart

Jako variantu — přidat tuto sekvenci do crontabu.

Podle mého názoru je to nejjednodušší způsob, jak připojit SSL k Docker Web-app.

P.S. Prosím vezměte na vědomí, že všechny skripty uvedené v textu nejsou konečné, projekt je nyní v hluboké fázi vývoje, proto vás prosím, abyste nekritizovali konfigurace — ty se budou ještě mnohokrát měnit.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster