282 lines
13 KiB
Markdown
282 lines
13 KiB
Markdown
# Minecraft Server
|
||
|
||
[docker-minecraft-server](https://github.com/itzg/docker-minecraft-server) - самый простой и удобный способ запуска своего Minecraft сервера. У проекта есть хорошая [документация](https://docker-minecraft-server.readthedocs.io/en/latest/), но всё же есть некоторые нюансы, которые стоит записать.
|
||
|
||
## Запуск сервера
|
||
|
||
1. Устанавливаем [`docker`](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository). Не забываем про [post-install steps](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user).
|
||
2. Создаём папку для сервера.
|
||
```sh
|
||
mkdir minecraft-server
|
||
cd minecraft-server
|
||
```
|
||
3. Создаём файл `docker-compose.yml`.
|
||
|
||
=== "Терминал"
|
||
|
||
```sh
|
||
nano docker-compose.yml
|
||
```
|
||
|
||
=== "docker-compose.yml"
|
||
|
||
```yaml
|
||
# https://docker-minecraft-server.readthedocs.io/en/latest/
|
||
services:
|
||
mc:
|
||
image: itzg/minecraft-server
|
||
tty: true
|
||
stdin_open: true
|
||
ports:
|
||
# Порт 25565 является стандартным, все клиенты по умолчанию
|
||
# подключаются к нему, если порт не задан явно
|
||
- "25565:25565"
|
||
environment:
|
||
# Полный список переменных можно найти в документации
|
||
# https://docker-minecraft-server.readthedocs.io/en/latest/variables/
|
||
|
||
EULA: "TRUE"
|
||
|
||
# Не забудьте указать нужную версию Minecraft
|
||
VERSION: 1.19.4
|
||
|
||
# Разрешаем подключаться без лицензии Minecraft
|
||
ONLINE_MODE: false
|
||
|
||
# Указываем название игрового мира (будет храниться в ./data/<LEVEL>)
|
||
# Чтобы изменить мир, достаточно изменить значение этой переменной
|
||
# и перезапустить контейнер
|
||
LEVEL: MyWorld
|
||
|
||
# Описание сервера
|
||
MOTD: |
|
||
Tish's Minecraft Server on %VERSION%
|
||
|
||
# Иконка сервера
|
||
# Надо разместить файл icon.png в ./data/
|
||
# ICON: /data/icon.png
|
||
# OVERRIDE_ICON: true
|
||
|
||
# Автоотключение пустого сервера
|
||
# ENABLE_AUTOSTOP: TRUE
|
||
# AUTOSTOP_TIMEOUT_EST: 300
|
||
# AUTOSTOP_TIMEOUT_INIT: 600
|
||
|
||
volumes:
|
||
- ./data:/data
|
||
```
|
||
|
||
4. Запускаем сервер.
|
||
|
||
```sh
|
||
docker compose up -d
|
||
```
|
||
|
||
## Остановка сервера
|
||
|
||
```sh
|
||
docker compose stop
|
||
```
|
||
|
||
## Консоль сервера
|
||
|
||
`ctrl + p ctrl + q` - отключиться от консоли.
|
||
Если просто нажать `ctrl + c`, то сервер остановится.
|
||
|
||
```sh
|
||
docker compose attach mc
|
||
```
|
||
|
||
### Шпаргалка по командам
|
||
|
||
1. `/list` — список игроков.
|
||
2. `/op <nickname>` — сделать игрока оператором.
|
||
3. `/deop <nickname>` — удалить из списка операторов.
|
||
4. Отдельной команды для просмотра списка операторов нет, но он хранится в файле `data/ops.json`.
|
||
5. `/whitelist <on|off>` — включить или выключить белый список игроков.
|
||
6. `/whitelist list` — вывести белый список игроков.
|
||
7. `/whitelist add <nickname>` — добавить игрока в белый список.
|
||
8. `/whitelist remove <nickname>` — удалить игрока из белого списка.
|
||
9. `/gamemode <0|1|2|3>` — изменить режим игры (0 — выживание, 1 — креатив, 2 — приключение, 3 — наблюдатель).
|
||
10. `/time set <day|night|<число>>` — установить время суток.
|
||
11. `/weather <clear|rain|thunder>` — изменить погоду.
|
||
12. `/tp <nickname1> <nickname2>` — телепортировать первого игрока ко второму.
|
||
13. `/difficulty <peaceful|easy|normal|hard>` — изменить уровень сложности сервера.
|
||
|
||
## Домен для сервера
|
||
|
||
Если порт стандартный (`25565`), то при подключении можно просто указать домен в A-записи которого указан IP-адрес сервера. Однако если порт нестандартный или хочется сделать несколько доменных имён для одного сервера, то можно использовать SRV-записи.
|
||
|
||
Например, если я создам домен `minecraft.tishenko.dev` и запущу сервер на порте `12345`, то чтобы подключаться к серверу без указания порта, мне нужно будет добавить следующую SRV-запись для `minecraft.tishenko.dev`:
|
||
|
||
```dns
|
||
_minecraft._tcp.minecraft.tishenko.dev. 3600 IN SRV 0 5 12345 minecraft.tishenko.dev.
|
||
```
|
||
|
||
Обычно ДНС провайдеры предоставляют UI для создания записей, в нём скорее всего будут следующие поля:
|
||
|
||
- Поддомен: `minecraft`
|
||
- Сервис: `minecraft` (SpaceWeb, например, сам подставляет `_`)
|
||
- Протокол: `tcp`
|
||
- TTL: `3600`
|
||
- Приоритет: `0`
|
||
- Вес: `5`
|
||
- Порт: `12345`
|
||
- Целевой домен: `minecraft.tishenko.dev.` (точка в конце обязательна)
|
||
|
||
Целевой домен не обязательно должен совпадать с поддоменом. Можно сделать подключение к серверу по домену `tishenko.dev` указан следующую SRV-запись для домена `tishenko.dev`:
|
||
|
||
```dns
|
||
_minecraft._tcp.tishenko.dev. 3600 IN SRV 0 5 12345 minecraft.tishenko.dev.
|
||
```
|
||
|
||
Домен `minecraft.tishenko.dev` в своей A-записи должен указывать на IP-адрес сервера, но при этом совершенно неважно какая A-запись будет у `tishenko.dev`.
|
||
|
||
DNS-записи распространяются не мгновенно, но обычно это занимает 15-30 минут. Отслеживать распространение записей можно с помощью сайта [DNS Checker](https://dnschecker.org/#SRV/_minecraft._tcp.tishenko.dev).
|
||
|
||
!!! note "Клиенты Minecraft читают SRV-запись"
|
||
|
||
С помощью SRV-записи можно подменять как порт, так и домен сервера. Стандартный клиент Minecraft Java Edition при подключении по домену автоматически ищет SRV-запись _minecraft._tcp.<домен> в DNS. Если такая запись есть, клиент использует указанные в ней порт и хост. С Bedrock Edition могут возникнуть сложности, там не все клиенты читают SRV-запись.
|
||
|
||
|
||
## Автоматическое создание бэкапов
|
||
|
||
Скрипт ниже автоматически создаёт бэкапы при завершении работы сервера. Особенно удобно сочетать его с настройкой `ENABLE_AUTOSTOP`, тогда при завершении игровой сессии бэкап будет создан автоматически.
|
||
|
||
=== "Терминал"
|
||
```sh
|
||
# Создаём скрипт в директории рядом с docker-compose.yml
|
||
nano run-and-backup.sh
|
||
|
||
# После создания скрипта надо дать ему права на выполнение
|
||
chmod u+x run-and-backup.sh
|
||
```
|
||
|
||
=== "run-and-backup.sh"
|
||
|
||
```bash
|
||
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
# === настройки ===
|
||
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
DATA_DIR="${PROJECT_DIR}/data"
|
||
BACKUP_DIR="${PROJECT_DIR}/backups"
|
||
KEEP_BACKUPS=3
|
||
TAR_COMPRESS_FLAGS="-czf"
|
||
|
||
mkdir -p "$BACKUP_DIR"
|
||
|
||
ts() { date +"%Y-%m-%d_%H-%M-%S"; }
|
||
|
||
show_help() {
|
||
cat <<'EOF'
|
||
run-and-backup.sh — запускает Minecraft-сервер через Docker Compose
|
||
и создаёт резервную копию каталога ./data после завершения работы.
|
||
|
||
ИСПОЛЬЗОВАНИЕ:
|
||
./run-and-backup.sh — запустить сервер в foreground
|
||
./run-and-backup.sh -d — запустить в background (логи в run-and-backup.log)
|
||
./run-and-backup.sh -b — только сделать бэкап и выйти
|
||
./run-and-backup.sh -h — показать эту справку
|
||
|
||
ЧТО ДЕЛАЕТ:
|
||
1) docker compose up (следит за завершением контейнера)
|
||
2) по Ctrl+C или штатному выходу — docker compose down
|
||
3) создаёт архив ./backups/mc-data-YYYY-MM-DD_HH-MM-SS.tar.gz
|
||
4) хранит последние KEEP_BACKUPS бэкапов
|
||
|
||
КАК ВОССТАНОВИТЬ СЕРВЕР ИЗ БЭКАПА:
|
||
1) Остановите сервер:
|
||
docker compose down
|
||
2) Очистите или перенесите текущие данные:
|
||
mv ./data ./data.old
|
||
mkdir ./data
|
||
ИЛИ
|
||
rm -rf ./data/*
|
||
3) Распакуйте нужный архив в ./data:
|
||
tar -xzf ./backups/mc-data-YYYY-MM-DD_HH-MM-SS.tar.gz -C ./data
|
||
4) Запустите сервер
|
||
|
||
ПРИМЕЧАНИЯ:
|
||
• Архив содержит всё из ./data (мир, плагины, конфиги, whitelist, ops и т.д.)
|
||
• Для фонового режима логи скрипта пишутся в ./run-and-backup.log
|
||
EOF
|
||
}
|
||
|
||
backup() {
|
||
local stamp archive
|
||
stamp="$(ts)"
|
||
archive="${BACKUP_DIR}/mc-data-${stamp}.tar.gz"
|
||
|
||
if [[ ! -d "$DATA_DIR" ]]; then
|
||
echo "[!] Нет каталога DATA_DIR: $DATA_DIR" >&2
|
||
exit 1
|
||
fi
|
||
|
||
echo "[*] Бэкап ${DATA_DIR} -> ${archive}"
|
||
tar $TAR_COMPRESS_FLAGS "$archive" -C "$DATA_DIR" .
|
||
echo "[+] Готово: $archive"
|
||
|
||
echo "[*] Ротация: оставляю последние ${KEEP_BACKUPS}"
|
||
ls -1t "${BACKUP_DIR}"/mc-data-*.tar.* 2>/dev/null | tail -n +$((KEEP_BACKUPS+1)) | xargs -r rm -f
|
||
}
|
||
|
||
graceful_down_and_backup() {
|
||
echo "[*] Останавливаю docker compose (graceful)..."
|
||
docker compose down || true
|
||
backup
|
||
}
|
||
|
||
# ---- разбор флагов ----
|
||
bg=false
|
||
do_backup_only=false
|
||
|
||
while getopts ":dbh" opt; do
|
||
case "$opt" in
|
||
d) bg=true ;;
|
||
b) do_backup_only=true ;;
|
||
h) show_help; exit 0 ;;
|
||
\?) echo "Неизвестный флаг: -$OPTARG" >&2; show_help; exit 2 ;;
|
||
esac
|
||
done
|
||
|
||
# -b имеет приоритет: просто делаем бэкап и выходим
|
||
if $do_backup_only; then
|
||
backup
|
||
exit 0
|
||
fi
|
||
|
||
# запуск в фоне
|
||
if $bg; then
|
||
echo "[*] Запускаю в background (логи: ${PROJECT_DIR}/run-and-backup.log)"
|
||
nohup "$0" >"${PROJECT_DIR}/run-and-backup.log" 2>&1 &
|
||
echo "[✓] PID: $!"
|
||
exit 0
|
||
fi
|
||
|
||
# ---- основной режим ----
|
||
trap graceful_down_and_backup INT TERM
|
||
|
||
echo "[*] Запускаю docker compose в foreground (Ctrl+C для остановки)..."
|
||
if docker compose up; then
|
||
echo "[*] docker compose завершился сам — делаю бэкап..."
|
||
backup
|
||
else
|
||
echo "[!] docker compose завершился с ошибкой; если это был Ctrl+C, бэкап уже выполнен ловушкой."
|
||
fi
|
||
|
||
echo "[✓] Готово."
|
||
```
|
||
|
||
Теперь можно запускать сервер командой `./run-and-backup.sh`.
|
||
|
||
```sh
|
||
./run-and-backup.sh -d
|
||
```
|
||
|
||
Вывести справку можно командой.
|
||
|
||
```sh
|
||
./run-and-backup.sh -h
|
||
``` |