Backend не хранит игровые файлы на локальном диске. Он читает метаданные из S3 и выдаёт авторизованному лаунчеру короткоживущие signed URL только для разрешённых файлов.

Дерево объектов

serverId — числовой id строки из таблицы servers. Backend возвращает профиль только для существующего видимого сервера.

Профиль сборки

profile.json является источником правил запуска и управления файлами. Пример находится в E:\Wraithbound\wraithbound-launcher-platform\apps\launcher\resources\build-profile.example.json. Селекторы путей не являются glob-выражениями. libraries означает сам каталог и всё его содержимое. Абсолютные пути, .., обратные слеши и glob метасимволы отклоняются backend’ом.

Manifest сборки

manifest.json создаёт Rust manifest-builder. Для каждого файла он хранит:
Publisher один раз фильтрует manifest до подписи и публикации:
  1. оставляет файлы внутри update + updateVerify;
  2. удаляет элементы, попавшие в updateExclusions;
  3. формирует forceDownload из файлов внутри update;
  4. вычисляет revision из UUID профиля, версии, правил и хешей файлов.
Для versioned-релиза backend больше не меняет инвентарь: он проверяет, что все файлы входят в подписанную управляемую область, и отдаёт его без преобразований.

Java runtime

Runtime выбирается по recommendJavaVersion:
Manifest Java имеет тот же schemaVersion и формат файлов, что manifest сборки. Обязательные файлы:
Они должны быть обычными не optional-файлами. В files/ кладётся уже распакованный runtime целиком. Архив .zip не подходит: Guardian запускает bin/javaw.exe непосредственно из проверенного каталога.
Используйте runtime из доверенного дистрибутива. После публикации manifest нельзя заменять отдельные файлы без повторной генерации manifest: лаунчер обнаружит несовпадение SHA-256.

Автоматическая публикация

Основной способ — операторский Rust CLI wraithbound-publisher. Он получает Mojang assets, при необходимости скачивает и проверяет Java runtime, строит все manifests и синхронизирует точные S3 keys:
Credentials передаются через стандартные AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY и опциональный AWS_SESSION_TOKEN. Они не записываются в launcher config или manifest.

Ручная генерация одного manifest

Совместимый manifest-builder остаётся для диагностики и нестандартных операций. В штатном release flow использовать его вручную не требуется. Сборка:
Java 21:

Порядок публикации CLI

  1. Подготовьте чистый каталог кастомного клиента и profile.json без комментариев.
  2. Запустите check, затем обязательный первый publish --dry-run.
  3. Запустите publish: CLI подготовит assets/runtime и построит manifests.
  4. CLI загрузит тела файлов, затем manifests и profile.json в новый release-каталог.
  5. Установите envelope в launcher-server и отдельно активируйте релиз.
  6. Вызовите launcher/builds/profile с server_id, release_id и тестовым Bearer token.
  7. Проверьте, что ответ содержит profile, build, assets и runtime.
  8. Запустите клиент и убедитесь, что все финальные проверки завершились.
Порядок metadata-last обеспечивается CLI. Remote prune по умолчанию отсутствует, поэтому publisher не удалит файлы из-за ошибочного glob.

Signed URL

Для файлов клиента используется POST launcher/builds/resolve, для Java — POST launcher/builds/runtime/resolve. Новые клиенты передают в каждом запросе server_id и выбранный control-plane release_id; legacy-запрос без release ID оставлен только на время миграции. Backend:
  • проверяет Bearer session;
  • повторно загружает активный manifest;
  • отклоняет путь, которого нет в manifest;
  • ограничивает batch 500 файлами;
  • создаёт URL на 15 минут.
S3 access key, secret key и endpoint никогда не попадают в Electron config.