Сборка лаунчера
Лаунчер принадлежит одному проекту: адрес сервера, ключи подписи, соль машинного отпечатка и оформление записываются в файл при сборке. Игрок ничего не настраивает и адрес не вводит, а чужой проект через этот файл не откроется.
Одной командой
Сервер делает лаунчер сам — ни Rust, ни Node, ни компилятора на нём не нужно. Он берёт готовый лаунчер из релиза Laminara и впечатывает в него вашу конфигурацию: адрес, ключи, соль, оформление и иконку.
-
Укажите адрес, по которому придут игроки
{"launcher": {"dir": "/var/lib/laminara/launcher","endpoints": ["https://launcher.ваш-домен"]}} -
Соберите и выпустите
launcher buildКоманда скачивает заготовки под Windows, Linux и macOS (проверяя их контрольные суммы), впечатывает конфигурацию, ставит вашу иконку из
branding.logoPathи сразу публикует версию. Имя файла — из оформления: приbranding.windowTitle= «Magic World» получитсяMagic World.exe. Версию можно назвать явно:launcher build 1.3.0.Иконка ставится в двух местах, и оба важны: в ресурсах
.exe— её показывает проводник, — и самим лаунчером при запуске окна, откуда её берут панель задач и переключение окон. Второе работает на всех системах, поэтому на Linux и macOS окно тоже с вашим логотипом. -
Выложите игрокам
Сервер раздаёт опубликованный лаунчер сам, по постоянному адресу:
https://ваш-домен/launcherЭта ссылка определяет систему по браузеру и отдаёт нужный файл — её и давайте игрокам. Если нужна ссылка на конкретную систему, она такая же предсказуемая:
https://ваш-домен/launcher/windows-x64https://ваш-домен/launcher/linuxhttps://ваш-домен/launcher/mac-os-arm64https://ваш-домен/launcher/mac-osАдрес не меняется никогда: после каждой пересборки по нему автоматически лежит свежий файл. Скачивание не требует входа — игроку нужно попасть в лаунчер до того, как он сможет войти. Файл приходит под своим именем из оформления (
Magic World.exe), самодостаточный: скачал и запустил, установка не нужна. Дальше лаунчер обновляет себя сам.Сами файлы по-прежнему лежат в
launcher/<версия>/, если их нужно выложить куда-то ещё.
После обновления сервера лаунчер перепекается и выпускается заново — так до игроков доедет
свежая версия. Отключается это настройкой launcher.autoBake.
Лаунчер для macOS
Под macOS лаунчер — это .app, а не один файл, поэтому он приезжает архивом
Ваш Лаунчер-mac-os-arm64.app.tar.gz. Внутри обычное приложение: имя, иконка из вашего
оформления и настройки проекта лежат рядом с программой, а не внутри неё.
Так сделано ради подписи. Начиная с Apple Silicon система отказывается запускать
изменённую программу, а «впечатать» конфигурацию — это как раз изменить файл. Поэтому
сервер кладёт настройки рядом с программой, внутрь .app, и не трогает сам исполняемый
файл: подпись, которую поставила Apple при сборке, остаётся целой.
Процессор при скачивании выбирать не нужно: внутри одна программа сразу под Apple Silicon и
Intel. Ссылки /launcher/mac-os-arm64 и /launcher/mac-os отдают одно и то же, а
/launcher сам определит мак по браузеру.
Первый запуск у игрока
У пакета, собранного сервером, нет печати целостности: сервер кладёт внутрь ваши настройки, а
запечатать .app умеет только сам мак — команда codesign есть лишь в macOS. Поэтому
скачанное из браузера приложение система при первом запуске не откроет, и «правой кнопкой →
Открыть» тут не поможет: для macOS пакет выглядит не как «неизвестный разработчик», а как
испорченный. Снимается это одной командой, которую стоит положить рядом со ссылкой на
скачивание:
xattr -dr com.apple.quarantine "/Applications/Ваш Лаунчер.app"После неё приложение запускается обычным двойным щелчком, и повторять это не нужно — в том числе после самообновления лаунчера.
Микрофон и голосовой чат
Моды вроде Simple Voice Chat просят микрофон не у игры, а у приложения, из которого она
запущена, — то есть у лаунчера. macOS пускает такой запрос, только если в приложении есть
сразу две вещи: строка-объяснение NSMicrophoneUsageDescription в Info.plist и разрешение
com.apple.security.device.audio-input в подписи. Нет хотя бы одной — система не показывает
окно с вопросом, а снимает процесс; мод в этом случае пишет, что лаунчер не поддерживает
разрешения на микрофон.
В лаунчере Laminara есть обе: строку кладёт в пакет сервер, разрешение вшито в подпись при сборке релиза. От игрока нужно одно — разрешить микрофон в окне, которое покажет macOS при первом запуске голосового чата. Разрешение выдаётся лаунчеру, игра работает под ним.
Если игрок случайно нажал «Не разрешать», починить можно в «Системных настройках» → «Конфиденциальность и безопасность» → «Микрофон»: там надо включить ваш лаунчер. После обновления лаунчера macOS может спросить про микрофон ещё раз — это нормально, подпись у новой версии своя.
Там же, в пакете, лежит NSLocalNetworkUsageDescription: начиная с macOS 15 без него игра не
увидит серверы и миры в локальной сети.
Сборка своими руками
Нужна, если хочется большего, чем даёт запекание: свои свойства файла, инсталлятор, AppImage,
пакет под macOS. Тогда нужны Node 24 + pnpm и Rust 1.96+, а для Windows с Linux —
cargo install cargo-xwin и пакеты clang lld llvm (кросс-компиляция, виртуальная машина
с Windows не нужна).
laminara-server client-config \ --config /etc/laminara/config.json \ --endpoint https://launcher.ваш-домен > mygame.client.json
cd client./build-launcher.sh ../mygame.client.json --target windows./build-launcher.sh ../mygame.client.json --target linux./build-launcher.sh ../mygame.client.json --target macosГотовые файлы — в client/dist-launcher/. Положите их в launcher/<версия>/ на сервере и
выпустите командой launcher publish <версия> — дальше всё как обычно.
--target macos работает только на маке: нужны Xcode (из него берутся lipo и
codesign), обе цели Rust — aarch64-apple-darwin и x86_64-apple-darwin, скрипт добавит их
сам, — и Go с make generate, им собирается .app. На выходе и готовое приложение, и архив
.app.tar.gz для выкладки; пакет сразу подписывается codesign, поэтому игроку хватит
«правой кнопкой → Открыть». Кросс-сборки с Linux тут нет и быть не может: подписывает
только мак.
Где лаунчер хранит файлы
Папка называется по вашему проекту: при branding.name = «Мир Приключений» сборки и настройки
лягут в Мир Приключений внутри системного каталога данных, а не в общую laminara. Благодаря
этому два лаунчера разных проектов на одном компьютере не мешают друг другу.
Имя можно задать отдельно — например, если название проекта длинное или на другом алфавите:
"branding": { "name": "Мир Приключений", "folderName": "magicworld" }Что должно быть на компьютере игрока
| Система | Что нужно доставить |
|---|---|
| Windows 10 и 11 | Ничего: рантайм Visual C++ вшит в файл, а WebView2 входит в Windows 11 и приезжает в Windows 10 вместе с Edge |
| macOS 10.15 и новее | Ничего: одно приложение работает и на Apple Silicon, и на Intel |
| Linux | WebKitGTK (libwebkit2gtk-4.1) — в свежих дистрибутивах стоит сам |
Java игроку ставить не нужно ни на одной из них: нужную версию сервер кладёт в сборку, а лаунчер скачивает её вместе с остальными файлами.
Когда лаунчер надо пересобрать
Пересборка нужна, только если поменялось запечённое:
| Поменялось | Нужна пересборка |
|---|---|
| Адрес сервера, домен | Да |
| Кольцо ключей подписи | Да |
| Соль машинного отпечатка | Да |
| Брендинг: имя, логотип, ссылка на сайт | Да |
| Сборки, моды, версии | Нет |
| Новости, доступ к сборкам, баны | Нет |