Ubuntu Server のスタートアップ ≒ systemd
↓
systemd が docker.service を起動
↓
Docker が起動時に RestartPolicy: unless-stopped のコンテナを自動的に再起動
本来はUbuntu Serverを再起動すると、上記の仕組みでコンテナが自動で起動するのだが、時々起動しなかったり、コンテナが止まっていることがあるので、Windows側からSSH接続した時に、コンテナが全て起動しているかをチェックし、止まっているコンテナを起動するスクリプトを作成↓
systemd が docker.service を起動
↓
Docker が起動時に RestartPolicy: unless-stopped のコンテナを自動的に再起動
check_containers.sh ファイルを作成
nano /mnt/data/backup/scripts/check_containers.sh
#!/bin/bash
# 起動順序を考慮したコンテナチェック・自動起動スクリプト
CONTAINERS=(
"mirakurun"
"adguardhome"
"vaultwarden"
"passmanager-api"
"vafee2-lounge"
"immich_server"
"epgstation"
"uptime-kuma"
"golf_app"
"tennis_app"
"sports_weather"
"health-app"
)
wait_mirakurun() {
echo "Mirakurun API 応答待機中..."
for i in $(seq 1 30); do
if curl -s http://localhost:40772/api/version > /dev/null 2>&1; then
echo "✅ Mirakurun API 応答確認"
return 0
fi
sleep 5
done
echo "⚠️ Mirakurun API タイムアウト(150秒)"
return 1
}
# --- 事前チェック ---
echo "=== 事前チェック ==="
# SSDマウント確認
if ! mountpoint -q /mnt/data; then
echo "❌ /mnt/data がマウントされていません。復旧を中止します。"
exit 1
fi
echo "✅ /mnt/data マウント確認"
# PX-Q3U4 デバイス確認
if ! ls /dev/px4video* > /dev/null 2>&1; then
echo "⚠️ PX-Q3U4 デバイスが見つかりません(/dev/px4video*)"
echo " Mirakurun は起動しても録画不可の可能性があります"
else
echo "✅ PX-Q3U4 デバイス確認"
fi
echo ""
echo "=== コンテナ状態確認 ==="
FAILED=()
for c in "${CONTAINERS[@]}"; do
STATUS=$(docker inspect --format='{{.State.Status}}' "$c" 2>/dev/null)
if [ "$STATUS" = "running" ]; then
echo "✅ $c"
else
echo "❌ $c (${STATUS:-not found})"
FAILED+=("$c")
fi
done
if [ ${#FAILED[@]} -eq 0 ]; then
echo ""
echo "全コンテナ正常稼働中"
exit 0
fi
echo ""
echo "=== 自動起動を試みます ==="
RECOVER_FAILED=()
for c in "${FAILED[@]}"; do
echo -n "起動中: $c ... "
docker start "$c" > /dev/null 2>&1
sleep 3
# 起動後に実際に running か確認
STATUS=$(docker inspect --format='{{.State.Status}}' "$c" 2>/dev/null)
if [ "$STATUS" = "running" ]; then
echo "✅ 起動成功"
else
echo "⚠️ 起動失敗(Status: ${STATUS:-not found})"
# 失敗理由をログに残す
docker logs --tail=5 "$c" 2>&1 | sed 's/^/ ログ: /'
RECOVER_FAILED+=("$c")
fi
if [ "$c" = "mirakurun" ]; then
wait_mirakurun
fi
done
echo ""
if [ ${#RECOVER_FAILED[@]} -gt 0 ]; then
echo "=== 復旧失敗コンテナ ==="
for c in "${RECOVER_FAILED[@]}"; do
echo "❌ $c"
done
echo ""
echo "手動対応が必要です。リブートを検討してください。"
else
echo "全コンテナ復旧完了"
fi
chmod +x /mnt/data/backup/scripts/check_containers.sh
.bashrc ファイルの最後に追記
nano ~/.bashrc
# コンテナ起動確認 echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━" /mnt/data/backup/scripts/check_containers.sh 2>/dev/null echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
SSH接続時に読み込まれる .profile ファイルの作成
nano ~/.profile
# .bashrc を読み込む
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
これで、SSH接続時にスクリプトが走り、コンテナが全て起動しているかをチェックして、起動していなかったら順番も含め正常動作する様に起動する。