マイクラサーバー自動再起動システム完全ガイド
2025年8月版 – systemd、Docker、Kubernetes対応
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年版のマイクラサーバー自動再起動システムでは、systemd、Docker、Kubernetesといった複数のアプローチから環境に応じて最適な手法を選択できます。
小規模・個人運営
systemd + screen監視が最適。シンプルで確実な自動再起動を実現。
中規模・柔軟性重視
Docker環境で統一管理。開発・本番環境の差分を最小化。
大規模・エンタープライズ
Kubernetesによる高可用性とスケーラビリティを実現。
2025年版の重要なポイント
- Java 21活用: ZGC Generationalによる低レイテンシ実現
- 監視強化: Prometheus/Grafanaによる可視化
- セキュリティ: 最新のファイアウォール・認証設定
- バックアップ自動化: 差分バックアップとリモート保存
- アラート連携: Discord/Slack通知による迅速な対応
継続的な監視と自動化により、プレイヤーが快適に遊べる安定したマイクラサーバー環境を維持できます。定期的なシステム更新とセキュリティパッチの適用も忘れずに実施しましょう。