# Глобальный рефакторинг — 2026-09-09 ## Границы работы Переработаны backend/шаблоны сайта и React/Rust-слои нового лаунчера. Не менялись миры, модпак, порты, compose-топология, цены или режимы аккаунтов. Не переносились production-БД, секреты и приватный ключ подписи. ## Backend - Монолит main.py разделён на HTTP routers, services, schemas, middleware и единый резолвер ресурсов. Entrypoint app.main:app сохранён. - Cookie/bearer вход используют одну реализацию аккаунтов, паролей и сессий. - Ограничитель попыток входа защищён от гонок и бесконечного роста памяти. Он process-local; multi-worker развертывание требует общего хранилища. - Оплата и подписка фиксируются одной SQLite-транзакцией. Claim/reject, продление, recovery и привязки сериализуют конфликтующие операции. - JSON metadata проверяются централизованно: неверный UTF-8, не-object JSON и небезопасные идентификаторы не приводят к непредусмотренному чтению пути. - Jinja наследование убирает копии фона/шапки/навигации. Размер фона 72×83 задаётся единожды. HTML-формы, скрипты и визуальная структура сохранены. - Python зависимости зафиксированы на версиях действовавшего runtime. Добавлены pytest, Ruff, CI и изолированный test-stage Docker. ## Лаунчер - React разделён на компоненты, hooks, типизированный IPC и reducers. TypeScript проверяется сборкой; ошибки IPC не теряются. - Сохранены новые изменения GitHub 0.1.1: обязательный ShaCraft-аккаунт, verified aoc nickname, реальный онлайн, управление окном и Windows-фиксы установки/полных библиотек/точной Java major/длинной JVM-команды. - Сохранения настроек упорядочены; lifecycle install/launch/exit явный; демонстрационные значения прогресса не выдаются за реальную установку. - Rust commands выделены по ответственности. Неиспользуемые команды unsigned sync/inspect удалены; запись профиля требует verified manifest. - Общие атомарные записи и process-local permits защищают файлы от конфликтующих операций. Проверяются переносимые пути, symlink и подпись. - HTTPS exact-host policy распространяется и на redirects отдельных игровых провайдеров. Метаданные архивов Adoptium проверяются до загрузки. - GitHub: тесты/сборка на push/PR; ручная матрица пакетов Linux/Windows/macOS Intel/ARM с сохранением артефактов. Это не подпись релизов и не автообновление. ## Проверки Фактический итог: 88 backend-тестов + 23 subtests (локально и в изолированном Docker), 22 UI-теста, 59 Rust unit tests и отдельная живая read-only проверка production signed-manifest — успешно. npm ci/audit: 0 известных уязвимостей на момент прогона; строгий TypeScript/Vite и Ruff проходят. Это итог после объединения со всеми изменениями GitHub 0.1.1; прежние upstream Rust-тесты сохранены. Browser smoke: вход/регистрация ShaCraft, preview-gating, настройки, закрытие Escape и восстановление фокуса проверены без отправки учётных данных. Четыре тяжёлых/live игровых сценария не запускались. Backend выложен, image ID контейнера совпадает с собранным образом; главная/Help/Моды/кабинет/healthz/catalog/signed-manifest отвечают 200, публичная админка по-прежнему закрыта Caddy (403). Внешний вид проверен в браузере. Время запуска mc-aoc не изменилось. Резервный образ сохранён как `shacraft-backend:before-refactor-20260909`, исходники — `/root/shacraft-rollback-NWKzLR`. Схема БД не менялась. Backend: неизменность полного OpenAPI-снимка, публичные шаблоны, аккаунты, пароли/recovery, rate limit, LoginSystem gating, admin auth, платежи, rollback/параллельные операции, каталоги/manifest/config, startup/shutdown. Внешние эффекты замещены заглушками, БД только временная. Launcher: строгий TypeScript + Vite, тесты UI state/settings/listeners, Rust unit tests по подписи/путям/хранилищу/IPC guards/trusted hosts. Полная холодная установка игры, OAuth и запуск на Windows/macOS требуют отдельного ручного beta-прогона; не выдавать локальные проверки за такой тест. ## Не замаскированные рефактором ограничения 1. Привязка ника: NoGravity подтверждает авторизацию игрока на сервере, но не связь с конкретным веб-запросом. Нужен одноразовый challenge в игре. 2. Реферальная акция: enforcement REFERRAL_ENABLED и новизны самого плательщика не соответствует всей публичной формулировке. Требуется отдельное согласованное изменение бизнес-правил и регрессионные тесты. 3. RCON/уведомления после commit не имеют outbox/retry. Сбой может потребовать ручной выдачи, а не повторного начисления подписки. 4. Microsoft OAuth не является текущим способом входа: используется ShaCraft account + verified nickname. Неактивный OAuth-модуль требует собственного client ID и API approval при отдельной будущей активации. 5. Нужны подписанные installer/update-релизы, native beta на всех ОС, полноценная отмена загрузок и recovery пользовательских данных. 6. Блокировки лаунчера process-local; symlink-проверки не защищают от злонамеренного same-user TOCTOU. Keychain хранения refresh token пока нет.