Шаҳодатномаи SSL барои веб-барномаи Docker

Дар ин мақола, ман мехоҳам бо шумо усули эҷоди сертификати SSL барои барномаи веби шумо, ки дар Docker кор мекунад, мубодила кунам, зеро... Ман дар қисми русизабони интернет чунин ҳалли худро наёфтам.

Шаҳодатномаи SSL барои веб-барномаи Docker

Тафсилоти бештар дар зери бурида.

Мо докер v.17.05, docker-compose v.1.21, Ubuntu Server 18 ва як пинти холис Let'sEncrypt доштем. Ин барои ҷойгиркунии истеҳсолот дар Docker зарур нест. Аммо вақте ки шумо ба сохтани Docker шурӯъ мекунед, боздоштан душвор мешавад.

Ҳамин тавр, барои оғоз, ман танзимоти стандартиро медиҳам - ки мо дар марҳилаи таҳия доштем, яъне. бе порти 443 ва умуман SSL:

Доктор-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 / {
        # 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;
}

Баъдан, мо воқеан бояд SSL-ро татбиқ кунем. Рости гап, ман тақрибан 2 соат барои омӯзиши ком зон сарф кардам. Ҳама вариантҳои пешниҳодшуда ҷолибанд. Аммо дар марҳилаи кунунии лоиҳа ба мо (бизнес) лозим буд, ки зуд ва боэътимод кор кунем SSL Let'sEnctypt к nginx контейнер ва чизи дигар.

Пеш аз ҳама, мо онро дар сервер насб кардем сертификат
sudo apt-get install certbot

Баъдан, мо барои домени худ шаҳодатномаҳои ваҳшӣ тавлид кардем

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


пас аз иҷро, certbot ба мо 2 сабти TXT медиҳад, ки бояд дар танзимоти DNS нишон дода шаванд.

_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}


Ва enter-ро пахш кунед.

Пас аз ин, certbot мавҷудияти ин сабтҳоро дар DNS тафтиш мекунад ва барои шумо сертификатҳо эҷод мекунад.
агар шумо шаҳодатнома илова карда бошед, аммо сертификат онро наёфт - кӯшиш кунед, ки фармонро пас аз 5-10 дақиқа аз нав оғоз кунед.

Хуб, мо дар тӯли 90 рӯз соҳиби ифтихори сертификати Let'sEncrypt ҳастем, аммо ҳоло мо бояд онро ба Docker бор кунем.

Барои ин, ба таври ночиз, дар docker-compose.yml, дар бахши nginx, мо директорияҳоро пайваст мекунем.

Намунаи docker-compose.yml бо 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"

пайваст? Аҷоиб - биёед идома диҳем:

Акнун мо бояд конфигуратсияро тағир диҳем nginx бо кор кардан 443 порт ва SSL умуман:

Намунаи конфигуратсияи main.conf бо 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;
	}
}

Воқеан, пас аз ин манипуляцияҳо, мо ба директория бо Docker-compose меравем, docker-compose up -d менависем. Ва мо функсияи SSL-ро тафтиш мекунем. Ҳама чиз бояд барояд.

Муҳим он аст, ки фаромӯш накунед, ки шаҳодатномаи Let'sEnctypt барои 90 рӯз дода мешавад ва шумо бояд онро тавассути фармон нав кунед. sudo certbot renew, ва он гоҳ лоиҳаро бо фармон аз нав оғоз кунед docker-compose restart

Варианти дигар ин аст, ки ин пайдарпай ба crontab илова кунед.

Ба андешаи ман, ин роҳи осонтарини пайваст кардани SSL ба Docker Web-барнома аст.

PS Лутфан ба назар гиред, ки ҳама скриптҳои дар матн пешниҳодшуда ниҳоӣ нестанд, лоиҳа ҳоло дар марҳилаи амиқи Dev қарор дорад, бинобар ин ман мехоҳам аз шумо хоҳиш кунам, ки конфигуратсияҳоро танқид накунед - онҳо борҳо тағир дода мешаванд.

Манбаъ: will.com

Илова Эзоҳ