Подробный гайд: Ошибка middleware does not exist: гайд по CrowdSec в Traefik - Часть 1
Ошибка вида:
invalid middleware type or middleware does not exist
или по-русски:
недопустимый тип промежуточного ПО или промежуточное ПО не существует
в контексте crowdsec-bouncer-traefik-plugin почти всегда означает не проблему с самим CrowdSec, а проблему с тем, что Traefik не может найти или распознать middleware.
Чаще всего причина одна из двух:
- Плагин не был загружен в Traefik.
- Имя плагина в статической конфигурации не совпадает с именем, используемым в секции
plugin. - Router ссылается на несуществующее middleware или не указан нужный
@provider. - Middleware объявлен в одном провайдере, а используется без указания провайдера.
- Для Traefik v2/v3 используется неправильный CRD
apiVersionили несовместимая версия плагина.
1. Главное правило: есть три разных имени
В конфигурации часто путают три вещи:
1. Имя плагина в статической конфигурации
Это ключ, который вы задаёте сами, например:
experimental:
plugins:
crowdsec:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
Здесь имя плагина — crowdsec.
Или:
experimental:
plugins:
crowdsec-bouncer:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
Здесь имя плагина — crowdsec-bouncer. Это имя можно выбирать свободно, но оно должно быть одинаковым дальше в динамической конфигурации.
2. Имя middleware
Это имя, под которым middleware будет видно в Traefik.
Пример:
http:
middlewares:
crowdsec:
plugin:
crowdsec:
enabled: true
Здесь имя middleware — crowdsec.
Имя middleware тоже можно выбрать любое, например:
http:
middlewares:
my-crowdsec:
plugin:
crowdsec-bouncer:
enabled: true
Здесь имя middleware — my-crowdsec.
3. Имя, на которое ссылается router
Router должен ссылаться именно на имя middleware, а не на имя плагина.
Пример:
http:
routers:
app:
middlewares:
- crowdsec
Если middleware объявлено в другом провайдере, может потребоваться суффикс:
middlewares:
- crowdsec@file
или:
middlewares:
- crowdsec@docker
2. Самая частая ошибка
Неправильно:
http:
middlewares:
crowdsec:
plugin:
crowdsec-bouncer:
enabled: true
При статической конфигурации:
experimental:
plugins:
crowdsec:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
Почему ошибка? Потому что в plugin: указан crowdsec-bouncer, а в статической конфигурации плагин зарегистрирован как crowdsec.
Правильно:
http:
middlewares:
crowdsec:
plugin:
crowdsec:
enabled: true
Или наоборот.
Если статическая конфигурация такая:
experimental:
plugins:
crowdsec-bouncer:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
То в динамической конфигурации нужно писать:
http:
middlewares:
crowdsec:
plugin:
crowdsec-bouncer:
enabled: true
3. Рабочий пример: статическая конфигурация
Ниже пример, где имя плагина — crowdsec.
Файл traefik.yml:
log:
level: DEBUG
api:
dashboard: true
entryPoints:
web:
address: ":80"
providers:
docker:
exposedByDefault: false
file:
filename: /etc/traefik/dynamic.yml
watch: true
experimental:
plugins:
crowdsec:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
Вместо vX.Y.Z нужно указать реальную совместимую версию плагина, например:
version: v0.3.2
или более новую, если она совместима с вашей версией Traefik.
Если вы используете имя crowdsec-bouncer, тогда:
experimental:
plugins:
crowdsec-bouncer:
moduleName: github.com/crowdsecurity/crowdsec-bouncer-traefik-plugin
version: vX.Y.Z
4. Рабочий пример: динамическая конфигурация в файле
Файл dynamic.yml:
http:
middlewares:
crowdsec:
plugin:
crowdsec:
enabled: true
logLevel: info
updateIntervalSeconds: 60
cacheExpirationSeconds: 60
crowdsecLapiScheme: http
crowdsecLapiHost: crowdsec:8080
crowdsecLapiKey: "ВАШ_КЛЮЧ_БАУНСЕРА"
Если в статической конфигурации плагин называется crowdsec-bouncer, то:
http:
middlewares:
crowdsec:
plugin:
crowdsec-bouncer:
enabled: true
logLevel: info
updateIntervalSeconds: 60
cacheExpirationSeconds: 60
crowdsecLapiScheme: http
crowdsecLapiHost: crowdsec:8080
crowdsecLapiKey: "ВАШ_КЛЮЧ_БАУНСЕРА"
Пример роутера в том же файле:
http:
routers:
app:
rule: Host(`app.example.com`)
entryPoints:
- web
service: app
middlewares:
- crowdsec
services:
app:
loadBalancer:
servers:
- url: http://app:8080
Если роутер находится в Docker-провайдере, а middleware в файле, нужно указывать:
middlewares:
- crowdsec@file
Если роутер и middleware находятся в Docker-labels, обычно можно писать:
middlewares:
- crowdsec
или явно:
middlewares:
- crowdsec@docker
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.