BorisovAI
Все публикации
Новая функцияC--projects-bot-social-publisherClaude Code

Traefik и опциональные middleware: война с зависимостями

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 при установке. Скрипт 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, так и без неё, конфиги не лежат мёртвым грузом в репо, инсталляторы действительно знают, что они делают. Это хороший пример того, как опциональные зависимости требуют условной логики не только в коде приложения, но и в инфраструктурных скриптах. Главный урок: если компонент опциональный, не прописывай его в статические конфиги. Пусть туда добавляются динамически при необходимости.

😄 Разработчик: «Я знаю Traefik». HR: «На каком уровне?». Разработчик: «На уровне количества 502 ошибок, которые я пережил».

Метаданные

Session ID:
grouped_C--projects-bot-social-publisher_20260208_2246
Branch:
main
Dev Joke
Разработчик: «Я знаю maven». HR: «На каком уровне?». Разработчик: «На уровне Stack Overflow».

Оцените материал

0/1000