Files
ewoooc/scripts/tools/system_startup.sh
ogt 1b4f3a7bbe
Some checks failed
CD Pipeline / deploy (push) Failing after 59s
feat: EwoooC 初始化 — 完整專案推版至 Gitea
- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml)
- 部署模式: rsync Python 檔案至 188 → docker restart (volume mount)
- Dockerfile/requirements 變動時自動重建 Docker image
- 部署通知: Telegram (開始/成功/失敗)
- 健康檢查: https://mo.wooo.work/health (最多 5 次重試)
- 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 01:21:13 +08:00

184 lines
5.5 KiB
Bash

#!/bin/bash
# ==========================================================
# MOMO Pro System - 系統啟動腳本 (v3.0)
# 重開機後自動啟動所有服務
# 2026-02-13 更新:
# - n8n 和 Superset 已遷移到 K8s (tools namespace)
# - 移除 Docker n8n/Superset 啟動
# - 新增 K8s tools namespace 重啟
# ==========================================================
LOG_FILE="/var/log/momo_startup.log"
TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-8075645931:AAH-EGKMo8ZC4QJs-Nc1_0s92xHrGdQvdpg}"
TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-5619078117}"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
notify() {
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d chat_id="${TELEGRAM_CHAT_ID}" \
-d text="🖥️ UAT Server 啟動通知
$1" \
-d parse_mode="HTML" > /dev/null 2>&1 || true
}
wait_container() {
local name=$1
local max_wait=${2:-60}
local count=0
while [ $count -lt $max_wait ]; do
if docker ps --format '{{.Names}}' | grep -q "^${name}$"; then
STATUS=$(docker inspect --format='{{.State.Status}}' "$name" 2>/dev/null)
if [ "$STATUS" = "running" ]; then
log "$name 運行中"
return 0
fi
fi
sleep 2
count=$((count + 2))
done
log "⚠️ $name 等待超時"
return 1
}
wait_k8s_pod() {
local label=$1
local namespace=$2
local max_wait=${3:-120}
export KUBECONFIG=/home/wooo/.kube/config
log "等待 K8s Pod ($label) 就緒..."
kubectl wait --for=condition=ready pod -l "$label" -n "$namespace" --timeout="${max_wait}s" 2>/dev/null
if [ $? -eq 0 ]; then
log "✅ K8s Pod ($label) 已就緒"
return 0
else
log "⚠️ K8s Pod ($label) 等待超時"
return 1
fi
}
main() {
log "=========================================="
log "🚀 系統啟動流程開始 (v3.0)"
log "=========================================="
notify "🔄 UAT 系統正在啟動..."
# 1. 確保 Docker 運行
log "=== 1. 檢查 Docker ==="
if ! systemctl is-active --quiet docker; then
systemctl start docker
sleep 10
fi
log "✅ Docker 服務正常"
# 2. 啟動 Docker Registry
log "=== 2. 啟動 Docker Registry ==="
cd /home/wooo/registry 2>/dev/null || cd /home/wooo/devops/registry 2>/dev/null
docker compose up -d 2>/dev/null || docker start docker-registry 2>/dev/null
wait_container "docker-registry" 60
# 3. 啟動 GitLab
log "=== 3. 啟動 GitLab ==="
docker start wooo-gitlab 2>/dev/null || true
# GitLab 啟動較慢,不等待完全就緒
# 4. 重啟 K8s momo namespace (主應用)
log "=== 4. 重啟 K8s momo 應用 ==="
export KUBECONFIG=/home/wooo/.kube/config
kubectl rollout restart deployment/momo-app -n momo 2>/dev/null || true
kubectl rollout restart deployment/momo-scheduler -n momo 2>/dev/null || true
# 5. 重啟 K8s tools namespace (n8n, Superset)
log "=== 5. 重啟 K8s tools 服務 ==="
kubectl rollout restart deployment/n8n -n tools 2>/dev/null || true
kubectl rollout restart deployment/superset -n tools 2>/dev/null || true
# 6. 等待 K8s Pod 就緒
log "=== 6. 等待 K8s Pod 就緒 ==="
wait_k8s_pod "app=momo-app" "momo" 120
wait_k8s_pod "app=n8n" "tools" 60
wait_k8s_pod "app=superset" "tools" 90
# 7. 健康檢查
log "=== 7. 健康檢查 ==="
FAILED=""
# 取得 K8s ClusterIP
N8N_IP=$(kubectl get svc n8n -n tools -o jsonpath='{.spec.clusterIP}' 2>/dev/null)
SUPERSET_IP=$(kubectl get svc superset -n tools -o jsonpath='{.spec.clusterIP}' 2>/dev/null)
# Registry
if curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:5002/v2/ | grep -q "200"; then
log "✅ Registry: OK"
else
log "❌ Registry: FAILED"
FAILED="${FAILED}Registry, "
fi
# MOMO App
if curl -s -o /dev/null -w '%{http_code}' https://mo.wooo.work/health | grep -q "200"; then
log "✅ MOMO App: OK"
else
log "❌ MOMO App: FAILED"
FAILED="${FAILED}MOMO App, "
fi
# n8n (via K8s ClusterIP)
if [ -n "$N8N_IP" ] && curl -s -o /dev/null -w '%{http_code}' "http://${N8N_IP}:5678/healthz" | grep -q "200"; then
log "✅ n8n (K8s): OK"
else
log "❌ n8n (K8s): FAILED"
FAILED="${FAILED}n8n, "
fi
# Superset (via K8s ClusterIP)
if [ -n "$SUPERSET_IP" ] && curl -s -o /dev/null -w '%{http_code}' "http://${SUPERSET_IP}:8088/health" | grep -q "200"; then
log "✅ Superset (K8s): OK"
else
log "❌ Superset (K8s): FAILED"
FAILED="${FAILED}Superset, "
fi
# GitLab (可能需要更長時間)
if curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8929/ | grep -q "200\|302"; then
log "✅ GitLab: OK"
else
log "⚠️ GitLab: 啟動中... (需要幾分鐘)"
fi
# 結果通知
log "=========================================="
if [ -z "$FAILED" ]; then
log "✅ 所有服務啟動成功"
notify "✅ 系統啟動完成
所有服務狀態:
• Registry ✅
• MOMO App (K8s) ✅
• n8n (K8s) ✅
• Superset (K8s) ✅
• GitLab ✅
$(date '+%Y-%m-%d %H:%M:%S')"
else
log "⚠️ 部分服務異常: $FAILED"
notify "⚠️ 系統啟動完成,但部分服務異常
異常服務: $FAILED
請檢查日誌: /var/log/momo_startup.log
$(date '+%Y-%m-%d %H:%M:%S')"
fi
log "=========================================="
}
# 執行
main "$@"