Сервисы платформы¶
Обзор всех сервисов OneWallet: роль, стек, как общаются между собой и где искать подробную документацию по каждому. Внутренние детали здесь не дублируются — только ссылки на per-project доки.
На какие вопросы отвечает¶
- Какие вообще сервисы есть в платформе и за что каждый отвечает?
- На каком стеке написан конкретный сервис и на каком порту работает?
- Кто с кем общается и через какой транспорт (HTTP/HMAC, Redis, DB-views)?
- Куда смотреть за деталями по конкретному сервису?
См. также: 01-overview.md (общая картина), 04-payments-and-ledger.md (платёжный поток), 05-security-and-auth.md (HMAC, PII, step-up).
Карта сервисов¶
flowchart TD
Loop[one_loop_app<br/>Flutter consumer] --> NG[nginx-gateway]
Merch[one_merchant_app<br/>Flutter merchant] --> NG
Admin[admin-panel<br/>SvelteKit] --> NG
NG -->|HMAC| AC[Auth Center<br/>Serverpod]
NG -->|HMAC, /api/pm/*| PM[Payment Manager<br/>Node/Fastify]
AC -->|POST /intents HMAC| PM
PM -->|write SDK| TB[(TigerBeetle<br/>ledger)]
Admin -->|read-only SDK| TB
AC --> PG[(PostgreSQL 17<br/>public.*)]
PM --> PG2[(PostgreSQL 17<br/>pm.*)]
Blog[one_blog<br/>SvelteKit CMS] --> PG3[(PostgreSQL 17<br/>blog.*)]
PM -->|stream.notifications.jobs| NS[notifications-service]
AC -->|stream.notifications.jobs| NS
KYC[kyc-service] -->|stream.notifications.jobs| NS
AC -->|jobs| KYC
PM -.pub/sub intent.id.-> AC
Сервисы¶
Auth Center (projects/onewallet_base/)¶
- Роль: identity и публичный backend — JWT-аутентификация, регистрация и lifecycle пользователей (active→archive→delete), KYC-оркестрация, шифрование PII, профили, каталог мини-аппов, уведомления. Точка входа для Flutter-клиентов.
- Стек: Serverpod 3.4.8 (Dart). Порт 8090→8080 (RPC), 8081 (insights),
8082 (web). Схема БД
public.*(миграции черезserverpod generate). - Связи: принимает вызовы от Flutter через nginx; платежи делегирует в PM
(
POST /intentsс HMAC); читает баланс через nginx→PM; статусы интентов получает через Redis pub/subintent.{id}и стримит во Flutter; задачи в kyc-service и notifications-service. Прямого доступа к TigerBeetle нет. - Доки: projects/onewallet_base/docs/, projects/onewallet_base/CLAUDE.md.
Payment Manager (projects/payment-manager/)¶
- Роль: единый платёжный оркестратор. Единственный write-клиент TigerBeetle.
Обрабатывает все intents, применяет fee-rules и лимиты, ведёт saga, step-up
policies, merchant invoice, NFC. Phase 1 PSP (IPPS) — in-process
psp-worker. - Стек: Node 22 + Fastify 5.8.5 + Drizzle 0.45.2. Порт 3099→3000. Схема БД
pm.*(миграции черезdrizzle-kit migrate). - Связи: единый вход
POST /intents(+ quote/confirm/cancel, accounts, policies, admin) — все вызовы под HMAC. Читаетpublic.*read-only через views. Пишет в TigerBeetle. Публикует статусы в Redis pub/subintent.{id}и задачи вstream.notifications.jobs. - Доки: projects/payment-manager/docs/,
projects/payment-manager/CLAUDE.md,
PASSPORT (
docs/dev/reference/passport/) — канонический контракт.
TigerBeetle (ledger)¶
- Роль: финансовый ledger (двухфазные pending/post-трансферы). Главный
инвариант
transit.balance = 0.trace_id = intent_id; account id =uuidv5(name, namespace)— детерминирован. - Стек: TigerBeetle 0.17.4. Порт 3000 (внутренний).
- Связи: write — только PM (createAccounts/createTransfers); admin-panel — read-only (query/lookup). Auth Center и PSP-адаптеры доступа не имеют.
- Доки: 04-payments-and-ledger.md, adr/0001-tigerbeetle-ledger.md.
admin-panel (projects/admin-panel/)¶
- Роль: панель операторов — управление пользователями, KYC-ревью, fee-rules, расследование интентов, чтение балансов/истории.
- Стек: SvelteKit 2.57 + Svelte 5.55 + TypeScript + Tailwind v4. Порт 3200→3000.
- Связи: вызывает PM admin-endpoints под HMAC; читает TigerBeetle read-only через SDK; работает с Auth Center. Своей схемы БД не имеет.
- Доки: projects/admin-panel/docs/, projects/admin-panel/CLAUDE.md.
kyc-service (projects/kyc-service/)¶
- Роль: воркер KYC — OCR документов (Google Gemini или Ollama) и
face-matching (CompreFace). Файлы — в Garage (bucket
kyc-prod-data). - Стек: Node + BullMQ. Порт 3003. Redis DB 9.
- Связи: получает задачи от Auth Center; результаты возвращает в Auth
Center; уведомления — через
stream.notifications.jobs. - Доки: 06-storage-and-kyc.md, projects/kyc-service/CLAUDE.md.
notifications-service (projects/notifications-service/)¶
- Роль: push-уведомления (FCM). Единый потребитель очереди уведомлений от всех сервисов.
- Стек: Node + firebase-admin. Redis DB 4.
- Связи: потребляет
stream.notifications.jobs(продюсеры — PM, Auth Center, KYC); отправляет push во Flutter-клиенты. - Доки: projects/notifications-service/CLAUDE.md.
one_blog (projects/one_blog/)¶
- Роль: CMS «What's on» (контент для merchant-приложения). Схема
blog.*. - Стек: SvelteKit + Drizzle. Порт 3201→3000.
- Связи: пишет в
blog.*; контент доступен другим сервисам только через views вpublic(v_blog_category,v_blog_location,v_blog_post). В чужие схемы не пишет. - Доки: projects/one_blog/CLAUDE.md.
Транспорт между сервисами¶
| Связь | Транспорт |
|---|---|
| Клиенты/nginx → Auth Center, PM | HTTP под HMAC (X-Service-Id, X-Timestamp, X-Signature) |
| Auth Center → PM | POST /intents под HMAC |
| PM → TigerBeetle | TB SDK (write) |
| admin-panel → TigerBeetle | TB SDK (read-only) |
| PM → Auth Center → Flutter | Redis pub/sub intent.{id} |
| PM / Auth Center / KYC → Notifications | Redis stream stream.notifications.jobs |
| Cross-schema чтение | views в public (v_user_tb_accounts, v_tx_history, v_blog_*) |
Пример: HMAC-подпись запроса в PM¶
Подпись (источник: projects/payment-manager/src/auth/hmac.ts), окно ±60 с,
сравнение timing-safe:
signingString = `${timestamp}\n${METHOD}\n${PATH}\n${sha256hex(body)}`
X-Signature = HMAC-SHA256(serviceSecret, signingString) // hex
Например, Auth Center с X-Service-Id: auth-center шлёт POST /intents
(operationType P2P_TRANSFER); nginx подписывает как nginx-gateway. Подробнее —
05-security-and-auth.md,
adr/0002-single-hmac-auth.md.