Обзор инфраструктуры
Meduza работает на одном KVM-хосте, доступном по SSH. Платформа опирается на три ключевых компонента: 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 KVM Host
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 app.meduza.io
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Окружения
Все окружения работают на одном KVM-хосте и различаются переменными Nomad-задач и путями Consul KV:
| Окружение | Префикс Consul KV | Порт фронтенда | Домен |
|---|---|---|---|
| prod | hub/prod/config | 8888 | Продакшн-домен |
| stage | hub/stage/config | 8889 | Стейджинг-домен |
| dev | hub/dev/config | 8890 | Dev-домен |
TIP
Все три окружения используют один и тот же файл Nomad-задачи (hub.nomad.hcl). Переменная env определяет, какой путь Consul читается, какие порты назначаются и на какой домен Traefik маршрутизирует трафик.
Доступ
Доступ к KVM-хосту осуществляется исключительно через SSH. Веб-панели управления нет. Для управления инфраструктурой:
- Nomad UI доступен по адресу
http://<host>:4646(через SSH-туннель) - Consul UI доступен по адресу
http://<host>:8500(через SSH-туннель) - Traefik Dashboard доступен по адресу
http://<host>:8080(через SSH-туннель)
WARNING
Всегда используйте SSH-туннелирование для доступа к административным интерфейсам. Эти порты не должны быть открыты в публичный интернет.