Docker веб колдонмосу үчүн 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 к жөргөмүш контейнер жана башка эч нерсе жок.

Биринчиден, биз аны серверге орноттук certbot
sudo apt-get install certbot

Андан кийин, биз доменибиз үчүн коймо белги сертификаттарын түздүк

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


аткарылгандан кийин, certbot бизге DNS жөндөөлөрүндө көрсөтүлүшү керек болгон 2 TXT жазуусу менен камсыз кылат.

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


Жана enter басыңыз.

Андан кийин, certbot бул жазуулардын DNSде бар-жогун текшерип, сиз үчүн сертификаттарды түзөт.
эгерде сиз күбөлүк кошкон болсоңуз, бирок certbot аны тапкан жокмун - 5-10 мүнөттөн кийин буйрукту кайра иштетип көрүңүз.

Ооба, бул жерде биз 90 күн бою Let'sEncrypt сертификатынын сыймыктануу ээлерибиз, бирок азыр аны Dockerге жүктөп беришибиз керек.

Бул үчүн, эң жөнөкөй жол менен, docker-compose.yml, nginx бөлүмүндө биз каталогдорду байланыштырабыз.

Мисалы, SSL менен docker-compose.yml

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"

Байланышканбы? Жакшы - уланталы:

Эми биз конфигурацияны өзгөртүүбүз керек жөргөмүш менен иштөө 443 порт жана SSL жалпысынан:

SSL менен main.conf конфигурациясынын мисалы

#
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 Текстте берилген бардык скрипттер акыркы эмес экенин эске алыңыз, долбоор азыр терең иштеп чыгуу стадиясында, андыктан конфигурацияларды сынга албашыңызды суранат элем - алар көп жолу өзгөртүлөт.

Source: www.habr.com

Комментарий кошуу