ADR-0007 · Серверный авторитет и realtime (фаза 3)
Статус: предложено · 2026-06-26 (дизайн, реализация не начата)
Контекст. Human-vs-human ломает клиент-авторитетную модель фаз 1–2 (ADR-0002): двое игроков → патченый клиент читерит и кости, и ходы. Нужен серверный источник истины с валидацией ходов, серверными костями и часами. Стек уже Scala (движок на JVM, аналитика на http4s/cats-effect); референс — Lichess (lila + lila-ws). Хостинг — homelab aurora (решено с Жегорсом 2026-06-26).
Решение. Новый сервис play-api на Scala 3 / cats-effect, форма Lichess: авторитет play-api + (позже) stateless edge play-ws. Per-game состояние = fiber + Ref[GameSession] + Topic + Queue (мейлбокс-сериализация без Akka — тот же стек, что аналитика; Apache-2; immutable GameState движка ложится в Ref.update). Переиспользует движок (FenParser/makeMove/TurnGenerator/TimeManager) на JVM. WS-протокол в форме Lichess {t,d}+монотонная версия v; dests считаются server-side. Часы серверные. Персист: hot in-memory → снапшот DFEN в Postgres схему play (отдельно от аналитики) на ход/бросок → analytics на конце. Хэндофф в аналитику — POST /api/games напрямую с Bearer (gateway-Koyeb остаётся для внешних скраперов), аналитика всё равно ре-валидирует replay’ем. Масштаб: edge horizontally + Redis pub/sub; авторитет — одна нода надолго. Vs-bot остаётся 100% клиентским (не трогает play-api).
Последствия.
- Один язык/стек на весь бэкенд (движок + аналитика + play-api); общие кодеки, переиспользование движка → нет дрейфа правил.
aurora(RAM ≤32 ГБ, изношенный SSD, + прод-аналитика + Immich) — связывающее ограничение; снапшоты в памяти + компактный DFEN митигируют запись; боты (ADR-0009) — реальная ось нагрузки.- adapter-static SPA остаётся (ADR-0004); клиент HvH = тонкий вид над WS, движок в браузере остаётся для vs-bot/оптимистичного UI (версия движка клиент==сервер критична).
- Доступность/бэкапы живого stateful-сервиса важнее, чем у read-only аналитики — для хобби приемлемо, для коммерции пересмотреть.
Альтернативы (отклонены). Akka/Pekko-актор-модель — лишний фреймворк/лицензия (BSL), мейлбокс даёт fiber+Queue. Node/TS-сервер — потерял бы переиспользование Scala-движка (дрейф правил). Serverless (Cloudflare/Koyeb) — не держит долгоживущее in-memory состояние + WS.
Детали: 04 Фаза 3 §1. Связано: ADR-0008 Честность кубиков — server CSPRNG + commit-reveal, ADR-0009 Бот-API и турниры.