マイクラサーバー自動再起動システム完全ガイド 2025年8月版

マイクラサーバー自動再起動システム完全ガイド 2025年8月版






マイクラサーバー自動再起動システム完全ガイド 2025年8月版


マイクラサーバー自動再起動システム完全ガイド

2025年8月版 – systemd、Docker、Kubernetes対応

最終更新: 2025年8月
Minecraft 1.21 & Java 21対応

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

マイクラサーバー管理画面

引用元: Matsubo Tech Blog

目次

はじめに

マイクラサーバーを運営していると、「サーバーが落ちてしまった時に自動で再起動してほしい」と思ったことはありませんか?本記事では、2025年最新の技術スタックを活用した自動再起動システムの構築方法を詳しく解説します。

systemd

従来の安定した方式

Docker

コンテナ化された環境

Kubernetes

大規模クラスタ管理

2025年現在、マイクラサーバーの安定運用には自動化が必須です。手動でサーバーを再起動するのは非効率的で、特に深夜や外出中にサーバーが停止してしまうと対応できません。本ガイドでは、Java 21環境Minecraft 1.21に最適化された最新の自動化手法を紹介します。

systemdによる自動起動システム(2025年版)

マイクラサーバー設定画面

引用元: XServer GAMEs

🆕 2025年推奨systemdサービスファイル

Java 21とMinecraft 1.21に最適化されたサービス設定:

[Unit]
Description=Minecraft Server 1.21 (Java 21)
After=network.target
Wants=network-online.target

[Service]
Type=forking
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
Environment="JAVA_HOME=/usr/lib/jvm/java-21-openjdk"
Environment="JVM_OPTS=-Xmx8G -Xms8G -XX:+UseZGC -XX:+ZGenerational"
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/screen -dmS minecraft $JAVA_HOME/bin/java $JVM_OPTS -jar server.jar nogui
ExecReload=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "reload"\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "say §cサーバーメンテナンス中..."\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "save-all"\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "stop"\\015'
ExecStop=/bin/sleep 10
RemainAfterExit=yes
Restart=always
RestartSec=30
StartLimitBurst=3
StartLimitIntervalSec=300

# 2025年セキュリティ強化設定
NoNewPrivileges=true
PrivateTmp=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictSUIDSGID=true

[Install]
WantedBy=multi-user.target

2025年版の主な改善点

  • Java 21対応: ZGC Generationalを活用したメモリ管理
  • セキュリティ強化: NoNewPrivileges、PrivateTmpなど
  • ネットワーク待機: network-online.targetの追加
  • 起動制限: 5分間に3回までの起動制限

サービスの設定と有効化

# ユーザー作成とディレクトリ準備
sudo useradd -r -s /bin/false minecraft
sudo mkdir -p /opt/minecraft
sudo chown minecraft:minecraft /opt/minecraft

# サービスファイル配置
sudo nano /etc/systemd/system/minecraft.service

# サービス読み込みと有効化
sudo systemctl daemon-reload
sudo systemctl enable minecraft.service

# サービス開始
sudo systemctl start minecraft.service

# ステータス確認
sudo systemctl status minecraft.service

# ログ監視
sudo journalctl -u minecraft.service -f

Docker環境での自動再起動システム

Docker Compose設定(2025年版)

最新のitzg/minecraft-serverイメージを使用した設定:

version: '3.8'
services:
  minecraft:
    image: itzg/minecraft-server:java21
    container_name: minecraft-server-2025
    restart: unless-stopped
    ports:
      - "25565:25565"
    environment:
      EULA: "TRUE"
      TYPE: "PAPER"
      VERSION: "1.21"
      MEMORY: "8G"
      JVM_OPTS: "-XX:+UseZGC -XX:+ZGenerational -XX:+AlwaysPreTouch"
      # 2025年パフォーマンス最適化
      ENABLE_ROLLING_LOGS: "true"
      MAX_MEMORY: "8G"
      INIT_MEMORY: "2G"
      # 自動停止機能(コスト節約)
      ENABLE_AUTOPAUSE: "true"
      AUTOPAUSE_TIMEOUT_EST: 3600
      AUTOPAUSE_TIMEOUT_KN: 120
    volumes:
      - minecraft-data:/data
    networks:
      - minecraft-net
    healthcheck:
      test: ["CMD", "mc-health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 120s
    deploy:
      resources:
        limits:
          memory: 10G
        reservations:
          memory: 8G

  # 監視とメトリクス収集
  prometheus-exporter:
    image: itzg/mc-monitor
    container_name: minecraft-monitor
    restart: unless-stopped
    environment:
      EXPORT_PORT: 9225
      SERVERS: minecraft:25565
    ports:
      - "9225:9225"
    depends_on:
      - minecraft
    networks:
      - minecraft-net

volumes:
  minecraft-data:

networks:
  minecraft-net:
    driver: bridge

Dockerでの高度な監視スクリプト

#!/bin/bash
# /opt/minecraft/docker-monitor.sh

CONTAINER_NAME="minecraft-server-2025"
DISCORD_WEBHOOK="YOUR_WEBHOOK_URL"

check_container() {
    if ! docker ps --format "table {{.Names}}" | grep -q "$CONTAINER_NAME"; then
        echo "$(date): Container $CONTAINER_NAME is not running, restarting..."
        docker-compose up -d
        
        # Discord通知
        curl -H "Content-Type: application/json" \
             -X POST \
             -d "{\"content\":\"🔴 Minecraft server was down and has been restarted at $(date)\"}" \
             "$DISCORD_WEBHOOK"
    fi
}

# ヘルスチェック
check_health() {
    HEALTH=$(docker inspect --format='{{.State.Health.Status}}' "$CONTAINER_NAME" 2>/dev/null)
    if [ "$HEALTH" = "unhealthy" ]; then
        echo "$(date): Container is unhealthy, restarting..."
        docker restart "$CONTAINER_NAME"
        
        # Discord通知
        curl -H "Content-Type: application/json" \
             -X POST \
             -d "{\"content\":\"⚠️ Minecraft server health check failed, container restarted\"}" \
             "$DISCORD_WEBHOOK"
    fi
}

check_container
check_health

Docker環境の利点(2025年)

  • 自動パッケージ管理: Java環境やプラグインの自動更新
  • リソース制限: メモリやCPU使用量の厳密な制御
  • ヘルスチェック: コンテナレベルでの健全性監視
  • スケーリング: 複数サーバーの簡単な管理

Kubernetes環境でのエンタープライズ級管理

Kubernetes Deployment設定

大規模環境や高可用性が必要な場合のKubernetes設定:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: minecraft-server
  namespace: gaming
  labels:
    app: minecraft
    version: "1.21"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minecraft
  template:
    metadata:
      labels:
        app: minecraft
        version: "1.21"
    spec:
      containers:
      - name: minecraft
        image: itzg/minecraft-server:java21
        ports:
        - containerPort: 25565
          name: minecraft
        env:
        - name: EULA
          value: "TRUE"
        - name: TYPE
          value: "PAPER"
        - name: VERSION
          value: "1.21"
        - name: MEMORY
          value: "6G"
        - name: JVM_OPTS
          value: "-XX:+UseZGC -XX:+ZGenerational"
        resources:
          requests:
            memory: "4Gi"
            cpu: "1000m"
          limits:
            memory: "8Gi"
            cpu: "2000m"
        volumeMounts:
        - name: minecraft-data
          mountPath: /data
        livenessProbe:
          exec:
            command:
            - mc-health
          initialDelaySeconds: 120
          periodSeconds: 60
          timeoutSeconds: 10
          failureThreshold: 3
        readinessProbe:
          exec:
            command:
            - mc-health
          initialDelaySeconds: 30
          periodSeconds: 30
          timeoutSeconds: 5
      volumes:
      - name: minecraft-data
        persistentVolumeClaim:
          claimName: minecraft-pvc
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  name: minecraft-service
  namespace: gaming
spec:
  type: LoadBalancer
  ports:
  - port: 25565
    targetPort: 25565
    protocol: TCP
  selector:
    app: minecraft

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minecraft-pvc
  namespace: gaming
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast-ssd

HorizontalPodAutoscaler設定

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: minecraft-hpa
  namespace: gaming
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: minecraft-server
  minReplicas: 1
  maxReplicas: 3
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 75

高度な監視・アラートシステム

メモリ監視画面

引用元: ConoHa for GAME

Prometheus + Grafana監視スタック

# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'minecraft-server'
    static_configs:
      - targets: ['localhost:9225']
    scrape_interval: 30s
    metrics_path: /metrics

  - job_name: 'node-exporter'
    static_configs:
      - targets: ['localhost:9100']

rule_files:
  - "minecraft_alerts.yml"

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - alertmanager:9093

Slack/Discord統合アラート

#!/bin/bash
# /opt/minecraft/alert-system.sh

SERVER_NAME="MyMinecraft"
TPS_THRESHOLD=18
MEMORY_THRESHOLD=85
WEBHOOK_URL="YOUR_WEBHOOK_URL"

# TPS監視
check_tps() {
    # sparkプロファイラー連携
    TPS=$(screen -S minecraft -p 0 -X eval 'stuff "spark tps"\\015' 2>/dev/null | grep -o "[0-9]*\.[0-9]*" | head -1)
    
    if (( $(echo "$TPS < $TPS_THRESHOLD" | bc -l) )); then
        send_alert "🔴 Low TPS Alert: $TPS (Threshold: $TPS_THRESHOLD)"
        # 自動プロファイリング実行
        screen -S minecraft -p 0 -X eval 'stuff "spark profiler --timeout 60"\\015'
    fi
}

# メモリ監視
check_memory() {
    MEMORY_USAGE=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100)}')
    
    if [ "$MEMORY_USAGE" -gt "$MEMORY_THRESHOLD" ]; then
        send_alert "⚠️ High Memory Usage: ${MEMORY_USAGE}% (Threshold: ${MEMORY_THRESHOLD}%)"
    fi
}

