Перейти к содержимому

Развёртывание

Каталог: dokploy/ · Оркестрация: Dokploy + Docker Compose · Процесс-менеджер: PM2

Каждый сервис деплоится отдельным контейнером из общего multi-stage-образа dokploy/Dockerfile.node. Какой именно сервис собирать — задаётся build-аргументом SCRIPT_NAME (совпадает с nx build:<name> из package.json).

Двухстадийная сборка:

Stage base (сборка):

  1. node:22-alpine + инструменты для нативной сборки sharp (python3, make, g++, go).
  2. npm ci --omit=dev --ignore-scripts, затем переустановка sharp под платформу linuxmusl/x64.
  3. Копирование исходников.
  4. npx prisma generate --schema=./apps/core-api/prisma/schema.prisma.
  5. npm run build:${SCRIPT_NAME} (например, build:auth-apinx build auth-api).

Stage production (рантайм):

  1. node:22-alpine + глобальный pm2.
  2. Копирование node_modules, dist, package.json и dokploy/.env из стадии base.

⚠️ .env для контейнера ожидается по пути dokploy/.env (копируется в образ). Полный список переменных — environment и configs.

В 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).
  1. Убедиться, что есть build:<name> в package.json (nx build <name>).
  2. Скопировать один из dokploy/docker-compose.api-*.yml, поменять SCRIPT_NAME, имя сервиса, command (путь dist/apps/<name>/main.js) и сеть.
  3. Прописать env-переменные сервиса в dokploy/.env.
  4. Завести приложение в Dokploy, указав нужный compose-файл.
ПеременнаяГдеНазначение
SCRIPT_NAMEbuild-argКакой сервис собирать (nx build:<name>)
APP_NAMEbuild-argЛогическое имя (метка)
APP_ENVbuild-arg / envОкружение (dev/prod)
APP_PORTenvПорт HTTP-сервиса
ADMIN_API_PORTenvПорт admin-api (деф. 3002)
PM2_INSTANCE_NUMBERenvЧисло PM2-инстансов (кластер)

На момент фиксации в dokploy/ присутствуют compose-файлы только для auth-api и user-api; для project-api, admin-api, ai-agent-service их нужно добавить по образцу.

Схема переведена на единственную baseline-миграцию (см. migrations). Прод получает её в окне обслуживания единицей G2; к этому моменту в чек-лист переключения входят два пункта, вытекающих из F2:

  • Снести строки tokens и sessions платформенных пользователей вместе с накаткой. Админские access-токены, выданные до появления claim’а platformRole, не проходят ролевые guard’ы и дают 403 до истечения срока жизни пары (до 15 минут). Отказ безопасный, но админка выглядит сломанной, а фронт уходит в refresh по 401, не по 403.
  • Передать фронту список ломающих изменений API (шаг 8 §3): новый набор значений ProjectStatus, снятые маршруты смены статуса проекта, обязательная валюта, суммы в ответах как целые числа минорных единиц.