SSL Zertifikat fir Docker Web-App

An dësem Artikel wëll ech mat Iech eng Method deelen fir en SSL Zertifika fir Är Webapplikatioun op Docker ze kreéieren, well ... Ech hunn net sou eng Léisung am russeschsproochegen Deel vum Internet fonnt.

SSL Zertifikat fir Docker Web-App

Méi Detailer ënner dem Schnëtt.

Mir haten docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 an e Patt pure Let'sEncrypt. Et ass net datt et néideg ass Produktioun op Docker z'installéieren. Awer wann Dir ufänkt Docker ze bauen, gëtt et schwéier ze stoppen.

Also, fir unzefänken, ginn ech d'Standardastellungen - déi mir an der Dev-Bühn haten, d.h. ouni Port 443 an SSL am Allgemengen:

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

Als nächst musse mir tatsächlech SSL implementéieren. Fir éierlech ze sinn, hunn ech ongeféier 2 Stonnen d'Com Zone studéiert. All d'Optiounen déi do ugebuede ginn sinn interessant. Awer an der aktueller Etapp vum Projet hu mir (d'Geschäft) gebraucht fir séier an zouverlässeg ze schrauwen SSL Let'sEnctypt к nginx Container an näischt méi.

Als éischt hu mir et um Server installéiert certbot
sudo apt-get install certbot

Als nächst hu mir Wildcard Zertifikater fir eis Domain generéiert

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


no Ausféierung, certbot gëtt eis mat 2 TXT records datt an der DNS Astellunge spezifizéiert ginn muss.

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


An dréckt Enter.

Duerno wäert certbot fir d'Präsenz vun dësen Opzeechnungen an DNS iwwerpréift a Certificaten fir Iech erstellen.
wann Dir e Certificat dobäi hunn ma certbot hunn et net fonnt - probéiert de Kommando no 5-10 Minutten nei ze starten.

Gutt, hei si mir déi houfreg Besëtzer vun engem Let'sEncrypt Zertifikat fir 90 Deeg, awer elo musse mir et op Docker eroplueden.

Fir dëst ze maachen, op déi trivialst Manéier, an docker-compose.yml, an der nginx Sektioun, verbannen mir d'Verzeichnisser.

Beispill docker-compose.yml mat 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"

Verlinkt? Super - loosst eis weidergoen:

Elo musse mir d'Konfiguratioun änneren nginx mat ze schaffen 443 port an SSL allgemeng:

Beispill main.conf config mat 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;
	}
}

Eigentlech, no dëse Manipulatiounen, gi mir an den Dossier mat Docker-compose, schreiwen docker-compose up -d. A mir kontrolléieren d'Funktionalitéit vum SSL. Alles soll ofhuelen.

Den Haapt Saach ass net ze vergiessen datt de Let'sEnctypt Zertifika fir 90 Deeg ausgestallt gëtt an Dir musst et duerch de Kommando erneieren sudo certbot renew, an dann de Projet mat dem Kommando nei starten docker-compose restart

Eng aner Optioun ass dës Sequenz op crontab ze addéieren.

Menger Meenung no ass dëst deen einfachste Wee fir SSL mat Docker Web-App ze verbannen.

PS Huelt w.e.g. un datt all d'Skripten, déi am Text presentéiert ginn, net final sinn, de Projet ass elo an der déiwer Dev-Bühn, also wëll ech Iech froen, d'Konfiguratiounen net ze kritiséieren - si gi vill Mol geännert.

Source: will.com

Setzt e Commentaire