9.6 KiB
Отличный вопрос! Давай сравним, как реализовать ту же задачу в Traefik, и посмотрим, проще ли это будет по сравнению с Angie.
🎯 Цель (повторение)
Нужно организовать систему обратного прокси, где:
-
Пользователи разделены на группы:
public— публичный доступ ко всем общедоступным сайтам.internal— сотрудникам доступны внутренние сервисы (git, jira и т.д.).client-X— клиенты с доступом только к своему поддомену (client1.site.com,client2.site.com).
-
Каждая группа имеет свои IP-подсети.
-
Каждый домен/поддомен имеет список разрешённых групп.
-
Конфиги должны обновляться динамически без перезапуска.
-
Желательно наличие GUI и API управления.
✅ Вывод сразу: Traefik лучше подходит для этой задачи
Почему?
| Функция | Traefik ✅ / ❌ | Angie ✅ / ❌ |
|---|---|---|
| ACL по IP | ✅ | ✅ |
| Группы пользователей | ✅ через middleware | ✅ через allow/deny |
| Динамическая конфигурация | ✅ через API или файл | ✅ через /control |
| Поддержка GUI | ✅ встроенный dashboard | ❌ (нужно внешнее) |
| Простота автоматизации | ✅ | ⚠️ сложнее |
| Интеграция с Let’s Encrypt | ✅ | ⚠️ нужно допилить |
| Удобство масштабирования | ✅ | ✅ |
🔧 Как реализовать в Traefik
1. Базовая структура конфигурации
Traefik использует два типа конфигов:
traefik.yml— статическая часть (порт, провайдеры, логирование и т.п.)dynamic_conf.yml— динамическая часть (маршруты, middleware, TLS и т.п.)
Также можно управлять через REST API, но начнём с файла.
2. Middleware для групп доступа
В Traefik есть мощная система middleware, которую мы будем использовать для контроля доступа по IP.
Пример: определяем middleware для каждой группы
http:
middlewares:
public-access:
ipWhiteList:
sourceRange:
- "0.0.0.0/0" # все IP
internal-access:
ipWhiteList:
sourceRange:
- "192.168.1.0/24"
- "10.10.0.0/16"
client1-access:
ipWhiteList:
sourceRange:
- "203.0.113.0/24"
3. Роуты с указанием middleware
Каждому роуту можно указать, какие middleware применять.
Пример: маршрут для site1.com
http:
routers:
site1-router:
rule: "Host(`site1.com`, `www.site1.com`)"
entryPoints:
- web
service: site1-service
middlewares:
- public-access
- internal-access
Пример: маршрут для git.site1.com
http:
routers:
git-router:
rule: "Host(`git.site1.com`)"
entryPoints:
- web
service: git-service
middlewares:
- internal-access
Пример: маршрут для client1.site.com
http:
routers:
client1-router:
rule: "Host(`client1.site.com`)"
entryPoints:
- web
service: client1-service
middlewares:
- client1-access
4. Сервисы (бэкенды)
Определяешь бэкенд для каждого сайта:
http:
services:
site1-service:
loadBalancer:
servers:
- url: http://192.168.10.10:8080
git-service:
loadBalancer:
servers:
- url: http://192.168.10.11:3000
client1-service:
loadBalancer:
servers:
- url: http://192.168.20.10:8000
5. Динамическое обновление конфига
Можно использовать:
А. Файл с динамическим конфигом
Traefik следит за изменениями в файле и применяет их автоматически.
Пример запуска:
providers:
file:
filename: /etc/traefik/dynamic_conf.yml
watch: true
При изменении
dynamic_conf.yml— конфиг применяется без перезагрузки!
Б. REST API
Если хочешь полностью управлять через API, можешь использовать Traefik Pilot или свой микросервис.
Пример добавления маршрута через API:
curl -X POST "http://traefik:8080/api/http/routers" \
-H "Content-Type: application/json" \
-d '{
"name": "client2-router",
"rule": "Host(`client2.site.com`)",
"service": "client2-service",
"entryPoints": ["web"],
"middlewares": ["client2-access"]
}'
6. Генерация конфигов
Как и в случае с Angie, можно написать небольшой генератор конфигов, который:
- Получает данные о новом клиенте.
- Создаёт middleware с его IP-диапазоном.
- Создаёт новый роут.
- Обновляет
dynamic_conf.yml.
Или делает всё через API.
7. Dashboard (GUI)
Traefik предоставляет встроенный веб-интерфейс по адресу http://localhost:8080.
Там ты увидишь:
- Все маршруты,
- Сервисы,
- Middleware,
- Состояние бэкендов.
🔄 Автоматизация всего процесса
Ты можешь создать:
- API-сервис, принимающий запросы на добавление клиентов/групп.
- Шаблонизатор, генерирующий YAML или JSON.
- Систему хранения правил (например, PostgreSQL или Redis).
- Синхронизацию с файлом или API Traefik.
🔐 Как работает проверка доступа?
- Запрос приходит в Traefik.
- Traefik проверяет IP клиента через middleware
ipWhiteList. - Если IP не в списке — возвращает
403 Forbidden. - Иначе — направляет запрос на нужный бэкенд.
📦 Пример структуры проекта
traefik/
├── traefik.yml # статический конфиг
├── dynamic_conf.yml # динамические маршруты и middleware
└── data/
└── clients/ # шаблоны или скрипты для клиентов
🎯 Вывод
| Задача | Реализация в Traefik | Реализация в Angie |
|---|---|---|
| Группы доступа | ✅ middleware ipWhiteList |
✅ allow + файлы |
| Динамическое обновление | ✅ через файл или API | ✅ через /control |
| Управление через API | ✅ полноценное | ⚠️ ограниченное |
| GUI | ✅ встроенный | ❌ |
| Автоматизация | ✅ удобная | ⚠️ требует больше ручной работы |
| Масштабируемость | ✅ | ✅ |
| Простота внедрения | ✅ | ⚠️ требует глубоких знаний Nginx/Angie |
🚀 Рекомендация
Для твоего сценария Traefik — лучший выбор. Он:
- Поддерживает готовые механизмы ACL и middleware.
- Легко автоматизируется через API или файлы.
- Имеет встроенный GUI.
- Современная архитектура позволяет легко масштабироваться.
- Позволяет быстро внедрить систему контроля доступа по группам.