Архитектура развертывания
Серверная часть 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-сети) — у всех остальных блоков.backend—80,frontend—3000,postgres—5432,rabbitmq—5672и15672,pg-admin—80.
Такое разделение означает, что прямого доступа к 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 ссылок на другие блоки), но они зависимы по данным. Корректный порядок старта:
devops-core— создаёт сетьdh_network. Без неё остальные блоки не стартуют.rabbitmq— должен быть готов до стартаbackend(backend подписывается на очереди при старте).postgres— должен быть готов до стартаflywayиbackend.pg-agmin(опционально) — можно запускать послеpostgres, не блокирует остальные.flyway— применяет миграции схемы и завершается. Должен отработать до стартаbackend.backend— основной сервер платформы.frontend— административный интерфейс, общается с backend по REST.nginx— последним, после того как frontend и backend готовы принимать запросы.
При штатном перезапуске сервера тот же порядок поддерживается опцией restart: always и зависимостью через Docker-сеть: блоки восстанавливаются параллельно, но сетевые подключения устанавливаются по мере готовности соседей.
Шаблоны .env и реальные .env
В каждом блоке, требующем настройки, лежит файл .env.template с пустыми или примерными значениями. Реальный .env создаётся копированием шаблона и заполняется руками — это разделение позволяет хранить шаблон в git, а реальные секреты держать только на сервере.
Конвенция первичной установки:
Перекрёстные значения между блоками (имя пользователя БД, пароль брокера, имя exchange) подставляются согласованно — backend читает те же креды БД, которые указаны в postgres/.env. Контроль согласованности — на администраторе; диагностика рассогласования — по логам backend (docker logs backend).
Блоки без .env.template:
devops-core— у блока нет переменных, кроме встроенных параметров сети.firewall,vpn— опциональные, конфигурируются индивидуально под инфраструктуру заказчика.
Операционные команды
Все команды выполняются из каталога соответствующего блока (cd /etc/datahub/<block>).
Запуск блока в фоне:
Остановка и удаление контейнеров блока (тома и .env сохраняются):
Перезапуск одного блока без пересоздания контейнеров:
Статус контейнеров блока:
Просмотр логов контейнера в реальном времени (с конца, последние 200 строк):
Применение изменений в .env или docker-compose.yml — пересоздание контейнеров с новой конфигурацией:
Загрузка нового образа из реестра (для онлайн-обновления):
Полное описание процедуры обновления — в Обновление платформы.
Состояние всей платформы
Общий статус всех контейнеров платформы, отсортированный по имени:
Список Docker-сетей (должна присутствовать dh_network):
Кто подключён к dh_network:
Что дальше
Дальнейшие статьи раздела детально описывают каждый блок и сквозные настройки.
Компоненты по порядку запуска:
- DevOps Core — сеть
dh_network, должен стартовать первым. - PostgreSQL — БД и миграции Flyway.
- RabbitMQ — брокер сообщений.
- Сервер DataHUB — основной сервер платформы, REST API, авторизация.
- Frontend — административный веб-интерфейс.
- Reverse Proxy — nginx, единая точка входа.
- S3 хранилище — объектное хранилище (опционально).
Сквозные настройки:
- Настройка безопасности — TLS, mTLS, секреты, парольная политика, firewall, security headers.
- Настройка уведомлений — SMTP и SMS.
Эксплуатация:
- Production-настройка — финальный чек-лист готовности промышленного стенда.
- Мониторинг и логи — healthcheck-эндпоинты, формат логов, рекомендации по алертам.
- Обновление платформы — процедура обновления развёрнутых блоков.
- Резервное копирование — стратегия и порядок бэкапа.