This commit is contained in:
2025-08-25 07:41:03 +05:00
parent 3ca998f1cf
commit b6111740e8
11 changed files with 649 additions and 214 deletions

View File

@ -24,7 +24,7 @@ sudo apt install wget
Проверь актуальную версию на: [Traefik Releases](https://github.com/traefik/traefik/releases)
Пример для версии `v3.0.0`:
```bash
```sh
cd ~ &&
wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_linux_amd64.tar.gz
```
@ -32,7 +32,7 @@ wget https://github.com/traefik/traefik/releases/download/v3.3.4/traefik_v3.3.4_
---
## 📥 Шаг 3. Распаковка и установка
```bash
```sh
cd ~ &&
tar -xvzf traefik_v3.3.4_linux_amd64.tar.gz &&
sudo mv traefik /usr/local/bin/
@ -67,7 +67,7 @@ entryPoints:
websecure:
address: ":443"
traefik:
address: ":8080"
address: ":8989"
api:
dashboard: true

201
Proxy/Traefik_plugin.md Normal file
View File

@ -0,0 +1,201 @@
Создание локального плагина для Traefik: Перенос куки jwt_a в заголовок Authorization: Bearer
Этот документ описывает, как создать и настроить локальный плагин для Traefik, который извлекает значение куки jwt_a и устанавливает его в заголовок Authorization: Bearer <token>, аналогично правилу HAProxy:
acl is_jwt_cookie hdr_sub(cookie) jwt_a=
http-request set-header Authorization "Bearer %[cook(jwt_a)]" if is_jwt_cookie
Плагин будет работать локально без публикации на GitHub.
📋 Требования
Go: Версия 1.21 или выше.
Traefik: Версия 3.3.4 (или совместимая).
Linux Mint/Ubuntu: ОС, на которой установлен Traefik.
Права доступа: Пользователь с правами на изменение конфигурации Traefik и запуск сервисов.
📥 Шаг 1: Подготовка окружения
Проверьте, установлен ли Go:
go version
Если Go не установлен, установите его:
sudo apt update
sudo apt install golang
Убедитесь, что Traefik установлен и работает. Проверьте версию:
traefik version
📂 Шаг 2: Создание плагина
Создайте директорию для плагина:
mkdir -p ~/traefik-jwt-cookie-plugin
cd ~/traefik-jwt-cookie-plugin
Инициализируйте Go-модуль:
go mod init traefik-jwt-cookie-plugin
Создайте файл plugin.go с кодом плагина:
package traefik_jwt_cookie_plugin
import (
"context"
"net/http"
)
// Config holds the plugin configuration.
type Config struct {
CookieName string `json:"cookieName"`
}
// CreateConfig creates and initializes the plugin configuration.
func CreateConfig() *Config {
return &Config{
CookieName: "jwt_a", // Имя куки по умолчанию
}
}
// JWTCookiePlugin is the plugin structure.
type JWTCookiePlugin struct {
next http.Handler
name string
cookieName string
}
// New creates a new instance of the plugin.
func New(_ context.Context, next http.Handler, config *Config, name string) (http.Handler, error) {
return &JWTCookiePlugin{
next: next,
name: name,
cookieName: config.CookieName,
}, nil
}
func (p *JWTCookiePlugin) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
// Извлекаем куки
cookie, err := req.Cookie(p.cookieName)
if err == nil && cookie != nil && cookie.Value != "" {
// Устанавливаем заголовок Authorization
req.Header.Set("Authorization", "Bearer "+cookie.Value)
}
// Передаем запрос дальше
p.next.ServeHTTP(rw, req)
}
Создайте файл go.mod (создается автоматически при инициализации модуля):
module traefik-jwt-cookie-plugin
go 1.21
Создайте файл plugin.yaml:
moduleName: traefik-jwt-cookie-plugin
displayName: JWT Cookie to Authorization Header
summary: Middleware to extract a cookie and set it as Authorization Bearer header
⚙️ Шаг 3: Настройка Traefik для локального плагина
Отредактируйте файл конфигурации Traefik (/etc/traefik/traefik.yml):
experimental:
localPlugins:
jwtCookiePlugin:
moduleName: traefik-jwt-cookie-plugin
sourcePath: /home/igor/traefik-jwt-cookie-plugin # Замените на ваш путь
http:
routers:
my-router:
rule: "Host(`example.com`)" # Замените на ваш домен
service: my-service
middlewares:
- jwt-cookie-middleware
entryPoints:
- web
middlewares:
jwt-cookie-middleware:
plugin:
jwtCookiePlugin:
cookieName: "jwt_a"
services:
my-service:
loadBalancer:
servers:
- url: "http://backend:8080" # Ваш бэкенд-сервис
Убедитесь, что путь /home/igor/traefik-jwt-cookie-plugin соответствует вашей директории. Проверьте путь:
echo $HOME
🔒 Шаг 4: Настройка прав доступа
Убедитесь, что Traefik имеет доступ к директории плагина:
sudo chown -R igor:igor ~/traefik-jwt-cookie-plugin
sudo chmod -R 755 ~/traefik-jwt-cookie-plugin
Если Traefik работает от другого пользователя (например, traefik), выполните:
sudo chown -R traefik:traefik ~/traefik-jwt-cookie-plugin
🚀 Шаг 5: Запуск Traefik
Перезапустите Traefik:sudo systemctl restart traefik
Если Traefik запущен вручную:traefik --configFile=/etc/traefik/traefik.yml
🧪 Шаг 6: Тестирование
Включите дебаг-логи в traefik.yml:log:
level: DEBUG
Отправьте тестовый запрос с куки jwt_a:curl -H "Host: example.com" -b "jwt_a=your_jwt_token_here" http://192.168.200.85
Проверьте логи Traefik:sudo journalctl -u traefik
Ищите записи, связанные с jwtCookiePlugin, чтобы подтвердить, что куки обрабатываются.
🌐 Шаг 7: Интеграция с HAProxy
Поскольку вы используете HAProxy перед Traefik, убедитесь, что HAProxy передает куки без изменений. Если вы хотите перенести логику обработки куки из HAProxy в Traefik, удалите следующее правило из HAProxy:
acl is_jwt_cookie hdr_sub(cookie) jwt_a=
http-request set-header Authorization "Bearer %[cook(jwt_a)]" if is_jwt_cookie
Обновленная конфигурация HAProxy:
frontend fe_main
bind *:80
mode http
default_backend be_traefik
backend be_traefik
mode http
server traefik 192.168.200.85:80
⚠️ Возможные проблемы
Ошибка загрузки плагина: Проверьте логи Traefik (journalctl -u traefik) и убедитесь, что sourcePath указан правильно.
Куки не извлекаются: Убедитесь, что куки jwt_a передаются в запросе (проверьте через curl или браузер).
Go-ошибки: Выполните go mod tidy для установки зависимостей.
✅ Преимущества
Работает локально без публикации на GitHub.
Заменяет функциональность HAProxy без внешнего сервиса.
Полная интеграция с Traefik.
❗ Недостатки
Требует базовых навыков Go.
Экспериментальная поддержка плагинов в Traefik может быть нестабильной.
🔄 Альтернатива
Если плагин не работает, оставьте обработку куки в HAProxy, а Traefik используйте только для маршрутизации. Это минимизирует изменения в вашей инфраструктуре.

View File

@ -0,0 +1,209 @@
Congif to first level proxy
Connecting to infrascructure
```sh
ssh igor@192.168.200.81
```
```sh
sudo apt update &&
sudo apt install wget
```
```sh
cd /etc/traefik &&
sudo tee /etc/traefik/traefik.yml > /dev/null <<'EOF'
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
http8080:
address: ":8080"
https8443:
address: ":8443"
traefik:
address: ":8989"
api:
dashboard: true
insecure: true
log:
level: DEBUG
filePath: "/var/log/traefik/traefik.log"
accessLog:
filePath: "/var/log/traefik/access.log"
providers:
file:
filename: "/etc/traefik/dynamic.yml"
watch: true
EOF
```
```sh
cd /etc/traefik &&
sudo tee /etc/traefik/dynamic.yml > /dev/null <<'EOF'
---
http:
routers:
dashboard:
rule: "Host(`192.168.200.81`) && Host(`localhost`)" # или другой домен
entryPoints:
- traefik
service: api@internal
middlewares:
- auth
redirect-to-https:
entryPoints:
- web
rule: "HostRegexp(`{any:.+}`)"
service: noop
middlewares:
- redirect-to-https-middleware
gotify:
entryPoints:
- websecure
- https8443
rule: "Host(`gotify.geovizor.top`)"
service: gotify
tls: true
webdav:
entryPoints:
- websecure
- https8443
rule: "Host(`webdav.geovizor.top`)"
service: webdav
tls: true
ccalm-auth:
entryPoints:
- websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/api/authorization/v02`)"
service: ccalm-auth
middlewares:
- strip-api-authorization
tls: true
ccalm-dbms:
entryPoints:
- websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/api/dbms/v09`)"
service: ccalm-dbms
middlewares:
- strip-api-dbms
tls: true
ccalm-login:
entryPoints:
- websecure
rule: "Host(`ccalm.test`) && PathPrefix(`/login`)"
service: ccalm-login
tls: true
ccalm-default:
entryPoints:
- websecure
rule: "Host(`ccalm.test`)"
service: ccalm-default
tls: true
certbot:
entryPoints:
- websecure
rule: "PathPrefix(`/.well-known/acme-challenge/`)"
service: certbot
tls: true
middlewares:
auth:
basicAuth:
users:
- "admin:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/" # admin/admin
redirect-to-https-middleware:
redirectScheme:
scheme: https
permanent: true
strip-api-authorization:
replacePathRegex:
regex: ^/api/authorization/v02/(.*)
replacement: /$1
strip-api-dbms:
replacePathRegex:
regex: ^/api/dbms/v09/(.*)
replacement: /$1
services:
gotify:
loadBalancer:
servers:
- url: "https://192.168.200.84:8080"
passHostHeader: true
healthCheck:
path: "/"
interval: "5s"
serversTransport: insecureTransport
webdav:
loadBalancer:
servers:
- url: "http://127.0.0.1:8085"
ccalm-auth:
loadBalancer:
servers:
- url: "https://192.168.200.184:8082"
ccalm-dbms:
loadBalancer:
servers:
- url: "https://192.168.200.184:8084"
ccalm-login:
loadBalancer:
servers:
- url: "http://192.168.200.184:3000"
ccalm-default:
loadBalancer:
servers:
- url: "https://192.168.200.184:8083"
certbot:
loadBalancer:
servers:
- url: "http://127.0.0.1:9080"
noop:
loadBalancer:
servers:
- url: "http://0.0.0.0" # placeholder
# Определяем транспорт для отключения проверки SSL
serversTransports:
insecureTransport:
insecureSkipVerify: true
EOF
```
```sh
sudo systemctl daemon-reload &&
sudo systemctl enable traefik &&
sudo systemctl start traefik &&
sudo systemctl status traefik
```