2026.10.04広告・PRを含む記事です

マイクラサーバーの自動バックアップ方法!cron・プラグイン・Windows対応

NAS本体とドライブベイの参考写真と、自動バックアップの見出し。設定や稼働実例ではない
  • 手動バックアップを取り忘れて、数日前のデータしか残っていない
  • 荒らしや不具合に気づいたときには、壊れた状態のセーブデータしかなかった
  • 自動バックアップの仕組みを作りたいけれど、設定が難しそうで手を出せていない

マイクラサーバーのバックアップと復元を手動で行っていると、どうしても更新忘れや、ワールド破損後のデータで上書きしてしまう事故が起こります。

大切なワールドを失わないためには、「サーバー停止・圧縮・世代保存」を毎日決まった時間に自動実行する仕組みを作っておくのが最も確実です。

この記事では、Linux(cron)やWindowsでの定期自動化から、プラグインを使った手軽な設定、復元テストの手順までをわかりやすく整理しました。

読み終えるころには、自分の環境に合った自動バックアップが稼働し、データの取り忘れに怯えることなく安心してマルチプレイを楽しめます。

管理人spaのアイコン
この記事を書いた人spa

マイクラサーバーの構築と運用を繰り返して4年。今も経済サバイバル「spa77 SMP」を運用中で、その経験をもとに記事100本以上を執筆。

結論:初心者はサーバーを止める自動バックアップから始める

自動バックアップの流れ。停止、圧縮、起動、外部保存、復元テストの順番で進めることを示している

最初におすすめしたいのは、サーバーを一度止めてからコピーする自動バックアップです。

稼働中のままバックアップを取る方法は、save-offやsave-onの扱いを誤るとデータ破損の原因になります。初心者はサーバーを一度停止してからバックアップするのが最も安全です。

spa

僕のサーバーでも深夜に停止してバックアップしていますが、3分程度で完了します。

アーカイブのサイズはワールドが育つほど増えていき、1週間で1.1GBから1.3GB程度まで伸びました。

著者の停止バックアップの運用例で、容量が1週間に約1.1GBから約1.3GBへ増えたことを示す図

環境おすすめ方法
Linux VPSsystemctlまたはscreenとcronで停止、圧縮、起動
Windows自宅サーバーPowerShellとタスクスケジューラ
Paper・SpigotDriveBackupV2などのバックアッププラグイン
レンタルサーバー管理画面の自動バックアップと手動保存を併用
統合版サーバー停止コピー、慣れたらsave hold系を検討

迷ったら、毎日1回、7世代保存、サーバー外にも保存、月1回の復元テストから始めます。

凝った仕組みを作ることより、戻せるバックアップを残すことを優先します。

補足

この記事のコマンドは、基本的にコピペして使える形にしています。ただし、/opt/minecraft、server.jar、Minecraft、minecraftなどの名前は、自分の環境に合わせて置き換えます。

▼準備の話は後回しでいい、自分の環境のやり方だけ知りたい人は、ここから環境別の選び方へ飛んでください▼

自動バックアップ前に確認する3つのこと

自動バックアップを作る前に、次の3つだけ確認します。

ここを先に把握しておくと、どの手順を使えばいいか迷いにくいです。

確認すること見るコマンド
サーバーフォルダの場所pwd、ls
起動方法systemctlかscreenか
サーバーを動かしているユーザーwhoami、screen -list

今いる場所がサーバーフォルダか確認するなら、次のコマンドを使います。

Terminal window
pwd
ls

server.jar、world、server.propertiesが見えれば、そこがサーバーフォルダです。

systemdで管理しているかは、次のコマンドで確認します。

Terminal window
systemctl list-units --type=service | grep minecraft

screenで動かしている場合は、別のコマンドを使います。

Terminal window
screen -list

サーバーを動かしているユーザーを確認するなら、次のコマンドです。

Terminal window
whoami

自動バックアップで保存すべきファイル

バックアップ範囲の比較。バニラ各版とPaper26.1以降は使用中のworld全体を保存する。Paper26.1より前とSpigotの3フォルダ構成はネザー・エンドも別に保存する。統合版はworlds、設定、権限、使用中の追加パックを含め、外部データベースなどの保存先も確認する。

自動化する前に、保存対象を決めます。

ここを間違えると、毎日バックアップしていても復元時に困るので注意が必要です。

保存対象はエディションで変わります。

  • Java版で保存するもの
  • 統合版で保存するもの

自分が動かしている側だけ確認すれば十分です。

Java版で保存するもの

Java版は、サーバーソフトの種類によってネザーとエンドの保存場所が変わります。

保存対象もそれに合わせます。

サーバー・構成保存対象の例
バニラ使用中のworld全体とサーバー設定
Paper26.1以降使用中のworld全体、サーバー設定、plugins
Paper26.1より前world、world_nether、world_the_end、サーバー設定、plugins
Spigotの3フォルダ構成world、world_nether、world_the_end、サーバー設定、plugins
Java版共通使用中の全ワールドに加え、server.properties、OP・許可リスト・BAN情報など必要な設定とデータ

worldは初期名の例です。level-name、追加ワールド、保存先の設定に合わせて読み替えてください。

迷いやすいのはネザーとエンドの保存場所です。

Paper26.1より前や、Spigotの3フォルダ構成では、ネザーとエンドも別フォルダです。worldだけでなく、world_netherとworld_the_endも保存します。

Paper26.1以降の標準3次元は、world/dimensions/minecraft/配下にまとまります。バニラも26.1以降は同じ配下に3次元を保存します。

この構成ではworld全体を保存します。追加ワールドや外部に保存するデータまで含む、という意味ではありません。

サーバーソフトと版、level-name、実際に使用中の保存先を照合します。隣にworld_netherがあるかどうかだけでは、未生成の次元や退避済みの旧データを区別できません。

プラグインを使う場合は、本体・設定・データも保存します。LuckPermsなどは、設定によって外部データベースに情報を保存します。

