Подробный гайд: Ошибка middleware does not exist: гайд по CrowdSec в Traefik - Часть 2
5. Рабочий пример для Docker Compose через labels
Пример контейнера приложения:
services:
app:
image: traefik/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
- "traefik.http.routers.app.entrypoints=web"
- "traefik.http.routers.app.middlewares=crowdsec@docker"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.enabled=true"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.logLevel=info"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.updateIntervalSeconds=60"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.cacheExpirationSeconds=60"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.crowdsecLapiScheme=http"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.crowdsecLapiHost=crowdsec:8080"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.crowdsecLapiKey=${CROWDSEC_BOUNCER_KEY}"
Если ваш плагин в статической конфигурации называется не crowdsec, а crowdsec-bouncer, тогда все строки:
.plugin.crowdsec.
нужно заменить на:
.plugin.crowdsec-bouncer.
То есть:
- "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer.enabled=true"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer.logLevel=info"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer.updateIntervalSeconds=60"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer.cacheExpirationSeconds=60"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer.crowdsecLapiScheme=http"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer.crowdsecLapiHost=crowdsec:8080"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec-bouncer.crowdsecLapiKey=${CROWDSEC_BOUNCER_KEY}"
6. Пример статической конфигурации через аргументы командной строки
Если вы задаёте конфигурацию не файлом, а через command в Docker Compose:
services:
traefik:
image: traefik:v3.1
command:
- "--log.level=DEBUG"
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--experimental.plugins.crowdsec.modulename=github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin"
- "--experimental.plugins.crowdsec.version=vX.Y.Z"
Обратите внимание:
- в YAML обычно используется
moduleName; - в CLI-флаге часто используется
modulename; - имя после
experimental.plugins.— это имя плагина.
Если вы используете имя crowdsec-bouncer:
- "--experimental.plugins.crowdsec-bouncer.modulename=github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin"
- "--experimental.plugins.crowdsec-bouncer.version=vX.Y.Z"
7. Минимальная проверка: что должно совпадать
Допустим, вы выбрали имя плагина crowdsec.
Тогда:
Статическая конфигурация
experimental:
plugins:
crowdsec:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
Динамическая конфигурация
http:
middlewares:
crowdsec:
plugin:
crowdsec:
enabled: true
Router
http:
routers:
app:
middlewares:
- crowdsec
или, если другой провайдер:
middlewares:
- crowdsec@file
Если вы выбрали имя плагина crowdsec-bouncer:
Статическая конфигурация
experimental:
plugins:
crowdsec-bouncer:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
Динамическая конфигурация
http:
middlewares:
crowdsec:
plugin:
crowdsec-bouncer:
enabled: true
Router
http:
routers:
app:
middlewares:
- crowdsec
или:
middlewares:
- crowdsec@file
8. Проверка загрузки плагина
Плагин загружается при старте Traefik. Поэтому после изменения статической конфигурации нужно перезапустить Traefik.
Для Docker:
docker compose restart traefik
или:
docker restart traefik
Затем смотрите логи:
docker logs traefik | grep -Ei 'plugin|middleware|crowdsec'
Ищите строки, содержащие:
plugin
crowdsec
middleware
failed to load
error
Если плагин не загрузился, middleware не будет существовать.
9. Проверка через Traefik API / Dashboard
Если у вас включён API, например:
api:
dashboard: true
insecure: true
или через флаг:
- "--api.insecure=true"
то можно открыть:
http://localhost:8080/dashboard/
Нужен раздел:
HTTP -> Middlewares
Там должно быть ваше middleware, например:
crowdsec@file
или:
crowdsec@docker
Также можно проверить через API:
curl -s http://localhost:8080/api/http/middlewares | jq
Или выбрать только crowdsec:
curl -s http://localhost:8080/api/http/middlewares | jq '.[] | select(.name | contains("crowdsec"))'
Если middleware нет в списке — Traefik его не зарегистрировал. Значит, проблема в статической конфигурации плагина, имени плагина, имени middleware или провайдере.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.