Usługi

Stos technologiczny

Wybór języków i technologii dla produkcyjnego przepisania Trans-Atlas jako giełdy obejmującej sześć rodzajów transportu: serwerowa baza danych jako jedyne źródło prawdy, PostgreSQL + PostGIS, kontrakty przez JSON Schema.

To dokument decyzyjny, a nie wdrożony stos: żadna z wymienionych usług (Next.js, NestJS, Go, Kafka, ClickHouse, Kubernetes) nie działa w tym projekcie. index.html pozostaje tym samym jednostronicowym plikiem. „Backend: Sprint 0” to pierwszy zrealizowany i przetestowany fragment tego szerszego planu.

Decyzje według warstw

Warstwa Wybór Język Dlaczego
FrontendNext.js (App Router) + React + TypeScriptTypeScriptSSR/ISR для SEO-розділів біржі, клієнтські таблиці заявок, один тип-контракт із бекендом
UI-шарTailwind CSS + Radix UI + TanStack Table/QueryTypeScriptЩільні табличні інтерфейси біржі, доступність, серверний кеш замість localStorage
Основний backendNestJS на Node.js 24 LTSTypeScriptОдна мова з фронтендом, модульність під розділи транспорту, зрілі валідація/DI/OpenAPI
ORM / доступ до данихPrisma для CRUD + чистий SQL (pg) для геозапитівTypeScript / SQLPostGIS-функції та ранжування пишуться SQL-ом, не ORM-абстракцією
Пошук маршрутів (SEARCH)окремий сервіс на GoGoОбхід графа магістраль→фідери, POST_DRONE; передбачувана латентність і паралелізм
Геодані та відстаніPostgreSQL 18 + PostGIS; OSRM або ValhallaSQL / C++Радіусний пошук для дрон-плеча, реальні дорожні відстані замість «по прямій»
СУБДPostgreSQL 18 (Patroni або керований кластер)SQLТранзакційна цілісність угод, ставок, ескроу; JSONB для шаблонів заявок
Кеш і черги коротких задачRedis 7—Вимога A.4/A.11; кеш конекторів погоди та кордонів
Шина подійKafka (або Redpanda)—Ставки, статуси угод, аудит, вебхуки партнерам; ordered log під фінансові події
Повнотекстовий пошукPostgreSQL FTS на MVP → OpenSearch за потребиSQLНе вводити ще один кластер, поки Postgres тримає навантаження
Реальний час (ставки, чат)WebSocket (Socket.IO або ws) + Redis pub/subTypeScriptОнлайн-стрічка заявок і ставок
Платежі, валюти, ескроуокремий сервіс settlement, decimal-арифметикаTypeScript + SQLВалюта ціни ≠ валюта оплати: ставка, договір, платіж, курс, комісія — окремі поля
Web3-шар (опційний)Solidity + Foundry, EVM L2, стейблкоїн-виплатиSolidityСмартконтрактне ескроу як додатковий шар, а не заміна фіатної бухгалтерії
Аналітика та BIClickHouse (події) + Metabase/Power BISQLОперативна аналітика без навантаження на OLTP
ML / прогноз ставокPython (FastAPI, pandas, scikit-learn/LightGBM)PythonОкремий сервіс, викликається API; не змішується з доменним бекендом
ІнфраструктураDocker + Kubernetes (керований) або Nomad; TerraformHCL / YAMLОдин спосіб опису середовищ, узгоджений із наявним CI-підходом
CI/CD і контрактиGitHub Actions + JSON Schema + мутаційні тести + bash -euo pipefailYAML / PythonПродовження вже перевіреного контрактного CI проєкту TA
СпостережуваністьOpenTelemetry → Grafana (Loki, Tempo, Prometheus), Sentry—Трасування пошуку маршрутів і платіжних операцій end-to-end

Dlaczego tak

