Конфигурация
Сервер читает один JSON-файл (флаг --config). Разделы независимы: работает тот, что описан. Обзор и примеры — в разделе Конфигурация.
auth
providerstringобязательно
jsonfile, sql или http.configobjectобязательно
sessions.backendstring
memory или redis.sessions.redis.addrstring
backend: redis.sessions.redis.passwordstring
requirepass). Пусто — без пароля.sessions.redis.dbint
sessions.redis.tlsbool
accessTTLduration
15m.refreshTTLduration
720h.Поля config по провайдерам:
- jsonfile —
path,hash,fields{username, password, uuid, twoFactorSecret} - sql —
driver,dsn,table,hash,fields{username, password, uuid, twoFactorSecret} - http —
url,usernameField,passwordField,codeField,uuidField,successField,secondFactorField
Значения hash: argon2id, bcrypt, sha256, sha512, md5, plain. Подробнее — Аутентификация.
config.querystring
sql: свой запрос вместо table/fields, когда нужна связка таблиц или учёт флага бана. Логин — единственный подстановочный знак, выбираются пароль и (необязательно) UUID.config.fields.twoFactorSecretstring
jsonfile, по умолчанию totp) или колонка (sql), где лежит base32-секрет двухфакторки. Подробнее — Аутентификация.storage
backendstringобязательно
fs или s3.configobjectобязательно
Поля config:
- fs —
root,xaccelPrefix - s3 —
endpoint,region,bucket,accessKeyId,secretAccessKey,pathStyle,secure
Подробнее — Хранилище.
build
profilesDirstringобязательно
trustedSigningKeysarray
signingKeyPathstring
api
addrstringобязательно
0.0.0.0:8099.xAccelboolean
X-Accel-Redirect (для файлового хранилища).trustedProxiesstring[]
X-Forwarded-For можно верить. По умолчанию — loopback и частные сети, то есть nginx на той же машине или соседний контейнер. Запрос с любого другого адреса считается пришедшим напрямую, и заголовок игнорируется.Адрес игрока — это то, по чему считаются ограничения на попытки входа и что видно в банах, поэтому заголовку верят не всякому. Пустой список ([]) отключает разбор заголовка совсем: адресом всегда будет тот, с которого пришло соединение. Сервер, открытый в интернет без прокси, так и настраивают.
yggdrasil
enabledboolean
serverNamestring
rsaKeyPathstring
skinProviderstring
template, json или sql.skinConfigobject
skinDomainsarray
mirrorTexturesbooleanпо умолчанию true
Подробнее — Вход в игре и скины.
modules
dirstring
configobject
{ "greeter": { … } }.Подробнее — Модули.
launcher
dirstring
<dir>/<версия>/<артефакты>. Туда же кладёт файлы launcher build.endpointsstring[]
autoBakebooleanпо умолчанию true
Подробнее — Сборка лаунчера и Обновление лаунчера.
console
enabledbooleanпо умолчанию true
/console/. Без сеанса её адреса отвечают 404.authstringпо умолчанию link
link — по одноразовой ссылке из команды web, password — по паролю, both — и так, и так.passwordstring
laminara-server hash). Нужен при auth = password или both.publicUrlstring
https://launcher.example.com — подставляется в ссылку на консоль.sessionTTLdurationпо умолчанию 168h
0 — не забывать никогда.linkTTLdurationпо умолчанию 10m
statePathstring
Подробнее — Консоль.
branding
namestring
windowTitlestring
taglinestring
primaryColorstring
#4ade80.primaryInkstring
backgroundColorstring
logoPathstring
.svg/.png). Встраивается в конфиг лаунчера как data-URI.heroMediaPathstring
.jpg, .png, .webp) или видео (.mp4, .webm). Картинка показывается везде одинаково, видео на Linux зависит от кодеков в системе игрока — если их нет, фон останется пустым. Пусто — фон по умолчанию.siteUrlstring
folderNamestring
name, а если его нет — из windowTitle. Задавайте, только если название проекта не годится для имени папки.Блок отдаётся командой client-config и записывается в лаунчер при сборке.
access
sourcesobject
{ "closed-beta": { "type": "file" | "http", "config": { … } } }.rulesarray
builds (шаблоны имён), source, visibility (listed/hidden), message.publicObjectsboolean
/objects/ без авторизации даже при наличии правил. По умолчанию false.Подробнее — Доступ к сборкам.
hwid
modestring
off · observe (по умолчанию) · enforce.saltPathstring
client-config. Не задан — сервер заводит его сам в каталоге данных: соль нельзя менять, иначе все компьютеры станут новыми.ticketSecretPathstring
storeobject
memory или sql (driver: sqlite/postgres/mysql, dsn).requireReport · requireChallenge · requireLauncher · requireHardwareKeyboolean
minScore · minKinds · clusterScore · fanOutLimit · maxClusterSizenumber
vmPolicystring
allow · flag · deny.hardwareBanTTL · retention · ipRetentionstring
Подробнее — Машины и баны.
rateLimit
Включён по умолчанию: публичный вход, открытый для перебора паролей, — не то состояние, которое кто-то выбирает осознанно.
disabledboolean
backendstring
memory (по умолчанию) или redis — общий счётчик на несколько экземпляров.redis.addrstring
backend: redis.redis.passwordstring
requirepass).redis.dbint
redis.tlsbool
loginobject
{ "limit": 10, "per": "5m" }.accountobject
{ "limit": 50, "per": "15m" }. Жёсткий лимит здесь дал бы любому способ заблокировать конкретного игрока чужими неудачными попытками.challengeobject
{ "limit": 60, "per": "1m" }.Тратится только неудачная попытка входа: игрок, который вводит пароль верно, в счётчики не попадает вообще.
news
sourceobject
{ "type": "file" | "http", "config": { … } }. Нет блока — новостей нет.limitnumber
20.Подробнее — Новости.
update
checkboolean
interval и писать в лог, когда выходит версия свежее. По умолчанию true.installboolean
false.repostring
laminara/laminara.intervalduration
24h.Подробнее — Обновление сервера.
log
filestring
maxSizeMBnumber
20.keepnumber
5.maxAgeduration
720h.Подробнее — Обслуживание.
crashReports
enabledboolean
false.maxPerHournumber
20.anonymousboolean
true.anonymousPerHournumber
3.sinksobject
{ "имя": { "type": "discord|telegram|http|file", "config": { … } } }. Отчёт уходит во все адреса сразу.Подробнее — Отчёты о падениях.