Подробный гайд: Ошибка middleware does not exist: гайд по CrowdSec в Traefik - Часть 3

Полный гайд по устранению ошибки «middleware does not exist» при интеграции crowdsec-bouncer-traefik-plugin в Traefik, Docker Compose и Kubernetes.

2026.10.05                  


Подробный гайд: Ошибка middleware does not exist: гайд по CrowdSec в Traefik - Часть 3Подробный гайд: Ошибка 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 успешно создан.


Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта