Docker web-app üçün SSL sertifikatı

Bu məqalədə mən sizə Docker-də işləyən veb tətbiqiniz üçün SSL sertifikatı yaratma üsulunu paylaşmaq istəyirəm, çünki rusdilli internetdə belə bir həll tapmadım.

Docker web-app üçün SSL sertifikatı

Daha çox məlumat üçün keçidin altında.

Bizim docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 və təmiz Let’sEncrypt vardı. Docker-da istehsal mühitini yaratmaq mütləq lazım deyil. Ancaq Docker toplamaya başladıysanız, dayandırmaq çətindir.

Beləliklə, əvvəlcə dev mərhələsində, yəni 443 portu olmadan olan standart parametrləri qeyd edəcəyəm, SSL ümumilikdə:

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 \/ {
        # faylı birbaşa təqdim etməyə çalış, index.php-yə geri dön
        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, biz SSL-i tətbiq etməliyik. Düzünü desəm — .com zonasını təxminən 2 saat araşdırdım. Orada təqdim olunan bütün variantlar maraqlıdır. Ancaq layihənin hazırkı mərhələsində, bizə (biznesə) sürətlə və etibarlı şəkildə SSL Let’sEnctypt üçün nginx konteynerə əlavə etmək lazım idi.

İlk növbədə, serverdə quraşdırdıq variantlardan ACME müştərisini WinACME-də dayandırdım.
sudo apt-get install certbot

Sonra biz wild card sertifikatlarını yaratdıq alan adınız için

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


certbot icrasından sonra, sizə DNS parametrlərində göstərməli olduğunuz 2 TXT qeydi təqdim olunacaq.

_acme-challenge.stomup.ru TXT {səninCertBot tərəfindən verilmişAçar}


Və enter düyməsini basırıq.

Sonra certbot bu qeydlərin DNS-də olub-olmadığını yoxlayacaq və sizin üçün sertifikatları yaradacaq.
əgər sertifikatı əlavə etmisinizsə, lakin variantlardan ACME müştərisini WinACME-də dayandırdım. onu tapmayıbsa — 5-10 dəqiqədən sonra bu əmri təkrar yerinə yetirməyə çalışın..

Bəli, indi biz 90 günlük Let’sEncrypt sertifikatına sahibik, ancaq indi bunu Docker-da təsdiq etməliyik.

Bunun için, docker-compose.yml dosyasında, nginx bölümünde dizinleri bağlıyoruz.

SSL ile docker-compose.yml örneği

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"

Bağlantıları kurdunuz mu? Harika—devam edelim:

Şimdi yapılandırmayı değiştirmemiz gerekiyor nginx port ile 443 ve SSL ümumilikdə:

SSL ile main.conf yapılandırma örneği

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

Aslında bu işlemlerden sonra — Docker-compose dizinine gidiyoruz, docker-compose up -d yazıyoruz. Ve SSL'in çalışıp çalışmadığını kontrol ediyoruz. Her şeyin çalışması lazım.

Unutmayın ki Let’sEncrypt sertifikası 90 gün süreyle verilmektedir ve bunu güncellemek için sudo certbot renewkomutunu kullanmanız gerekecek, ardından projeyi şu komutla yeniden başlatmalısınız: docker-compose restart

Alternatif olarak, bu sırayı crontab'a ekleyebilirsiniz.

Bana göre, Docker Web-app'e SSL bağlamanın en basit yolu budur.

P.S. Lütfen metindeki tüm betiklerin kesin olmadığını dikkate alın — proje hala derin bir geliştirme aşamasında, bu nedenle yapılandırmalara çok eleştirel yaklaşmanızı istemiyorum — bunlar daha birçok kez değiştirilecektir.

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster