Руководство по развёртыванию — Большой брат v2

Руководство по развёртыванию

Платформа «Большой брат v2» — пошаговая инструкция от подготовки инфраструктуры до запуска

Реестр схем развёртывания

1Последовательность развёртывания
11 шагов от проверки требований до верификации работоспособности.
Открыть →
2Топология инфраструктуры
Сервер приложений, БД, Kafka, сетевые требования, тома.
Открыть →
3Инициализация баз данных
Автоматические init-скрипты: табличные пространства, расширения, 4 схемы, справочники, seed-данные, Flyway.
Открыть →
4Конвейер сборки образов
Frontend (Node→Nginx), Backend (Maven JDK 8/17), типы Dockerfile.
Открыть →

1. Предварительные требования

Топология инфраструктуры

Серверы и ПО

КомпонентТребованиеПримечание
DockerDocker Engine + Docker Compose v2Команда docker compose (без дефиса)
Gitgit 2.x с поддержкой submodulesДля --recurse-submodules
ОЗУМинимум 16 ГБ, рекомендуется 32 ГБPostgreSQL + Kafka + 18 JVM-контейнеров + Nginx
Диск50+ ГБ для образов, логов, данных БД и сборкиSSD рекомендуется
PostgreSQL и Apache Kafka входят в состав Docker Compose и запускаются как контейнеры вместе с остальными сервисами. Устанавливать их отдельно не требуется. Образ PostgreSQL собирается из database/postgres/Dockerfile на базе TimescaleDB HA (PG 17.9 + расширения postgis, pg_cron, http, pg_background). Kafka работает в режиме KRaft (без Zookeeper).

Чек-лист перед началом

  • Docker и Docker Compose установлены и работают
  • Git установлен, есть доступ к репозиторию (SSH-ключ настроен)
  • Достаточно ОЗУ и дискового пространства

2. Инициализация баз данных

Схема инициализации БД
Автоматическая инициализация. Структура БД, расширения, схемы, таблицы, функции и справочные данные создаются автоматически при первом запуске контейнера postgres. Скрипты расположены в database/postgres/init/ и монтируются в /docker-entrypoint-initdb.d. Ручное создание структуры БД не требуется.

Кастомный образ PostgreSQL

Образ собирается из database/postgres/Dockerfile на базе TimescaleDB HA (PG 17.9, TS 2.25.2) и включает расширения, необходимые для работы сервисов:

РасширениеНазначение
timescaledbГипертаблицы, сжатие, политики удержания телеметрии
postgisГеопространственные типы и функции
pg_cronПланировщик задач внутри БД
httpHTTP-запросы из SQL-функций
pg_backgroundФоновые рабочие процессы
pgcryptoКриптографические функции (хеширование паролей)
fuzzystrmatchНечёткое сравнение строк
dblink, postgres_fdw, file_fdwФедеративный доступ к внешним данным

Порядок выполнения init-скриптов

При первом запуске контейнера PostgreSQL скрипты из database/postgres/init/ выполняются в лексикографическом порядке:

СкриптДействие
00-init-tablespaces.shСоздание директорий для табличных пространств (mon_data, mon_idx, refr_data, refr_idx)
00-init-tablespaces.sqlСоздание табличных пространств в БД ref
01-extensions-ref.sqlУстановка расширений на БД ref (plpgsql, pgcrypto, postgis, dblink, http, pg_background и др.) + pg_cron на postgres
01-init-timescaledb.sqlСоздание БД refts и установка расширения TimescaleDB
02-init-jofl-schema.sqlСхема jofl — таблицы и функции JOFL-подсистемы (~37 таблиц, ~162 функции)
03-init-mon-schema.sqlСхема mon — мониторинг и телеметрия (~55 таблиц, ~25 функций)
04-init-bb-schema.sqlСхема bb — бизнес-функции, мосты между mon/jofl/refr (~105 функций)
05-init-refr-schema.sqlСхема refr — справочники, аккаунты, транспорт, тревоги (~372 таблицы, ~531 функция)
06-init-jofl-meta.sqlМетаданные JOFL: меню, роли, окна, фильтры, словари
06z-init-refr-ref-data.sqlСправочники: страны (refr.country), ОКОПФ (refr.okopf) для РФ, Казахстана, Беларуси
07-additional-data.sqlSeed-данные: организация, аккаунт, портал, роли, константы, регионы (refr.ref_geo), типы графиков, статусы расчётов, последовательности
Healthcheck: Контейнер postgres считается здоровым только после выполнения всех init-скриптов. Зависимые сервисы не стартуют, пока инициализация не завершена. Healthcheck проверяет наличие записи refr.account WHERE id_account = 1, которая создаётся последним скриптом 07-additional-data.sql.

Что создаётся автоматически

ОбъектБДОписание
БД refОсновная база: справочники, аккаунты, ТС, конфигурации, JOFL
БД reftsТелеметрия: TimescaleDB для временных рядов
Схема joflrefJOFL-подсистема (UI-метаданные, маршрутизация вызовов)
Схема monrefМониторинг (ТС, хабы, сенсоры, маршруты, тревоги)
Схема bbrefБизнес-логика (PL/pgSQL функции-мосты)
Схема refrrefСправочники (аккаунты, организации, ТС, роли, конфигурации)
Табличные пространстваrefmon_data, mon_idx, refr_data, refr_idx
СправочникиrefСтраны, ОКОПФ, регионы, константы, типы тревог, роли
СуперпользовательrefАккаунт REF_ADM (id=1), пароль по умолчанию в скриптах

Flyway-миграции БД refts (выполняются автоматически сервисом ts-loader)

Помимо init-скриптов, сервис ts-loader при первом запуске выполняет Flyway-миграции в БД refts:

МиграцияОписание
V1.1Создание расширения TimescaleDB
V1.2Создание схемы monraw, назначение владельца
V1.3Функция monraw.dummy_now() для гипертаблиц
V1.4Гипертаблица monraw.traffic с индексами
V1.5Гипертаблица monraw.tfc_sensor
V1.6Гипертаблица monraw.tfc_sensor_str

Тестирование инициализации изолированно

Для проверки корректности init-скриптов без влияния на рабочее окружение используйте скрипт:

# Linux / macOS bash database/postgres/scripts/run-init-isolated.sh # Windows (PowerShell) .\database\postgres\scripts\run-init-isolated.ps1
Скрипт создаёт временный Docker-том и контейнер, прогоняет все init-скрипты, проверяет pg_isready и автоматически удаляет контейнер и том после завершения. Подходит для CI/CD и проверки перед деплоем.

Опциональные политики (после запуска)

-- Подключиться к БД refts
psql -U adv -h localhost -d refts

-- Политика удержания данных (~18 месяцев)
SELECT add_retention_policy('monraw.traffic', drop_after => 47304000);
SELECT add_retention_policy('monraw.tfc_sensor', drop_after => 47304000);
SELECT add_retention_policy('monraw.tfc_sensor_str', drop_after => 47304000);

-- Политика сжатия (через 1 день) -- Настроить compression и add_compression_policy для каждой гипертаблицы
Скрипты политик находятся в backend/ts-loader/src/main/resources/db/additional_scripts_for_new_timescale/

3. Apache Kafka

Kafka входит в состав Docker Compose и запускается как контейнер kafka (образ apache/kafka:3.9.0) в режиме KRaft (без Zookeeper). Дополнительная настройка не требуется.

Автоматическое создание топиков. Сервисы самостоятельно создают необходимые Kafka-топики при первом подключении. Ручное создание топиков не требуется.

Справочник топиков

ТопикФорматПродюсерКонсьюмер-группы
coordsoctet-streamhub-wialon-combine-v2ts-loader, recent-values, recent-values-v2
change-sensor-valueJSONrecent-values-v2-servicealarm-service
active-alertsJSONalarm-serviceonline-info-v2

4. Клонирование репозитория

# Клонирование с субмодулями (обязательно!) git clone --recurse-submodules git@gitlab.advantum.ru:vibecoding/ref-vc.git
cd ref-vc

# Если уже склонировано без субмодулей
git submodule update --init --recursive
Критично: сборка Docker-образов для 8 сервисов требует данные из .git/modules/. Без --recurse-submodules сборка упадёт.

Структура субмодулей (17 штук)

