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

Сервисы платформы

Обзор всех сервисов 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/sub intent.{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/sub intent.{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.