Перейти к содержанию

Архитектура развертывания

Серверная часть DataHUB поставляется как набор независимых блоков Docker Compose — по одному docker-compose.yml на каждый сервис платформы. Эта статья описывает блочную структуру поставки, общие соглашения между блоками, организацию сети и операционные команды для работы с развёрнутой системой. Это опорная статья раздела — все последующие статьи про конкретные компоненты опираются на изложенную здесь модель.

Пошаговая инструкция по первичной установке вынесена в Быстрый старт. Конфигурация каждого конкретного компонента — в отдельных статьях: DevOps Core, PostgreSQL, RabbitMQ, Сервер DataHUB, Frontend, Reverse Proxy, S3 хранилище.

Блочная структура поставки

После распаковки релизного архива и копирования шаблонов в /etc/datahub/ структура каталога выглядит так:

/etc/datahub/
├── devops-core/      # общая инфраструктура (Docker-сеть)
├── rabbitmq/         # транспорт сообщений
├── postgres/         # база данных
├── pg-agmin/         # веб-интерфейс администратора БД (опционально)
├── flyway/           # миграции схемы БД
├── backend/          # Сервер DataHUB (REST API, авторизация)
├── frontend/         # административный веб-интерфейс
├── nginx/            # reverse proxy и единая точка входа
├── firewall/         # сетевые правила (опционально)
└── vpn/              # VPN-узел для удалённого администрирования (опционально)

Каждый каталог — самостоятельный блок Docker Compose со своим docker-compose.yml, .env и подкаталогами для данных, логов и конфигурации. Блоки не зависят друг от друга на уровне Compose: каждый запускается своей командой docker compose up. Связь между блоками — через общую Docker-сеть dh_network.

Общий шаблон блока

Все блоки построены по единому шаблону. На примере backend:

x-logging: &default-logging
  driver: "json-file"
  options:
    max-size: "100m"
    max-file: "10"

networks:
  dh_network:
    external: true
    name: dh_network

services:
  backend:
    image: registry.gitlab.com/datahub/v3/services/backend-mono:dev
    container_name: backend
    hostname: backend
    volumes:
      - ./certs:/datahub/backend/secrets:rw
      - ./log/:/var/log/nginx/:rw
      - ./templates:/datahub/backend/resources/templates:ro
    expose:
      - "80"
    env_file:
      - .env
    restart: always
    logging: *default-logging
    networks:
      - dh_network