pluginsだけで足りると判断せず、各プラグインの保存先とバックアップ方法を確認してください。

level-nameやserver-portなど、設定ファイルの中身はserver.propertiesの設定ガイドで先に把握しておくと迷いが減ります。

Paper、Spigot、Vanillaの違いで迷っている場合は、先にサーバーソフトの選び方を見ておくと判断しやすいです。

統合版で保存するもの

統合版サーバーでは、基本的にworldsフォルダを保存します。

許可リストや権限も戻したいなら、次のファイルも含めます。

ファイル役割
worldsワールドデータ
server.propertiesサーバー設定
allowlist.json許可リスト
permissions.json権限設定
resource_packsリソースパック
behavior_packsビヘイビアーパック

統合版のフォルダ構造はJava版とは別です。

Java版のworld_netherのような感覚で探すと迷うので、最初はworldsを中心に確認します。

ホワイトリストやallowlistの設定まで一緒に戻したい場合は、参加制限の設定も確認しておくと迷いにくいです。

環境別に自動バックアップ方法を選ぶ

マイクラサーバーの自動バックアップ方法を環境別に選ぶ図解。Linux VPSはcron、Windowsはタスクスケジューラ、Paper・Spigotはプラグイン、レンタルサーバーは管理画面、統合版は停止コピーを選ぶ流れを示している

保存対象が決まったら、次は自分の環境に合う自動化方法を選びます。

VPS、自宅Windows、Paper・Spigot、レンタルサーバー、統合版では、使う道具がそれぞれ別です。

Linux VPSで毎日の自動バックアップを設定する

Linux VPSでは、シェルスクリプトを作ってcronで毎日実行します。

ここでは、サーバーを停止してからバックアップする方法を例にします。

補足

cronは、Linuxなどで、毎日午前3時にこのコマンドを実行すると指定できる仕組みです。分、時、日、月、曜日の5項目で実行タイミングを決めます。

設定は次の順番で進めます。

  • 前提のフォルダ構成
  • systemdでサーバーを動かしている場合
  • screenでサーバーを動かしている場合
  • systemd版のバックアップスクリプトを作る
  • screen版のバックアップスクリプトを作る
  • スクリプトに実行権限を付けて手動確認する
  • 毎日3時に自動実行するよう登録する

systemdとscreenは、自分が使っているほうだけ読めば問題ありません。

前提のフォルダ構成

前提にするのは、このフォルダ構成です。

/opt/minecraft
├── server.jar
├── world
├── world_nether # Paper26.1より前や、Spigotの3フォルダ構成の例
├── world_the_end # 同上
├── plugins
└── server.properties
/opt/minecraft-backups

実際のフォルダ名は、自分のサーバー環境に合わせて指定してください。

world_netherやworld_the_endが見当たらないだけでは、保存構造は確定できません。サーバーソフトと版、level-name、使用中の保存先を確認してください。

/home/minecraft/serverで運用しているなら、スクリプト内のSERVER_DIRをそのパスに変更します。

補足

保存先が異なる場合は、スクリプト内のSERVER_DIRとBACKUP_DIRを自分の環境に合わせて書き換えます。

systemdでサーバーを動かしている場合

VPSで運用しているなら、マイクラサーバーをsystemdのサービスとして動かしている人も多いです。

サービス名がminecraft.serviceなら、次のコマンドで停止と起動をします。

Terminal window
sudo systemctl stop minecraft
sudo systemctl start minecraft

サービス名が違う場合は、自分の環境に合わせます。

確認は次のコマンドです。

Terminal window
systemctl list-units --type=service | grep minecraft

screenでサーバーを動かしている場合

自宅サーバーやVPSでは、screenでマイクラサーバーを動かしている人もいます。

たとえば、次のように起動しているケースです。

Terminal window
cd /opt/minecraft
screen -dmS Minecraft java -Xms2G -Xmx2G -jar server.jar nogui

この場合は、次のコマンドでは止められません。

Terminal window
systemctl stop minecraft

screenセッションへsayやstopを送って、サーバーが終了してからバックアップします。

screenセッション名の確認が必要です。

Terminal window
screen -list

Minecraftという名前で動いていれば、次のようにコマンドを送れます。

Terminal window
screen -S Minecraft -p 0 -X stuff "say バックアップのためサーバーを停止します$(printf '\r')"
screen -S Minecraft -p 0 -X stuff "save-all$(printf '\r')"
screen -S Minecraft -p 0 -X stuff "stop$(printf '\r')"

screenで運用している場合は、次のsystemd版ではなくscreen版のスクリプトが対象です。

systemd版のバックアップスクリプトを作る

次のスクリプトを/usr/local/bin/mc-backup.shに保存します。

SERVER_DIR、BACKUP_DIR、SERVICE_NAMEは環境に合わせて変更します。

初心者は、nanoでファイルを開くのがわかりやすいです。

Terminal window
sudo nano /usr/local/bin/mc-backup.sh

開いたら、次の内容をそのまま貼り付けます。

