Traefik Middleware
Настройка заголовков безопасности, ограничения скорости, IP-списков разрешений, лимитов одновременных запросов и базовой аутентификации для приложений и compose-стеков.
Конфигурация Traefik middleware позволяет привязывать правила обработки запросов к приложению или Docker Compose-стеку без прямого редактирования конфигурационных файлов Traefik. Правила хранятся для каждого ресурса. Для приложений конфигурация записывается напрямую в динамическую конфигурацию Traefik file-provider при upsert/disable и применяется немедленно; для Docker Compose-стеков правила внедряются как Traefik-метки и применяются при следующем деплое.
Конфигурация middleware применяется к приложениям и Docker Compose-стекам. Basic Auth доступен только для compose — приложения используют отдельную вкладку Security.
Доступ к настройкам middleware
Перейдите в Application или Compose → вкладка Security. Для просмотра настроек необходимо разрешение app_security.read, для внесения изменений — app_security.write.
Заголовки безопасности
Включите Security Headers, чтобы активировать middleware заголовков. Отдельные заголовки можно комбинировать:
| Поле | Описание |
|---|---|
| HSTS | Добавляет Strict-Transport-Security для принудительного HTTPS |
| Frame Deny | Устанавливает X-Frame-Options: DENY для защиты от clickjacking |
| Content Type Nosniff | Устанавливает X-Content-Type-Options: nosniff |
| Referrer Policy | Значение заголовка Referrer-Policy |
| Custom Response Headers | Словарь дополнительных заголовков для внедрения |
Ограничение скорости
Включите Rate Limit, чтобы активировать middleware rateLimit Traefik:
| Поле | Описание |
|---|---|
| Average | Максимальное количество разрешённых запросов за период |
| Burst | Максимальный всплеск сверх среднего |
| Period | Временное окно для среднего значения (например, 1s, 1m) |
Лимит одновременных запросов
Ограничивает количество одновременных запросов, передаваемых в сервис. Включите In-Flight Limit и укажите:
- Amount — максимальное количество одновременных запросов. Избыточные запросы получают ответ
429 Too Many Requests.
Ограничение размера тела запроса
Включите Body Limit и укажите:
- Max Request Body Bytes — запросы с телом, превышающим это значение (в байтах), будут отклонены.
IP-список разрешений
Включите IP Allowlist и укажите список IPv4/IPv6-адресов или CIDR-диапазонов. Пересылаются только запросы из указанных источников; все остальные получают ответ 403 Forbidden.
Адреса должны соответствовать формату 1.2.3.4 или 10.0.0.0/24. Символы вне этих наборов отклоняются для предотвращения инъекций в метки.
Basic Auth (только для compose)
Basic Auth доступен только для Docker Compose-стеков. Для приложений используйте вкладку Security.
Включите Basic Auth, чтобы требовать HTTP basic-аутентификацию для каждого запроса. Пароли хранятся в виде bcrypt-хешей и никогда не возвращаются через API — отображаются только имена пользователей.
Добавление пользователя
Перейдите в Compose → Security → Basic Auth и нажмите Add User. При добавлении первого пользователя Basic Auth включается автоматически — отдельно активировать переключатель заранее не требуется. Укажите:
- Username — не должен содержать пробелы или символы
: , $ \` во избежание инъекций в метки Traefik - Password — хранится в виде bcrypt-хеша
POST /api/trpc/traefikMiddlewareConfig.addBasicAuthUser{
"composeId": "<compose-id>",
"username": "alice",
"password": "s3cr3t"
}Удаление пользователя
POST /api/trpc/traefikMiddlewareConfig.removeBasicAuthUser{
"composeId": "<compose-id>",
"username": "alice"
}Применение настроек по умолчанию
Действие Apply Secure Defaults задаёт усиленный базовый уровень в один клик. Существующие значения этих полей перезаписываются; настройки IP-списка разрешений и Basic Auth остаются без изменений:
| Поле | Значение |
|---|---|
| Заголовки безопасности | Включены — HSTS, запрет фреймов, nosniff для типов контента, Referrer-Policy: strict-origin-when-cross-origin |
| Ограничение скорости | Включено — 100 в среднем, всплеск 50, период 1s |
| Лимит одновременных запросов | Включён — 100 одновременных запросов |
| Лимит размера тела | Включён — 20971520 байт (20 МиБ) |
POST /api/trpc/traefikMiddlewareConfig.applySecureDefaults{
"applicationId": "<application-id>"
}Отключение всего middleware
Disable полностью удаляет запись конфигурации middleware. Все правила Traefik удаляются при следующем обновлении конфигурации или деплое.
POST /api/trpc/traefikMiddlewareConfig.disable{
"composeId": "<compose-id>"
}Справочник API
Все эндпоинты требуют действительного токена сессии участника с соответствующим разрешением app_security.
| Метод | Путь | Разрешение | Описание |
|---|---|---|---|
GET | /api/trpc/traefikMiddlewareConfig.get | app_security.read | Получить конфигурацию middleware для ресурса |
POST | /api/trpc/traefikMiddlewareConfig.upsert | app_security.write | Создать или обновить конфигурацию middleware |
POST | /api/trpc/traefikMiddlewareConfig.applySecureDefaults | app_security.write | Применить усиленные настройки по умолчанию |
POST | /api/trpc/traefikMiddlewareConfig.disable | app_security.write | Удалить всю конфигурацию middleware |
POST | /api/trpc/traefikMiddlewareConfig.addBasicAuthUser | app_security.write | Добавить пользователя Basic Auth (только compose) |
POST | /api/trpc/traefikMiddlewareConfig.removeBasicAuthUser | app_security.write | Удалить пользователя Basic Auth (только compose) |
Тело запроса get / disable
Укажите ровно одно из значений: applicationId или composeId:
{ "applicationId": "<id>" }или
{ "composeId": "<id>" }Тело запроса upsert
Все поля конфигурации являются необязательными; пропущенные поля остаются без изменений:
{
"applicationId": "<id>",
"headersEnabled": true,
"hstsEnabled": true,
"frameDeny": true,
"contentTypeNosniff": true,
"referrerPolicy": "strict-origin-when-cross-origin",
"customResponseHeaders": { "X-Powered-By": "" },
"rateLimitEnabled": true,
"rateLimitAverage": 100,
"rateLimitBurst": 50,
"rateLimitPeriod": "1s",
"inFlightEnabled": true,
"inFlightAmount": 20,
"bodyLimitEnabled": true,
"maxRequestBodyBytes": 10485760,
"ipAllowListEnabled": false,
"ipAllowList": [],
"basicAuthEnabled": false
}