Ключевые соглашения:

  • image — образ из приватного реестра вендора (registry.gitlab.com/datahub/v3/services/<name>:<tag>). В офлайн-поставке образы предварительно загружаются командой docker load из images/*.tar.gz.
  • container_name и hostname — короткое имя сервиса (backend, postgres, rabbitmq, nginx, …). Совпадает с DNS-именем внутри сети dh_network — по нему соседние блоки обращаются к сервису.
  • networks: [dh_network] — все сервисы подключены к общей внешней сети. Подробнее ниже.
  • env_file: [.env] — переменные окружения берутся из файла .env рядом с docker-compose.yml. Шаблон .env.template лежит в том же каталоге и копируется в .env при первичной установке.
  • restart: always — рестарт при сбое и при старте Docker. Исключения: flyway (restart: "no" — одноразовая миграция), frontend (unless-stopped), devops-core/dh_initializer ("no").
  • logging: *default-logging — единый драйвер логов json-file с ротацией: 100 МБ на файл, 10 файлов на сервис. Логи пишутся в /var/lib/docker/containers/<id>/<id>-json.log и доступны через docker logs <container>.

Тома и каталоги внутри блока

В каждом блоке используются bind-mount тома, привязанные к относительным каталогам блока (./data, ./certs, ./log, ./templates, ./config):

Назначение Типичный путь в блоке Использующие блоки
Постоянные данные ./data postgres, rabbitmq, pg-agmin
Сертификаты и секреты ./certs backend, nginx
Логи сервиса ./log backend, nginx
Конфигурация ./config nginx
Шаблоны (письма и т.п.) ./templates backend
Веб-контент ./html nginx

Все эти каталоги — на хост-файловой системе сервера, внутри /etc/datahub/<block>/. Бэкап серверной части сводится к бэкапу /etc/datahub/ плюс дамп PostgreSQL — см. Резервное копирование.

Что наружу, что внутрь

DataHUB использует строгое разделение: наружу выставлен только nginx, остальные блоки доступны только через общую Docker-сеть.

  • ports (проброс порта хоста в контейнер) — только в блоке nginx. Слушает 80 (редирект), 443 (основной HTTPS), 15432/15672 (reverse proxy на pgAdmin и RabbitMQ Management).
  • expose (порт виден только внутри Docker-сети) — у всех остальных блоков. backend80, frontend3000, postgres5432, rabbitmq5672 и 15672, pg-admin80.

Такое разделение означает, что прямого доступа к backend, БД или брокеру с внешней сети нет — весь внешний трафик проходит через nginx с авторизацией и rate-limiting.

Сеть dh_network

Все блоки общаются через единую bridge-сеть dh_network. Сеть создаётся блоком devops-core и помечается в нём как внутренняя, а во всех остальных блоках — как external:

# devops-core/docker-compose.yml — создаёт сеть
networks:
  dh_network:
    name: dh_network
    driver: bridge
    ipam:
      config:
        - subnet: 10.203.0.0/24

# остальные блоки — подключаются к существующей
networks:
  dh_network:
    external: true
    name: dh_network

Это означает: пока не запущен devops-core, остальные блоки запустить нельзя — Docker не найдёт сеть. Поэтому devops-core всегда стартует первым.

Имена сервисов внутри сети резолвятся как DNS-имена: backend обращается к БД по адресу postgres:5432, к брокеру — по rabbitmq:5672, nginx проксирует на backend:80 и frontend:3000. Эти имена задаются полями container_name / hostname в шаблонах блоков.

Порядок запуска

Блоки независимы на уровне Docker Compose (внутри блока нет depends_on ссылок на другие блоки), но они зависимы по данным. Корректный порядок старта:

  1. devops-core — создаёт сеть dh_network. Без неё остальные блоки не стартуют.
  2. rabbitmq — должен быть готов до старта backend (backend подписывается на очереди при старте).
  3. postgres — должен быть готов до старта flyway и backend.
  4. pg-agmin (опционально) — можно запускать после postgres, не блокирует остальные.
  5. flyway — применяет миграции схемы и завершается. Должен отработать до старта backend.
  6. backend — основной сервер платформы.
  7. frontend — административный интерфейс, общается с backend по REST.
  8. nginx — последним, после того как frontend и backend готовы принимать запросы.

При штатном перезапуске сервера тот же порядок поддерживается опцией restart: always и зависимостью через Docker-сеть: блоки восстанавливаются параллельно, но сетевые подключения устанавливаются по мере готовности соседей.

Шаблоны .env и реальные .env

В каждом блоке, требующем настройки, лежит файл .env.template с пустыми или примерными значениями. Реальный .env создаётся копированием шаблона и заполняется руками — это разделение позволяет хранить шаблон в git, а реальные секреты держать только на сервере.

Конвенция первичной установки:

sudo sh -c 'cat ./.env.template > ./.env'
sudo vim ./.env

Перекрёстные значения между блоками (имя пользователя БД, пароль брокера, имя exchange) подставляются согласованно — backend читает те же креды БД, которые указаны в postgres/.env. Контроль согласованности — на администраторе; диагностика рассогласования — по логам backend (docker logs backend).

Блоки без .env.template:

  • devops-core — у блока нет переменных, кроме встроенных параметров сети.
  • firewall, vpn — опциональные, конфигурируются индивидуально под инфраструктуру заказчика.

Операционные команды

Все команды выполняются из каталога соответствующего блока (cd /etc/datahub/<block>).

Запуск блока в фоне:

sudo docker compose up -d

Остановка и удаление контейнеров блока (тома и .env сохраняются):

sudo docker compose down

Перезапуск одного блока без пересоздания контейнеров:

sudo docker compose restart

Статус контейнеров блока:

sudo docker compose ps

Просмотр логов контейнера в реальном времени (с конца, последние 200 строк):

sudo docker logs -f --tail 200 <container_name>

Применение изменений в .env или docker-compose.yml — пересоздание контейнеров с новой конфигурацией:

sudo docker compose up -d --force-recreate

Загрузка нового образа из реестра (для онлайн-обновления):

sudo docker compose pull
sudo docker compose up -d

Полное описание процедуры обновления — в Обновление платформы.

Состояние всей платформы

Общий статус всех контейнеров платформы, отсортированный по имени:

sudo docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

Список Docker-сетей (должна присутствовать dh_network):

sudo docker network ls

Кто подключён к dh_network:

sudo docker network inspect dh_network --format '{{range .Containers}}{{.Name}} {{end}}'

Что дальше

Дальнейшие статьи раздела детально описывают каждый блок и сквозные настройки.

Компоненты по порядку запуска:

  • DevOps Core — сеть dh_network, должен стартовать первым.
  • PostgreSQL — БД и миграции Flyway.
  • RabbitMQ — брокер сообщений.
  • Сервер DataHUB — основной сервер платформы, REST API, авторизация.
  • Frontend — административный веб-интерфейс.
  • Reverse Proxy — nginx, единая точка входа.
  • S3 хранилище — объектное хранилище (опционально).

Сквозные настройки:

Эксплуатация: