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-ключ настроен)
Автоматическая инициализация. Структура БД, расширения, схемы, таблицы, функции и справочные данные создаются автоматически при первом запуске контейнера 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
Планировщик задач внутри БД
http
HTTP-запросы из 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 функций)
Healthcheck: Контейнер postgres считается здоровым только после выполнения всех init-скриптов. Зависимые сервисы не стартуют, пока инициализация не завершена. Healthcheck проверяет наличие записи refr.account WHERE id_account = 1, которая создаётся последним скриптом 07-additional-data.sql.
Что создаётся автоматически
Объект
БД
Описание
БД ref
—
Основная база: справочники, аккаунты, ТС, конфигурации, JOFL
Справочники (аккаунты, организации, ТС, роли, конфигурации)
Табличные пространства
ref
mon_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 / macOSbash 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-топики при первом подключении. Ручное создание топиков не требуется.
Справочник топиков
Топик
Формат
Продюсер
Консьюмер-группы
coords
octet-stream
hub-wialon-combine-v2
ts-loader, recent-values, recent-values-v2
change-sensor-value
JSON
recent-values-v2-service
alarm-service
active-alerts
JSON
alarm-service
online-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 сборка упадёт.
Пользователь БД (создаётся автоматически контейнером)
DB_PASSWORD
change_me
Пароль БД
DB_NAME_REF
ref
Имя БД справочников
DB_NAME_REFTS
refts
Имя БД телеметрии
DB_POOL_MAX
4
Макс. соединений на сервис
DB_POOL_MIN_IDLE
1
Мин. idle-соединений
HUB_WIALON_COMBINE_TCP_HOST_PORT
9201
Внешний TCP-порт Wialon
HUB_WIALON_COMBINE_HTTP_HOST_PORT
62011
HTTP-порт хаба
CUSTOM_ONLINE_INFO_HOST_PORT
62010
Порт кастомного онлайн-табло
Обязательно измените 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 и содержит маппинг протокольных сенсоров.
При стандартном развёртывании файл из репозитория подходит «как есть». Редактируйте при нестандартной конфигурации устройств.
Первая сборка загружает Maven-зависимости и занимает значительное время. Образ postgres также собирается при первой сборке (компиляция расширения pg_background). Последующие сборки используют Docker-кэш и выполняются быстрее.
# Запуск всей системы в фонеdocker compose up -d# Просмотр логов запуска
docker compose logs -f
# Просмотр логов конкретного сервиса
docker compose logs -f config-service
Порядок запуска (автоматический через depends_on)
postgres — запускается первым, выполняет init-скрипты (создание БД, схем, таблиц, справочников). Healthcheck ждёт полного завершения инициализации
kafka — запускается после postgres (KRaft-режим, готов за ~10 секунд)
raw-rest-service, alarm-service, recent-values-* — зависят от config-service
hub-wialon-combine-v2 — зависит от hub-config-service-v2 и kafka
aggr-rest-service — зависит от raw-rest-service
aggr-builder-service, custom-online-info — зависят от aggr-rest-service
online-info-v2 — зависит от alarm-service и recent-values-v2
xls-pdf-report-service, db-report-service — зависят от aggr-builder-service
jsofl2 — зависит от ref-jofl-service
Первый запуск занимает 5–15 минут: основное время уходит на выполнение init-скриптов PostgreSQL (создание схем, ~1000 таблиц, ~800 функций, заливка справочников). Последующие запуски — 3–7 минут (данные уже на томе postgres_data).
Важно: init-скрипты выполняются только при первом создании тома postgres_data. Если том уже существует, скрипты не запускаются повторно. Для полной реинициализации удалите том: docker volume rm ref-vc_postgres_data.
Минимальные внешние порты: для пользователей достаточно 80 (web) и 9201 (TCP для устройств). Порт 9103 — опционально для администраторов. Порт 5432 полезен для доступа к БД из IDE или psql.
10. Логирование
Логи каждого сервиса записываются в файлы внутри контейнера и маунтятся в ./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.dumpdocker 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.dumpdocker 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