ubuntu
カテゴリ
コンテナ起動確認スクリプト
2026/06/10 18時maintenance
Ubuntu Server のスタートアップ ≒ systemd
↓
systemd が docker.service を起動
↓
Docker が起動時に RestartPolicy: unless-stopped のコンテナを自動的に再起動
本来はUbuntu Serverを再起動すると、上記の仕組みでコンテナが自動で起動するのだが、時々起動しなかったり、コンテナが止まっていることがあるので、Windows側からSSH接続した時に、コンテナが全て起動しているかをチェックし、止まっているコンテナを起動するスクリプトを作成

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 これで、SSH接続時にスクリプトが走り、コンテナが全て起動しているかをチェックして、起動していなかったら順番も含め正常動作する様に起動する。
記事一覧