Подробный гайд: Ошибка middleware does not exist: гайд по CrowdSec в Traefik - Часть 3
10. Типичные ошибки и исправления
Ошибка 1: используется полное имя репозитория
Неправильно:
plugin:
crowdsec-bouncer-traefik-plugin:
enabled: true
Если в статической конфигурации плагин зарегистрирован как:
experimental:
plugins:
crowdsec:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
Правильно:
plugin:
crowdsec:
enabled: true
Ошибка 2: статическое имя crowdsec-bouncer, а в динамической конфигурации crowdsec
Статическая:
experimental:
plugins:
crowdsec-bouncer:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
Неправильная динамическая:
http:
middlewares:
crowdsec:
plugin:
crowdsec:
enabled: true
Правильная:
http:
middlewares:
crowdsec:
plugin:
crowdsec-bouncer:
enabled: true
Ошибка 3: роутер ссылается на неправильное имя
Middleware называется:
http:
middlewares:
crowdsec-middleware:
plugin:
crowdsec:
enabled: true
А роутер ссылается на:
middlewares:
- crowdsec
Это ошибка.
Нужно:
middlewares:
- crowdsec-middleware
или переименовать middleware в crowdsec.
Ошибка 4: не указан провайдер
Middleware объявлено в файле:
http:
middlewares:
crowdsec:
plugin:
crowdsec:
enabled: true
А роутер объявлен в Docker labels и пишет просто:
- "traefik.http.routers.app.middlewares=crowdsec"
Иногда это работает, если провайдер очевиден, но надёжнее писать явно:
- "traefik.http.routers.app.middlewares=crowdsec@file"
Ошибка 5: middleware объявлено в Docker, а используется как @file
Неправильно:
- "traefik.http.routers.app.middlewares=crowdsec@file"
Если сам middleware объявлен через Docker labels:
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.enabled=true"
Правильно:
- "traefik.http.routers.app.middlewares=crowdsec@docker"
или просто:
- "traefik.http.routers.app.middlewares=crowdsec"
Ошибка 6: контейнер с middleware не обрабатывается провайдером
Если у вас:
providers:
docker:
exposedByDefault: false
То контейнер, на котором объявлены middleware labels, должен иметь:
- "traefik.enable=true"
Либо middleware нужно объявлять на том же сервисе, который маршрутизируется.
Ошибка 7: отсутствует блок plugin
Неправильно:
http:
middlewares:
crowdsec:
crowdsec:
enabled: true
Правильно:
http:
middlewares:
crowdsec:
plugin:
crowdsec:
enabled: true
11. Полный пример Docker Compose
Ниже — максимально полный учебный пример.
name: traefik-crowdsec
services:
crowdsec:
image: crowdsecurity/crowdsec:latest
environment:
GID: "${GID:-1000}"
COLLECTIONS: "crowdsecurity/traefik crowdsecurity/http-cve"
volumes:
- crowdsec-db:/var/lib/crowdsec/data
- crowdsec-config:/etc/crowdsec
traefik:
image: traefik:v3.1
command:
- "--log.level=DEBUG"
- "--api.dashboard=true"
- "--api.insecure=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"
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
depends_on:
- crowdsec
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
- "traefik.http.routers.whoami.entrypoints=web"
- "traefik.http.routers.whoami.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=10"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.cacheExpirationSeconds=10"
- "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}"
volumes:
crowdsec-db:
crowdsec-config:
Перед запуском создайте .env файл рядом с docker-compose.yml:
CROWDSEC_BOUNCER_KEY=ваш_ключ_баунсера
12. Создание ключа баунсера
После запуска CrowdSec создайте ключ для Traefik:
docker compose exec crowdsec cscli bouncers add traefik-bouncer
Вы получите ключ вида:
abc123def456...
Сохраните его в .env:
CROWDSEC_BOUNCER_KEY=abc123def456...
Проверка списка баунсеров:
docker compose exec crowdsec cscli bouncers list
После изменения ключа перезапустите Traefik:
docker compose restart traefik
13. Проверка доступности LAPI из контейнера Traefik
Очень важно: внутри контейнера localhost — это сам контейнер, а не хост-машина.
Если CrowdSec запущен в том же Docker Compose и сервис называется crowdsec, то нужно использовать:
crowdsecLapiHost: crowdsec:8080
Неправильно:
crowdsecLapiHost: localhost:8080
если только Traefik не работает в host-сети.
Проверить доступность можно из контейнера Traefik:
docker compose exec traefik sh -lc 'wget -qO- http://crowdsec:8080/health'
Также можно проверить LAPI с ключом:
docker compose exec traefik sh -lc '
wget -qO- --header "X-Api-Key: $CROWDSEC_BOUNCER_KEY" \
"http://crowdsec:8080/v1/decisions?ip=1.2.3.4"
'
Если LAPI недоступен, плагин может работать некорректно, но это обычно проявляется уже после того, как middleware успешно создан.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.