ПутьОписание
backend/admin-serviceSpring Boot Admin Server
backend/config-serviceКонфигурация сенсоров
backend/hub-config-service-v2Конфигурация хабов
backend/hub-wialon-combine-v2Приём телеметрии Wialon
backend/ts-loaderЗагрузка в хранилище
backend/ts-storageОбщие библиотеки
backend/raw-rest-serviceAPI сырых данных
backend/recent-values-serviceПоследние значения v1
backend/recent-values-v2-serviceПоследние значения v2
backend/alarm-serviceСервис тревог
backend/online-info-v2Онлайн-панель
backend/custom-online-infoКастомное онлайн-табло
backend/restauthАутентификация
backend/xls-pdf-report-serviceXLS/PDF отчёты
backend/db-report-serviceБД-отчёты
backend/ref-jofl-serviceJOFL backend
frontend/jsofl2React SPA

5. Конфигурация

Шаг 5.1. Файл .env

# Скопировать шаблон cp .env.example .env # Отредактировать параметры
nano .env
ПеременнаяЗначение по умолчаниюОписание
KAFKA_BOOTSTRAP_SERVERSkafka:9092Адрес Kafka-брокера (имя Docker-сервиса)
DB_HOSTpostgresХост PostgreSQL (имя Docker-сервиса)
DB_PORT5432Порт PostgreSQL на хосте (маппинг)
DB_USERadvПользователь БД (создаётся автоматически контейнером)
DB_PASSWORDchange_meПароль БД
DB_NAME_REFrefИмя БД справочников
DB_NAME_REFTSreftsИмя БД телеметрии
DB_POOL_MAX4Макс. соединений на сервис
DB_POOL_MIN_IDLE1Мин. idle-соединений
HUB_WIALON_COMBINE_TCP_HOST_PORT9201Внешний TCP-порт Wialon
HUB_WIALON_COMBINE_HTTP_HOST_PORT62011HTTP-порт хаба
CUSTOM_ONLINE_INFO_HOST_PORT62010Порт кастомного онлайн-табло
Обязательно измените DB_PASSWORD на надёжный пароль! Этот пароль используется как для создания роли PostgreSQL контейнером, так и для подключения всех сервисов.
DB_HOST и KAFKA_BOOTSTRAP_SERVERS по умолчанию указывают на имена Docker-сервисов (postgres и kafka). JDBC-подключения внутри Docker-сети всегда используют порт 5432. Переменная DB_PORT задаёт маппинг порта на хост — для доступа снаружи (например, из IDE или psql).

Шаг 5.2. Конфигурация хаба (hub-config.xml)

Файл находится в settings/backend/hub-wialon-combine-v2/hub-config.xml. Он монтируется в контейнер hub-wialon-combine-v2 и содержит маппинг протокольных сенсоров.

При стандартном развёртывании файл из репозитория подходит «как есть». Редактируйте при нестандартной конфигурации устройств.

6. Сборка Docker-образов

Конвейер сборки
# Сборка всех 18 образов (первый раз — 15-40 минут) docker compose build # Или сборка конкретного сервиса
docker compose build config-service

Что происходит при сборке

СлойБазовый образ (build)Базовый образ (runtime)Сервисы
PostgreSQLtimescale/timescaledb-ha:pg17.9-ts2.25.2-allpostgres (+ http, pg_background)
Frontendnode:22-bullseyenginx:alpinejsofl2
Backend JDK 17maven:3.6-openjdk-17liberica-openjdk-alpine:17admin, hub-config, hub-wialon, ts-loader, alarm, restauth, online-info, custom-online, recent-v2, xls-pdf, db-report
Backend JDK 8maven:3.6-openjdk-8liberica-openjdk-alpine:8u372 / temurin:8-jreconfig, raw-rest, recent-values, aggr-rest, aggr-builder
Legacymaven:3.6.1-jdk-8-alpineanapsix/alpine-java:8ref-jofl-service
Первая сборка загружает Maven-зависимости и занимает значительное время. Образ postgres также собирается при первой сборке (компиляция расширения pg_background). Последующие сборки используют Docker-кэш и выполняются быстрее.

7. Запуск системы

Последовательность развёртывания
# Запуск всей системы в фоне docker compose up -d # Просмотр логов запуска
docker compose logs -f

# Просмотр логов конкретного сервиса
docker compose logs -f config-service

