【2025年最新】マイクラサーバーの自動バックアップ完全ガイド!rclone活用で安全なデータ保護

【2025年最新】マイクラサーバーの自動バックアップ完全ガイド!rclone活用で安全なデータ保護

※本記事は2025年1月時点の情報に基づいて執筆されています。内容の正確性には万全を期していますが、最新情報は各公式サイトをご確認ください。

「大切なワールドデータが消えたらどうしよう…」「手動バックアップは面倒くさい!」そんな不安を解消する自動バックアップシステムの構築方法を徹底解説します。rcloneを使ったクラウドバックアップで、データ消失リスクを完全に回避しましょう!

マイクラバックアップ 画像出典:XServer GAMEs

なぜ自動バックアップが必要なのか?

マインクラフトサーバーを運営していると、様々なリスクでデータが失われる可能性があります:

データ消失の主な原因:

  • サーバークラッシュ – 突然の停止によるワールド破損
  • ストレージ故障 – HDDやSSDの物理的な故障
  • 人為的ミス – 誤操作によるファイル削除
  • マルウェア感染 – ランサムウェアなどの攻撃
  • 自然災害 – データセンターの被災

手動バックアップの問題点:

  • 定期実行を忘れやすい
  • 作業量が多く継続困難
  • バックアップのタイミングがばらつく
  • ローカル保存のみでリスク分散不足

自動バックアップシステムの全体構成

今回構築するシステムの特徴:

機能仕様メリット
定期実行cron/systemdによる自動化手動作業不要
増分バックアップ変更分のみ保存ストレージ効率が良い
クラウド保存Google Drive/AWS S3等災害対策・リスク分散
世代管理古いバックアップの自動削除ストレージ容量管理
圧縮保存tar.gz形式での保存転送時間短縮

バックアップ構成図 

画像出典:XServer GAMEs

ステップ1:rcloneのインストールと設定

1. rcloneのインストール

Ubuntu/Debian系の場合:

Copy# 公式インストールスクリプト
curl https://rclone.org/install.sh | sudo bash

# パッケージマネージャー経由
sudo apt update
sudo apt install rclone

CentOS/RHEL系の場合:

Copy# EPELリポジトリ有効化
sudo yum install epel-release
sudo yum install rclone

# または直接ダウンロード
wget https://downloads.rclone.org/rclone-current-linux-amd64.rpm
sudo rpm -ivh rclone-current-linux-amd64.rpm

2. Google Driveとの連携設定

Copy# rclone設定開始
rclone config

# 設定手順:
# n) New remote
# name> gdrive
# Storage> google drive
# client_id> (空白でEnter)
# client_secret> (空白でEnter)
# scope> 1 (Full access)
# root_folder_id> (空白でEnter)
# service_account_file> (空白でEnter)
# Edit advanced config? > n
# Use auto config? > y (ブラウザが開く)

3. 接続テスト

Copy# Google Drive内容確認
rclone ls gdrive:

# テストフォルダ作成
rclone mkdir gdrive:minecraft-backups

# 動作確認
echo "test" > test.txt
rclone copy test.txt gdrive:minecraft-backups/
rclone ls gdrive:minecraft-backups/

ステップ2:基本バックアップスクリプトの作成

シンプルなバックアップスクリプト

Copy#!/bin/bash
# minecraft_backup.sh

# 設定変数
MINECRAFT_DIR="/opt/minecraft"
BACKUP_DIR="/tmp/minecraft-backup"
RCLONE_REMOTE="gdrive:minecraft-backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="minecraft_backup_${DATE}"

# ログ設定
LOGFILE="/var/log/minecraft-backup.log"
exec 1> >(tee -a "$LOGFILE")
exec 2>&1

echo "=== Minecraft Backup Started: $(date) ==="

# MinecraftサーバーにSave-allコマンド送信
if screen -list | grep -q "minecraft"; then
    echo "Sending save-all command to server..."
    screen -S minecraft -p 0 -X stuff "save-all$(printf \\r)"
    screen -S minecraft -p 0 -X stuff "save-off$(printf \\r)"
    sleep 10
    
    SAVE_ENABLED=true