# 通知送信
send_alert() {
    MESSAGE="$1"
    curl -H "Content-Type: application/json" \
         -X POST \
         -d "{\"content\":\"**$SERVER_NAME**: $MESSAGE\"}" \
         "$WEBHOOK_URL"
}

check_tps
check_memory

監視項目(2025年版)

  • TPS値(目標: 19.5以上)
  • メモリ使用率(警告: 80%以上)
  • ディスク使用量
  • プレイヤー接続数
  • チャンク読み込み時間
  • GCポーズ時間

アラート設定

  • 即座通知: TPS < 15
  • メモリリーク警告: 使用率90%超
  • 接続不能: ヘルスチェック失敗
  • 異常終了: プロセス停止検出
  • ディスク不足: 残容量5GB未満

Java 21環境でのメモリ管理最適化

2025年推奨JVMフラグ

# Java 21 + Minecraft 1.21最適化設定(16GB環境)
java -Xmx12G -Xms12G \
     -XX:+UnlockExperimentalVMOptions \
     -XX:+UseZGC \
     -XX:+ZGenerational \
     -XX:+AlwaysPreTouch \
     -XX:+DisableExplicitGC \
     -XX:+UseLargePages \
     -XX:LargePageSizeInBytes=2m \
     -XX:+UseFastUnorderedTimeStamps \
     -XX:+UseCriticalJavaThreadPriority \
     -XX:ThreadPriorityPolicy=1 \
     -XX:ReservedCodeCacheSize=512M \
     -XX:InitialCodeCacheSize=64M \
     -Dfile.encoding=UTF-8 \
     -Djava.awt.headless=true \
     -jar server.jar nogui

動的メモリ調整スクリプト

#!/bin/bash
# /opt/minecraft/memory-optimizer.sh

SERVER_DIR="/opt/minecraft"
SCREEN_NAME="minecraft"

