7.6 KiB
Глобальный рефакторинг — 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-прогона; не выдавать локальные проверки за такой тест.
Не замаскированные рефактором ограничения
- Привязка ника: NoGravity подтверждает авторизацию игрока на сервере, но не связь с конкретным веб-запросом. Нужен одноразовый challenge в игре.
- Реферальная акция: enforcement REFERRAL_ENABLED и новизны самого плательщика не соответствует всей публичной формулировке. Требуется отдельное согласованное изменение бизнес-правил и регрессионные тесты.
- RCON/уведомления после commit не имеют outbox/retry. Сбой может потребовать ручной выдачи, а не повторного начисления подписки.
- Microsoft OAuth не является текущим способом входа: используется ShaCraft account + verified nickname. Неактивный OAuth-модуль требует собственного client ID и API approval при отдельной будущей активации.
- Нужны подписанные installer/update-релизы, native beta на всех ОС, полноценная отмена загрузок и recovery пользовательских данных.
- Блокировки лаунчера process-local; symlink-проверки не защищают от злонамеренного same-user TOCTOU. Keychain хранения refresh token пока нет.