Порядок запуска (автоматический через depends_on)

  1. postgres — запускается первым, выполняет init-скрипты (создание БД, схем, таблиц, справочников). Healthcheck ждёт полного завершения инициализации
  2. kafka — запускается после postgres (KRaft-режим, готов за ~10 секунд)
  3. admin-service — зависит от postgres (healthcheck)
  4. config-service, hub-config-service-v2, restauth, ts-loader, ref-jofl-service — зависят от postgres (healthcheck) + admin-service
  5. raw-rest-service, alarm-service, recent-values-* — зависят от config-service
  6. hub-wialon-combine-v2 — зависит от hub-config-service-v2 и kafka
  7. aggr-rest-service — зависит от raw-rest-service
  8. aggr-builder-service, custom-online-info — зависят от aggr-rest-service
  9. online-info-v2 — зависит от alarm-service и recent-values-v2
  10. xls-pdf-report-service, db-report-service — зависят от aggr-builder-service
  11. jsofl2 — зависит от ref-jofl-service
Первый запуск занимает 5–15 минут: основное время уходит на выполнение init-скриптов PostgreSQL (создание схем, ~1000 таблиц, ~800 функций, заливка справочников). Последующие запуски — 3–7 минут (данные уже на томе postgres_data).
Важно: init-скрипты выполняются только при первом создании тома postgres_data. Если том уже существует, скрипты не запускаются повторно. Для полной реинициализации удалите том: docker volume rm ref-vc_postgres_data.

8. Верификация и проверка здоровья

# Статус всех контейнеров docker compose ps # Проверка healthcheck
docker inspect --format='{{.State.Health.Status}}' admin-service
docker inspect --format='{{.State.Health.Status}}' config-service

# Массовая проверка здоровья for s in postgres kafka admin-service config-service \
  hub-config-service-v2 hub-wialon-combine-v2 ts-loader \
  raw-rest-service aggr-rest-service aggr-builder-service \
  alarm-service restauth online-info-v2 custom-online-info \
  recent-values-service recent-values-v2-service \
  xls-pdf-report-service db-report-service \
  ref-jofl-service jsofl2; do
  echo "$s: $(docker inspect --format='{{.State.Health.Status}}' $s 2>/dev/null || echo 'NOT FOUND')"
done

Что проверить после запуска

ПроверкаURL / КомандаОжидаемый результат
Web-интерфейсhttp://<host>:80Экран входа jsofl2
Spring Boot Adminhttp://<host>:9103Wallboard с зелёными статусами
Config-service APIhttp://<host>:9102/actuator/health{"status":"UP"}
Приём телеметрииtelnet <host> 9201TCP-соединение устанавливается

9. Карта портов

ПортСервисПротоколДоступ
80jsofl2 (Nginx)HTTPПользователи (браузер)
5432postgresTCPАдминистраторы / IDE
9092kafkaTCPВнутренний (Docker-сеть)
9103admin-serviceHTTPАдминистраторы
9201hub-wialon-combine-v2TCPТелематические устройства
59201 / 62011hub-wialon-combine-v2HTTPВнутренний
8000hub-config-service-v2HTTPВнутренний
8087xls-pdf-report-serviceHTTPВнутренний
8089db-report-serviceHTTPВнутренний
9099restauthHTTPВнутренний
9100raw-rest-serviceHTTPВнутренний
9101ts-loaderHTTPВнутренний
9102config-serviceHTTPВнутренний
9104aggr-rest-serviceHTTPВнутренний
9107aggr-builder-serviceHTTPВнутренний
9110recent-values-serviceHTTPВнутренний
9112recent-values-v2-serviceHTTPВнутренний
9198alarm-serviceHTTPВнутренний
28081ref-jofl-serviceHTTPВнутренний
42079online-info-v2HTTPВнутренний
61010 / 62010custom-online-infoHTTPВнутренний
Минимальные внешние порты: для пользователей достаточно 80 (web) и 9201 (TCP для устройств). Порт 9103 — опционально для администраторов. Порт 5432 полезен для доступа к БД из IDE или psql.

10. Логирование

Логи каждого сервиса записываются в файлы внутри контейнера и маунтятся в ./logs/:

