Files
SergObsidian/WORK & PROJECTS/Mol/Серверы/PROXY_PASS/Traefik config.md
2025-05-13 16:11:25 +05:00

9.6 KiB
Raw Blame History

Отличный вопрос! Давай сравним, как реализовать ту же задачу в 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 (нужно внешнее)
Простота автоматизации ⚠️ сложнее
Интеграция с Lets 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.

🔐 Как работает проверка доступа?

  1. Запрос приходит в Traefik.
  2. Traefik проверяет IP клиента через middleware ipWhiteList.
  3. Если IP не в списке — возвращает 403 Forbidden.
  4. Иначе — направляет запрос на нужный бэкенд.

📦 Пример структуры проекта

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.
  • Современная архитектура позволяет легко масштабироваться.
  • Позволяет быстро внедрить систему контроля доступа по группам.