Luanti/Minetest game server: docker-compose + minetest.conf for the avallon technic/mesecons survival server
Find a file
Nikki Claude e874873913 Initial commit: Luanti server docker setup with mapserver + nginx
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>
2026-08-12 00:51:20 +07:00
nginx Initial commit: Luanti server docker setup with mapserver + nginx 2026-08-12 00:51:20 +07:00
.gitignore Initial commit: Luanti server docker setup with mapserver + nginx 2026-08-12 00:51:20 +07:00
docker-compose.yml Initial commit: Luanti server docker setup with mapserver + nginx 2026-08-12 00:51:20 +07:00
minetest.conf Initial commit: Luanti server docker setup with mapserver + nginx 2026-08-12 00:51:20 +07:00
README.md Initial commit: Luanti server docker setup with mapserver + nginx 2026-08-12 00:51:20 +07:00

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 (новые моды по умолчанию выключены) — см. заметки по воркфлову.

Известные грабли (пройдено в этом сетапе)

  1. command: в docker-compose ПОЛНОСТЬЮ заменяет CMD образа, а не дополняет — если пишешь command:, обязательно включай --config /etc/minetest/minetest.conf, иначе конфиг молча не подхватится.
  2. Ни --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.
  3. ./data должен принадлежать UID 30000 на хосте до первого запуска, иначе Failed to open log file → segfault-краш-луп (exit 139).
  4. 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 = 12
  • num_emerge_threads = 3 (явно, не авто — под 4 ядра)
  • enable_rollback_recording = true
  • server_name, server_description, server_announce = true

Главный риск для CPU — не число игроков, а автоматизация (technic-заводы, mesecons-схемы). max_forceloaded_blocks (world anchors technic) оставлен на дефолте 16 намеренно — это единственный предохранитель от 24/7-нагрузки от афк-заводов вне зависимости от онлайна игроков.