TypeScript jako język główny: jeden kontrakt typów od bazy danych po interfejs, największy rynek zatrudnienia dla produktu webowego tej klasy, a istniejący prototyp demo i lokalny serwer TA przechodzą do produkcji bez zmiany języka.

Go wyłącznie dla modułu SEARCH: przechodzenie grafu tras i masowe obliczenia odległości w Node dają niestabilne opóźnienia pod obciążeniem; gorutyny i jeden statyczny plik binarny czynią równoległy fan-out bezpośrednim i przewidywalnym.

Świadomie niewybrane

Odrzucono Powód
PHP/Laravel монолiтСлабший шлях до реального часу й до окремого високонавантаженого сервісу пошуку
Java/SpringПридатний і надійний, але дорожчий у наймі та повільніший в ітераціях для команди такого розміру
Python як основний backendЗалишено лише для ML і аналітики; для OLTP-домену з ескроу типізований TypeScript зручніший у контрактному CI
MongoDB як основна базаУгоди, ставки, ескроу потребують транзакцій і обмежень цілісності
Vector DB на старті Q&AУ TA вже працює локальне retrieval по курованих wiki.json/outputs.json — цього достатньо для MVP
Повністю on-chain біржаЮридично значущі документи й фіатні платежі лишаються off-chain; блокчейн — опційний розрахунковий шар
localStorage як сховище предметних данихПряма заборона рамкового ТЗ; допустимий лише втрачуваний UI-стан

Mapa usług MVP

web (Next.js, TS)
  └─ api-gateway (NestJS, TS) ── OpenAPI + JSON Schema
       ├─ identity (KYB, тризрівневий онбординг, права на розділи транспорту)
       ├─ exchange (заявки, лоти, ставки, рейтинги)  ── Kafka
       ├─ settlement (валюта ціни / валюта оплати, курс + джерело курсу, комісія, ескроу)
       ├─ search (Go)  ── PostGIS, OSRM/Valhalla, Redis
       ├─ connectors (погода, кордони, довідники) ── Redis-кеш, деградація по джерелу
       └─ qa-portal (raw → wiki → outputs, цитати й статус перевірки)
PostgreSQL 18 + PostGIS · Redis · Kafka · ClickHouse · S3-сумісне сховище документів

Kolejność uruchamiania

Etap Co obejmuje Przyrost technologiczny
Етап 1 (0–3 міс.)Заявки, ставки, профілі, права на розділи, UK/EN/PL/DE, платна реєстраціяNext.js, NestJS, PostgreSQL+PostGIS, Redis, GitHub Actions
Етап 2 (3–6 міс.)Модуль SEARCH, POST_DRONE, реальні дорожні відстаніGo-сервіс, OSRM/Valhalla, gRPC-контракт
Етап 3 (6–9 міс.)Мультивалютні угоди, ескроу, e-invoicing, локальні виплатиsettlement, decimal-арифметика, PSP-інтеграції
Етап 4 (9–12 міс.)Аналітика, рейтинги на даних, прогноз ставок, вебхуки партнерамClickHouse, Python-ML, Kafka Connect
Етап 5Смартконтрактне ескроу й оракули підтвердження доставкиSolidity + Foundry, L2

Kryteria przyjęcia wyboru stosu

  • Жоден предметний запис не зберігається у сховищі браузера; очищення браузера не втрачає даних учасника
  • Кожен публічний API-ендпойнт має JSON Schema, і мутація схеми валить CI
  • Контракт між api-gateway і search перевіряється окремим негативним pull request
  • Пошук повертає зібраний і ранжований набір варіантів, а не перший знайдений маршрут
  • Дрон-варіант додається як альтернатива останнього авто-плеча і не видаляє авто-варіант
  • У угоді ставка, договір, платіж, курс, джерело курсу, комісія та стан ескроу — окремі поля
  • Деградація одного зовнішнього конектора дає частковий результат, а не помилку всієї сторінки
  • Усі bash-кроки конвеєра виконуються з bash -euo pipefail

Pliki modelu