else
    echo "Minecraft server not running in screen session"
    SAVE_ENABLED=false
fi

# バックアップディレクトリ準備
mkdir -p "$BACKUP_DIR"
cd "$BACKUP_DIR"

# ワールドデータの圧縮
echo "Creating compressed backup..."
tar -czf "${BACKUP_NAME}.tar.gz" -C "$MINECRAFT_DIR" world world_nether world_the_end server.properties whitelist.json ops.json banned-players.json banned-ips.json

# セーブ機能を再有効化
if [ "$SAVE_ENABLED" = true ]; then
    screen -S minecraft -p 0 -X stuff "save-on$(printf \\r)"
    echo "Save enabled on server"
fi

# クラウドにアップロード
echo "Uploading to cloud storage..."
rclone copy "${BACKUP_NAME}.tar.gz" "$RCLONE_REMOTE" --progress

# ローカルの一時ファイル削除
rm -f "${BACKUP_NAME}.tar.gz"

echo "=== Backup Completed: $(date) ==="
echo ""

ステップ3:高度なバックアップスクリプト

機能充実版のスクリプト

Copy#!/bin/bash
# advanced_minecraft_backup.sh

# 設定ファイル読み込み
CONFIG_FILE="/etc/minecraft-backup/config.conf"
if [ -f "$CONFIG_FILE" ]; then
    source "$CONFIG_FILE"
else
    echo "Config file not found: $CONFIG_FILE"
    exit 1
fi

# デフォルト設定
MINECRAFT_DIR="${MINECRAFT_DIR:-/opt/minecraft}"
BACKUP_DIR="${BACKUP_DIR:-/tmp/minecraft-backup}"
RCLONE_REMOTE="${RCLONE_REMOTE:-gdrive:minecraft-backups}"
RETENTION_DAYS="${RETENTION_DAYS:-30}"
MAX_BACKUP_SIZE="${MAX_BACKUP_SIZE:-1000000000}" # 1GB
COMPRESSION_LEVEL="${COMPRESSION_LEVEL:-6}"

# 関数定義
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOGFILE"
}

send_discord_notification() {
    local message="$1"
    local status="$2"
    local color="65280"  # 緑色
    
    if [ "$status" = "error" ]; then
        color="16711680"  # 赤色
    elif [ "$status" = "warning" ]; then
        color="16776960"  # 黄色
    fi
    
    if [ -n "$DISCORD_WEBHOOK" ]; then
        curl -H "Content-Type: application/json" \
             -d "{\"embeds\":[{\"color\":$color,\"title\":\"Minecraft Backup\",\"description\":\"$message\"}]}" \
             "$DISCORD_WEBHOOK" &>/dev/null
    fi
}

cleanup_old_backups() {
    log_message "Cleaning up old backups..."
    
    # ローカルの古いバックアップ削除
    find "$BACKUP_DIR" -name "minecraft_backup_*.tar.gz" -mtime +7 -delete
    
    # リモートの古いバックアップ削除
    rclone delete "$RCLONE_REMOTE" --min-age "${RETENTION_DAYS}d" --include "minecraft_backup_*.tar.gz"
    
    log_message "Cleanup completed"
}

check_disk_space() {
    local required_space="$1"
    local available_space=$(df "$BACKUP_DIR" | awk 'NR==2 {print $4}')
    available_space=$((available_space * 1024))  # KBをバイトに変換
    
    if [ "$available_space" -lt "$required_space" ]; then
        log_message "ERROR: Insufficient disk space. Required: $required_space, Available: $available_space"
        return 1
    fi
    return 0
}

backup_database() {
    # プラグインのデータベースバックアップ
    if [ -f "$MINECRAFT_DIR/plugins/*/database.db" ]; then
        log_message "Backing up plugin databases..."
        find "$MINECRAFT_DIR/plugins" -name "*.db" -exec cp {} "$BACKUP_DIR/" \;
    fi
}

# メイン処理開始
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="minecraft_backup_${DATE}"
LOGFILE="/var/log/minecraft-backup.log"

