# Серверная основа, профиль и одиночная сетевая партия

Промежуточный этап0.8.0,10 ноября2026. Полная дорожная карта остаётся открытой. Профиль и серверная партия работают в локальной проверке; подключение через интернет и настоящая доставка писем ещё не настроены. На Sites сохраняется локальная игра; экран профиля объясняет доступность без неработающих форм.

## Что реализовано

- Один Node-сервер с тем же игровым ядром: клиент не рассчитывает бой, награды и случайные камни. Игрок отправляет намерение; сервер проверяет фазу, маршрут и средства.
- Одиночные серверные комнаты,30Hz расчёт и10Hz передача изменённых данных. Пауза/ускорение клиента выключены. Открытая книга и свёрнутая вкладка не останавливают бой.
- PostgreSQL-схема аккаунтов, сессий, кодов, почтовой очереди, комнат, участников, команд, билетов и результатов. Для локальных проверок Electric PGlite; полноценный PostgreSQL подключается тем же хранилищем через pg.
- Подтверждение почты шестизначным одноразовым кодом; имя и пароль после подтверждения; повторный вход; отдельное восстановление; список устройств и выход со всех устройств. Пароли Argon2id; сессии HttpOnly, CSRF/Origin. Реальные письма без настройки SMTP не отправляются.
- Серверный журнал с UUID команды и порядковым номером. Принятое действие, состояние и квитанция сохраняются одной транзакцией. Повтор команды возвращает прежний ответ, не строит/не списывает второй раз.
- Lease и возрастающий epoch комнаты. Старый писатель после передачи комнаты не может менять данные. Ошибка записи откатывает изменение и случайный поток; до переподключения действия блокируются.
- Одноразовый билет подключения, восстановление полного состояния и следующий номер команды. В сетевом представлении нет будущих RNG/seed/внутренних квитанций.
- История последних100 завершённых серверных партий. Сдача и явное завершение кампании записывают результат один раз. Все текущие результаты server_casual, без рейтинга и сезонных очков.
- Отдельный экран профиля в едином зелёно-золотом стиле. Возврат к локальной экспедиции, повторный вход в серверную партию и подтверждение сдачи. Серверная карта не перезаписывает локальное сохранение.

## Что проверено

- Полный путь по настоящему HTTP/WebSocket: регистрация, сессия, CSRF, билет, постройка, повтор команды и отзыв доступа после выхода.
- Срок кода,5 неудач, повторная отправка, одновременное подтверждение, одноразовый grant, разделение регистрации/восстановления, отзыв старого пароля и сессий.
- Ошибки порядка и устаревшей карты; чужой владелец; неподдерживаемая команда; попытки передать золото/HP; отказ хранилища с откатом RNG.
- Смена writer/epoch. Отдельный тест реально убивает дочерний Node-процесс и открывает файловую PGlite заново. После истечения lease сессия/камень/подтверждённая команда восстанавливаются; сдача не дублирует итог.
- Интерфейс320×568,390×844,844×390 и1440×1000: нет горизонтального переполнения. Пять построек, выбор, ручной запуск волны, бой при открытой книге, возврат к локальной игре и повторное подключение.

Это не проверка FPS физического телефона, качества реальной SMTP-доставки, полномасштабного PostgreSQL или распределённого отказа нескольких машин. Смена часов на31 секунду в тесте не измеряет фактическое время восстановления.

## Ближайшие работы по серверу

- Выбрать площадку и подтверждённого отправителя; настроить HTTPS и один origin для игры/API/WebSocket. На отдельный вопрос о существующем хостинге и почтовом сервисе ответа пока нет. Платная площадка и реальная почта автоматически не создавались.
- Проверить подготовленный Docker/Compose-контур с полноценным PostgreSQL, отдельной ролью приложения, резервной копией и восстановлением. Здесь Docker/psql отсутствуют; образы перед запуском закрепить проверенными digest.
- Проверить два независимых процесса с одной PostgreSQL, журнал и failover под задержкой/ошибками; не подменять это двумя объектами RoomService внутри одного процесса.
- Заменить консервативные частые snapshot на измеренный checkpoint+journal, определить время восстановления, draining и возобновление комнат после падения. Сейчас расчёт во время падения процесса заморожен до восстановления.
- Измерить p95/p99 tick, расход трафика,60 живых врагов и тяжёлые эффекты; затем выбрать число комнат на worker. Текущая техническая граница64 загруженных actor — защитный лимит, не измеренная производительность.
- Для ranked нужен серверный случайный поток с криптографическим ключом: общий32-битный генератор ядра пока остаётся в casual. Проверить правила и баланс, формулу очков и совместимость сезонов до включения рейтинга.

## Дальнейшая очередь

- Co-op1–4: общая карта/сердце/кошелёк, отдельная пятёрка, владельцы и явное общее управление, готовность всех, фиксированная сложность по составу,90с восстановления и предсказуемое завершение оставленного хода. Не менять ограничения улучшений одинаковых камней вне текущей пятёрки.
- На этапе управления co-op вернуть согласованную двухэтапную постановку и пинг клетки. Эти небольшие правки были отложены пользователем; текущий одиночный ввод не изменён.
- Last Survivor2–4: отдельные37×37, одинаковые броски независимо от кликов, общий серверный раунд/лимит стройки, одновременный бой и честная ничья последнего tick, endless после50.
- Детальная статистика владельца/исходной башни/компонентов при синтезе; глобальные и сезонные проекции; отдельные ключи mode/ruleset/map/состав/season. Последние100 личных результатов ещё не являются глобальной статистикой.
- Разнообразие противников: сейчас16 анимированных форм; до50 уникальных остаётся34. Новые лицензии и реальная геометрия должны быть проверены до добавления. Новые50 моделей не заявлены готовыми.
- Изменение пароля из профиля с повторным подтверждением, отзыв отдельных устройств, привязка локальной истории с unverified-меткой, удаление профиля и поддержка — следующие расширения профиля. Сейчас пароль можно сменить через восстановление.
- Платежи и косметика остаются отдельным будущим контуром. Реальных списаний и купленной силы в ranked нет.

## Файлы и эксплуатационные правила

Код находится в существующем проекте sites/gemtd-prototype/server. Подробности запуска и ограничений — server/README.md. server/.data, .mailbox, .env и node_modules исключены из Git/Docker/публикации. Статическая сборка копирует только public,src и интерфейс; серверные секреты и файлы пользователей в неё не включаются.

Технические первоисточники: [node-postgres](https://node-postgres.com/features/transactions), [PGlite](https://pglite.dev/docs/api), [ws](https://github.com/websockets/ws), [Argon2](https://github.com/ranisalt/node-argon2), [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html), [Pwned Passwords](https://haveibeenpwned.com/API/v3#PwnedPasswords), [Nodemailer](https://nodemailer.com/smtp).