#!/bin/bash
set -euo pipefail
SERVER_DIR="/opt/minecraft"
BACKUP_DIR="/opt/minecraft-backups"
SERVICE_NAME="minecraft"
KEEP_DAYS=7
DATE="$(date '+%Y-%m-%d_%H-%M-%S')"
BACKUP_FILE="${BACKUP_DIR}/minecraft_${DATE}.tar.gz"
LOG_FILE="${BACKUP_DIR}/backup.log"
SERVER_STOPPED=0
WORLD_DIRS=(
world # server.propertiesのlevel-nameと同じ名前にする
# world_nether # 旧Paper・Spigotの3フォルダ構成なら先頭の#を外す
# world_the_end # 同上。追加ワールドもここに並べる
)
EXTRA_TARGETS=(
plugins
server.properties
ops.json
whitelist.json
banned-players.json
)
cleanup() {
if [ "$SERVER_STOPPED" -eq 1 ]; then
systemctl start "$SERVICE_NAME" || true
fi
}
trap cleanup EXIT
mkdir -p "$BACKUP_DIR"
{
echo "[$(date '+%Y-%m-%d %H:%M:%S')] backup start"
# ワールドが1つでも見つからなければ、サーバーを止める前に中止する
for world in "${WORLD_DIRS[@]}"; do
if [ ! -d "$SERVER_DIR/$world" ]; then
echo "world not found: $world. backup aborted."
exit 1
fi
done
EXISTING_TARGETS=("${WORLD_DIRS[@]}")
for target in "${EXTRA_TARGETS[@]}"; do
if [ -e "$SERVER_DIR/$target" ]; then
EXISTING_TARGETS+=("$target")
fi
done
systemctl stop "$SERVICE_NAME"
SERVER_STOPPED=1
tar -czf "$BACKUP_FILE" -C "$SERVER_DIR" "${EXISTING_TARGETS[@]}"
systemctl start "$SERVICE_NAME"
SERVER_STOPPED=0
find "$BACKUP_DIR" -name 'minecraft_*.tar.gz' -mtime +"$KEEP_DAYS" -delete
echo "[$(date '+%Y-%m-%d %H:%M:%S')] backup done: $BACKUP_FILE"
} >> "$LOG_FILE" 2>&1

貼り付けたら、Ctrl + O、Enter、Ctrl + Xの順で保存すればOKです。

補足

書き換える項目はSERVER_DIR、BACKUP_DIR、SERVICE_NAME(サービス名)、WORLD_DIRSの4点です。

WORLD_DIRSには、使っているワールドのフォルダをすべて書きます。level-nameを変えたサーバーでworldのままにすると、ワールドが見つからずバックアップは中止されます。

スクリプトが動く順番はこうです。

  1. バックアップ保存先を作る
  2. WORLD_DIRSのワールドがすべてあるか確かめる
  3. マイクラサーバーを停止する
  4. ワールド、設定、プラグインをtar.gzに圧縮する
  5. サーバーを起動する
  6. 作成から8日以上たったバックアップを削除する
  7. ログをbackup.logに残す

findの-mtime +7は、経過日数の端数を切り捨てて7より大きいものを選びます。そのため消えるのは、ちょうど7日ではなく8日以上たったファイルです。

削除は日数で決まるので、残るバックアップの数が7個とは限りません。バックアップの失敗が続いても古いものは消えていくため、backup.logのbackup doneも時々確かめてください。

ワールドは必須の対象です。1つでも欠けていれば、サーバーを止める前にworld not foundをログに残して中止します。

設定ファイルやプラグインのEXTRA_TARGETSは、実際にあるものだけを圧縮します。バニラサーバーでpluginsやops.jsonがなくても、エラーで止まりません。

途中でtarが失敗したときはcleanupでサーバーを起動し直し、サーバーが停止したまま放置されるのを防ぎます。

保存対象を確かめるには、自分のサーバーフォルダでlsを実行します。

Terminal window
ls /opt/minecraft

screen版のバックアップスクリプトを作る

screenで運用している場合、スクリプトの保存先は/usr/local/bin/mc-backup-screen.shです。

SCREEN_NAME、SERVER_DIR、BACKUP_DIR、WORLD_DIRS、起動時のメモリ量は自分の環境に合わせます。

screen版は、マイクラサーバーを起動しているユーザーで実行するのが基本です。

rootユーザーのcronから実行すると、一般ユーザー(minecraftなど)が起動したscreenセッションが見えず、停止コマンドが届きません。必ずサーバー起動と同じユーザーのcrontabで登録してください。

初心者spa

screenで起動しているのに、cronから見ると見つからないことがあるんですね!

screenを起動しているユーザーでファイルを開くのが原則です。

Terminal window
nano /usr/local/bin/mc-backup-screen.sh

権限エラーになる場合は、先に管理者権限で空ファイルを作って所有者を変えます。

Terminal window
sudo touch /usr/local/bin/mc-backup-screen.sh
sudo chown minecraft:minecraft /usr/local/bin/mc-backup-screen.sh
nano /usr/local/bin/mc-backup-screen.sh

minecraft:minecraftは、自分がサーバーを動かしているユーザー名に置き換えます。

貼り付ける中身はこれです。

#!/bin/bash
set -euo pipefail
SERVER_DIR="/opt/minecraft"
BACKUP_DIR="/opt/minecraft-backups"
SCREEN_NAME="Minecraft"
KEEP_DAYS=7
START_COMMAND='java -Xms2G -Xmx2G -jar server.jar nogui'
DATE="$(date '+%Y-%m-%d_%H-%M-%S')"
BACKUP_FILE="${BACKUP_DIR}/minecraft_${DATE}.tar.gz"
LOG_FILE="${BACKUP_DIR}/backup.log"
SERVER_STOPPED=0
WORLD_DIRS=(
world # server.propertiesのlevel-nameと同じ名前にする
# world_nether # 旧Paper・Spigotの3フォルダ構成なら先頭の#を外す
# world_the_end # 同上。追加ワールドもここに並べる
)
EXTRA_TARGETS=(
plugins
server.properties
ops.json
whitelist.json
banned-players.json
)
cleanup() {
if [ "$SERVER_STOPPED" -eq 1 ]; then
screen -dmS "$SCREEN_NAME" bash -c "cd \"$SERVER_DIR\" && exec $START_COMMAND" || true
fi
}
trap cleanup EXIT
mkdir -p "$BACKUP_DIR"
{
echo "[$(date '+%Y-%m-%d %H:%M:%S')] screen backup start"
# ワールドが1つでも見つからなければ、サーバーを止める前に中止する
for world in "${WORLD_DIRS[@]}"; do
if [ ! -d "$SERVER_DIR/$world" ]; then
echo "world not found: $world. backup aborted."
exit 1
fi
done
EXISTING_TARGETS=("${WORLD_DIRS[@]}")
for target in "${EXTRA_TARGETS[@]}"; do
if [ -e "$SERVER_DIR/$target" ]; then
EXISTING_TARGETS+=("$target")
fi
done
if screen -list | grep -q "$SCREEN_NAME"; then
screen -S "$SCREEN_NAME" -p 0 -X stuff "say バックアップのためサーバーを停止します$(printf '\r')"
sleep 5
screen -S "$SCREEN_NAME" -p 0 -X stuff "save-all$(printf '\r')"
sleep 10
screen -S "$SCREEN_NAME" -p 0 -X stuff "stop$(printf '\r')"
for i in {1..60}; do
if ! screen -list | grep -q "$SCREEN_NAME"; then
break
fi
sleep 2
done
else
echo "screen session not found: $SCREEN_NAME"
exit 1
fi
if screen -list | grep -q "$SCREEN_NAME"; then
echo "server did not stop. backup aborted."
exit 1
fi
SERVER_STOPPED=1
tar -czf "$BACKUP_FILE" -C "$SERVER_DIR" "${EXISTING_TARGETS[@]}"
screen -dmS "$SCREEN_NAME" bash -c "cd \"$SERVER_DIR\" && exec $START_COMMAND"
SERVER_STOPPED=0
find "$BACKUP_DIR" -name 'minecraft_*.tar.gz' -mtime +"$KEEP_DAYS" -delete
echo "[$(date '+%Y-%m-%d %H:%M:%S')] screen backup done: $BACKUP_FILE"
} >> "$LOG_FILE" 2>&1

