Обзор инфраструктуры
Платформа работает на кластере из трёх виртуальных машин — по одной на окружение. Она опирается на три ключевых компонента: Nomad для оркестрации рабочих нагрузок, Traefik для обратного проксирования и терминации TLS, и Consul для управления конфигурацией через хранилище ключей-значений.
Компоненты стека
| Компонент | Роль | Порт |
|---|---|---|
| Nomad | Оркестрация контейнеров, планирование задач, проверки здоровья | 4646 |
| Traefik | Обратный прокси, терминация TLS, автоматический HTTPS через Let's Encrypt | 80, 443 |
| Consul | KV-хранилище для конфигурации приложений | 8500 |
Как они взаимодействуют
Три компонента образуют тесно интегрированный цикл:
- Nomad планирует и запускает контейнеризированные сервисы (задачи). Каждая задача определяет блоки сервисов с метаданными-тегами.
- Traefik отслеживает каталог сервисов Nomad и автоматически обнаруживает сервисы, аннотированные тегами
traefik.*. Он формирует правила маршрутизации и выпускает TLS-сертификаты через Let's Encrypt на основе этих тегов. - Consul хранит конфигурацию приложений в виде JSON-объектов в KV-хранилище. Nomad-задачи используют блоки
templateдля чтения значений из Consul при деплое и инжекта их как переменных окружения в работающие контейнеры.
flowchart TB
Internet["Internet (HTTPS :443)"]
subgraph Нода окружения
Traefik["Traefik\nReverse Proxy + TLS"]
Nomad["Nomad\nOrchestrator"]
Consul["Consul\nKV Config Store"]
subgraph Nomad Jobs
FE["Frontend Container"]
BE["Backend Container"]
end
end
Internet -->|"incoming request"| Traefik
Traefik -->|"route by Host header"| FE
FE -->|"API calls"| BE
Nomad -->|"schedules & health-checks"| FE
Nomad -->|"schedules & health-checks"| BE
Nomad -->|"reads service tags"| Traefik
Consul -->|"template: KV config → env vars"| BE
Consul -->|"template: KV config → env vars"| FE
Nomad -->|"resolves template blocks"| ConsulПоток запросов
Типичный запрос проходит через стек следующим образом:
sequenceDiagram
participant Client
participant Traefik
participant Frontend
participant Backend
participant Consul
Client->>Traefik: HTTPS request to my-tool.amzhub.ai
Traefik->>Traefik: Match Host() rule, terminate TLS
Traefik->>Frontend: Forward to healthy upstream
Frontend->>Backend: API request (dynamic port)
Backend->>Consul: (at deploy time) Config loaded via template
Backend-->>Frontend: JSON response
Frontend-->>Traefik: HTML / assets
Traefik-->>Client: HTTPS responseОкружения
Каждое окружение живёт на своей виртуальной машине и в своём namespace Nomad. Consul и его KV — общие на весь кластер, разделение идёт по префиксу ключа:
| Окружение | Namespace | Нода | Префикс Consul KV |
|---|---|---|---|
| prod | prod | 192.168.100.40 | hub/prod/config |
| stage | stage | 192.168.100.30 | hub/stage/config |
| dev | dev | 192.168.100.20 | hub/dev/config |
TIP
Все три окружения используют один и тот же файл Nomad-задачи (hub.nomad.hcl). Переменная env определяет, какой путь Consul читается, на какую ноду попадёт задача (constraint по meta.env) и на какой домен Traefik маршрутизирует трафик.
Consul общий на весь кластер
Traefik каждой ноды видит сервисы всех окружений, поэтому в теги сервиса первым ставится env=${var.env} — по нему traefik фильтрует чужое. Без этого тега прод попытается выпустить сертификат для dev-домена, и проверка Let's Encrypt уйдёт не на ту машину.
Доступ
Управляющие интерфейсы наружу не опубликованы — нужен WireGuard. Конфиг туннеля и токены выдаются отдельным именным пакетом.
- Nomad UI —
http://192.168.100.1:4646/ui(вход: Sign In → Token) - Consul UI —
http://192.168.100.1:8500/ui(вход: Log in → Token) - Traefik Dashboard —
http://<нода>:8080, через SSH-туннель на нужную ноду
WARNING
Эти порты закрыты снаружи намеренно. Не публикуйте их и не проксируйте через traefik — доступ только через VPN.