Обзор архитектуры
Инфраструктура построена на архитектуре, управляемой пайплайнами. Код проходит путь от машин разработчиков через GitLab CI, упаковывается в Docker-образы и оркестрируется с помощью Nomad, где Traefik обеспечивает входящую маршрутизацию.
Общая схема
flowchart LR
Dev[Developer] -->|git push| GitLab[GitLab CI]
GitLab -->|docker build & push| Registry[Docker Registry<br>gitlab.amzgit.com:5050]
Registry -->|pull image| Nomad[Nomad Cluster]
Nomad -->|registers service| Traefik[Traefik Ingress]
Traefik -->|routes traffic| Users[Users]Роли компонентов
GitLab CI
Все CI-пайплайны определены в .gitlab-ci.yml в корне каждого проекта. Общие шаблоны находятся в репозитории meduza/infra и подключаются через механизм include GitLab. CI-слой отвечает за:
- Линтинг и тестирование
- Сборку Docker-образов и их отправку в реестр
- Запуск развёртываний Nomad для каждого окружения
Docker Registry
Платформа использует GitLab Container Registry по адресу gitlab.amzgit.com:5050. Каждый проект публикует образы в собственном пространстве имён:
gitlab.amzgit.com:5050/meduza/platform_hub/backend:latest
gitlab.amzgit.com:5050/meduza/platform_hub/frontend:latestTIP
Образы тегируются как Git SHA, так и именем окружения (например, dev, stage, prod), что упрощает откат к предыдущим версиям.
Nomad
HashiCorp Nomad является оркестратором рабочих нагрузок. Каждый сервис определяется как задание Nomad с одной или несколькими группами задач. Nomad отвечает за:
- Планирование контейнеров по кластеру
- Проверки здоровья и автоматические перезапуски
- Плавные развёртывания с поддержкой канареечных релизов
- Регистрацию сервисов в каталоге Consul
Traefik
Traefik выступает в роли пограничного маршрутизатора и обратного прокси. Он обнаруживает сервисы через Consul и автоматически настраивает маршруты на основе тегов, определённых в файлах заданий Nomad. Терминация TLS и маршрутизация доменов обрабатываются на этом уровне.
Consul
Consul выполняет две функции в стеке:
- Обнаружение сервисов -- Nomad регистрирует задачи в Consul, а Traefik считывает их для построения таблицы маршрутизации.
- KV-хранилище -- Переменные окружения и значения конфигурации хранятся в Consul KV и внедряются в контейнеры через шаблоны Nomad.
Структура сервиса: platform_hub
Основной проект, platform_hub, состоит из бэкенда на Fastify и фронтенда на Vue 3. Оба работают как отдельные группы задач в рамках одного задания Nomad.
flowchart TB
subgraph Nomad Job: platform_hub
direction TB
subgraph backend [Task Group: backend]
API[Fastify API<br>Port 3000]
end
subgraph frontend [Task Group: frontend]
UI[Vue 3 SPA<br>Port 8080]
end
end
Traefik[Traefik]
Traefik -->|api.meduza.* /api/*| API
Traefik -->|app.meduza.*| UI
UI -->|fetch /api/*| Traefik
API -->|query| DB[(PostgreSQL)]
API -->|read/write| Redis[(Redis)]Правила маршрутизации
| Шаблон маршрута | Цель | Описание |
|---|---|---|
app.meduza.<env>.* | frontend:8080 | Vue 3 SPA и статические ресурсы |
api.meduza.<env>.*/api/* | backend:3000 | Fastify REST API |
Маршруты Traefik настраиваются через теги Consul в спецификации задания Nomad. Фронтенд взаимодействует с бэкендом исключительно через Traefik, никогда напрямую между группами задач.
Межсервисное взаимодействие
Сервисы внутри кластера Nomad взаимодействуют через два механизма:
- Consul DNS -- Сервисы могут обращаться друг к другу через
<service-name>.service.consul. Это используется для внутренних вызовов между сервисами, которым не нужно проходить через Traefik. - Traefik (внешний) -- Весь пользовательский трафик и кросс-доменные запросы проходят через Traefik, который обеспечивает TLS и балансировку нагрузки.
WARNING
Избегайте жёсткого указания IP-адресов или портов. Всегда используйте обнаружение сервисов Consul или интерполяцию шаблонов Nomad ({{ env "NOMAD_ADDR_http" }}) для определения адресов.
Хранилища данных
| Хранилище | Назначение | Доступ |
|---|---|---|
| PostgreSQL | Основная реляционная база данных для platform_hub | Только бэкенд, через строку подключения в Consul KV |
| Redis | Кэш сессий, очереди и эфемерное состояние | Только бэкенд, через Consul KV |
| Consul KV | Конфигурация и секреты | Все сервисы, через шаблоны Nomad |