貼り付けたら、Ctrl + O、Enter、Ctrl + Xで保存します。

補足

スクリプト内のSCREEN_NAMEは、screen -listで表示されるセッション名に合わせて指定します。

このスクリプトは、screen内のマイクラサーバーへsave-allとstopを送ります。

screenセッションが消えたことを確認してから圧縮するのが手順です。

圧縮が終わったら、同じscreen名でサーバーを起動し直します。

server.jarの名前やメモリ量が違う場合は、START_COMMANDのjava -Xms2G -Xmx2G -jar server.jar noguiを必ず直します。

ワールドを増やしたらWORLD_DIRSへ、設定ファイルやMODのフォルダを増やしたらEXTRA_TARGETSへ追加します。systemd版と同じ分け方です。

スクリプトに実行権限を付けて手動確認する

スクリプトを実行できるようにします。

Terminal window
sudo chmod +x /usr/local/bin/mc-backup.sh

screen版のスクリプトにも、同じように実行権限が必要です。

Terminal window
sudo chmod +x /usr/local/bin/mc-backup-screen.sh

手動で一度動かします。

Terminal window
sudo /usr/local/bin/mc-backup.sh

screen版の場合は実行するコマンドが別です。

Terminal window
sudo /usr/local/bin/mc-backup-screen.sh

ただし、screenを一般ユーザーで起動している場合は、sudoを付けずに同じユーザーで試します。

Terminal window
/usr/local/bin/mc-backup-screen.sh

その場合、バックアップ保存先へ書き込める権限も必要です。

Terminal window
sudo mkdir -p /opt/minecraft-backups
sudo chown minecraft:minecraft /opt/minecraft-backups

minecraft:minecraftの部分は、自分がサーバーを動かしているユーザー名に変えます。

バックアップファイルができているか確認します。

Terminal window
ls -lh /opt/minecraft-backups

ログの確認も必要です。

Terminal window
tail -n 50 /opt/minecraft-backups/backup.log

この時点で失敗しているなら、cronに入れる前に原因を直します。

手動実行で失敗するものは、自動化しても同じ結果になるのが通例です。

毎日3時に自動実行するよう登録する

crontab -eを開きます。

Terminal window
sudo crontab -e

screen版で、一般ユーザーのscreenセッションを使っている場合はsudoを付けません。

Terminal window
crontab -e

毎日午前3時に実行するなら、次の1行を追加します。

0 3 * * * /usr/local/bin/mc-backup.sh

screen版なら、登録するスクリプト名を変えます。

0 3 * * * /usr/local/bin/mc-backup-screen.sh

screen版は、cronを登録したユーザーとscreenを起動したユーザーを一致させるのが条件です。

ここがズレると、screen session not foundで止まります。

cronの5項目は、左から分、時、日、月、曜日です。

0 3 * * *は、毎日3時0分という意味になります。

補足

cron登録後はスクリプトを直接手動実行し、バックアップが正常に作成されるか確認します。

設定後は、登録内容の確認が必要です。

Terminal window
sudo crontab -l

次の日に、バックアップファイルとログが増えているか確認します。

Terminal window
ls -lh /opt/minecraft-backups
tail -n 50 /opt/minecraft-backups/backup.log

サーバーを止めずに稼働中バックアップする方法

Java版の稼働中バックアップの実装例。save-offの成功確認、save-all flushの完了確認、対象データのコピー、save-onの成功確認の順に進み、失敗時にも保存再開を確認する。全データの整合性を保証する手順ではない

稼働中のバックアップは、使うサーバーソフト・版・追加機能に合わせた仕組みが必要です。初心者は、この記事の前半で紹介した完全停止後のバックアップを選んでください。

以下はJava版の保存コマンドを使う実装例の説明です。統合版にはそのまま使えません。MOD・プラグイン・外部データベースの保存まで、同じコマンドで止まるとは限りません。

stopで止める流れが不安なら、先に停止と再起動の基本を確認してください。

緑色のランプが点灯したラック型サーバーの実写真に、マイクラサーバーを安全に再起動する記事見出しを重ねた画像。

【初心者向け】マイクラサーバーを再起動する方法!手動・自動の両方を解説

Java版の保存系コマンド

コマンド役割と注意
save-offワールドの自動保存を無効にする。サーバー全体の書き込み停止を保証するものではない
save-allワールドなどの保存を指示する。自動保存とは別の処理
save-all flush保存に加えてディスクへの反映を指示する。処理中に負荷がかかる場合がある
save-onワールドの自動保存を再開する。送信だけでなく成功も確認する

