Когда конфиги падают: война Traefik с несуществующим middleware

Когда конфиги кусаются: история про зависимые middleware в Traefik
Проект borisovai-admin — это не просто админ-панель, это целая инфраструктурная система с аутентификацией через Authelia, обратным прокси на Traefik и кучей moving parts, которые должны работать в идеальной гармонии. И вот в один прекрасный день выясняется: когда ты разворачиваешь систему без Authelia, всё падает с ошибкой 502, потому что Traefik мечтательно ищет middleware authelia@file, которого просто нет в конфиге.
Завязка проблемы была в статических конфигах. Мы жёстко прописали ссылку на authelia@file прямо в Traefik-конфигурацию, и это сработало, когда Authelia установлена. Но стоило её отключить или просто не устанавливать — бум, 502 ошибка. Получается, конфиги были сильно связаны с опциональным компонентом. Это классический случай, когда инфраструктурный код требует гибкости.
Решение разбилось на несколько фронтов. Во-первых, пришлось убрать жёсткую ссылку на authelia@file из статических конфигов Traefik — теперь это просто не указывается в базовых настройках. Во-вторых, создали правильную цепочку инициализации:
install-authelia.shтеперь сам добавляетauthelia@fileвconfig.jsonи настраивает OIDC при установке Authelia;configure-traefik.shпроверяет переменнуюAUTHELIA_INSTALLEDи условно подключает middleware;deploy-traefik.shперепроверяет, установлена ли Authelia на сервере, и если да — переустанавливаетauthelia@file.
Неожиданный бонус обнаружился в install-management-ui.sh — там был неправильный путь к mgmt_client_secret. Исправили по ходу. А authelia.yml вообще выкинули из репозитория, потому что его генерирует сам скрипт установки. Зачем держать в git то, что всегда одинаково генерируется?
Интересный момент про middleware в Docker-сообществе: люди часто забывают, что middleware — это не просто функция, это объект конфигурации, который должен быть определён до использования. Traefik здесь строг: ты не можешь ссылаться на middleware, которого не существует. Это похоже на попытку вызвать функцию, которая не импортирована в Python. Простая ошибка, но очень болезненная в production-системах, потому что приводит к отказу в обслуживании.
Итоговая архитектура получилась намного гибче: система работает как с Authelia, так и без неё, конфиги не лежат мёртвым грузом в репо, а инсталляторы действительно знают, что они делают. Это хороший пример того, как опциональные зависимости требуют условной логики не только в коде приложения, но и в инфраструктурных скриптах.
Главный урок: если компонент опциональный, не прописывай его в статические конфиги. Пусть они туда добавляются динамически при необходимости.
😄 Что будет, если Fedora обретёт сознание? Первым делом она удалит свою документацию.
Метаданные
- Branch:
- main
- Dev Joke
- Что будет, если Fedora обретёт сознание? Первым делом он удалит свою документацию
Часть потока:
Разработка: borisovai-admin