+
This commit is contained in:
@ -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
201
Proxy/Traefik_plugin.md
Normal 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 используйте только для маршрутизации. Это минимизирует изменения в вашей инфраструктуре.
|
||||
209
Proxy/top.geovizor.traefik_first.md
Normal file
209
Proxy/top.geovizor.traefik_first.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user