Skip to content

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

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

Общая схема

mermaid
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:latest

TIP

Образы тегируются как Git SHA, так и именем окружения (например, dev, stage, prod), что упрощает откат к предыдущим версиям.

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

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