Ubuntu, Let's Encrypt, Docker, Docker Compose, NGINX
В этом руководстве будут описаны инструменты и методы, которые я использовал для размещения моего личного веб-сайта Servesa, а также множество побочных проектов. В этой архитектуре используются бесплатные инструменты с открытым исходным кодом, она может работать на любом облачном провайдере (или может быть распределена между несколькими поставщиками) и может обрабатывать тысячи запросов в минуту.

Хорошие варианты использования
- Разместите несколько приложений на одной виртуальной машине и / или распределите одно приложение по нескольким виртуальным машинам.
- Управляйте несколькими средами, например «Производство», «постановка», «испытание» и т. Д.
- Разместите частную сеть p2p (например, Ethereum)
Обзор
- Настройте сервер: создайте экземпляр виртуальной машины, укажите записи DNS на этом экземпляре и установите сертификаты SSL.
- Определите сеть: определите сеть контейнеров Docker и настройте балансировщик нагрузки, чтобы направлять входящий трафик в нужное приложение.
- Развернуть. Скопируйте конфигурацию сети на сервер и запустите сеть.
- Настройка параметров для локальной разработки: изменение производственной конфигурации для запуска на локальном компьютере.
1. Настройте сервер.
Мы сделаем сервер максимально простым: мы установим Docker, затем установим сертификаты SSL и все. Для начала создайте новую виртуальную машину под управлением Ubuntu и SSH в вашу виртуальную машину.
Установите Docker и Docker Compose
Настройте записи DNS для своего домена и поддоменов
Войдите в свой регистратор домена и добавьте записи DNS, указывающие на публичный IP-адрес вашей виртуальной машины:
- добавить записи A для
*и@ - добавьте записи CNAME для каждого из ваших поддоменов

Установить сертификаты
Установить certbot на сервер. Используйте certbot для запроса сертификатов для вашего домена и субдоменов:
$ certbot --server https://acme-v02.api.letsencrypt.org/directory -d servesa.io --manual --preferred-challenges dns-01 certonly
Certbot сгенерирует ключ проверки. Добавьте в настройки DNS запись TXT с именем «_acme-challenge» и используйте ключ проверки в качестве значения:

Подождите несколько минут, чтобы убедиться, что запись DNS успела обновиться (вы можете проверить свои записи DNS с помощью такого сайта, как What’s My DNS?), А затем нажмите Enter, чтобы продолжить. Certbot проверит связь с вашим DNS, чтобы доказать, что вы управляете доменом, а затем установит сертификаты на /etc/letsencrypt.
Поддомены
Мы повторим процесс, чтобы получить «шаблонный» сертификат, который будет охватывать любой субдомен (обратите внимание, что мы добавили «*.» В начало или в наш домен).
$ certbot --server https://acme-v02.api.letsencrypt.org/directory -d *.servesa.io --manual --preferred-challenges dns-01 certonly
Повторите описанные выше шаги для подтверждения.
Сделанный
Вот и все! Наш сервер готов :)
2. Определите сеть
Вместо того, чтобы запускать наши приложения непосредственно на виртуальной машине, мы будем встраивать наши приложения в образы Docker, а затем подключать приложения к частной сети с помощью Docker Compose. Этот уровень абстракции позволяет легко добавлять новые приложения в сеть, добавлять дополнительные экземпляры существующих приложений, распределять нашу сеть по нескольким виртуальным машинам и т. Д.
Определить услуги
Сервис Docker Compose отвечает за управление докер-контейнером. Мы будем использовать файл конфигурации Docker Compose (docker-compose.yml), чтобы определить каждую из служб, которые будут работать в нашей сети: службу для каждого веб-сайта, службу, которая будет запускать базу данных, и балансировщик нагрузки ( Nginx) для направления входящего трафика на соответствующий сервис.
Настроить NGINX
Docker может разрешать IP-адреса приложений в нашей частной сети, используя имя службы. Балансировщик нагрузки, NGINX (произносится как «двигатель-X»), использует эту функцию для направления трафика в соответствующее приложение. Примечательные особенности конфигурации servea.io:
- направлять трафик для каждого поддомена на нужный сервис (строки 83–100)
- перенаправлять любой трафик, не являющийся https, на https (строки 61-67)
- перенаправить www на базовый домен (строки 69-81)
- отформатируйте журналы, чтобы в них было больше полезной информации (строки 39-44)
Также следует отметить, что NGINX (который работает внутри контейнера Docker) нуждается в доступе к нашим файлам сертификатов (которые установлены на нашей виртуальной машине). Вот как мы делаем файлы доступными для контейнера:
- Когда мы настраиваем наш сервер, certbot установил наши сертификаты в
/etc/letsencrypt/ - Наш
nginx.confдает указание NGINX искать сертификаты в/etc/letsencrypt/(строки 87–89) - Наш
docker-compose.ymlиспользует директиву volume для сопоставления каталога/etc/letsencrypt/на виртуальной машине с каталогом/etc/letsencrypt/внутри контейнера (строки 48–51).
Вы можете разместить свои сертификаты в любом каталоге на виртуальной машине, но вам нужно будет синхронизировать эти настройки.
3. Развернуть
Перенести конфигурацию в Github; Получите конфигурацию из Github
Отправьте свою конфигурацию в репозиторий Github. Затем подключитесь к вашей виртуальной машине по SSH и создайте новый каталог. Создайте репозиторий git и загрузите свою конфигурацию из Github:
$ mkdir /etc/servesa && cd /etc/servesa $ git init $ git remote add origin http://github.com/magrelo/servesa-compose $ git pull origin master
Запуск!
При наличии всей конфигурации нам просто нужно загрузить наши образы докеров и запустить все службы в нашей сети. Эта команда будет делать и то, и другое:
$ docker-compose up -d
Используйте команду ps, чтобы увидеть статус служб:
$ docker-compose ps
См. Справочник по Docker Compose для получения информации о других полезных командах.
4. Настройте локальную разработку.
Большинство наших сервисов будут работать одинаково независимо от того, работаем ли мы на локальном компьютере или на сервере (отлично!). Исключением является наш балансировщик нагрузки NGINX, потому что URL-адреса на вашем локальном компьютере работают иначе.

В производстве мы используем поддомен, чтобы направлять входящий трафик в нужную службу, например, https://midi.servesa.io будет направлен в службу midi, а https://garden.servesa.io будет направлен в службу сад. Однако ваш локальный компьютер не поддерживает субдомены, он обслуживает веб-страницы по адресу http://localhost и не имеет сертификатов SSL (https). Итак, мы создадим отдельную конфигурацию NGINX для использования на локальном компьютере и изменим конфигурацию, чтобы использовать порт для направления трафика к каждой службе:

Наконец, нам понадобится способ указать docker-compose использовать локальную конфигурацию при локальной разработке. Мы можем создать еще один файл docker-compose с именем docker-compose.override.yml, который переопределит нашу производственную конфигурацию нашей конфигурацией разработки (я переименовываю файл, чтобы docker-compose не видел его в производственной среде, а затем переименовал его обратно на моем локальном компьютере, когда Хочу использовать).
Спасибо! Исходные файлы: Docker Compose config, домашняя страница servea.io, все образы Docker. Напишите мне в Twitter: Мэтт Лован.