Развёртывание
Каталог:
dokploy/· Оркестрация: Dokploy + Docker Compose · Процесс-менеджер: PM2
Каждый сервис деплоится отдельным контейнером из общего multi-stage-образа dokploy/Dockerfile.node. Какой именно сервис собирать — задаётся build-аргументом SCRIPT_NAME (совпадает с nx build:<name> из package.json).
Dockerfile (dokploy/Dockerfile.node)
Заголовок раздела «Dockerfile (dokploy/Dockerfile.node)»Двухстадийная сборка:
Stage base (сборка):
node:22-alpine+ инструменты для нативной сборкиsharp(python3, make, g++, go).npm ci --omit=dev --ignore-scripts, затем переустановкаsharpпод платформуlinuxmusl/x64.- Копирование исходников.
npx prisma generate --schema=./apps/core-api/prisma/schema.prisma.npm run build:${SCRIPT_NAME}(например,build:auth-api→nx build auth-api).
Stage production (рантайм):
node:22-alpine+ глобальныйpm2.- Копирование
node_modules,dist,package.jsonиdokploy/.envиз стадииbase.
⚠️
.envдля контейнера ожидается по путиdokploy/.env(копируется в образ). Полный список переменных — environment и configs.
Docker Compose (на сервис)
Заголовок раздела «Docker Compose (на сервис)»В dokploy/ лежат per-service compose-файлы (пример — docker-compose.api-auth.yml, docker-compose.api-user.yml):
services: auth-api-node: build: context: .. dockerfile: ./dokploy/Dockerfile.node args: APP_NAME: apis/auth-api APP_ENV: ${APP_ENV} SCRIPT_NAME: auth-api # какой сервис собирать environment: PM2_INSTANCE_NUMBER: ${PM2_INSTANCE_NUMBER:-1} ports: - "${APP_PORT}:${APP_PORT}" command: pm2-runtime start dist/apps/auth-api/main.js -i ${PM2_INSTANCE_NUMBER} restart: always networks: [api-auth-back, dokploy-network]
networks: api-auth-back: { driver: bridge } dokploy-network: { external: true } # общая сеть DokployКлючевое:
- Запуск —
pm2-runtime start dist/apps/<name>/main.js -i <N>, кластеризация по числу инстансовPM2_INSTANCE_NUMBER. - Сеть — каждый сервис в собственном bridge-network + общая внешняя
dokploy-network(через неё Dokploy проксирует трафик). - Порт —
${APP_PORT}(для admin-api — свойADMIN_API_PORT).
Как добавить деплой нового сервиса
Заголовок раздела «Как добавить деплой нового сервиса»- Убедиться, что есть
build:<name>вpackage.json(nx build <name>). - Скопировать один из
dokploy/docker-compose.api-*.yml, поменятьSCRIPT_NAME, имя сервиса,command(путьdist/apps/<name>/main.js) и сеть. - Прописать env-переменные сервиса в
dokploy/.env. - Завести приложение в Dokploy, указав нужный compose-файл.
Переменные сборки/деплоя
Заголовок раздела «Переменные сборки/деплоя»| Переменная | Где | Назначение |
|---|---|---|
SCRIPT_NAME | build-arg | Какой сервис собирать (nx build:<name>) |
APP_NAME | build-arg | Логическое имя (метка) |
APP_ENV | build-arg / env | Окружение (dev/prod) |
APP_PORT | env | Порт HTTP-сервиса |
ADMIN_API_PORT | env | Порт admin-api (деф. 3002) |
PM2_INSTANCE_NUMBER | env | Число PM2-инстансов (кластер) |
На момент фиксации в
dokploy/присутствуют compose-файлы только дляauth-apiиuser-api; дляproject-api,admin-api,ai-agent-serviceих нужно добавить по образцу.
Накатка baseline’а (единица G2)
Заголовок раздела «Накатка baseline’а (единица G2)»Схема переведена на единственную baseline-миграцию (см. migrations).
Прод получает её в окне обслуживания единицей G2; к этому моменту в чек-лист переключения входят
два пункта, вытекающих из F2:
- Снести строки
tokensиsessionsплатформенных пользователей вместе с накаткой. Админские access-токены, выданные до появления claim’аplatformRole, не проходят ролевые guard’ы и дают 403 до истечения срока жизни пары (до 15 минут). Отказ безопасный, но админка выглядит сломанной, а фронт уходит в refresh по 401, не по 403. - Передать фронту список ломающих изменений API (шаг 8 §3): новый набор значений
ProjectStatus, снятые маршруты смены статуса проекта, обязательная валюта, суммы в ответах как целые числа минорных единиц.