108 lines
6.0 KiB
Markdown
108 lines
6.0 KiB
Markdown
# Server runtime — Phase 4
|
||
|
||
Полный релиз содержит готовый Docker Compose. `scripts/server.sh` управляет
|
||
им локально, проверяя artifact checksums, manifest, pinned Compose и
|
||
подтверждённую Minecraft/loader/image/Java комбинацию. Wrapper требует
|
||
Node/npm dependencies, Docker daemon и локальный Compose из bootstrap.
|
||
Сам payload можно запускать обычным Docker Compose на подготовленном host.
|
||
|
||
## Первоначальная настройка
|
||
|
||
Выбрать отдельный server root и готовый full release. Пример для второго
|
||
локального сервера, пока основной работает на 25565:
|
||
|
||
```bash
|
||
mkdir -p .tools/local-server
|
||
cp server/.env.example .tools/local-server/.env
|
||
chmod 600 .tools/local-server/.env
|
||
```
|
||
|
||
В локальном `.env` явно задать:
|
||
|
||
```dotenv
|
||
MC_EULA=TRUE
|
||
MC_MEMORY=2G
|
||
MC_PORT=25566
|
||
MC_BIND_ADDRESS=127.0.0.1
|
||
MC_UID=1000
|
||
MC_GID=1000
|
||
MC_PROJECT_NAME=minecraft-lab-local
|
||
```
|
||
|
||
`MC_EULA=TRUE` означает ваше принятие https://www.minecraft.net/en-us/eula.
|
||
Для текущего эксперимента оно уже получено. На новом host EULA принять
|
||
самостоятельно. UID/GID выбрать для владельца runtime на host; image
|
||
инициализирует права данных с этими значениями. Оператор должен иметь
|
||
доступ к Docker, server root и локальному `.env`.
|
||
|
||
Файл использует простые `KEY=value` без кавычек/interpolation. Пока разрешены
|
||
только перечисленные ключи. Его значения имеют приоритет над случайными
|
||
ambient MC_EULA/MEMORY/PORT/UID/GID из shell. Project можно выбрать также
|
||
через `MC_PROJECT_NAME` в shell; он должен оставаться стабильным для этого root.
|
||
|
||
```bash
|
||
export MC_ROOT="$PWD/.tools/local-server"
|
||
export MC_RELEASE_DIR="$PWD/dist/minecraft-lab-neoforge-spike-0.0.4"
|
||
scripts/server.sh config --quiet
|
||
scripts/server.sh up -d --wait --wait-timeout 600
|
||
scripts/server.sh ps
|
||
scripts/server.sh logs --tail 100
|
||
scripts/server.sh exec -T minecraft mc-health
|
||
```
|
||
|
||
Пути должны быть абсолютными; cwd не влияет на mounts. `MC_ENV_FILE` может
|
||
выбрать другой абсолютный файл настроек вне immutable release; по умолчанию
|
||
используется `MC_ROOT/.env`. Для второго runtime нужен отдельный стабильный
|
||
project и свободный порт. Wrapper отклоняет project, чьи существующие
|
||
контейнеры подключают другой `/data`.
|
||
|
||
## Lifecycle и данные
|
||
|
||
```bash
|
||
scripts/server.sh restart --timeout 120
|
||
scripts/server.sh up -d --wait --wait-timeout 120
|
||
scripts/server.sh stop
|
||
scripts/server.sh create --force-recreate
|
||
scripts/server.sh up -d --wait --wait-timeout 120
|
||
scripts/server.sh down
|
||
```
|
||
|
||
Restart/create/stop/down относятся к тому же выбранному релизу. `down`
|
||
удаляет контейнер и network, но сохраняет host runtime. Данные не находятся
|
||
в named volume: `MC_ROOT/runtime` монтируется в `/data` read-write.
|
||
Release и его `server/config` монтируются read-only. Онлайн-проверка аккаунтов
|
||
выключена. `MC_BIND_ADDRESS` в host `.env` выбирает IPv4 интерфейс:
|
||
по умолчанию 127.0.0.1; для remote LAN задать 0.0.0.0.
|
||
|
||
Первая инициализация разрешена только с пустым runtime (или `.gitkeep`).
|
||
В root создаётся `.mcpack-runtime.json`: project и SHA256 manifest выбранного
|
||
релиза. Binding записывается перед запуском и сохраняется даже при его
|
||
неудаче, чтобы повторный up продолжал ту же попытку. Это не active-release
|
||
и не отметка успешного deployment.
|
||
|
||
Смена релиза/project на связанном runtime и неявное принятие существующего
|
||
мира без binding запрещены. Backup/restore реализованы в Phase 5;
|
||
смена релиза требует будущего deploy workflow. Текущий старый Phase 0 мир управляется `scripts/spike-server.sh`;
|
||
миграция на новый wrapper в Phase 4 не выполняется.
|
||
|
||
Lifecycle-операции и весь цикл backup используют общую `.mcpack-runtime.lock`
|
||
в server root. Snapshot/recovery procedure — [backups.md](backups.md). После
|
||
принудительного убийства процесса lock может остаться; удалять только когда
|
||
соответствующий процесс точно завершён. `config` проверяет контракт без
|
||
запуска Docker и без создания runtime/binding. `up --wait` теперь проверяет
|
||
Minecraft status query и окно стабильной работы, включая restart loops.
|
||
Отдельная проверка — `scripts/server.sh health`; timeout/report/logs описаны
|
||
в [health.md](health.md).
|
||
|
||
Обычный Compose также работает с release payload:
|
||
|
||
```bash
|
||
MC_ROOT=/absolute/server-root MC_RELEASE_DIR=/absolute/full-release \
|
||
docker compose --project-name minecraft-lab-local \
|
||
--env-file /absolute/server-root/.env \
|
||
-f /absolute/full-release/server/compose.yaml up -d --wait
|
||
```
|
||
|
||
При прямом вызове Compose проверки/binding/lock wrapper не выполняются;
|
||
для локального lifecycle используйте `scripts/server.sh`.
|