wraithbound-publisher, launcher-server, S3 и CDN.
Главное за минуту
У каждой сборки есть постоянныйbuildId, а у каждого её состояния — отдельный
неизменяемый releaseId.
Публикация состоит из двух независимых действий:
- Publisher загружает новый неизменяемый релиз в S3 и устанавливает его подписанный manifest в launcher-server.
- Администратор проверяет результат и нажимает «Опубликовать». Только после этого launcher-server переключает активный релиз.
Термины
Где лежат исходники
На production-машине launcher-server используется следующая раскладка:buildId. Запрос из админки содержит только этот
ID; launcher-server сам находит разрешённый /etc/wraithbound/builds/4.toml.
Передать произвольный путь из браузера невозможно.
В репозитории есть готовый пример:
Подготовка новой сборки
1. Создайте сервер на сайте
Создайте запись игрового сервера в административной панели сайта и запомните её числовой ID. Этот ID используется во всей цепочке какserverId и buildId.
Например, если сервер получил ID 4, должны совпасть:
2. Подготовьте чистый клиент
Скопируйте вclients/<Название> только то, что должен получить пользователь:
- Minecraft JAR и библиотеки;
- Forge/loader и необходимые bootstrap-библиотеки;
- моды;
- natives для поддерживаемой платформы;
- начальные конфигурации, если ими должен управлять лаунчер;
- ресурсы сборки.
logs, crash-reports, saves,
скриншоты, кэши, дампы и локальные настройки разработчика.
Каталог
assets хранится отдельно и не должен дублироваться внутри каждой
сборки. Java также хранится отдельным runtime и повторно используется разными
сборками.3. Создайте profile.json
Минимальный рабочий профиль Architechnica выглядит так:
Поля профиля
Селекторы в
update, updateVerify и updateExclusions — не glob-шаблоны.
mods означает каталог и всё его содержимое. Нельзя использовать ..,
обратные слеши, абсолютные пути или *.
Как выбрать файловую политику
- Добавляйте в
updateVerifyто, что обязано точно совпадать с релизом: библиотеки, JAR, моды и natives. - Добавляйте в
updateфайлы, которые могут меняться во время игры, но должны восстанавливаться перед следующим запуском. - Добавляйте в
updateExclusionsтолько пользовательские настройки, которые действительно нужно сохранить. - Если весь
configисключён, обновление не сможет доставлять изменения конфигов. Если весьconfigпроверяется, пользовательские изменения будут восстановлены до опубликованного состояния.
logs, crash-reports, screenshots, saves,
resourcepacks, shaderpacks и options.txt по умолчанию.
4. Подготовьте assets
Структура должна соответствовать обычным Minecraft assets:download_from_mojang = true, publisher скачает
отсутствующий официальный index и его objects. Уже проверенные объекты будут
переиспользованы.
Кастомные ресурсы, отсутствующие в официальном asset index, держите в каталоге
клиента или добавляйте в собственный корректный index; случайные файлы из общего
каталога assets в manifest не попадут.
5. Подготовьте Java runtime
Runtime должен быть распакованным каталогом, а не ZIP-файлом:sha256 берётся у конкретного дистрибутива Java;
не копируйте hash от другой версии архива.
6. Создайте publisher TOML
storage.bucket, WB_PUBLISHER_S3_BUCKET или
WRAITHBOUND_S3_BUCKET. В production предпочтительно передавать bucket и все
секреты через окружение/deployment, а не копировать их в разные TOML-файлы.
7. Выставьте права на сервере
wraithbound должен читать исходники, профиль, assets, runtime и TOML.
Запись нужна в каталоги, куда publisher докачивает assets/runtime, и во
временный рабочий каталог.
Предварительная проверка
Соберите publisher один раз:--dry-run должен вывести профиль, количество объектов и общий размер. Для
диагностики точных S3 keys можно временно добавить --list-objects, но такой
вывод содержит локальные пути и получается очень большим.
Что делает кнопка «Подготовить»
На странице/admin/launcher/builds кнопка «Подготовить» ставит buildId в
ограниченную очередь launcher-server. Worker выполняет:
- проверяет TOML, профиль и локальные каталоги;
- получает недостающие Minecraft assets;
- получает и проверяет Java runtime;
- показывает этапы в разделе «Операции».
Публикация первого релиза
1. Подготовьте секреты в текущей консоли
2. Проверьте релиз
3. Загрузите и установите релиз
- подготавливает assets и runtime;
- строит manifests и считает SHA-256;
- загружает игровые файлы, assets и runtime;
- загружает
profile.jsonи manifests; - подписывает protobuf envelope;
- устанавливает envelope в launcher-server через
InstallBuildRelease.
sha256 и
переиспользует только точное совпадение.
4. Активируйте релиз
Откройте/admin/launcher/builds, найдите сборку, нажмите «Опубликовать» и
выберите установленный релиз. Launcher-server ещё раз проверит подпись и
атомарно переключит active release.
После активации проверьте один реальный лаунчер: получение профиля, загрузку с
CDN, scanner, Java, Guardian и запуск Minecraft.
Как выпустить обновление сборки
Для каждого обновления используйте один и тот же безопасный порядок.- Сделайте резервную копию или Git-снимок исходного каталога сборки.
- Добавьте/замените моды, конфиги, библиотеки и другие файлы.
- При необходимости измените
profile.json. - Задайте новый
release.id. - Увеличьте
release.generationотносительно всех предыдущих релизов. - Выполните
check. - Выполните
publish --dry-runи проверьте размер/число объектов. - Выполните настоящий
publish. - Убедитесь, что операция установки завершилась и релиз появился в админке.
- Активируйте его кнопкой «Опубликовать».
- Проверьте обновление на тестовом лаунчере.
releaseId: YYYY.MM.DD.N, где N — номер выпуска за день.
generation при этом остаётся отдельным возрастающим числом для этой сборки.
Что произойдёт у пользователя
После активации launcher-server возвращает новый signed release. Лаунчер:- сравнивает локальные файлы с новым manifest;
- скачивает только отсутствующие и изменённые объекты;
- сохраняет исключённые пользовательские данные;
- повторно проверяет клиент и Java;
- формирует актуальную Guardian policy;
- запускает Minecraft.
Откат
Откат не требует повторной загрузки старой сборки:- Откройте
/admin/launcher/builds. - Нажмите «Откатить» у нужной сборки.
- Выберите ранее установленный релиз.
- Подтвердите действие.
- Проверьте активный release ID и запуск тестового клиента.
Блокировка сборки и обслуживание
Блокировка сборки применяется к одномуbuildId. Используйте её, когда
конкретный клиент повреждён или запуск нужно временно остановить. В админке
обязательно укажите понятную оператору причину; там же блокировка снимается.
Режим обслуживания применяется шире:
install-disabled— запрещает подготовку/установку затронутых сборок;launch-disabled— запрещает запуск Minecraft;full— полностью блокирует пользовательский сценарий и показывает обязательное окно обслуживания.
buildId затронуты. После работ
отключите режим отдельным действием в том же разделе админки.
S3 и CDN
В текущей production-схеме разделены два namespace:launcher.config.json.
Для publisher выдайте отдельную S3 identity с доступом только на content
prefix. Launcher-server использует свою identity для control-plane prefix.
Не запускайте два пишущих launcher-server на одном prefix: распределённой
блокировки между репликами пока нет.
Публикация через GitHub Actions
Workflow находится в:config_path— отслеживаемый Git TOML для сборки;release_id— новый неизменяемый ID;generation— новый номер поколения;dry_run— только проверить план или выполнить публикацию.
dry_run = true. После проверки повторите с теми
же release_id/generation и dry_run = false. Активация всё равно остаётся
ручным действием в админке.
Проверка после публикации
Минимальный production-чеклист:- launcher-server имеет состояние
active (running); /health/liveи/health/readyвозвращают успех;- в журнале launcher-server нет S3/signature ошибок;
- новый релиз отображается в админке как установленный;
- active release ID изменился только после ручной активации;
- signed envelope читается публичным launcher API;
- CDN отдаёт один файл релиза без авторизации и без redirect на S3 console;
- чистая установка клиента завершается;
- повторный запуск не скачивает неизменившиеся файлы;
- Minecraft стартует нужным
mainClassи подключается к нужному серверу; - откат на предыдущий релиз работает.
Частые ошибки
Чего нельзя делать
- Не публикуйте поверх существующего
releaseId. - Не уменьшайте и не переиспользуйте
generation. - Не активируйте релиз до успешной загрузки всех объектов.
- Не удаляйте прошлый релиз до истечения периода безопасного отката.
- Не храните credentials или signing seed в Git, TOML сборки и Electron config.
- Не указывайте S3 origin вместо CDN первым production mirror без осознанной причины.
- Не добавляйте весь изменяемый пользовательский каталог в
updateVerify. - Не считайте кнопку «Подготовить» публикацией.