# Структура директорий логов (создаётся Docker автоматически при маунте)
logs/
├── backend/
│   ├── admin-service/
│   ├── config-service/
│   ├── hub-config-service-v2/
│   ├── hub-wialon-combine-v2/
│   ├── ts-loader/
│   ├── raw-rest-service/
│   ├── aggr-rest-service/
│   ├── aggr-builder-service/
│   ├── alarm-service/
│   ├── restauth/
│   ├── xls-pdf-report-service/
│   ├── db-report-service/
│   ├── online-info-v2/
│   ├── custom-online-info/
│   ├── recent-values-service/
│   ├── recent-values-v2-service/
│   └── ref-jofl-service/
└── frontend/
    └── jsofl2/           # Nginx access/error logs

Ротация: большинство сервисов настроены на LOGGING_FILE_MAX-HISTORY: 3 (хранить 3 файла истории).

11. Обслуживание и обновление

Обновление кода

# Остановить систему
docker compose down

# Обновить код и субмодули git pull --recurse-submodules
git submodule update --recursive

# Пересобрать и запустить docker compose build && docker compose up -d

Перезапуск отдельного сервиса

docker compose restart config-service # Или с пересборкой
docker compose up -d --build config-service

Очистка

# Удалить остановленные контейнеры и неиспользуемые образы
docker system prune -f

# Удалить все образы проекта для полной пересборки
docker compose down --rmi local

Резервное копирование БД

# Дамп справочной БД (через контейнер postgres) docker compose exec postgres pg_dump -U adv -d ref -F c -f /tmp/ref_backup.dump docker compose cp postgres:/tmp/ref_backup.dump ./ref_backup_$(date +%Y%m%d).dump # Дамп телеметрической БД docker compose exec postgres pg_dump -U adv -d refts -F c -f /tmp/refts_backup.dump docker compose cp postgres:/tmp/refts_backup.dump ./refts_backup_$(date +%Y%m%d).dump # Или через pg_dump с хоста (если установлен клиент PostgreSQL)
pg_dump -U adv -h localhost -p 5432 -d ref -F c -f ref_backup_$(date +%Y%m%d).dump

12. Устранение неполадок

Контейнер не запускается / перезапускается

# Посмотреть логи контейнера
docker compose logs --tail=100 имя_сервиса

# Проверить статус healthcheck
docker inspect имя_сервиса | grep -A 10 Health

Частые проблемы

СимптомПричинаРешение
Сервис падает с Connection refused к БДКонтейнер postgres ещё выполняет init-скрипты или не запущенПроверить docker compose ps postgres и healthcheck. Дождаться статуса healthy
too many clients alreadyИсчерпан пул соединений PostgreSQLУменьшить DB_POOL_MAX в .env (по умолчанию 4). В docker-compose.yml задано max_connections=300
Init-скрипты postgres падаютОшибка в SQL-скриптах database/postgres/init/Проверить docker compose logs postgres, удалить том docker volume rm ref-vc_postgres_data и перезапустить
Kafka consumer не подключаетсяКонтейнер kafka не готовПроверить docker compose ps kafka. Убедиться, что KAFKA_BOOTSTRAP_SERVERS=kafka:9092
Сборка: fatal: not a git repositoryСубмодули не инициализированыgit submodule update --init --recursive
jsofl2: 502 Bad Gatewayref-jofl-service ещё не готовПодождать 1–2 минуты, проверить healthcheck ref-jofl-service
Нет данных на картеУстройства не подключены / coords-топик пустПроверить TCP-подключение к порту 9201, топик coords в Kafka
Нет тревогТипы тревог отключены в конфигурацииПроверить переменные APP_SUPPORTED_ALARMS_* в docker-compose.yml

Полезные команды диагностики

# Все контейнеры и их статусы
docker compose ps -a

# Использование ресурсов
docker stats --no-stream

# Зайти внутрь контейнера
docker compose exec config-service sh

# Проверить подключение к Kafka изнутри контейнера
docker compose exec ts-loader sh -c "nc -zv kafka 9092"

# Проверить подключение к БД изнутри контейнера
docker compose exec config-service sh -c "nc -zv postgres 5432"

# Подключиться к БД напрямую через контейнер postgres
docker compose exec postgres psql -U adv -d ref

# Проверить, что init-скрипты отработали корректно
docker compose exec postgres psql -U adv -d ref -c "SELECT count(*) FROM refr.account"
Узнать стоимость
Оставьте свои данные и мы обязательно с вами свяжемся