- HTML 100%
Docker-compose для avallon-mine (technic/mesecons/pipeworks/techpack, до 10 игроков): luanti server, live mapserver, nginx (/ landing, /maps proxy). Конфиг с активными строками поверх полного minetest.conf.example. Signed-off-by: Nikki Claude <nikki.claude@avallon.pw> |
||
|---|---|---|
| nginx | ||
| .gitignore | ||
| docker-compose.yml | ||
| minetest.conf | ||
| README.md | ||
mine-luanti-docker
Docker-сетап Luanti (Minetest) сервера для avallon — до 10 игроков (в среднем 3-5),
технологическая связка модов (technic/mesecons/pipeworks/techpack), деплой на хост mine.
Хост
- VM:
mine/detroit, 4vCPU, 8GB RAM, 200Mbit uplink - Путь на хосте:
/opt/mine-luanti-docker - Порт:
30000/udp
Структура
config/minetest.conf # рабочий конфиг (полный example + активные строки без #)
docker-compose.yml
games/minetest_game/ # база — клонируется отдельно, не в этом репо (см. ниже)
mods/<name>/ # моды — клонируются отдельно (см. ниже)
data/ # мир, сохранения — НЕ коммитить (see .gitignore)
games/ и mods/ не в репозитории (внешние апстримы, будем решать позже — плоский git clone
или submodules). data/ — runtime-состояние сервера, всегда в .gitignore.
Первый деплой с нуля
mkdir -p /opt/mine-luanti-docker/{config,data,games,mods}
cd /opt/mine-luanti-docker
git clone --depth 1 https://github.com/luanti-org/minetest_game.git games/minetest_game
sudo chown -R 30000:30000 data # обязательно! контейнер работает под UID 30000
docker compose up -d
docker logs -f mine-server
Образ
ghcr.io/luanti-org/luanti:latest — official, alpine-based, UID 30000 (minetest),
entrypoint /usr/local/bin/luantiserver.
Планируемые моды (пока не затянуты)
Все рассчитаны на minetest_game как базу. После клонирования в ./mods/<name>/
не забыть включить их в data/.minetest/worlds/avallon-world/world.mt
(новые моды по умолчанию выключены) — см. заметки по воркфлову.
Известные грабли (пройдено в этом сетапе)
command:в docker-compose ПОЛНОСТЬЮ заменяет CMD образа, а не дополняет — если пишешьcommand:, обязательно включай--config /etc/minetest/minetest.conf, иначе конфиг молча не подхватится.- Ни
--worldname, ни--worldне создают новый мир с нужным именем "с нуля" — при пустойworlds/авто-бутстрап хардкодит имяworld, независимо от переданных флагов. Рабочий обход: создатьworld.mtруками ДО первого запуска —
После этогоmkdir -p data/.minetest/worlds/avallon-world cat > data/.minetest/worlds/avallon-world/world.mt <<'EOF' gameid = minetest_game backend = sqlite3 world_name = avallon-world EOF sudo chown -R 30000:30000 data--worldname avallon-worldпросто выбирает уже существующий зарегистрированный мир по имени — это работает надёжно (в отличие от создания). В логе строкаServer for gameid="minetest" listening...— генерический лейбл, не признак того, что игра не подхватилась; проверять реальныйgameidвworld.mt. ./dataдолжен принадлежать UID 30000 на хосте до первого запуска, иначеFailed to open log file→ segfault-краш-луп (exit 139).minetest_game/game.confне содержитid=— gameid берётся из имени папки вgames/, а не из содержимого файла.
Ресурсный сайзинг (4vCPU/8GB/200Mbit, до 10 игроков)
Дефолты движка этой версии (5.16.1) уже разумны сами по себе — почти ничего вручную
поднимать не пришлось (active_block_range=4, max_block_send_distance=12,
max_simultaneous_block_sends_per_client=40 — всё уже на уровне "high-end").
Реально тронуто:
max_users = 12num_emerge_threads = 3(явно, не авто — под 4 ядра)enable_rollback_recording = trueserver_name,server_description,server_announce = true
Главный риск для CPU — не число игроков, а автоматизация (technic-заводы,
mesecons-схемы). max_forceloaded_blocks (world anchors technic) оставлен
на дефолте 16 намеренно — это единственный предохранитель от 24/7-нагрузки
от афк-заводов вне зависимости от онлайна игроков.