itzgのJava版向けバックアップ実装の既定設定では、RCONでsave-off、save-all flush、バックアップ処理、save-onの順に進みます。save-offの成功後に、スクリプト終了時も保存再開を試みる処理を登録しています。

この順番だけで、どの構成でも安全にコピーできるとは断定できません。Paper公式フォーラムの管理者による説明(2022年)でも、save-offだけではディスク上のデータ変更を完全には防げないとされています。古い版についての説明なので、現在の全バージョンに同じ待ち時間を当てはめないでください。

稼働中の方式を選ぶなら、利用する版と追加機能に対応したバックアップツールの手順に従い、少なくとも次を確認します。

  1. save-offが成功したことを確認し、エラーや中断時にもsave-onへ戻す処理を用意する
  2. save-all flushの成功・保存完了を確認する。固定の秒数待ちだけで完了したと判断しない
  3. 対象データをコピーし、処理結果を確認する。失敗したコピーを正常なバックアップとして扱わない
  4. コピーの成否にかかわらずsave-onの成功を確認する。再開できなければ管理者へ通知し、放置しない

終了時の処理を用意しても、強制終了や通信断などでは実行・成功しない場合があります。通知と復旧方法も必要です。コピーしたデータは別環境で復元を試し、ワールドだけでなく必要な追加機能のデータも戻るか確認してください。

稼働中のサーバーへ保存コマンドを送る方法

サーバーのコンソールやRCONでは、コマンドの返答を確認しながら進めます。screenのstuffは文字列を送るだけなので、そのコマンドの成功や保存完了を確認する仕組みにはなりません。

次は、screenのMinecraftセッションへ保存再開を送る送信方法だけの例です。バックアップ処理は含みません。

Terminal window
screen -S Minecraft -p 0 -X stuff "save-on$(printf '\r')"

送信後はサーバーのコンソールやログで、自動保存が再開したことを確認します。save-off・保存・コピー・save-onを確認なしで連続送信するだけの自動化は避けてください。成功確認や失敗時の復旧を用意できない場合は、完全停止してコピーする方式を使いましょう。

バックアップをサーバー外の別ストレージへ転送する

同じVPS内に保存するだけだと、ディスク障害や誤削除に弱いです。

大事なワールドなら、外部ストレージにも逃がします。

逃がし先の選択肢は3つです。

  • 別のサーバーへ転送して保管する
  • 差分だけを同期して保管する
  • クラウドストレージを使う場合

別のサーバーを持っていないなら、クラウドストレージが一番手軽です。

別のサーバーへ転送して保管する

別VPSや自宅NASへSSH接続できる環境なら、scpでの転送も選べます。

Terminal window
scp "$BACKUP_FILE" [email protected]:/data/minecraft-backups/

これをバックアップスクリプトのtar後に入れます。

SSH鍵を設定してパスワードなしで転送できる状態にしておくと、cronでも動かしやすいです。

差分だけを同期して保管する

差分同期したいならrsyncも使えます。

Terminal window
rsync -av --ignore-existing /opt/minecraft-backups/ [email protected]:/data/minecraft-backups/

--ignore-existingを付けると、すでにあるファイルは上書きしません。

バックアップ先を壊したくない場合に扱いやすいです。

クラウドストレージを使う場合

Google DriveやS3互換ストレージへ送る場合は、rcloneのような同期ツールを使います。

そのかわり、認証設定や保存容量の管理が必要です。

初心者なら、まずサーバー内バックアップを作ってから外部転送を足す順番で進めます。

一気に全部やろうとすると、失敗したときに原因を切り分けにくくなるためです。

Windowsでタスクスケジューラ自動バックアップを作る

Windowsの自宅サーバーなら、PowerShellスクリプトとタスクスケジューラを使います。

ここで例にするのは、RCONでサーバーへstopを送り、正常に終了したのを確かめてからZIPを作る方法です。

作業は次の5ステップです。

  • 前提のフォルダ構成
  • RCONを有効にしてmcrconを置く
  • PowerShellスクリプトを作る
  • PowerShellを手動実行する
  • タスクスケジューラに登録する

手動実行で動くところまで確認してから、タスクへ登録します。

前提のフォルダ構成

この記事では、次の構成を例にします。

C:\MinecraftServer
C:\MinecraftBackups

実際のフォルダに合わせて変更してください。

RCONを有効にしてmcrconを置く

タスクスケジューラから動くスクリプトは、サーバーのコンソールへ直接入力できません。そこでRCONを使い、コンソールと同じstopを送ります。

サーバーを止めた状態でserver.propertiesを開き、次の3行を設定します。

enable-rcon=true
rcon.port=25575
rcon.password=推測されにくい長いパスワード

RCONの25575番ポートは、ルーターでポート開放しないでください。スクリプトは同じPCの中から接続するので、外へ開ける必要はありません。

送信には、コマンドラインのRCONクライアントmcrconを使います。mcrcon-0.7.2-windows-x86-64.zipを展開し、mcrcon.exeをC:\MinecraftServerに置いてください。

PowerShellスクリプトを作る

作るファイルはC:\MinecraftServer\backup.ps1です。