log_message "=== Advanced Minecraft Backup Started ==="

# 前提条件チェック
if [ ! -d "$MINECRAFT_DIR" ]; then
    log_message "ERROR: Minecraft directory not found: $MINECRAFT_DIR"
    send_discord_notification "❌ Backup failed: Minecraft directory not found" "error"
    exit 1
fi

# ディスク容量チェック
ESTIMATED_SIZE=$(du -sb "$MINECRAFT_DIR" | cut -f1)
if ! check_disk_space $((ESTIMATED_SIZE * 2)); then
    send_discord_notification "❌ Backup failed: Insufficient disk space" "error"
    exit 1
fi

# バックアップディレクトリ準備
mkdir -p "$BACKUP_DIR"
cd "$BACKUP_DIR"

# Minecraftサーバーの一時停止処理
SCREEN_SESSION=$(screen -list | grep minecraft | awk '{print $1}')
if [ -n "$SCREEN_SESSION" ]; then
    log_message "Pausing Minecraft server for backup..."
    screen -S "$SCREEN_SESSION" -p 0 -X stuff "say §eBackup starting in 10 seconds...$(printf \\r)"
    sleep 5
    screen -S "$SCREEN_SESSION" -p 0 -X stuff "say §eBackup starting in 5 seconds...$(printf \\r)"
    sleep 5
    screen -S "$SCREEN_SESSION" -p 0 -X stuff "save-all$(printf \\r)"
    screen -S "$SCREEN_SESSION" -p 0 -X stuff "save-off$(printf \\r)"
    sleep 3
    SAVE_ENABLED=true
    log_message "Server paused for backup"
else
    log_message "Minecraft server not running"
    SAVE_ENABLED=false
fi

# データベースバックアップ
backup_database

# メインバックアップ作成
log_message "Creating compressed backup (compression level: $COMPRESSION_LEVEL)..."
START_TIME=$(date +%s)

tar --exclude='*.tmp' --exclude='*.log' \
    -czf "${BACKUP_NAME}.tar.gz" \
    -C "$MINECRAFT_DIR" \
    world world_nether world_the_end \
    server.properties whitelist.json ops.json \
    banned-players.json banned-ips.json \
    plugins/*/config.yml plugins/*/data

END_TIME=$(date +%s)
BACKUP_SIZE=$(stat -c%s "${BACKUP_NAME}.tar.gz")
COMPRESSION_TIME=$((END_TIME - START_TIME))

log_message "Backup created: Size $(numfmt --to=iec $BACKUP_SIZE), Time ${COMPRESSION_TIME}s"

# サーバー再開
if [ "$SAVE_ENABLED" = true ]; then
    screen -S "$SCREEN_SESSION" -p 0 -X stuff "save-on$(printf \\r)"
    screen -S "$SCREEN_SESSION" -p 0 -X stuff "say §aBackup completed! Server resumed.$(printf \\r)"
    log_message "Server resumed"
fi

# サイズチェック
if [ "$BACKUP_SIZE" -gt "$MAX_BACKUP_SIZE" ]; then
    log_message "WARNING: Backup size exceeds limit ($MAX_BACKUP_SIZE bytes)"
    send_discord_notification "⚠️ Backup created but size is larger than expected" "warning"
fi

# クラウドアップロード
log_message "Uploading to cloud storage: $RCLONE_REMOTE"
UPLOAD_START=$(date +%s)

if rclone copy "${BACKUP_NAME}.tar.gz" "$RCLONE_REMOTE" --progress --transfers 4; then
    UPLOAD_END=$(date +%s)
    UPLOAD_TIME=$((UPLOAD_END - UPLOAD_START))
    log_message "Upload completed in ${UPLOAD_TIME}s"
    send_discord_notification "✅ Backup completed successfully\nSize: $(numfmt --to=iec $BACKUP_SIZE)\nTime: ${COMPRESSION_TIME}s + ${UPLOAD_TIME}s" "success"
else
    log_message "ERROR: Upload failed"
    send_discord_notification "❌ Backup upload failed" "error"
    exit 1
fi

