Перейти к содержанию

Minecraft Server#

docker-minecraft-server - самый простой и удобный способ запуска своего Minecraft сервера. У проекта есть хорошая документация, но всё же есть некоторые нюансы, которые стоит записать.

Запуск сервера#

  1. Устанавливаем docker. Не забываем про post-install steps.
  2. Создаём папку для сервера.
    mkdir minecraft-server
    cd minecraft-server
    
  3. Создаём файл docker-compose.yml.

    nano 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
    
  4. Запускаем сервер.

    docker compose up -d
    

Остановка сервера#

docker compose stop

Консоль сервера#

ctrl + p ctrl + q - отключиться от консоли. Если просто нажать ctrl + c, то сервер остановится.

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:

_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:

_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.

Клиенты Minecraft читают SRV-запись

С помощью SRV-записи можно подменять как порт, так и домен сервера. Стандартный клиент Minecraft Java Edition при подключении по домену автоматически ищет SRV-запись _minecraft._tcp.<домен> в DNS. Если такая запись есть, клиент использует указанные в ней порт и хост. С Bedrock Edition могут возникнуть сложности, там не все клиенты читают SRV-запись.

Автоматическое создание бэкапов#

Скрипт ниже автоматически создаёт бэкапы при завершении работы сервера. Особенно удобно сочетать его с настройкой ENABLE_AUTOSTOP, тогда при завершении игровой сессии бэкап будет создан автоматически.

# Создаём скрипт в директории рядом с docker-compose.yml
nano run-and-backup.sh

# После создания скрипта надо дать ему права на выполнение
chmod u+x run-and-backup.sh
#!/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.

./run-and-backup.sh -d

Вывести справку можно командой.

./run-and-backup.sh -h