Terminal window
$ServerDir = "C:\MinecraftServer"
$BackupDir = "C:\MinecraftBackups"
$Mcrcon = "C:\MinecraftServer\mcrcon.exe"
$RconPort = 25575
$RconPassword = "server.propertiesのrcon.passwordと同じ値"
$ServerPort = 25565 # server.propertiesのserver-port
$StartArgs = "-Xms2G -Xmx2G -jar server.jar nogui"
$KeepDays = 7
$Date = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
$BackupFile = Join-Path $BackupDir "minecraft_$Date.zip"
$LogFile = Join-Path $BackupDir "backup.log"
$WorldDirs = @(
"world" # server.propertiesのlevel-nameと同じ名前にする
# "world_nether" # 旧Paper・Spigotの3フォルダ構成なら先頭の#を外す
# "world_the_end" # 同上。追加ワールドもここに並べる
)
$ExtraTargets = @(
"plugins",
"server.properties",
"ops.json",
"whitelist.json",
"banned-players.json"
)
function Write-Log($Message) {
"[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $Message" | Add-Content $LogFile
}
New-Item -ItemType Directory -Force -Path $BackupDir | Out-Null
Write-Log "backup start"
# ワールドが1つでも見つからなければ、サーバーを止める前に中止する
foreach ($World in $WorldDirs) {
if (-not (Test-Path (Join-Path $ServerDir $World) -PathType Container)) {
Write-Log "world not found: $World. backup aborted."
exit 1
}
}
# server-portで待ち受けているプロセスを、このサーバーとして特定する
$ServerPids = @(Get-NetTCPConnection -LocalPort $ServerPort -State Listen -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty OwningProcess -Unique)
if ($ServerPids.Count -gt 1) {
Write-Log "multiple processes on port $ServerPort. backup aborted."
exit 1
}
$WasRunning = $ServerPids.Count -eq 1
if ($WasRunning) {
$ServerPid = $ServerPids[0]
# コンソールと同じstopをRCONで送り、ワールドを保存して終了させる
& $Mcrcon -H 127.0.0.1 -P $RconPort -p $RconPassword -w 5 "say Server will stop for backup." "stop"
$RconExit = $LASTEXITCODE
Wait-Process -Id $ServerPid -Timeout 120 -ErrorAction SilentlyContinue
# 終了しなければ強制終了せず、圧縮もしないで中止する
if (Get-Process -Id $ServerPid -ErrorAction SilentlyContinue) {
Write-Log "server did not stop (mcrcon exit code: $RconExit). backup aborted."
exit 1
}
}
$Paths = @($WorldDirs + $ExtraTargets |
ForEach-Object { Join-Path $ServerDir $_ } |
Where-Object { Test-Path $_ })
try {
Compress-Archive -Path $Paths -DestinationPath $BackupFile -Force -ErrorAction Stop
# 圧縮に成功したときだけ古いバックアップを削除する
Get-ChildItem $BackupDir -Filter "minecraft_*.zip" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$KeepDays) } |
Remove-Item -Force
Write-Log "backup done: $BackupFile"
}
catch {
Write-Log "backup failed: $_"
}
finally {
# 動いていたサーバーだけ起動し直す
if ($WasRunning) {
Start-Process -FilePath "java" -ArgumentList $StartArgs -WorkingDirectory $ServerDir
}
}

止める相手は、server-portで待ち受けているプロセスだけです。JAR名では探さないので、別フォルダで同じserver.jarを動かすサーバーを巻き込みません。

stopを送ってから120秒たってもサーバーが終了しなければ、強制終了せずにバックアップを中止します。このときサーバーは動いたままなので、backup.logを見て原因を確かめてください。

$StartArgsは、ふだんサーバーを起動するときのJAR名とメモリ量に合わせて直します。

Stop-ProcessやタスクマネージャーでJavaを終了させる止め方は、ワールドを保存せずにプロセスを終わらせます。書き込み途中で止まるとワールドが壊れるので、バックアップの自動化には使わないでください。

PaperやSpigotを動かしているなら、サーバーを止めずに自動バックアップできる後述のDriveBackupV2プラグインも選べます。

補足

PowerShellのCompress-Archiveは、2GBを超えるファイルを圧縮できず、隠し属性のファイルやフォルダは黙って飛ばします。ワールドやプラグインのフォルダに該当するファイルがあるなら、7-Zipなどの圧縮ツールへ切り替えてください。

どのツールでも、できたZIPを別の場所に展開し、ワールドが入っているかを確かめておきます。

PowerShellを手動実行する

管理者権限のPowerShellで試してください。

Terminal window
powershell -ExecutionPolicy Bypass -File "C:\MinecraftServer\backup.ps1"

C:\MinecraftBackupsにZIPファイルができているか確認します。

手動で動かないうちは、タスクスケジューラに入れない方がいいです。

タスクスケジューラに登録する

コマンドで登録するなら、schtasksを使えます。

毎日3時に実行する例です。

Terminal window
schtasks /Create /SC DAILY /ST 03:00 /TN "Minecraft Backup" /TR "powershell -ExecutionPolicy Bypass -File C:\MinecraftServer\backup.ps1"

登録できたら、すぐ手動実行して確認します。

Terminal window
schtasks /Run /TN "Minecraft Backup"

結果を見る場所は、タスクスケジューラの履歴またはC:\MinecraftBackups\backup.logです。

Paper・Spigotはバックアッププラグインで自動化する

PaperやSpigotを使っているなら、バックアッププラグインで自動化する方法もあります。

代表例は、DriveBackupV2です。

DriveBackupV2は、Google Drive、OneDrive、Dropbox、FTP、WebDAV、S3互換ストレージなどへの保存に対応しています。

Paper、Spigot、Bukkit系サーバーで使えるのが特徴です。

プラグイン方式で押さえるのは次の3点です。

  • プラグイン方式が向いている人
  • DriveBackupV2の基本手順
  • プラグイン方式でも確認すること

導入自体は簡単ですが、保存先の設定だけは自分で確認してください。

プラグイン方式が向いている人

プラグイン方式は、次の人に向いています。

  • PaperやSpigotで運用している
  • コマンドライン操作に慣れていない
  • Google Driveなどへ直接保存したい
  • バックアップの世代管理をプラグイン側でやりたい

一方で、バニラサーバーや統合版サーバーでは使えません。

プラグインを入れられるサーバーかどうかを先に確認します。

Paperの導入前なら、PaperMCの導入手順を先に見ておくとプラグイン方式を選びやすいです。

DriveBackupV2の基本手順

