Этот блог работает внутри Docker контейнера и использует Traefik в качестве reverse proxy для Ghost. Недавно вышла версия v2.0, в которой были изменены некоторые фундаментальные особенности, что требует переконфигурации trafik.toml, acme.json и docker-compose.yml
У Traefik есть официальная инструкция по обновлению, и то ли я дурак, то ли ее стоит доработать, но факт в том, что после получаса вкуривания заново все настроить для меня было гораздо проще и полезнее
Задача
Нашей задачей является настройка Traefik так, чтобы прицепить к нему всего один сайт-сервис (в нашем случае на Ghost CMS), который будет работать через SSL
Из всех функциональных способностей Traefik я использую лишь генерацию LetsEncrypt сертификатов. Балансировщик, метрики, dashboard и middleware а-ля ограничение запросов мне не нужны
В следующих конфигах нужно быть очень внимательным, поскольку никаких параметров а-ля
entryPoints.name = insecure
нет. Названия компонентов и настроек являются частью названия самой переменной: entryPoints. insecure.address = ":80" как пример, в следующем конфиге
traefik.toml
Это файл статической конфигурации. В нем указываются базовые настройки самого Traefik, а не того, как он будет обрабатывать сервисы
[global]
checkNewVersion = true
sendAnonymousUsage = true
[entryPoints]
[entryPoints.insecure]
address = ":80"
[entryPoints.secure]
address = ":443"
[providers]
[providers.docker]
endpoint = "unix:///var/run/docker.sock"
exposedByDefault = false
[log]
level = "WARNING"
[certificatesResolvers]
[certificatesResolvers.default]
[certificatesResolvers.default.acme]
email = "email@example.com"
storage = "acme.json"
[certificatesResolvers.default.acme.httpChallenge]
entryPoint = "insecure"
Обратите внимание на providers.docker.exposedByDefault = false
. Если у вас на хосте запущено множество сервисов, то без этого Traefik попытается автоматически подхватить и подстроиться под все. С этим он будет цеплять только те, у которых в docker-compose.yml
будет label traefik.enable=true
Также заметьте названия entryPoint'ов (insecure
, secure
) и название certificatesResolvers
(default
), которые будут использованы в следующем файле
docker-compose.yml
В нашем случае именно это файл динамической конфигурации
version: '3.5'
services:
ghost:
image: ghost:2
labels:
- traefik.enable=true
- traefik.docker.network=traefiknet
- traefik.http.routers.ghost.rule=Host(`blog.amd-nick.me`)
- traefik.http.routers.ghost.entrypoints=insecure, secure
- traefik.http.routers.ghost.tls.certresolver=default
- traefik.http.services.ghost.loadbalancer.server.port=2368
depends_on:
- traefik
networks:
- traefiknet
traefik:
image: traefik:v2.0.4
ports:
- 80:80
- 443:443
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- ./traefik/traefik.toml:/etc/traefik/traefik.toml
- ./traefik/acme.json:/acme.json # описан дальше
networks:
- traefiknet
networks:
traefiknet:
name: traefiknet
.network=traefiknet
обязательно создайте внизу файла вместе с.name: traefiknet
, иначеdocker compose
создаст сеть с другим названием (Issues: 2348, 2700)- В
routers.ghost.rule
используются обратные кавычки .entrypoints
и.certresolver
взяты сtraefik.toml
loadbalancer.server.port=2368
указывает на порт, который Ghost использует внутри контейнера. Наружу этот порт не выносим- В volumes traefik видим проброс traefik.toml, который автоматически загрузится с той локации и acme по тому же принципу
acme.json
Вам нужно создать пустой файл acme.json
и обязательно сделать ему chmod 600 acme.json
. Если забыть указать chmod, то SSL работать не будет (!). В этот файл будет сохраняться SSL сертификат
Как-то так :) Если помог - буду рад, если вы подпишитесь на t.me/uFeed, где я вкратце пишу о том, что читаю