Перейти к содержанию

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

Как поднять OneWallet с нуля: два docker-compose файла (инфраструктура и приложения), профили, скрипт init.sh с правильным порядком миграций, сети и тома. Все факты сверены с projects/deploy/.

На какие вопросы отвечает

  • В каком порядке применять миграции, чтобы не получить «relation does not exist»?
  • Почему сначала Serverpod (public.*), потом Drizzle (pm.*), и только потом views?
  • Какие профили compose есть и что они включают?
  • Где nginx — он в docker-compose?
  • Какие тома хранят данные и что удаляется при --reset?

Два compose-файла

Файл Что Сети
docker-compose.infra.yml (name: onewallet-infra) postgres 17, valkey, tigerbeetle 0.17.4, garage (S3), garage-ui, compreface создаёт сети
docker-compose.apps.yml (name: onewallet-apps) core (Serverpod), paymentmanager, notifications, kyc, admin, blog сети external: true

Сети создаёт infra, apps к ним подключается (поэтому infra стартует первым). Префикс имён — APP_PREFIX из корневого .env; секреты окружения — envs/${ENV}/.env и passwords.yaml.

Профили

  • core — postgres/valkey (infra) + core, notifications, admin, blog (apps);
  • pm — добавляет tigerbeetle (infra) и paymentmanager (apps);
  • kyc — kyc-service (нужны s3 + compreface сети);
  • s3 — garage + garage-ui;
  • compreface — CompreFace (face matching для KYC).

nginx

nginx НЕ в docker-compose — это хостовой/отдельный ingress. Сервис-id nginx-gateway подписывает запросы в PM по HMAC (см. 05-security-and-auth.md).

Порядок старта — init.sh

Скрипт projects/deploy/init.shразовая инициализация (или --reset для полного сброса данных). Порядок шагов критичен из-за разделения схем (см. 03-data-and-schemas.md):

graph TD
  A[format TigerBeetle data file] --> B[infra up --profile pm]
  B --> C{PG ready?}
  C -->|pg_isready| D{TB ready?}
  D -->|data file exists| E[Serverpod --apply-migrations<br/>public.*]
  E --> F[notifications schema<br/>seeds/notifications-schema.sql]
  F --> G[drizzle-kit migrate<br/>pm.*]
  G --> H[create-views.sql + GRANT<br/>v_user_tb_accounts, v_tx_history]
  H --> I[PM seed<br/>service keys, fee rules, routes]
  I --> J[apps up -d]

Почему именно так:

  1. TigerBeetle format — создаёт tigerbeetle/data/0_0.tigerbeetle (идемпотентно: если файл есть, шаг пропускается).
  2. infra up --profile pm — поднимает PG, Valkey, TB.
  3. Ждём PostgreSQL (pg_isready) и TigerBeetle (наличие data-файла) — иначе миграции упадут.
  4. Serverpod миграции (--apply-migrations, роль maintenance) создают public.*.
  5. Notifications schema (notifications.notification_log) — отдельным SQL-файлом.
  6. Drizzle migrate создаёт pm.* — после public.*, т.к. views будут читать обе схемы.
  7. Views + GRANTcreate-views.sql создаёт cross-schema views в public (v_user_tb_accounts, v_tx_history и др.) и выдаёт права роли приложения. Требует, чтобы public.* (шаг 4) и pm.* (шаг 6) уже существовали.
  8. PM seed — service keys (включая nginx-gateway), fee rules, payment routes. При повторе падает на duplicate key — это безопасно игнорируется.

После init.sh запускаются приложения: docker compose -f docker-compose.apps.yml up -d.

Схема blog.* (one_blog) мигрируется собственным Drizzle отдельно от init.sh. Cross-schema views для блога (v_blog_*) — часть того же механизма views.

Сети и тома

Сети (${APP_PREFIX}_*_network): databases, redis, tigerbeetle, s3, compreface.

Тома (bind-mounts в projects/deploy/) — их и удаляет --reset:

  • ./postgres/data — PostgreSQL;
  • ./redis/data — Valkey (appendonly);
  • ./tigerbeetle/data — ledger (data-файл);
  • ./garage/meta, ./garage/data — Garage S3.

Порты (внеш → внутр)

Сервис Порт
core (Serverpod) 8090→8080 (RPC), 8081 (insights), 8082 (web)
paymentmanager 3099→3000
admin 3200→3000
blog 3201→3000
kyc 3003 (internal)
tigerbeetle 3000
postgres 5432
valkey 6379
garage 3900 (S3), 3902, 3903
garage-ui 2080→8080

kyc (env PORT=3003) не проброшен наружу в docker-compose.apps.yml — у сервиса нет секции ports:. Порт 3003 доступен только во внутренней сети (health-check и обращения других контейнеров), externally не маппится.

Пример: первое развёртывание

cd projects/deploy
cp .env.example .env                       # задать APP_PREFIX, ENV
cp envs/prod/.env.example envs/prod/.env   # секреты, SERVICE_SECRETS, REDIS_PASSWORD
# заполнить envs/prod/passwords.yaml (piiEncryptionKey и пр.)
./init.sh                                   # формат TB → миграции → views → seed
docker compose -f docker-compose.apps.yml up -d

Полный сброс данных и переинициализация: ./init.sh --reset.

Полная инструкция

Детали env-файлов, registry-образов, секретов, профилей и troubleshooting — в projects/deploy/README.md.

Связанное: 01-overview.md · 02-services.md · 03-data-and-schemas.md · 06-storage-and-kyc.md