Доступ к сборкам
По умолчанию все опубликованные сборки видны и доступны каждому. Если нужно, чтобы конкретную сборку видели и качали только определённые люди — например, закрытый тест или сборка для стаффа — опишите правило доступа в конфиге сервера.
Список игроков Laminara у себя не хранит. Она берёт его из источника: файла на диске или вашего HTTP-эндпоинта. Так список остаётся там, где вы им уже управляете, — в гите, в панели сайта, в базе Discord-бота.
Быстрый старт: список в файле
/etc/laminara/closed-beta.json:
["neo", "trinity", "morpheus"]Конфиг сервера:
{ "access": { "sources": { "closed-beta": { "type": "file", "config": { "path": "/etc/laminara/closed-beta.json" } } }, "rules": [ { "builds": ["TestServer"], "source": "closed-beta", "message": "Закрытый тест — напишите в Discord за доступом" } ] }}Всё. Сборку TestServer увидят все, но кнопка будет заблокирована с этим текстом, а
скачать её смогут только трое из списка. Файл перечитывается сам при изменении —
перезапускать сервер не нужно.
Правила
Одно правило закрывает одну или несколько сборок:
| Поле | Значение |
|---|---|
builds |
Имена сборок. Поддерживаются шаблоны: ["test-*", "staff"] |
source |
Имя источника из блока sources |
visibility |
listed (по умолчанию) — сборка видна с замком; hidden — сборки не существует для тех, у кого нет доступа |
message |
Текст, который увидит игрок вместо кнопки «Играть» |
Сборка, которую не задело ни одно правило, остаётся публичной. Правила проверяются сверху вниз, срабатывает первое подходящее.
Источник file
{ "type": "file", "config": { "path": "/etc/laminara/whitelist.json" } }Файл может быть в любой из этих форм:
["neo", "trinity"]{ "users": ["neo"], "uuids": ["11112222-3333-4444-5555-666677778888"] }{ "builds": { "test-alpha": ["neo"], "test-beta": { "users": ["trinity", "smith"] } }}neotrinity # обычный текст тоже подойдётФорма с builds нужна, когда одним файлом вы ведёте несколько сборок. Если для сборки
в нём записи нет, применяется общий список файла.
Совпадение ищется по нику (регистр не важен), UUID (с дефисами и без) и по внутреннему идентификатору вашего провайдера авторизации — пишите тот, который вам удобнее.
Если файл не читается, сборка закрывается для всех: неверный путь не должен молча открывать закрытый тест.
Источник http
Забирает список у вас. Два режима.
list — вы отдаёте список (по умолчанию)
Laminara делает GET <url>?build=<имя сборки> и ждёт документ той же формы, что и
файл выше. Ответ кэшируется на cacheTTL, поэтому тысяча игроков стоит одного
запроса, а короткая недоступность вашего сайта никого не выкидывает.
{ "type": "http", "config": { "url": "https://site.example/api/laminara/access", "headers": { "Authorization": "Bearer ваш-секрет" }, "cacheTTL": "60s" }}check — вы отвечаете по одному игроку
Laminara делает GET <url>?build=<сборка>&username=<ник>&uuid=<uuid>&subject=<id> и ждёт
{"allowed": true} либо просто код ответа: 2xx — можно, 403/404 — нельзя.
{ "type": "http", "config": { "url": "https://site.example/api/laminara/check", "mode": "check" }}Берите list, если список меняется редко и умещается в один ответ. Берите check, если
права вычисляются на лету (подписка, донат, роль в Discord).
| Параметр | По умолчанию | Смысл |
|---|---|---|
mode |
list |
Режим, см. выше |
method |
GET |
HTTP-метод |
headers |
— | Заголовки запроса, обычно токен |
timeout |
5s |
Таймаут одного запроса |
cacheTTL |
60s |
Сколько жить ответу; ошибки кэшируются не дольше 10 с |
failOpen |
false |
Что делать, если эндпоинт недоступен |
Что именно закрывается
Правило закрывает распространение сборки: её видимость в лаунчере, выдачу манифеста
и скачивание файлов. Как только в конфиге появляется хоть одно правило, раздача объектов
(/objects/...) начинает требовать сессию: без этого утёкший манифест превращал бы любой
список доступа в формальность.
Объекты содержимо-адресуемы и общие между сборками, поэтому файл выдаётся, если игроку
доступна хотя бы одна сборка, которая на него ссылается. Ванильный client.jar,
общий у публичной и закрытой сборки, качается свободно — он и так публичный.
Отключить охрану объектов можно, если раздачу забрал CDN:
{ "access": { "publicObjects": true } }Тогда список доступа остаётся, но становится рекомендательным: кто добыл манифест, тот скачает файлы.
Проверка из консоли
access rulesobjects: guarded (downloads require an allowed session)TestServer -> source closed-beta (listed) Закрытый тест — напишите в Discord за доступом
builds: Survival public TestServer gated (listed)access check TestServer neoaccess reloadaccess check отвечает на вопрос «почему этот игрок не видит сборку» одной строкой,
access reload сбрасывает кэш источников, не дожидаясь TTL.