Введение
Архитектура
Обработка входящих запросов
Коммуникация сервисов
Руководство пользователя
Получение данных из сервисов
Использование Панели управления
Туториалы
Получение данных из других сервисов
Построение истории отдельного пользователя
Классические модели атрибуции
Вероятностное прохождение воронки
Атрибуция по индексу активности
Воронки
X
Выберите раздел

Сборка и запуск

Сервис запускается тремя способами: в dev-режиме с перезапуском по изменению файлов, собранным JavaScript из dist/ и в Docker-контейнере на базовом образе платформы.

Локальный запуск

Нужен доступ к Redis вашей инсталляции (напрямую или через туннель) и .env с его адресом:

npm install
npm run start:dev

start:dev запускает ts-node-dev с tsconfig-paths и source-map-support, а вывод прогоняет через pino-pretty. При изменении файлов в src/ процесс перезапускается. LOG_LEVEL=debug включает отладочные записи, в том числе о подписках на каналы:

INFO  RedisClient: Starting redis client. DSN: redis://127.0.0.1:6379/0
INFO  RPCAdapterRedis: subscribed channel=kafkastream
INFO  RPCAdapterRedis: subscribed channel=broadcast
INFO  RPCAgnostic: started
INFO  AppServer: Setup completed

Сборка и запуск собранного кода:

npm run build        # rimraf dist && tsc
npm run start:prod   # node dist/index с tsconfig-paths и source maps

В start:prod переменная TS_NODE_BASEURL=./dist переключает алиас @app/* на собранные файлы.

Базовый образ

Все TypeScript-сервисы собираются от образа rockstat/band-base-ts. Он строится из репозитория rockme-framework: node:22-alpine с инструментами для нативных модулей (python3, make, gcc), фреймворк собран в /usr/src/rockme и опубликован через npm link. Благодаря этому в Dockerfile сервиса достаточно npm link @rockstat/rock-me-ts, и фреймворк берётся из образа, а не из реестра.

Теги образа: ng — текущая ветка разработки, latest — стабильный. Пересобирается он из rockmets командами make build (или make build_macos_arm64 на Apple Silicon, собирает под linux/amd64), make tag-ng, make push-ng; всё вместе — make all-ng.

Dockerfile сервиса

ARG BASE_CONTAINER=rockstat/band-base-ts:ng
FROM $BASE_CONTAINER

LABEL band.service.version="1.0.0"
LABEL band.service.title="My service"
LABEL band.service.def_position="3x1"

WORKDIR /app

COPY package.json .
COPY package-lock.json .
RUN npm link @rockstat/rock-me-ts
RUN npm install && npm cache clean --force

COPY . .
RUN npm run build

ENV REDIS_DSN=redis://redis:6379
ENV NODE_ENV=production

CMD [ "npm", "run", "start:prod" ]

Порядок слоёв важен: сначала копируются только манифесты и ставятся зависимости, потом исходники. Так правка кода не сбрасывает кэш npm install. .dockerignore должен исключать node_modules, dist и .env*.

Метки band.service.* читает Панель управления: версия, человекочитаемое имя и позиция карточки сервиса на дашборде.

Если фреймворк в package.json указан как file:../rockmets, в образе этого пути нет. kafkastream решает это копированием: RUN cp -r /usr/src/rockme /app/rockmets после npm i. Проще указать обычную версию пакета и полагаться на npm link из базового образа.

Публикация образа

В каждом сервисе одинаковый makefile:

build:
	docker build -t my-service .

build_amd64:
	docker buildx build --platform linux/amd64 -t my-service .

tag-ng:
	docker tag my-service rockstat/my-service:ng

push-ng:
	docker push rockstat/my-service:ng

all-ng: build_amd64 tag-ng push-ng

push-dev:
	docker tag my-service rockstat/my-service:dev
	docker push rockstat/my-service:dev

Рабочий цикл: make all-ng собирает образ под linux/amd64 и публикует его с тегом ng, make push-dev выкладывает тестовую сборку под тегом dev, не трогая ng.

Версии

Версия хранится в трёх местах: package.json, метка band.service.version в Dockerfile и .bumpversion.cfg. Поднимает все три сразу bumpversion:

make bump-patch   # 1.0.0 -> 1.0.1
make bump-minor   # 1.0.1 -> 1.1.0

Конфигурация подхватывает версию автоматически через <%= pkg.version %>, поэтому её видно в логах и статусе сервиса.

Переменные окружения контейнера

ПеременнаяОбязательнаЗначение
REDIS_DSNдаredis://redis:6379 внутри сети платформы
NODE_ENVдаproduction
LOG_LEVELнетinfo по умолчанию, warn для тихих сервисов
STATSD_HOSTнетхост Telegraf/StatsD, без него метрики не отправляются
TZнетUTC, уже задан в базовом образе
SERVICE_GROUP, WORKER_IDдля обогатителейгруппа и номер воркера
своипо необходимостиKAFKA_BROKERS, CH_DSN и другие, которые читает конфигурация

Чеклист перед первым запуском

  • rpc.name уникален в инсталляции, а для нескольких экземпляров включает WORKER_ID.
  • Все внешние подключения выполняются в setup() до регистрации методов шины.
  • Обработчик broadcast или enrich не ждёт сеть и возвращает управление сразу.
  • Секреты приходят из окружения, в YAML — только <%= env.NAME %>.
  • Dockerfile наследует rockstat/band-base-ts:ng, метки band.service.* заполнены.
  • make all-ng проходит на чистой машине, образ стартует с одним REDIS_DSN.