Развёртывание¶
Как поднять 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]
Почему именно так:
- TigerBeetle format — создаёт
tigerbeetle/data/0_0.tigerbeetle(идемпотентно: если файл есть, шаг пропускается). - infra up --profile pm — поднимает PG, Valkey, TB.
- Ждём PostgreSQL (
pg_isready) и TigerBeetle (наличие data-файла) — иначе миграции упадут. - Serverpod миграции (
--apply-migrations, рольmaintenance) создаютpublic.*. - Notifications schema (
notifications.notification_log) — отдельным SQL-файлом. - Drizzle migrate создаёт
pm.*— послеpublic.*, т.к. views будут читать обе схемы. - Views + GRANT —
create-views.sqlсоздаёт cross-schema views вpublic(v_user_tb_accounts,v_tx_historyи др.) и выдаёт права роли приложения. Требует, чтобыpublic.*(шаг 4) иpm.*(шаг 6) уже существовали. - 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(envPORT=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