Docker veb tətbiqi üçün SSL sertifikatı

Bu yazıda mən sizinlə Docker-də işləyən veb tətbiqiniz üçün SSL sertifikatı yaratmaq üsulunu bölüşmək istəyirəm, çünki... İnternetin rusdilli hissəsində belə bir həll tapmadım.

Docker veb tətbiqi üçün SSL sertifikatı

Daha çox məlumat kəsik altında.

Bizdə docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 və bir pint təmiz Let'sEncrypt var idi. Docker-də istehsalı yerləşdirmək lazım deyil. Ancaq Docker-i qurmağa başladıqdan sonra dayandırmaq çətinləşir.

Beləliklə, başlamaq üçün standart parametrləri verəcəyəm - inkişaf mərhələsində bizdə olan, yəni. port 443 və ümumiyyətlə SSL olmadan:

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;
}

Sonra, əslində SSL tətbiq etməliyik. Düzünü desəm, com zonasını öyrənməyə 2 saata yaxın vaxt sərf etdim. Orada təklif olunan bütün variantlar maraqlıdır. Ancaq layihənin hazırkı mərhələsində bizə (biznes) tez və etibarlı şəkildə vida etmək lazım idi SSL Let'sEnctypt к nginx konteyner və başqa heç nə.

Əvvəlcə onu serverə quraşdırdıq sertifikat
sudo apt-get install certbot

Sonra, biz domenimiz üçün joker sertifikatlar yaratdıq

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


icra edildikdən sonra certbot bizə DNS parametrlərində göstərilməli olan 2 TXT qeydini təqdim edəcək.

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


Və enter düyməsini basın.

Bundan sonra certbot bu qeydlərin DNS-də olub-olmadığını yoxlayacaq və sizin üçün sertifikatlar yaradacaq.
sertifikat əlavə etmisinizsə, lakin sertifikat tapmadı - 5-10 dəqiqədən sonra əmri yenidən başladın.

Yaxşı, biz 90 gün ərzində Let'sEncrypt sertifikatının fəxri sahibləriyik, lakin indi onu Docker-ə yükləməliyik.

Bunun üçün ən mənasız şəkildə docker-compose.yml-də nginx bölməsində kataloqları əlaqələndiririk.

SSL ilə docker-compose.yml nümunəsi

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"

Əlaqələndirildi? Əla - davam edək:

İndi konfiqurasiyanı dəyişdirməliyik nginx ilə işləmək 443 port və SSL ümumiyyətlə:

SSL ilə main.conf konfiqurasiyasına nümunə

#
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;
	}
}

Əslində bu manipulyasiyalardan sonra Docker-compose ilə qovluğa gedirik, docker-compose up -d yazırıq. Və biz SSL-in funksionallığını yoxlayırıq. Hər şey uçmalıdır.

Əsas odur ki, Let'sEnctypt sertifikatının 90 gün müddətinə verildiyini unutma və onu əmr vasitəsilə yeniləməlisən. sudo certbot renew, və sonra komanda ilə layihəni yenidən başladın docker-compose restart

Başqa bir seçim bu ardıcıllığı crontab-a əlavə etməkdir.

Fikrimcə, bu, SSL-i Docker Veb tətbiqinə qoşmağın ən asan yoludur.

P.S. Nəzərə alın ki, mətndə təqdim olunan bütün skriptlər yekun deyil, layihə hazırda dərin inkişaf mərhələsindədir, ona görə də sizdən konfiqurasiyaları tənqid etməməyinizi xahiş edirəm - onlar dəfələrlə dəyişdiriləcək.

Mənbə: www.habr.com

Добавить комментарий