# メモリ使用量チェック
check_memory_usage() {
    JAVA_PID=$(pgrep -f "java.*server.jar")
    if [ -n "$JAVA_PID" ]; then
        # RSS使用量(MB)
        MEMORY_MB=$(ps -p $JAVA_PID -o rss= | awk '{print int($1/1024)}')
        # GCログ解析
        GC_TIME=$(tail -100 logs/latest.log | grep -o "GC.*[0-9]*ms" | tail -1)
        
        echo "$(date): Memory: ${MEMORY_MB}MB, GC: $GC_TIME"
        
        # メモリリーク検出
        if [ "$MEMORY_MB" -gt 10240 ]; then  # 10GB超過
            echo "$(date): Memory leak detected, triggering heap dump"
            kill -3 $JAVA_PID  # ヒープダンプ生成
            
            # 再起動が必要な場合
            if [ "$MEMORY_MB" -gt 14336 ]; then  # 14GB超過
                echo "$(date): Critical memory usage, restarting server"
                systemctl restart minecraft
            fi
        fi
    fi
}

# GC統計情報
analyze_gc() {
    if [ -f "logs/gc.log" ]; then
        # 直近のGC統計
        tail -50 logs/gc.log | awk '
        /GC\(/ {
            if ($0 ~ /Young/) young_count++
            if ($0 ~ /Old/) old_count++
            if ($0 ~ /[0-9]+ms/) {
                match($0, /([0-9]+)ms/, time)
                total_time += time[1]
                count++
            }
        }
        END {
            if (count > 0) {
                avg_time = total_time / count
                print "GC Analysis: Young=" young_count " Old=" old_count " AvgTime=" avg_time "ms"
                if (avg_time > 100) print "WARNING: High GC pause time"
            }
        }'
    fi
}

check_memory_usage
analyze_gc

Java 21の利点

  • ZGC Generational: 低レイテンシGC(1ms未満)
  • Virtual Threads: 軽量スレッド処理
  • パフォーマンス向上: 従来比15-20%高速化
  • メモリ効率: ヒープ使用量10-15%削減

セキュリティとバックアップ戦略

ファイアウォールとネットワーク設定

# UFW設定(2025年推奨)
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Minecraftポート
sudo ufw allow 25565/tcp comment 'Minecraft Server'

# SSH(ポート変更推奨)
sudo ufw allow 2222/tcp comment 'SSH Custom Port'

# 監視ポート(内部ネットワークのみ)
sudo ufw allow from 10.0.0.0/8 to any port 9225 comment 'Prometheus Metrics'

# fail2ban設定
sudo apt install fail2ban
cat << EOF | sudo tee /etc/fail2ban/jail.local
[minecraft]
enabled = true
port = 25565
filter = minecraft
logpath = /opt/minecraft/logs/latest.log
maxretry = 5
bantime = 3600
EOF

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

自動バックアップシステム

#!/bin/bash
# /opt/minecraft/backup-system.sh

BACKUP_DIR="/backup/minecraft"
SERVER_DIR="/opt/minecraft"
RETENTION_DAYS=30
REMOTE_BACKUP="user@backup-server:/backups/minecraft"

create_backup() {
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    BACKUP_NAME="minecraft_backup_$TIMESTAMP"
    
    # サーバーに保存コマンド送信
    screen -S minecraft -p 0 -X eval 'stuff "save-all"\\015'
    screen -S minecraft -p 0 -X eval 'stuff "save-off"\\015'
    
    sleep 5
    
    # 圧縮バックアップ作成
    cd "$SERVER_DIR"
    tar -czf "$BACKUP_DIR/$BACKUP_NAME.tar.gz" \
        --exclude='logs' \
        --exclude='crash-reports' \
        --exclude='cache' \
        world/ plugins/ server.properties whitelist.json ops.json
    
    # 保存再開
    screen -S minecraft -p 0 -X eval 'stuff "save-on"\\015'
    
    # 古いバックアップ削除
    find "$BACKUP_DIR" -name "minecraft_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete
    
    # リモートバックアップ(オプション)
    if [ -n "$REMOTE_BACKUP" ]; then
        rsync -avz "$BACKUP_DIR/$BACKUP_NAME.tar.gz" "$REMOTE_BACKUP/"
    fi
    
    echo "$(date): Backup completed: $BACKUP_NAME.tar.gz"
}

# 差分バックアップ(高頻度用)
create_incremental_backup() {
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    INCREMENTAL_DIR="$BACKUP_DIR/incremental"
    
    mkdir -p "$INCREMENTAL_DIR"
    
    # 前回のフルバックアップを基準とした差分
    rsync -av --delete \
          --backup --backup-dir="$INCREMENTAL_DIR/$TIMESTAMP" \
          "$SERVER_DIR/world/" \
          "$BACKUP_DIR/current_world/"
}

create_backup

2025年版おすすめVPSサービス比較

マイクラサーバーの自動化には、信頼性の高いVPSサービスの選択が重要です。2025年8月現在の最新料金と性能比較:

サービス名 メモリ/CPU 月額料金 特徴
XServer VPS for Game 8GB/6コア 2,560円
4,400円
高性能CPU・NVMe SSD
Java 21プリインストール
ConoHa for GAME 8GB/6コア 3,234円
36ヶ月契約
時間課金対応
自動バックアップ
さくら VPS 8GB/6コア 4,400円 老舗・安定運用
24時間サポート
KAGOYA CLOUD VPS 8GB/6コア 3,300円 スケールアップ対応
初期費用無料

2025年推奨構成

  • プレイヤー10人以下: 8GB/6コア
  • 20人規模: 16GB/8コア
  • 大規模サーバー: 32GB/12コア以上
  • Java 21対応: 必須要件

選択時の注意点

  • root権限の有無を確認
  • systemd使用可能な環境
  • ストレージ拡張性
  • ネットワーク帯域制限

トラブルシューティング

問題 原因 解決方法
systemdサービスが起動しない 権限・Java環境問題 sudo chown minecraft:minecraft /opt/minecraft
java -versionで確認
自動再起動が効かない Restart設定不備 Restart=always確認
systemctl daemon-reload
Java 21でのメモリエラー ZGC設定不適切 -XX:+UseZGC -XX:+ZGenerational
メモリ上限を物理メモリの80%以下に
Dockerコンテナが再起動しない restart policy未設定 restart: unless-stopped
docker update --restart=unless-stopped
screen セッションが残る 不完全な終了処理 screen -wipe
pkill -f "SCREEN.*minecraft"

デバッグコマンド集

# systemdサービス状態確認
sudo systemctl status minecraft.service -l
sudo journalctl -u minecraft.service -f --since "1 hour ago"

# Dockerコンテナログ確認
docker logs minecraft-server-2025 --tail 100 -f
docker stats minecraft-server-2025

# Java プロセス確認
jps -v | grep minecraft
jstack $(pgrep -f "java.*server.jar")

# リソース使用量確認
htop -p $(pgrep -f "java.*server.jar")
iostat -x 1 10

# ネットワーク接続確認
ss -tuln | grep 25565
netstat -ant | grep 25565

# ディスク使用量確認
du -sh /opt/minecraft/*
df -h /opt/minecraft

まとめ

2025年版のマイクラサーバー自動再起動システムでは、systemdDockerKubernetesといった複数のアプローチから環境に応じて最適な手法を選択できます。

小規模・個人運営

systemd + screen監視が最適。シンプルで確実な自動再起動を実現。

中規模・柔軟性重視

Docker環境で統一管理。開発・本番環境の差分を最小化。

大規模・エンタープライズ

Kubernetesによる高可用性とスケーラビリティを実現。

2025年版の重要なポイント

  • Java 21活用: ZGC Generationalによる低レイテンシ実現
  • 監視強化: Prometheus/Grafanaによる可視化
  • セキュリティ: 最新のファイアウォール・認証設定
  • バックアップ自動化: 差分バックアップとリモート保存
  • アラート連携: Discord/Slack通知による迅速な対応

継続的な監視と自動化により、プレイヤーが快適に遊べる安定したマイクラサーバー環境を維持できます。定期的なシステム更新とセキュリティパッチの適用も忘れずに実施しましょう。


マイクラサーバー自動再起動システム完全ガイド

2025年8月版 - 最新技術で安定運用を実現

※本記事の内容は情報提供目的です。実際の運用では各環境に応じて設定を調整してください。


目次