#!/bin/bash # 開機自動啟動腳本 # 部署位置: 192.168.0.110:/home/wooo/scripts/startup_services.sh # systemd service: /etc/systemd/system/momo-startup.service set -e LOG_FILE="/var/log/momo_startup.log" TELEGRAM_BOT_TOKEN="8075645931:AAH-EGKMo8ZC4QJs-Nc1_0s92xHrGdQvdpg" TELEGRAM_CHAT_ID="5619078117" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } send_telegram() { local message="$1" curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ -d chat_id="${TELEGRAM_CHAT_ID}" \ -d text="${message}" \ -d parse_mode="HTML" > /dev/null 2>&1 } wait_for_docker() { log "等待 Docker 啟動..." for i in {1..30}; do if docker info > /dev/null 2>&1; then log "Docker 已就緒" return 0 fi sleep 2 done log "ERROR: Docker 啟動超時" return 1 } wait_for_k3s() { log "等待 K3s 啟動..." for i in {1..60}; do if kubectl get nodes > /dev/null 2>&1; then log "K3s 已就緒" return 0 fi sleep 2 done log "ERROR: K3s 啟動超時" return 1 } start_harbor() { log "啟動 Harbor Registry..." cd /home/wooo/devops/harbor/harbor # 使用 docker compose v2 if docker compose up -d 2>&1; then log "Harbor 啟動命令已發送" # 等待 Harbor 就緒 for i in {1..30}; do if docker ps --filter "name=harbor-core" --format "{{.Status}}" | grep -q "healthy"; then log "Harbor 已就緒" return 0 fi sleep 3 done log "WARNING: Harbor 可能未完全啟動" return 1 else log "ERROR: Harbor 啟動失敗" return 1 fi } start_monitoring() { log "啟動監控服務..." cd /home/wooo/monitoring if [ -f "docker-compose.yml" ]; then docker compose up -d 2>&1 || docker-compose up -d 2>&1 log "監控服務已啟動" else log "找不到監控服務配置" fi } start_gitlab() { log "啟動 GitLab..." # 檢查 GitLab 容器是否存在 if docker ps -a --format "{{.Names}}" | grep -q "gitlab"; then docker start gitlab 2>/dev/null || true docker start gitlab-runner 2>/dev/null || true log "GitLab 已啟動" else log "GitLab 容器不存在,跳過" fi } start_n8n() { log "啟動 n8n..." if docker ps -a --format "{{.Names}}" | grep -q "n8n"; then docker start momo-n8n 2>/dev/null || docker start n8n 2>/dev/null || true log "n8n 已啟動" else log "n8n 容器不存在,跳過" fi } check_momo_pods() { log "檢查 MOMO K8s Pods..." # 等待 pods 啟動 for i in {1..60}; do local app_status=$(kubectl get pods -n momo -l app=momo-app -o jsonpath='{.items[0].status.phase}' 2>/dev/null) local pg_status=$(kubectl get pods -n momo -l app=momo-postgres -o jsonpath='{.items[0].status.phase}' 2>/dev/null) if [[ "$app_status" == "Running" ]] && [[ "$pg_status" == "Running" ]]; then log "MOMO Pods 已就緒" return 0 fi # 如果 ErrImagePull,嘗試重新拉取 if kubectl get pods -n momo 2>/dev/null | grep -q "ErrImagePull\|ImagePullBackOff"; then log "偵測到映像拉取錯誤,重啟 pods..." kubectl delete pod -l app=momo-app -n momo 2>/dev/null || true kubectl delete pod -l app=momo-scheduler -n momo 2>/dev/null || true fi sleep 5 done log "WARNING: MOMO Pods 啟動超時" return 1 } verify_services() { log "驗證所有服務..." local all_ok=true local status_report="" # 檢查 Harbor if docker ps --filter "name=harbor-core" --format "{{.Status}}" | grep -q "healthy"; then status_report="${status_report}• Harbor: ✅ 正常\n" else status_report="${status_report}• Harbor: ❌ 異常\n" all_ok=false fi # 檢查 MOMO App local health_code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 10 https://mo.wooo.work/health 2>/dev/null) if [[ "$health_code" == "200" ]]; then status_report="${status_report}• MOMO App: ✅ 正常\n" else status_report="${status_report}• MOMO App: ❌ HTTP ${health_code}\n" all_ok=false fi # 檢查 PostgreSQL local pg_status=$(kubectl get pods -n momo -l app=momo-postgres -o jsonpath='{.items[0].status.phase}' 2>/dev/null) if [[ "$pg_status" == "Running" ]]; then status_report="${status_report}• PostgreSQL: ✅ 正常\n" else status_report="${status_report}• PostgreSQL: ❌ ${pg_status}\n" all_ok=false fi # 檢查 GitLab if docker ps --filter "name=gitlab" --format "{{.Status}}" | grep -q "Up"; then status_report="${status_report}• GitLab: ✅ 正常\n" else status_report="${status_report}• GitLab: ⚠️ 未運行\n" fi # 檢查 n8n if docker ps --filter "name=n8n" --format "{{.Status}}" | grep -q "Up"; then status_report="${status_report}• n8n: ✅ 正常\n" else status_report="${status_report}• n8n: ⚠️ 未運行\n" fi log "服務狀態:\n${status_report}" if [[ "$all_ok" == "true" ]]; then send_telegram "🟢 UAT 伺服器開機完成 所有服務已正常啟動! $(echo -e "$status_report") 時間: $(date '+%Y-%m-%d %H:%M:%S')" return 0 else send_telegram "🟠 UAT 伺服器開機完成 (部分服務異常) $(echo -e "$status_report") 請檢查異常服務 SSH: ssh wooo@192.168.0.110 時間: $(date '+%Y-%m-%d %H:%M:%S')" return 1 fi } main() { log "========== 開機啟動服務開始 ==========" # 1. 等待 Docker if ! wait_for_docker; then send_telegram "🔴 UAT 開機失敗 Docker 啟動超時 需要人工介入 時間: $(date '+%Y-%m-%d %H:%M:%S')" exit 1 fi # 2. 啟動 Harbor (K8s 需要 Registry) start_harbor # 3. 等待 K3s if ! wait_for_k3s; then send_telegram "🔴 UAT 開機失敗 K3s 啟動超時 需要人工介入 時間: $(date '+%Y-%m-%d %H:%M:%S')" exit 1 fi # 4. 啟動其他 Docker 服務 start_gitlab start_n8n start_monitoring # 5. 等待並檢查 MOMO Pods check_momo_pods # 6. 最終驗證 sleep 30 # 給服務一些時間穩定 verify_services log "========== 開機啟動服務完成 ==========" } # 執行主程式 main "$@"