Делаем HTTPS сайтик с помощью Nginx + Docker Compose + Let’s Encrypt

Привет! Думаю, в последние 2 года каждый из нас испытал на себе тренд ухода в HTTPS. Про это говорят все: на конференциях, в подкастах и блогах. Причин несколько. Во-первых, тема сесурити стала сильно актуальнее, чем раньше, из-за многочисленных взломов. Во-вторых, появились бесплатные SSL/TLS Certificates. Давайте тогда же посмотрим, как просто прикрутить сертификат ко своему сайту?

Начнём попорядку. Есть сайт (и одноименная организация) — Let’s Encrypt. По итогам 2017 года, это самый крупный SSL регистратор. Он выдал огромное количество сертов. Ещё бы, ведь они бесплатны! То есть, мы будем получать свой сертификат тут.

Есть одна проблема: Let’s Encrypt выдаёт сертификаты лишь только на 3 месяца. А ведь это так утомительно продлять сертификаты, а если ещё и доменов много — то це біда. К счастью для нас, был разработан умный, интелектуальный бот — https://certbot.eff.org/, который будет жить с нами и сам, когда прийдёт время (например, раз в месяц) будет ходить и продлять сертификат. Вам даже делать ничего не прийдётся.

Остаётся понять, как же это всё дело скрестить. Ведь тут тебе и боты, и сертификаты, и nginx, и докеры, и шмокеры, и композы. Мутное дело, сразу видно. Но ясен красен за нас уже всё сделано. Корневая вещь, которая создана — это специальный контейнер для ЛетсЭнкрипта — https://hub.docker.com/r/jrcs/letsencrypt-nginx-proxy-companion/. Этот контейнер позволяет использовать Nginx в качестве прокси, а сам он будет отвечать за регистрацию и продление сертификатов.

Теперь нам надо всё это дело подружить с docker-compose. На самом деле, у letsencrypt-nginx-proxy-companion много документации и примеров, как это можно сделать. Лично мне понравился этот пример — https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion.

Быстрый старт

Первое, что вы должны сделать — это clone проекта — https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion. Из этого проекта нам понадобяться следующие файлы:

  • .env
  • run.sh
  • docker-compose.yml

Конечно же, в docker-compose.yml требуется добавить свои сервисы, которые вам нужны. Например так может выглядить итоговый композ-конфиг с одним бизнес-сервисом (контейнер gateway):

Далее вам требуется немного поменять параметры окружения в .env. Итоговая версия файла может выглядить так:

После этого вам нужно закинуть ваши исходники, а также эти 3 файла: .env, docker-compose.yml и run.sh (логично предположить, что они будут лежать в коне вашего git-проекта) на сервер.

Далее, всё, что вам остаётся сделать — это запустить run.sh. Он сделает пару очевидных вещей: создаст сетку, получит актуальный шаблон для Nginx с гитхаба (если вы параноик, закэшиуйрте локально nginx.tmpl и убирите сетевой вызов в гитхаб), а также запустит ваш docker-compose.

Важно, что первый запуск у вас займёт порядка 5 минут. Ведь именно в этот момент времени вы будете получать сертификат.

К чему мы пришли?

У вас есть домен, защищенный сертификатом. Серт будет автоматически обновляться. При попытке открыть сайт по http, будет выполняться редирект на https (HTTP 301). Все статические ресурсы — css, js, images — доступны только по https.

С точки зрения инфраструктуры тут следующее решение. Есть прокси — nginx, который слушает на 80 и 443. Есть ваши бизнесовые контейнеры — например, «сайты». Каждый из них должен экспозить 80-й порт. 443-й порт экспозить не требуется. Других изменений энвайронмента тут не произошло.

Категории: Программирование