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