SSL certificate alang sa Docker web-app

Niini nga artikulo, gusto nakong ipaambit kanimo ang usa ka pamaagi sa paghimo og SSL certificate para sa imong web application nga nagdagan sa Docker, tungod kay... Wala koy nakit-an nga solusyon sa Russian nga pinulongan nga bahin sa Internet.

SSL certificate alang sa Docker web-app

Dugang nga mga detalye ubos sa pagputol.

Kami adunay docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 ug usa ka pint nga puro Let'sEncrypt. Dili kini kinahanglan nga i-deploy ang produksiyon sa Docker. Apan sa higayon nga magsugod ka sa pagtukod sa Docker, mahimong lisud ang paghunong.

Mao nga, sa pagsugod, ihatag nako ang mga sumbanan nga setting - nga naa namo sa yugto sa dev, i.e. walay port 443 ug SSL sa kinatibuk-an:

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

Sunod, kinahanglan gyud natong ipatuman ang SSL. To be honest, mga 2 hours ko nag study sa com zone. Ang tanan nga mga kapilian nga gitanyag didto makapaikag. Apan sa karon nga yugto sa proyekto, kinahanglan namon (ang negosyo) nga dali ug kasaligan nga mag-screw SSL Let'sEnctypt ΠΊ nginx sudlanan ug wala nay lain pa.

Una sa tanan, among gi-install kini sa server certbot
sudo apt-get install certbot

Sunod, nakamugna mi og wildcard nga mga sertipiko para sa among domain

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


pagkahuman sa pagpatay, ang certbot maghatag kanamo sa 2 nga mga rekord sa TXT nga kinahanglan itakda sa mga setting sa DNS.

_acme-challenge.stomup.ru TXT {Ρ‚ΠΎΡ‚ΠšΠ»ΡŽΡ‡ΠšΠΎΡ‚ΠΎΡ€Ρ‹ΠΉΠ’Π°ΠΌΠ’Ρ‹Π΄Π°Π»CertBot}


Ug pindota ang enter.

Pagkahuman niini, susihon sa certbot ang presensya sa kini nga mga rekord sa DNS ug maghimo mga sertipiko alang kanimo.
kung nakadugang ka ug sertipiko apan certbot wala kini nakit-an - sulayi i-restart ang mando pagkahuman sa 5-10 minuto.

Aw, ania kami mga mapahitas-on nga tag-iya sa usa ka Let'sEncrypt nga sertipiko sa 90 ka adlaw, apan karon kinahanglan namon nga i-upload kini sa Docker.

Aron mahimo kini, sa labing gamay nga paagi, sa docker-compose.yml, sa seksyon sa nginx, gisumpay namon ang mga direktoryo.

Pananglitan docker-compose.yml uban sa 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"

Gisumpay? Nindot - magpadayon kita:

Karon kinahanglan namong usbon ang config nginx sa pagtrabaho uban sa 443 port ug SSL kasagaran:

Pananglitan sa main.conf config nga adunay 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;
	}
}

Sa tinuud, pagkahuman sa kini nga mga manipulasyon, moadto kami sa direktoryo nga adunay Docker-compose, isulat ang docker-compose up -d. Ug among gisusi ang pagpaandar sa SSL. Ang tanan kinahanglan nga makuha.

Ang panguna nga butang mao nga dili kalimtan nga ang sertipiko sa Let'sEnctypt gi-isyu sa 90 ka adlaw ug kinahanglan nimo nga bag-ohon kini pinaagi sa mando. sudo certbot renew, ug dayon i-restart ang proyekto gamit ang command docker-compose restart

Ang laing kapilian mao ang pagdugang niini nga han-ay sa crontab.

Sa akong opinyon kini ang labing kadali nga paagi sa pagkonektar sa SSL sa Docker Web-app.

PS Palihug hunahunaa nga ang tanan nga mga script nga gipresentar sa teksto dili katapusan, ang proyekto naa na sa lawom nga yugto sa Dev, mao nga gusto nako nga hangyoon ka nga dili sawayon ang mga config - kini usbon sa daghang mga higayon.

Source: www.habr.com

Idugang sa usa ka comment