Конфигурация
Сервер читает один JSON-файл — config.json. Установщик кладёт его в /etc/laminara/config.json,
и команды находят его там сами; другой путь задаётся флагом --config. Если не уверены, где он у
вас, спросите сервер: laminara-server doctor первой же строкой печатает файл, из которого читал.
Файл состоит из независимых разделов — включён только тот, что вы описали. Нет раздела yggdrasil — вход в игре просто не поднимается; нет storage — сервер работает без раздачи файлов.
Полный список полей с типами — в справочнике конфигурации. Здесь — что каждый раздел даёт.
Разделы
auth — кто такие игроки
Откуда брать аккаунты и как проверять пароль. Laminara не хранит аккаунты: она спрашивает ваш источник (JSON-файл, SQL-база или HTTP-API) и владеет только сессиями. Здесь же выбирается алгоритм хеша пароля и хранилище сессий (в памяти или Redis). Подробно — в разделе Аутентификация.
storage — где лежат файлы
Хранилище объектов: локальная файловая система или S3-совместимое. От него зависит, как сервер отдаёт байты лаунчеру. Что выбрать — в разделе Хранилище.
build — куда складывать сборки
Каталог профилей (profilesDir) и путь к ключу подписи (signingKeyPath). Ключ Ed25519 создаётся автоматически при первом запуске, если файла ещё нет. Его публичная часть попадает в лаунчер вместе со всем набором ключей.
api — публичный слушатель
Адрес, на котором сервер обслуживает лаунчер, раздачу объектов и (если включён) Yggdrasil. Флаг xAccel включает выдачу файлов силами nginx через X-Accel-Redirect — см. Продакшен.
За обратным прокси адрес игрока приходит заголовком, и верить ему можно только от самого прокси: список его адресов задаёт trustedProxies (по умолчанию — loopback и частные сети, то есть nginx на этой же машине). Порт, открытый в интернет напрямую, ставит "trustedProxies": [] — тогда адресом всегда считается тот, с которого пришло соединение.
yggdrasil — вход в игре
Включает authlib-injector-совместимый сервер аутентификации и подпись скинов. Тут же выбирается адаптер скинов. Подробно — в разделе Вход в игре и скины.
Минимальный пример
Достаточный, чтобы собирать и раздавать сборки: аккаунты из JSON-файла, файловое хранилище, публичный порт.
{ "auth": { "provider": "jsonfile", "config": { "path": "/var/lib/laminara/users.json", "hash": "argon2id" }, "sessions": { "backend": "memory" } }, "storage": { "backend": "fs", "config": { "root": "/var/lib/laminara/objects" } }, "build": { "profilesDir": "/var/lib/laminara/profiles", "signingKeyPath": "/var/lib/laminara/signing.key" }, "api": { "addr": "0.0.0.0:8099" }}