Skip to content
страница целиком, в Markdown — вставьте в чат с моделью

Обзор архитектуры ​

Инфраструктура построена на архитектуре, управляемой пайплайнами. Код проходит путь от машин разработчиков через GitLab CI, упаковывается в Docker-образы и оркестрируется с помощью Nomad, где Traefik обеспечивает входящую маршрутизацию.

Общая схема ​

mermaid
flowchart LR
    Dev[Developer] -->|git push| GitLab[GitLab CI]
    GitLab -->|docker build & push| Registry[Docker Registry<br>registry.amztop.io]
    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 ​

Образы лежат в отдельном registry registry.amztop.io — он развёрнут рядом с кластером, а авторизацию для него по-прежнему подписывает GitLab. Путь образа повторяет путь проекта в GitLab:

registry.amztop.io/integrations/platform_hub/backend:dev
registry.amztop.io/integrations/platform_hub/frontend:dev

TIP

Образы тегируются именем окружения: ветка dev даёт :dev, stage — :stage, main — :prod. Чтобы Nomad увидел новую сборку под неизменившимся тегом, в джобу передаётся переменная deploy_ts с номером пайплайна.

Nomad ​

HashiCorp Nomad является оркестратором рабочих нагрузок. Каждый сервис определяется как задание Nomad с одной или несколькими группами задач. Nomad отвечает за:

  • Планирование контейнеров по кластеру
  • Проверки здоровья и автоматические перезапуски
  • Плавные развёртывания с поддержкой канареечных релизов
  • Регистрацию сервисов в каталоге Consul

Traefik ​

Traefik выступает в роли пограничного маршрутизатора и обратного прокси. Он обнаруживает сервисы через Consul и автоматически настраивает маршруты на основе тегов, определённых в файлах заданий Nomad. Терминация TLS и маршрутизация доменов обрабатываются на этом уровне.

Consul ​

Consul выполняет две функции в стеке:

  1. Обнаружение сервисов -- Nomad регистрирует задачи в Consul, а Traefik считывает их для построения таблицы маршрутизации.
  2. KV-хранилище -- Переменные окружения и значения конфигурации хранятся в Consul KV и внедряются в контейнеры через шаблоны Nomad.

Структура сервиса: platform_hub ​

Основной проект, platform_hub, состоит из бэкенда на Fastify и фронтенда на Vue 3. Оба работают как отдельные группы задач в рамках одного задания Nomad.

mermaid
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:8080Vue 3 SPA и статические ресурсы
api.meduza.<env>.*/api/*backend:3000Fastify REST API

Маршруты Traefik настраиваются через теги Consul в спецификации задания Nomad. Фронтенд взаимодействует с бэкендом исключительно через Traefik, никогда напрямую между группами задач.

Межсервисное взаимодействие ​

Сервисы внутри кластера Nomad взаимодействуют через два механизма:

  1. Consul DNS -- Сервисы могут обращаться друг к другу через <service-name>.service.consul. Это используется для внутренних вызовов между сервисами, которым не нужно проходить через Traefik.
  2. Traefik (внешний) -- Весь пользовательский трафик и кросс-доменные запросы проходят через Traefik, который обеспечивает TLS и балансировку нагрузки.

WARNING

Избегайте жёсткого указания IP-адресов или портов. Всегда используйте обнаружение сервисов Consul или интерполяцию шаблонов Nomad ({{ env "NOMAD_ADDR_http" }}) для определения адресов.

Хранилища данных ​

ХранилищеНазначениеДоступ
PostgreSQLОсновная реляционная база данных для platform_hubТолько бэкенд, через строку подключения в Consul KV
RedisКэш сессий, очереди и эфемерное состояниеТолько бэкенд, через Consul KV
Consul KVКонфигурация и секретыВсе сервисы, через шаблоны Nomad

Документация по инфраструктуре