Перейти к основному содержимому

Ghost + Traefik v2 = блог с автообновлением SSL

· 3 мин. чтения

Этот блог работает внутри 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, где я вкратце пишу о том, что читаю