# 古いバックアップの削除
cleanup_old_backups

# 一時ファイル削除
rm -f "${BACKUP_NAME}.tar.gz"

log_message "=== Backup Process Completed ==="

ステップ4:設定ファイルの作成

バックアップ設定ファイル

Copy# /etc/minecraft-backup/config.conf

# 基本設定
MINECRAFT_DIR="/opt/minecraft"
BACKUP_DIR="/tmp/minecraft-backup"
RCLONE_REMOTE="gdrive:minecraft-backups"

# 保存期間設定(日数)
RETENTION_DAYS=30

# バックアップサイズ制限(バイト)
MAX_BACKUP_SIZE=2000000000  # 2GB

# 圧縮レベル(1-9、9が最高圧縮)
COMPRESSION_LEVEL=6

# 通知設定
DISCORD_WEBHOOK="https://discord.com/api/webhooks/your-webhook-url"

# ログ設定
LOGFILE="/var/log/minecraft-backup.log"

# 除外パターン
EXCLUDE_PATTERNS="*.tmp,*.log,cache/*,temp/*"

ステップ5:自動実行の設定

cronによる定期実行設定

Copy# crontab設定
sudo crontab -e

# 毎日午前2時にバックアップ実行
0 2 * * * /opt/scripts/advanced_minecraft_backup.sh

# 毎6時間ごとに実行(より頻繁なバックアップ)
0 */6 * * * /opt/scripts/advanced_minecraft_backup.sh

# 毎週日曜日の午前1時に完全バックアップ
0 1 * * 0 /opt/scripts/full_minecraft_backup.sh

systemdサービスによる管理

Copy# /etc/systemd/system/minecraft-backup.service
[Unit]
Description=Minecraft Server Backup
After=network.target

[Service]
Type=oneshot
User=minecraft
Group=minecraft
ExecStart=/opt/scripts/advanced_minecraft_backup.sh
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
Copy# /etc/systemd/system/minecraft-backup.timer
[Unit]
Description=Minecraft Backup Timer
Requires=minecraft-backup.service

[Timer]
OnCalendar=daily
RandomizedDelaySec=1800
Persistent=true

[Install]
WantedBy=timers.target

サービス有効化:

Copy# サービス登録
sudo systemctl daemon-reload
sudo systemctl enable minecraft-backup.timer
sudo systemctl start minecraft-backup.timer

# 状態確認
sudo systemctl status minecraft-backup.timer
sudo systemctl list-timers minecraft-backup.timer

ステップ6:AWS S3との連携設定

S3バケットの設定

Copy# rclone S3設定
rclone config

# 設定項目:
# name> s3backup
# Storage> Amazon S3
# provider> AWS
# env_auth> false
# access_key_id> YOUR_ACCESS_KEY
# secret_access_key> YOUR_SECRET_KEY
# region> ap-northeast-1
# endpoint> (空白)
# location_constraint> ap-northeast-1

S3用バックアップスクリプト

Copy#!/bin/bash
# s3_backup_script.sh

# S3設定
S3_BUCKET="s3backup:minecraft-backups-bucket"
S3_STORAGE_CLASS="STANDARD_IA"  # コスト削減

# ライフサイクル管理
upload_to_s3() {
    local file="$1"
    local remote_path="$2"
    
    # ストレージクラス指定してアップロード
    rclone copy "$file" "$remote_path" \
        --s3-storage-class "$S3_STORAGE_CLASS" \
        --transfers 8 \
        --checkers 16 \
        --progress
}

# 古いバックアップをGlacierに移動
archive_old_backups() {
    local days_old=30
    
    rclone ls "$S3_BUCKET" | while read -r size date time filename; do
        file_date=$(echo "$filename" | grep -o '[0-9]\{8\}')
        if [ -n "$file_date" ]; then
            file_timestamp=$(date -d "$file_date" +%s)
            current_timestamp=$(date +%s)
            days_diff=$(( (current_timestamp - file_timestamp) / 86400 ))
            
            if [ $days_diff -gt $days_old ]; then
                log_message "Moving $filename to Glacier storage"
                # S3のライフサイクルポリシーで自動処理される
            fi
        fi
    done
}

