SSL-certifikat för Docker webbapp

I den här artikeln vill jag dela med dig en metod för att skapa ett SSL-certifikat för din webbapplikation som körs på Docker, eftersom... Jag hittade inte en sådan lösning på den ryskspråkiga delen av Internet.

SSL-certifikat för Docker webbapp

Mer detaljer under klippet.

Vi hade docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 och en pint ren Let'sEncrypt. Det är inte så att det är nödvändigt att distribuera produktion på Docker. Men när du väl börjar bygga Docker blir det svårt att sluta.

Så till att börja med kommer jag att ge standardinställningarna - som vi hade på utvecklingsstadiet, dvs. utan port 443 och SSL i allmänhet:

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

Därefter måste vi faktiskt implementera SSL. För att vara ärlig tillbringade jag cirka 2 timmar på att studera com-zonen. Alla alternativ som erbjuds där är intressanta. Men i det nuvarande skedet av projektet behövde vi (verksamheten) snabbt och pålitligt skruva SSL Let'sEnctypt к nginx container och inget mer.

Först och främst installerade vi det på servern certbot
sudo apt-get install certbot

Därefter genererade vi jokerteckencertifikat för vår domän

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


efter körning kommer certbot att förse oss med 2 TXT-poster som måste specificeras i DNS-inställningarna.

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


Och tryck enter.

Efter detta kommer certbot att kontrollera förekomsten av dessa poster i DNS och skapa certifikat åt dig.
om du har lagt till ett certifikat men certbot hittade det inte - försök starta om kommandot efter 5-10 minuter.

Tja, här är vi de stolta ägarna av ett Let'sEncrypt-certifikat i 90 dagar, men nu måste vi ladda upp det till Docker.

För att göra detta, på det mest triviala sättet, i docker-compose.yml, i nginx-sektionen, länkar vi katalogerna.

Exempel docker-compose.yml med 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"

Länkat? Bra - låt oss fortsätta:

Nu måste vi ändra konfigurationen nginx att arbeta med 443 hamn och SSL allmänt:

Exempel main.conf config med 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;
	}
}

Efter dessa manipulationer går vi faktiskt till katalogen med Docker-compose, skriver docker-compose up -d. Och vi kontrollerar funktionaliteten hos SSL. Allt ska ta fart.

Det viktigaste är att inte glömma att Let'sEnctypt-certifikatet utfärdas i 90 dagar och du måste förnya det genom kommandot sudo certbot renew, och starta sedan om projektet med kommandot docker-compose restart

Ett annat alternativ är att lägga till denna sekvens i crontab.

Enligt min mening är detta det enklaste sättet att ansluta SSL till Docker Web-app.

PS Ta hänsyn till att alla skript som presenteras i texten inte är slutgiltiga, projektet är nu på det djupa utvecklingsstadiet, så jag skulle vilja be dig att inte kritisera konfigurationerna - de kommer att ändras många gånger.

Källa: will.com

Lägg en kommentar