#!/bin/bash
# =============================================================================
# WOOO TECH - MOMO Pro System
# 簡化版建置與部署腳本
# 用途: 本地建置 Docker 映像並部署到 K3s (不依賴 Harbor)
# =============================================================================
set -e
# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
IMAGE_NAME="momo-pro-system"
IMAGE_TAG="${1:-local}"
K3S_HOST="${K3S_HOST:-192.168.0.110}"
K3S_USER="${K3S_USER:-wooo}"
# Telegram 通知
TELEGRAM_BOT_TOKEN="8075645931:AAH-EGKMo8ZC4QJs-Nc1_0s92xHrGdQvdpg"
TELEGRAM_CHAT_ID="5619078117"
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 parse_mode="HTML" \
-d text="$message" > /dev/null 2>&1 || true
}
log() {
echo -e "${GREEN}[$(date '+%H:%M:%S')]${NC} $1"
}
warn() {
echo -e "${YELLOW}[$(date '+%H:%M:%S')] ⚠️ $1${NC}"
}
error() {
echo -e "${RED}[$(date '+%H:%M:%S')] ❌ $1${NC}"
send_telegram "❌ 部署失敗%0A%0A錯誤: $1%0A時間: $(date '+%Y-%m-%d %H:%M:%S')"
exit 1
}
# 檢查必要工具
check_requirements() {
log "檢查必要工具..."
if ! command -v docker &> /dev/null; then
error "Docker 未安裝"
fi
if ! command -v ssh &> /dev/null; then
error "SSH 未安裝"
fi
log "✅ 工具檢查通過"
}
# 建置 Docker 映像
build_image() {
log "🔨 開始建置 Docker 映像..."
cd "$PROJECT_ROOT"
docker build -t "${IMAGE_NAME}:${IMAGE_TAG}" . || error "Docker 建置失敗"
log "✅ Docker 映像建置完成: ${IMAGE_NAME}:${IMAGE_TAG}"
}
# 匯出映像到 K3s
export_to_k3s() {
log "📤 匯出映像到 K3s..."
# 儲存映像為 tar
local tmp_file="/tmp/${IMAGE_NAME}-${IMAGE_TAG}.tar"
docker save "${IMAGE_NAME}:${IMAGE_TAG}" -o "$tmp_file" || error "映像匯出失敗"
log "📦 映像大小: $(du -h "$tmp_file" | cut -f1)"
# 傳輸到 K3s 主機
log "🚀 傳輸到 K3s 主機 (${K3S_HOST})..."
scp "$tmp_file" "${K3S_USER}@${K3S_HOST}:/tmp/" || error "SCP 傳輸失敗"
# 匯入到 K3s containerd
log "📥 匯入到 K3s containerd..."
ssh "${K3S_USER}@${K3S_HOST}" "sudo k3s ctr images import /tmp/${IMAGE_NAME}-${IMAGE_TAG}.tar" || error "K3s 匯入失敗"
# 清理暫存檔
rm -f "$tmp_file"
ssh "${K3S_USER}@${K3S_HOST}" "rm -f /tmp/${IMAGE_NAME}-${IMAGE_TAG}.tar"
log "✅ 映像已匯入 K3s"
}
# 重啟 K8s Deployment
restart_deployment() {
log "🔄 重啟 K8s Deployment..."
ssh "${K3S_USER}@${K3S_HOST}" "sudo kubectl rollout restart deployment/momo-app deployment/momo-scheduler -n momo" || error "重啟失敗"
log "⏳ 等待 Deployment 就緒..."
ssh "${K3S_USER}@${K3S_HOST}" "sudo kubectl rollout status deployment/momo-app -n momo --timeout=120s" || error "momo-app 啟動失敗"
ssh "${K3S_USER}@${K3S_HOST}" "sudo kubectl rollout status deployment/momo-scheduler -n momo --timeout=120s" || error "momo-scheduler 啟動失敗"
log "✅ Deployment 重啟完成"
}
# 健康檢查
health_check() {
log "🏥 執行健康檢查..."
local retries=5
local wait=10
for i in $(seq 1 $retries); do
if curl -s "https://mo.wooo.work/health" | grep -q "healthy"; then
log "✅ 健康檢查通過"
return 0
fi
warn "健康檢查失敗,等待 ${wait} 秒後重試 ($i/$retries)..."
sleep $wait
done
error "健康檢查失敗"
}
# 推送到 Docker Hub (可選)
push_to_dockerhub() {
local dockerhub_user="${DOCKERHUB_USER:-woootech}"
local full_image="${dockerhub_user}/${IMAGE_NAME}:${IMAGE_TAG}"
log "☁️ 推送到 Docker Hub: ${full_image}..."
docker tag "${IMAGE_NAME}:${IMAGE_TAG}" "${full_image}"
docker push "${full_image}" || {
warn "Docker Hub 推送失敗(需要 docker login)"
return 1
}
log "✅ 已推送到 Docker Hub"
}
# 主流程
main() {
local start_time=$(date +%s)
echo ""
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} MOMO Pro System - 建置與部署${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
check_requirements
build_image
export_to_k3s
restart_deployment
health_check
# 可選: 推送到 Docker Hub
if [[ "${PUSH_TO_DOCKERHUB}" == "true" ]]; then
push_to_dockerhub
fi
local end_time=$(date +%s)
local duration=$((end_time - start_time))
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} ✅ 部署完成!${NC}"
echo -e "${GREEN} 耗時: ${duration} 秒${NC}"
echo -e "${GREEN}========================================${NC}"
send_telegram "✅ MOMO Pro 部署成功%0A%0A🏷️ 版本: ${IMAGE_TAG}%0A⏱️ 耗時: ${duration} 秒%0A🌐 https://mo.wooo.work"
}
# 執行
main "$@"