DriveBackupV2は、次の順番で設定します。

  1. DriveBackupV2のjarをダウンロードする
  2. pluginsフォルダへ入れる
  3. サーバーを再起動する
  4. plugins/DriveBackupV2/config.ymlを確認する
  5. 保存先を設定する
  6. 1回手動バックアップを実行する
  7. 復元できるか確認する

配布ページは、DriveBackupV2のCurseForgeページ です。

Google Driveへ連携する場合は、サーバー内で次のようなコマンドを実行して認証します。

/drivebackup linkaccount googledrive

OneDriveなら次のコマンドです。

/drivebackup linkaccount onedrive

Dropboxを使う場合は、指定するサービス名が変わります。

/drivebackup linkaccount dropbox

ローカル保存だけで始めるなら、plugins/DriveBackupV2/config.ymlのlocal-keep-countを見ます。

local-keep-countは、サーバー内に残すバックアップ数です。

初期値が0の場合、クラウドなどへアップロードするまでの一時保存として扱われます。

サーバー内にも7世代残したいなら、次のように設定します。

local-keep-count: 7

Google DriveやOneDriveなど、リモート側の世代数はkeep-countが設定箇所です。

たとえば20世代まで残すなら、次のようにします。

keep-count: 20

旧PaperやSpigotでworld_nether、world_the_endがわかれている場合は、backup-listへの追加が必要です。

Paper26.1以降はこの2つがworldの中に入るので、worldを入れておけば足ります。

ワールドだけでなく設定も戻したいなら、少なくとも次のものをバックアップ対象に入れておくと扱いやすいです。

  • world
  • world_nether(旧Paper・Spigotのみ)
  • world_the_end(旧Paper・Spigotのみ)
  • plugins
  • server.properties
  • ops.json
  • whitelist.json
  • banned-players.json

backup-listは、次のように、バックアップするフォルダやファイルと、作るZIP名を並べます。

backup-list:
- path: "world"
format: "Backup-world-%FORMAT.zip"
create: true
# 次の2つは旧Paper・Spigot向け。Paper26.1以降はworldに含まれるので不要
- path: "world_nether"
format: "Backup-world_nether-%FORMAT.zip"
create: true
- path: "world_the_end"
format: "Backup-world_the_end-%FORMAT.zip"
create: true
- path: "plugins"
format: "Backup-plugins-%FORMAT.zip"
create: true
- path: "server.properties"
format: "Backup-server-properties-%FORMAT.zip"
create: true

%FORMATには日時が入り、古いバックアップと新しいバックアップを見分けられます。

また、pluginsフォルダにはプラグイン本体のjarも含まれる点に注意が必要です。

jarまで保存すると容量が膨らみやすいため、設定ファイルだけで十分ならblacklistで*.jarを外します。

- path: "plugins"
format: "Backup-plugins-%FORMAT.zip"
create: true
blacklist:
- "**/*.jar"

設定を書き換えたあとは、サーバーを再起動するか、次のコマンドでの設定反映が必要です。

/drivebackup reloadconfig

初心者が最初に見るべき設定項目は、次の4つで十分です。

見る項目何を決めるか
backup-list何をバックアップするか
local-keep-countサーバー内に何世代残すか
keep-countクラウド側に何世代残すか
local-save-directoryサーバー内の保存先

プラグイン方式でも確認すること

プラグインを入れても、最初の1回は中身まで開きます。

  • ネザーとエンドのデータも入っているか(旧構造はworld_nether等)
  • pluginsフォルダ内の設定も含まれているか
  • 古いバックアップが自動削除されるか
  • クラウド保存に失敗していないか
  • 手動で復元できるか

バックアッププラグインは便利ですが、設定ミスを見逃すと毎日同じミスが続くのが難点です。

作られたZIPを開いて、ワールド、ネザー、エンド、プラグイン設定が入っていれば、毎日の自動バックアップに任せやすくなります。

レンタルサーバーは管理画面の自動バックアップを確認する

ConoHaやXServer GAMEsなどのマイクラ向けレンタルサーバーでは、管理画面から自動バックアップを設定できます。

初心者なら、この方法が一番楽です。

とはいえ、管理画面バックアップだけに頼り切るのは少し不安です。

バックアップ機能の有無、保存期間、世代数は、サービスや契約プランによって変わります。

使う前に、契約中プランの公式ヘルプや管理画面で現在の条件を確認します。

管理画面で見るのは、バックアップまわりの設定です。

  • 自動バックアップの有無
  • 保存頻度
  • 保存期間
  • 保存世代数
  • 復元時に上書きされる範囲
  • 手動ダウンロードできるか

大きなアップデート前、MODやプラグイン追加前、大型建築イベント前は、自分でも手動バックアップを取ります。

管理画面のバックアップ機能を重視してサーバーを選ぶなら、レンタルサーバー比較も見ておくと候補を絞りやすいです。

サーバーラック背面の参考写真と、レンタルサーバーの選び方の見出し。紹介サービスの実設備ではない

マイクラのレンタルサーバーおすすめ4社!迷ったら3日438円から

cronやスクリプトを書かずに自動化したい場合は、バックアップ機能を持つ管理画面から始めるほうが早いです。

割引は11月13日17時まで

cronを書かなくても、寝ている間にワールドのバックアップが取れていきます

管理画面でバックアップできるプランを確認する

統合版サーバーの自動バックアップ方法

統合版のサーバーでは、Java版とは保存コマンドが違い、書き込みを止めてからコピーし、再開するまでを3つのコマンドで行います。

コマンド役割
save holdワールドファイルへの書き込みを一時停止する
save queryバックアップ対象ファイルの情報を確認する
save resumeワールドファイルへの書き込みを再開する

ただし、統合版でも初心者は停止コピーから始めるほうがわかりやすいです。

サーバーを止めて、worlds、server.properties、allowlist.json、permissions.jsonをコピーします。