ステップ7:バックアップの検証と復元

バックアップ整合性チェック

Copy#!/bin/bash
# backup_verification.sh

verify_backup() {
    local backup_file="$1"
    local temp_dir="/tmp/backup_verify_$$"
    
    echo "Verifying backup: $backup_file"
    
    # 一時ディレクトリ作成
    mkdir -p "$temp_dir"
    
    # アーカイブの整合性確認
    if tar -tzf "$backup_file" > /dev/null 2>&1; then
        echo "✓ Archive integrity OK"
    else
        echo "✗ Archive corrupted"
        return 1
    fi
    
    # 展開テスト
    cd "$temp_dir"
    if tar -xzf "$backup_file" > /dev/null 2>&1; then
        echo "✓ Extraction test OK"
        
        # 重要ファイルの存在確認
        if [ -d "world" ] && [ -f "server.properties" ]; then
            echo "✓ Essential files present"
        else
            echo "✗ Missing essential files"
            rm -rf "$temp_dir"
            return 1
        fi
    else
        echo "✗ Extraction failed"
        rm -rf "$temp_dir"
        return 1
    fi
    
    # 一時ファイル削除
    rm -rf "$temp_dir"
    echo "✓ Backup verification completed"
    return 0
}

# 最新バックアップの検証
LATEST_BACKUP=$(rclone ls "$RCLONE_REMOTE" | grep "minecraft_backup_" | sort | tail -n 1 | awk '{print $2}')
if [ -n "$LATEST_BACKUP" ]; then
    rclone copy "$RCLONE_REMOTE/$LATEST_BACKUP" /tmp/
    verify_backup "/tmp/$LATEST_BACKUP"
    rm -f "/tmp/$LATEST_BACKUP"
fi

災害復旧用の復元スクリプト

Copy#!/bin/bash
# disaster_recovery.sh

MINECRAFT_DIR="/opt/minecraft"
BACKUP_SOURCE="gdrive:minecraft-backups"
RECOVERY_DIR="/opt/minecraft-recovery"

restore_from_backup() {
    local backup_date="$1"
    local backup_file="minecraft_backup_${backup_date}.tar.gz"
    
    echo "=== Disaster Recovery Started ==="
    echo "Target backup: $backup_file"
    
    # 既存データのバックアップ
    if [ -d "$MINECRAFT_DIR" ]; then
        echo "Creating safety backup of current data..."
        tar -czf "/tmp/pre_recovery_backup_$(date +%Y%m%d_%H%M%S).tar.gz" -C "$MINECRAFT_DIR" .
    fi
    
    # リカバリディレクトリ準備
    mkdir -p "$RECOVERY_DIR"
    cd "$RECOVERY_DIR"
    
    # バックアップファイルのダウンロード
    echo "Downloading backup file..."
    if ! rclone copy "$BACKUP_SOURCE/$backup_file" . --progress; then
        echo "ERROR: Failed to download backup file"
        exit 1
    fi
    
    # バックアップの検証
    if ! tar -tzf "$backup_file" > /dev/null 2>&1; then
        echo "ERROR: Backup file is corrupted"
        exit 1
    fi
    
    # Minecraftサーバー停止
    if screen -list | grep -q minecraft; then
        echo "Stopping Minecraft server..."
        screen -S minecraft -p 0 -X stuff "stop$(printf \\r)"
        sleep 10
    fi
    
    # データ復元
    echo "Restoring data..."
    mkdir -p "$MINECRAFT_DIR"
    tar -xzf "$backup_file" -C "$MINECRAFT_DIR"
    
    # 権限修正
    chown -R minecraft:minecraft "$MINECRAFT_DIR"
    chmod -R 755 "$MINECRAFT_DIR"
    
    # 設定ファイルの確認
    if [ -f "$MINECRAFT_DIR/server.properties" ]; then
        echo "✓ server.properties restored"
    else
        echo "⚠ server.properties missing - manual configuration required"
    fi
    
    echo "=== Recovery Completed ==="
    echo "Please verify the restoration and restart the server manually"
    
    # 一時ファイル削除
    rm -f "$backup_file"
}

