SSL сертификат за веб-апликација Docker

Во оваа статија, сакам да споделам со вас метод за креирање SSL сертификат за вашата веб апликација која работи на Docker, бидејќи ... Не најдов такво решение во делот на Интернет на руски јазик.

SSL сертификат за веб-апликација Docker

Повеќе детали под сечењето.

Имавме docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 и половина литар чист Let'sEncrypt. Не е дека е неопходно да се распореди производството на Docker. Но, штом ќе започнете да го градите Docker, станува тешко да се запре.

Значи, за почеток, ќе ги дадам стандардните поставки - што ги имавме во фазата на dev, т.е. без порта 443 и SSL воопшто:

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 / {
        # 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 минути.

Па, еве ние сме горди сопственици на Let'sEncrypt сертификат за 90 дена, но сега треба да го поставиме на 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.

П.С. Ве молиме имајте предвид дека сите скрипти претставени во текстот не се конечни, проектот сега е во фаза на длабок развој, затоа би сакал да ве замолам да не ги критикувате конфигурациите - тие ќе бидат модифицирани многу пати.

Извор: www.habr.com

Додадете коментар