稼働中バックアップをする場合は、次の流れです。

  1. save holdを実行する
  2. save queryでバックアップ対象を確認する
  3. 対象ファイルをコピーする
  4. save resumeを必ず実行する

save resumeを忘れると危険なので、最初はテスト環境で試します。

統合版のバックアップは、Java版の記事やプラグイン情報をそのまま当てはめない方が安全です。

自動バックアップの保存頻度と世代数の目安

バックアップは、頻度と保存世代を決めておかないと容量を圧迫します。

迷ったら、次の目安で始めます。

サーバーの状態頻度保存世代
たまに遊ぶ少人数サーバー1日1回7世代
毎日遊ぶサーバー1日1回7から14世代
建築イベント中作業前後に追加イベント終了まで残す
MOD・プラグイン変更前作業前に1回成功確認まで残す
バージョンアップ前作業前に1回しばらく残す

最新1世代のみの保存運用は非常に危険です。

荒らし被害やワールド破損に気づくのが遅れた場合、すでに壊れた状態のデータで上書きされて元の正常なデータへ戻せなくなります。最低でも7世代は残してください。

最初は7世代を目安にし、ディスク容量に余裕があれば14世代まで増やすと安心です。

復元テストで自動バックアップが戻せるか確認する

マイクラサーバーのバックアップを毎日作り、サーバー外へ保管し、月1回復元テストする流れを示した図解

バックアップは、復元できて初めて意味が出ます。

spa

一度でもテスト用フォルダへ戻して起動しておくと、本当にワールドが壊れた日に「この手順で戻せる」とわかった状態で作業できます!

自動化したら、月1回はテスト用フォルダへ戻しての確認が必要です。

本番サーバーへいきなり上書きする必要はなく、別フォルダで起動して最低限次を見ます。

  • サーバーが起動するか
  • ワールドに入れるか
  • ネザーとエンドも戻っているか
  • OP権限やホワイトリストが戻っているか
  • プラグイン設定が反映されているか
  • コンソールに大きなエラーが出ていないか

復元テストをしていないバックアップは、まだ半分の状態です。

壊れてから初めて試すと、ファイル名・置き場所・権限・起動コマンドのどこで詰まっているのかわかりにくくなります。

自動バックアップでよくある失敗と対策

ここからは、自動化したあとに見落としやすいところを確認します。

よくある失敗は5つです。

  • サーバー内にしか保存していない
  • ネザーとエンドが抜けている
  • pluginsフォルダを保存していない
  • 自動実行はされているのに中身が空になっている
  • 古いバックアップを消しすぎている

どれも設定した直後は気づきにくく、復元しようとした日に発覚します。

サーバー内にしか保存していない

同じVPSや同じPCの中だけに保存していると、ディスク故障や誤削除に弱いです。

昨日の状態に戻すだけなら便利ですが、あなたのVPSごと消えたときには一緒に失います。

大事なワールドなら、別サーバー、外付けSSD、クラウドストレージにも逃がします。

spa

バックアップをサーバーと同じディスクにだけ置くと、ディスクが壊れた日にワールドと一緒に消えます。上の外付けHDDや別サーバーへコピーしておきましょう。

ネザーとエンドが抜けている

旧PaperやSpigotでは、world_netherとworld_the_endが別フォルダに分かれます。

この構造でworldだけを圧縮すると、通常世界だけ戻って、ネザーやエンドの建築が抜けます。

Paper26.1以降はこの2つがworldの中に入るため、worldをまるごと保存すれば抜けません。

最初のバックアップ後に、ZIPやtarの中身を開いて確認します。

pluginsフォルダを保存していない

プラグインサーバーでは、設定やデータの保存先がpluginsフォルダです。

権限、保護、経済、チャット連携のデータは、ワールドではなくpluginsフォルダの中に保存されます。

ワールドだけ戻すと、建物は戻ったのに権限や保護設定が空っぽ、という戻し方になりやすいです。

自動実行はされているのに中身が空になっている

cronに登録できても、スクリプトが成功しているとは限りません。

止まりがちなのは、パスの違い、権限不足、容量不足、サービス名のズレです。

ログを残し、最初の数日はバックアップファイルが増えているか確認します。

古いバックアップを消しすぎている

容量を節約しようとして、最新1個だけにするのは危険です。

荒らしに気づくのが翌日なら、最新バックアップも荒らされたあとです。

最低7世代は残す前提で、容量が足りないなら保存先や圧縮方法を見直します。

よくある質問

QMySQL・MariaDBを使うプラグインのデータも、サーバーフォルダの自動バックアップに入りますか?
A

外部データベースへ保存しているデータは入りません。プラグインの接続先を確認し、mariadb-dumpなどでデータベースも別に書き出して、サーバーファイルと同じ世代として保管します。

QサーバーのバックアップZIPを友達へそのまま渡しても大丈夫ですか?
A

おすすめしません。server.propertiesにはRCONパスワードが入る場合があり、プラグイン設定にも認証情報が含まれることがあります。必要なワールドだけを分けるか、暗号化して共有先を限定します。

まとめ:自動バックアップは毎日作る、別に逃がす、復元するまでやる

毎日の自動バックアップが動き、壊れた日に昨日のワールドへ戻せれば完成です。

最初の1本は、サーバーを止めてZIPを作る形で十分です。翌朝、保存先にその日のZIPが増え、中にワールドのフォルダが入っていれば自動化は動いています。

動き出したら、最低7世代を残してサーバーの外にもコピーし、月に1回は実際に戻してみてください。戻せると確かめたら、次はセキュリティのチェックリストの9分野から、まだ手をつけていない項目を探す番です。

cronやタスクスケジューラを自分で書くのが負担なら、管理画面で自動バックアップを設定できるレンタルサーバーに任せると、スクリプトなしで毎日のバックアップが残ります。

割引は11月13日17時まで

cronを書かなくても、寝ている間にワールドのバックアップが取れていきます

管理画面でバックアップできるプランを確認する