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

Установка

Сервер — один статический бинарник. Выберите способ под свою инфраструктуру: Docker, systemd для железа или VPS, сборка из исходников для разработки. Образ Docker собирается из исходников, так что для генерации protobuf понадобится и Go.

Установщик

Проще всего — установщик. Одна команда, дальше он всё спросит и соберёт сам.

Окно терминала
curl -fsSL https://raw.githubusercontent.com/laminara/laminara/main/install.sh | bash

Что он делает:

  • определяет архитектуру и скачивает бинарь из релизов GitHub;
  • спрашивает по шагам — как игроки придут на сервер (домен через nginx или прямой адрес), хранилище (диск или S3), источник аккаунтов (JSON-файл с первым аккаунтом, SQL или HTTP), хранилище сессий, вход в игре и скины;
  • генерирует config.json, создаёт каталог данных и первый аккаунт (пароль хешируется argon2id);
  • по выбору ставит systemd-сервис или поднимает Docker-стек с Redis;
  • при выборе домена ставит nginx, пишет ему конфиг под этот сервер и берёт сертификат Let’s Encrypt — после установки игроки уже приходят на https://ваш-домен.

Ключи подписи сервер создаёт сам при первом запуске, а библиотеки и Java докачивает при сборках — заводить руками ничего не нужно. В конце установщик печатает адрес проекта и готовую команду client-config — с неё начинается сборка лаунчера для игроков.

Если серверы у вас в Pterodactyl или Pelican, ставьте через egg для панели — установщик и systemd тогда не нужны.

Дальше — способы собрать всё вручную.

Docker

Окно терминала
make generate # сгенерировать gen/ из protobuf перед сборкой образа
cp deploy/config.example.json deploy/config.json
docker compose -f deploy/docker-compose.yml up -d --build

Compose поднимает сам сервер и Redis. Постоянные данные — профили сборок, объекты, ключи подписи — лежат в томе laminara-data (/var/lib/laminara внутри контейнера). Разделы для Postgres и S3-хранилища в файле закомментированы; включите их, если они вам нужны.

systemd

Для установки на хост есть готовый unit с Type=notify — сервер сам сообщает systemd о готовности и об остановке.

  1. Соберите бинарник

    Окно терминала
    make build
    sudo install -m0755 bin/laminara-server /usr/local/bin/laminara-server
  2. Заведите пользователя и каталоги

    Окно терминала
    sudo useradd --system --home /var/lib/laminara --shell /usr/sbin/nologin laminara
    sudo install -d -o laminara -g laminara /var/lib/laminara /etc/laminara
    sudo install -m0640 -o laminara -g laminara deploy/config.example.json /etc/laminara/config.json
  3. Поставьте unit и запустите

    Unit печатает сам сервер — он знает, в какие каталоги пишет:

    Окно терминала
    laminara-server systemd-config --config /etc/laminara/config.json \
    | sudo tee /etc/systemd/system/laminara-server.service
    sudo systemctl enable --now laminara-server

Unit ограничивает права: NoNewPrivileges, ProtectSystem=strict, ProtectHome, PrivateTmp, а запись разрешена ровно там, где сервер её делает по конфигу — каталог сборок, хранилище, лаунчер, ключи, журнал и /run/laminara. Ключи --binary, --user, --group меняют пути и владельца службы.

PrivateTmp=true обязателен: во временный каталог пишут и публикация сборок, и сборка лаунчера, и модули (каждый создаёт там свой сокет), а ProtectSystem=strict без приватного /tmp делает каталог доступным только для чтения. Если сервер всё же оказался с таким /tmp, он не падает: при запуске заводит tmp/ рядом со своими данными, пишет об этом в журнал и работает дальше — но unit лучше починить.

Из исходников

Нужен только Go — генератор кода тянется через go tool, отдельный protoc не требуется.

Окно терминала
make generate # protobuf -> gen/go
make build # go build ./...
make test # прогнать тесты
make run # запустить в текущем терминале

Управление запущенным сервером

Тот же бинарник — клиент к своему демону: он подключается к процессу по Unix-сокету.

Окно терминала
laminara-server status # состояние
laminara-server console # интерактивная консоль с живыми логами
laminara-server logs -f # только логи, потоком
laminara-server stop # остановить

Полный список команд — в справочнике CLI.

О чём спросит установщик

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

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

В конце установщик предлагает сразу собрать первую сборку. Согласились — он спросит имя сборки, версию Minecraft и загрузчик (список загрузчиков печатается для выбранной версии, версия самого загрузчика по Enter берётся последняя подходящая), а дальше сделает всё сам: подготовит клиент, опубликует сборку, соберёт лаунчер и напечатает ссылку, по которой игроки его качают. Отказались — то же самое делается потом из консоли, установщик покажет команды.

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

Redis для сессий

Если выбрать хранение сессий в Redis, установщик сначала проверит, отвечает ли он по указанному адресу, и дальше поступит по обстановке:

  • отвечает — идём дальше, ничего спрашивать не надо;
  • просит пароль — установщик спросит его и проверит, что Redis такой пароль принимает;
  • не отвечает, адрес локальный — предложит поставить Redis пакетом и включить службу, поднять его в Docker контейнером laminara-redis (вариант появляется, только если Docker на машине есть), указать другой адрес или обойтись памятью;
  • не отвечает, адрес чужой — предложит указать другой адрес или обойтись памятью.

Если Redis ставит сам установщик, он же его и настраивает: придумывает пароль, прописывает его Redis’у (requirepass в конфиге службы или --requirepass контейнеру), закрывает Redis от сети (bind 127.0.0.1) и кладёт пароль в конфиг Laminara — вводить руками ничего не нужно. Перед записью установщик проверяет, что пароль действительно взялся: если Redis почему-то поднялся без него, в конфиг пароль не попадёт.

Выбор «обойтись без Redis» не ломает установку: сессии останутся в памяти. Вернуться к этому разговору можно в любой момент, не трогая остальную установку:

Окно терминала
curl -fsSL https://raw.githubusercontent.com/Laminara/laminara/main/install.sh -o install.sh
bash install.sh --redis

Это то же самое меню: проверит Redis, при необходимости поставит и настроит его, запишет адрес и пароль в конфиг и перезапустит службу. Отдельные значения правятся и вручную — laminara-server settings auth.sessions.backend redis; пароль, номер базы и TLS живут в блоке auth.sessions.redis.

Удаление

Снять Laminara с сервера можно тем же способом, что и поставить:

Окно терминала
curl -fsSL https://raw.githubusercontent.com/Laminara/laminara/main/uninstall.sh -o uninstall.sh
bash uninstall.sh

Скрипт сначала показывает, что именно уберёт — настройки, каталог данных с его размером, программу, службу systemd, сайт nginx и системного пользователя, — и только потом спрашивает подтверждение. Ничего не удаляется, пока вы не ответите «да» дважды: сперва про данные, затем про удаление целиком.

Данные можно оставить: тогда уедут только программа, служба и сайт nginx, а /var/lib/laminara и файл настроек останутся на месте — с ними Laminara поднимется заново там же, где стояла.