# 使用方法
if [ $# -eq 0 ]; then
    echo "Usage: $0 <backup_date>"
    echo "Example: $0 20250101_120000"
    echo ""
    echo "Available backups:"
    rclone ls "$BACKUP_SOURCE" | grep "minecraft_backup_" | awk '{print $2}' | sed 's/minecraft_backup_//g' | sed 's/.tar.gz//g'
    exit 1
fi

restore_from_backup "$1"

ステップ8:監視とアラート機能

バックアップ監視スクリプト

Copy#!/bin/bash
# backup_monitor.sh

BACKUP_REMOTE="gdrive:minecraft-backups"
ALERT_HOURS=26  # 26時間以内にバックアップがない場合アラート
LOG_FILE="/var/log/backup-monitor.log"

check_recent_backup() {
    local current_time=$(date +%s)
    local alert_threshold=$((current_time - (ALERT_HOURS * 3600)))
    
    # 最新バックアップの取得
    local latest_backup=$(rclone ls "$BACKUP_REMOTE" | grep "minecraft_backup_" | sort -k2 | tail -n 1)
    
    if [ -z "$latest_backup" ]; then
        send_alert "❌ No backups found in remote storage!"
        return 1
    fi
    
    # バックアップ日時の解析
    local backup_name=$(echo "$latest_backup" | awk '{print $2}')
    local backup_date=$(echo "$backup_name" | grep -o '[0-9]\{8\}_[0-9]\{6\}')
    local backup_timestamp=$(date -d "${backup_date:0:8} ${backup_date:9:2}:${backup_date:11:2}:${backup_date:13:2}" +%s)
    
    if [ $backup_timestamp -lt $alert_threshold ]; then
        local hours_old=$(( (current_time - backup_timestamp) / 3600 ))
        send_alert "⚠️ Latest backup is ${hours_old} hours old! Check backup system."
        return 1
    else
        echo "[$(date)] Latest backup check: OK" >> "$LOG_FILE"
        return 0
    fi
}

send_alert() {
    local message="$1"
    echo "[$(date)] ALERT: $message" >> "$LOG_FILE"
    
    # Discord通知
    if [ -n "$DISCORD_WEBHOOK" ]; then
        curl -H "Content-Type: application/json" \
             -d "{\"content\":\"🚨 **Minecraft Backup Alert**\\n$message\"}" \
             "$DISCORD_WEBHOOK"
    fi
    
    # メール通知(Postfixが設定されている場合)
    if command -v mail >/dev/null 2>&1; then
        echo "$message" | mail -s "Minecraft Backup Alert" admin@yourdomain.com
    fi
}

# メイン処理
check_recent_backup

# バックアップサイズの監視
monitor_backup_sizes() {
    local size_threshold=5000000000  # 5GB
    local recent_backups=$(rclone ls "$BACKUP_REMOTE" | grep "minecraft_backup_" | sort -k2 | tail -n 5)
    
    echo "$recent_backups" | while read -r size date time filename; do
        if [ "$size" -gt "$size_threshold" ]; then
            send_alert "⚠️ Large backup detected: $filename ($(numfmt --to=iec $size))"
        fi
    done
}

monitor_backup_sizes

ステップ9:パフォーマンス最適化

高速バックアップのための最適化

Copy#!/bin/bash
# optimized_backup.sh

# 並列処理によるバックアップ最適化
parallel_backup() {
    local minecraft_dir="$1"
    local backup_dir="$2"
    local backup_name="$3"
    
    # 複数のワールドを並列で圧縮
    {
        tar -czf "${backup_name}_overworld.tar.gz" -C "$minecraft_dir" world &
        tar -czf "${backup_name}_nether.tar.gz" -C "$minecraft_dir" world_nether &
        tar -czf "${backup_name}_end.tar.gz" -C "$minecraft_dir" world_the_end &
        tar -czf "${backup_name}_config.tar.gz" -C "$minecraft_dir" server.properties whitelist.json ops.json &
        wait
    }
    
    # 統合アーカイブの作成
    tar -czf "${backup_name}.tar.gz" "${backup_name}"_*.tar.gz
    rm -f "${backup_name}"_*.tar.gz
}

# rsyncを使用した増分バックアップ
incremental_backup() {
    local source_dir="$1"
    local backup_base="/backup/minecraft"
    local current_backup="$backup_base/current"
    local date_backup="$backup_base/$(date +%Y%m%d_%H%M%S)"
    
    # 現在のバックアップが存在する場合は増分バックアップ
    if [ -d "$current_backup" ]; then
        rsync -av --delete --link-dest="$current_backup" "$source_dir/" "$date_backup/"
    else
        rsync -av "$source_dir/" "$date_backup/"
    fi
    
    # 現在のバックアップシンボリック更新
    rm -f "$current_backup"
    ln -s "$date_backup" "$current_backup"
    
    # 圧縮してクラウドにアップロード
    tar -czf "${date_backup}.tar.gz" -C "$backup_base" "$(basename "$date_backup")"
    rclone copy "${date_backup}.tar.gz" "$RCLONE_REMOTE" --transfers 8
}

# デデュープリケーション機能
deduplicate_backup() {
    local backup_dir="$1"
    
    # 重複ファイルの検出と削除
    find "$backup_dir" -type f -exec sha256sum {} \; | sort | uniq -d -w 64 | while read -r hash file; do
        echo "Duplicate found: $file"
        # 重複ファイルをハードリンクに置換
        find "$backup_dir" -type f -exec sha256sum {} \; | grep "^$hash" | tail -n +2 | cut -d' ' -f3- | while read -r dup_file; do
            ln -f "$file" "$dup_file"
        done
    done
}

ステップ10:トラブルシューティング

よくある問題と解決方法

Q: rcloneでGoogle Driveの認証エラーが発生する A: トークンの有効期限切れが原因です。rclone config reconnect gdrive:で再認証してください。

Q: バックアップファイルが破損している A: 圧縮中にサーバーがクラッシュした可能性があります。save-offコマンドを確実に実行してからバックアップを取得してください。

Q: アップロード速度が遅い A: rcloneの--transfers--checkersオプションを調整してください。また、圧縮レベルを下げることも検討してください。

Q: ディスク容量不足でバックアップが失敗する A: 古いローカルバックアップの削除間隔を短くするか、直接クラウドにアップロードする設定に変更してください。

緊急時の手動復元手順

Copy# 緊急時の最小限復元手順
# 1. サーバー停止
sudo systemctl stop minecraft

# 2. 現在のデータを退避
mv /opt/minecraft /opt/minecraft.backup.$(date +%Y%m%d)

# 3. 最新バックアップをダウンロード
rclone copy gdrive:minecraft-backups /tmp/ --include "minecraft_backup_*.tar.gz" --order-by modtime --max-age 24h

# 4. 最新ファイルを特定
LATEST=$(ls -t /tmp/minecraft_backup_*.tar.gz | head -n 1)

# 5. 展開
mkdir -p /opt/minecraft
tar -xzf "$LATEST" -C /opt/minecraft

# 6. 権限修正
chown -R minecraft:minecraft /opt/minecraft

# 7. サーバー再起動
sudo systemctl start minecraft

おすすめのサーバーホスティングサービス

自動バックアップシステムを安定運用するには、信頼性の高いサーバー環境が重要です:

高可用性・大容量ストレージ重視なら:

コスト効率重視なら:

これらのサービスなら、大容量のバックアップデータも安心して保存できます。

まとめ

自動バックアップシステムの構築により、マインクラフトサーバーのデータ保護は完璧になります。rcloneを活用したクラウドバックアップなら、災害やハードウェア障害からも確実にデータを守れます。

重要なポイント:

  • 定期的なバックアップの自動実行
  • 複数の保存先でのリスク分散
  • バックアップの整合性確認
  • 迅速な復元手順の準備

設定は複雑ですが、一度構築すれば長期間安心してサーバー運営を続けられます。大切なワールドデータを守るために、ぜひ導入を検討してください!

目次