【完全保存版】Python×Ubuntuでマイクラサーバーを自動運用!バックアップ・再起動・復元をまるごと自動化

執筆者:

カテゴリ:

, , , ,

「マイクラサーバーを立てたけど、メンテナンスが面倒…」「ワールドが壊れたらどうしよう…」と不安になっていませんか? 今回は、初心者でも迷わないように、Pythonを使ってサーバーの「バックアップ」「復元」「自動再起動」をすべて自動化する方法を、ステップバイステップで解説します!


1. なぜ「Python」で管理するのか?

プログラミング言語はたくさんありますが、サーバー管理にはPythonが最適です。

  • 直感的で読みやすい: 初心者でも「何をしているコードか」が理解しやすい。
  • 自動化の道具が豊富: ファイルの圧縮や日付の取得など、便利な機能が標準で揃っています。
  • Ubuntuと相性抜群: Ubuntuには最初からPythonが入っているため、すぐに始められます。

2. 実装:自動バックアップ&再起動スクリプト

まずは、サーバーを安全に停止させ、データを保存してからPCをリフレッシュするスクリプトを作成します。

準備:Pythonスクリプトの作成

Ubuntuのターミナルで、新しいPythonファイルを作成しましょう。

nano mc_maintenance.py

スクリプトの中身

以下のコードをコピーして貼り付けてください(パスは自分の環境に合わせて書き換えてくださいね)。

Python

import shutil
import datetime
import os
import subprocess
import time

# --- 設定エリア ---
SERVER_DIR = "/home/user/minecraft_server"  # マイクラのフォルダ
BACKUP_DIR = "/home/user/backups"           # 保存先フォルダ
SCREEN_NAME = "mc_server"                   # サーバーを動かしているscreen名

def run_command(command):
    """マイクラのコンソールにコマンドを送る関数"""
    subprocess.run(['screen', '-S', SCREEN_NAME, '-X', 'stuff', f'{command}\n'])

# 1. サーバー内に再起動の通知を出す
run_command("say 10秒後にメンテナンスのため再起動します!")
time.sleep(10)

# 2. 安全に停止させる(重要!)
run_command("stop")
print("サーバー停止中...")
time.sleep(30) # 完全に止まるまで待機

# 3. バックアップ実行(zip圧縮)
today = datetime.datetime.now().strftime('%Y%m%d_%H%M')
backup_path = os.path.join(BACKUP_DIR, f"world_backup_{today}")
shutil.make_archive(backup_path, 'zip', os.path.join(SERVER_DIR, 'world'))
print(f"バックアップ完了: {backup_path}.zip")

# 4. OSごと再起動してメモリをリフレッシュ!
print("Ubuntuを再起動します。")
subprocess.run(['sudo', 'reboot'])

3. Ubuntuの「起動時」にマイクラを自動起動させる

PCを再起動させても、マイクラが止まったままでは意味がありません。Ubuntuの systemd という機能を使って、「電源が入ったら自動でマイクラを立ち上げる」設定をします。

設定手順

  1. 設定ファイルを作成:sudo nano /etc/systemd/system/minecraft.service
  2. 「起動時にこのコマンドを打ってね」という指示書を書く。
  3. 登録完了!これで、たとえ停電で落ちても、電気が復旧すれば勝手にサーバーが復活します。

4. 「cron」でスケジュールを組む

最後に、このPythonスクリプトを「毎日決まった時間」に動かします。

crontab -e

一番下に以下を追記します。

# 毎日午前4時にメンテナンス実行
00 04 * * * /usr/bin/python3 /home/user/scripts/mc_maintenance.py

5. 万が一の「復元(リストア)」方法

データが壊れた時は、バックアップフォルダにある最新のzipファイルを展開して、元の world フォルダと入れ替えるだけです。これもPythonで「どの日付に戻す?」と聞いてくれるツールを作っておくと、パニックにならずに済みます。

万が一の時も安心!自動復元(リストア)スクリプト

バックアップがあるだけでは不十分です。大切なのは、「いつでも、誰でも、正確に」元の状態に戻せることです。

復元スクリプトの仕組み

復元を行う際は、以下の手順を正確に守る必要があります。

  1. 現在動いているサーバーを止める(データ競合を防ぐため)
  2. 今の壊れた(または戻したい)ワールドを念のため別名で退避させる
  3. バックアップファイルを解凍して配置する
  4. サーバーを再起動する

これを手動でやるとフォルダ名を間違えたりしがちですが、Pythonなら一瞬です。

2. 復元スクリプトのコード例

新しいファイル mc_restore.py を作成して、以下の内容を記述します。

Python

import shutil
import os
import zipfile

# --- 設定エリア ---
SERVER_DIR = "/home/user/minecraft_server"
BACKUP_DIR = "/home/user/backups"
WORLD_NAME = "world" # 復元したいフォルダ名

def restore_backup():
    # 1. バックアップ一覧を表示
    backups = [f for f in os.listdir(BACKUP_DIR) if f.endswith('.zip')]
    if not backups:
        print("バックアップが見つかりません。")
        return

    print("--- 復元可能なバックアップ一覧 ---")
    for i, file in enumerate(backups):
        print(f"[{i}] {file}")

    # 2. ユーザーに番号を選ばせる
    choice = int(input("復元したい番号を入力してください: "))
    target_zip = os.path.join(BACKUP_DIR, backups[choice])

    # 3. 現在のワールドを退避(安全のため削除せずリネーム)
    current_world = os.path.join(SERVER_DIR, WORLD_NAME)
    if os.path.exists(current_world):
        old_world = current_world + "_old"
        if os.path.exists(old_world):
            shutil.rmtree(old_world)
        os.rename(current_world, old_world)
        print(f"現在のワールドを {WORLD_NAME}_old に退避しました。")

    # 4. ZIPを展開して復元
    with zipfile.ZipFile(target_zip, 'r') as zip_ref:
        zip_ref.extractall(SERVER_DIR)
    
    print(f"【成功】{backups[choice]} から復元が完了しました。")
    print("サーバーを起動して確認してください!")

if __name__ == "__main__":
    restore_backup()
#実行コマンド
python3 mc_restore.py

コマンドを実行すると復元するファイルを選択して復元が始まります。


まとめ:自作サーバーの醍醐味は「自由」にある

自作サーバーなら、こうしたカスタマイズは自由自在です。

最初は「黒い画面(ターミナル)」が怖く感じるかもしれませんが、一つずつ設定をクリアしていく過程は、まるでマイクラで大きな回路を作るような楽しさがあります。 自分だけの「最強のメンテナンスフリーサーバー」を目指して、ぜひ挑戦してみてください!

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です