Minecraft Server#
docker-minecraft-server - самый простой и удобный способ запуска своего Minecraft сервера. У проекта есть хорошая документация, но всё же есть некоторые нюансы, которые стоит записать.
Запуск сервера#
- Устанавливаем
docker. Не забываем про post-install steps. - Создаём папку для сервера.
-
Создаём файл
docker-compose.yml.# 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 -
Запускаем сервер.
Остановка сервера#
Консоль сервера#
ctrl + p ctrl + q - отключиться от консоли.
Если просто нажать ctrl + c, то сервер остановится.
Шпаргалка по командам#
/list— список игроков./op <nickname>— сделать игрока оператором./deop <nickname>— удалить из списка операторов.- Отдельной команды для просмотра списка операторов нет, но он хранится в файле
data/ops.json. /whitelist <on|off>— включить или выключить белый список игроков./whitelist list— вывести белый список игроков./whitelist add <nickname>— добавить игрока в белый список./whitelist remove <nickname>— удалить игрока из белого списка./gamemode <0|1|2|3>— изменить режим игры (0 — выживание, 1 — креатив, 2 — приключение, 3 — наблюдатель)./time set <day|night|<число>>— установить время суток./weather <clear|rain|thunder>— изменить погоду./tp <nickname1> <nickname2>— телепортировать первого игрока ко второму./difficulty <peaceful|easy|normal|hard>— изменить уровень сложности сервера.
Домен для сервера#
Если порт стандартный (25565), то при подключении можно просто указать домен в A-записи которого указан IP-адрес сервера. Однако если порт нестандартный или хочется сделать несколько доменных имён для одного сервера, то можно использовать SRV-записи.
Например, если я создам домен minecraft.tishenko.dev и запущу сервер на порте 12345, то чтобы подключаться к серверу без указания порта, мне нужно будет добавить следующую SRV-запись для minecraft.tishenko.dev:
Обычно ДНС провайдеры предоставляют UI для создания записей, в нём скорее всего будут следующие поля:
- Поддомен:
minecraft - Сервис:
minecraft(SpaceWeb, например, сам подставляет_) - Протокол:
tcp - TTL:
3600 - Приоритет:
0 - Вес:
5 - Порт:
12345 - Целевой домен:
minecraft.tishenko.dev.(точка в конце обязательна)
Целевой домен не обязательно должен совпадать с поддоменом. Можно сделать подключение к серверу по домену tishenko.dev указан следующую SRV-запись для домена tishenko.dev:
Домен minecraft.tishenko.dev в своей A-записи должен указывать на IP-адрес сервера, но при этом совершенно неважно какая A-запись будет у tishenko.dev.
DNS-записи распространяются не мгновенно, но обычно это занимает 15-30 минут. Отслеживать распространение записей можно с помощью сайта DNS Checker.
Клиенты Minecraft читают SRV-запись
С помощью SRV-записи можно подменять как порт, так и домен сервера. Стандартный клиент Minecraft Java Edition при подключении по домену автоматически ищет SRV-запись _minecraft._tcp.<домен> в DNS. Если такая запись есть, клиент использует указанные в ней порт и хост. С Bedrock Edition могут возникнуть сложности, там не все клиенты читают SRV-запись.
Автоматическое создание бэкапов#
Скрипт ниже автоматически создаёт бэкапы при завершении работы сервера. Особенно удобно сочетать его с настройкой ENABLE_AUTOSTOP, тогда при завершении игровой сессии бэкап будет создан автоматически.
#!/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.
Вывести справку можно командой.