Перейти к содержимому

Доступ к сборкам

По умолчанию все опубликованные сборки видны и доступны каждому. Если нужно, чтобы конкретную сборку видели и качали только определённые люди — например, закрытый тест или сборка для стаффа — опишите правило доступа в конфиге сервера.

Список игроков 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"] }
}
}
neo
trinity # обычный текст тоже подойдёт

Форма с 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 rules
objects: guarded (downloads require an allowed session)
TestServer -> source closed-beta (listed)
Закрытый тест — напишите в Discord за доступом
builds:
Survival public
TestServer gated (listed)
access check TestServer neo
access reload

access check отвечает на вопрос «почему этот игрок не видит сборку» одной строкой, access reload сбрасывает кэш источников, не дожидаясь TTL.