Files
ewoooc/k8s/gcp/deploy.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

208 lines
5.8 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# WOOO TECH - Momo Pro System
# GCP 一鍵部署腳本
# 用法: ./deploy.sh [選項]
# --full 完整部署(含資料庫初始化)
# --update 僅更新應用(保留資料庫)
# --restart 僅重啟服務
# =============================================================================
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_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
NAMESPACE="momo"
IMAGE_NAME="momo-pro-system"
IMAGE_TAG="latest"
# 函數
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
# =============================================================================
# 檢查環境
# =============================================================================
check_environment() {
log_info "檢查環境..."
# K3s
if ! command -v kubectl &> /dev/null; then
log_error "kubectl 未安裝,請先安裝 K3s"
fi
# Docker
if ! command -v docker &> /dev/null; then
log_error "Docker 未安裝"
fi
log_success "環境檢查通過"
}
# =============================================================================
# 建構映像
# =============================================================================
build_image() {
log_info "建構 Docker 映像..."
cd "$PROJECT_DIR"
# 建構映像
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .
log_success "映像建構完成: ${IMAGE_NAME}:${IMAGE_TAG}"
}
# =============================================================================
# 匯入映像到 K3s
# =============================================================================
import_image() {
log_info "匯入映像到 K3s containerd..."
# 儲存映像
docker save ${IMAGE_NAME}:${IMAGE_TAG} -o /tmp/${IMAGE_NAME}.tar
# 匯入到 K3s
sudo k3s ctr images import /tmp/${IMAGE_NAME}.tar
# 清理
rm -f /tmp/${IMAGE_NAME}.tar
log_success "映像匯入完成"
}
# =============================================================================
# 部署 K8s 資源
# =============================================================================
deploy_k8s() {
log_info "部署 K8s 資源..."
cd "$SCRIPT_DIR"
# 建立 namespace
kubectl apply -f 00-namespace.yaml
# 部署 secrets 和 configmap
kubectl apply -f 01-secrets.yaml
kubectl apply -f 02-configmap.yaml
# 部署 PostgreSQL
kubectl apply -f 03-postgres.yaml
# 等待 PostgreSQL 就緒
log_info "等待 PostgreSQL 就緒..."
kubectl wait --for=condition=ready pod -l app=momo-postgres -n $NAMESPACE --timeout=120s || true
# 部署應用
kubectl apply -f 04-momo-app.yaml
kubectl apply -f 05-scheduler.yaml
log_success "K8s 資源部署完成"
}
# =============================================================================
# 重啟服務
# =============================================================================
restart_services() {
log_info "重啟服務..."
kubectl rollout restart deployment/momo-app -n $NAMESPACE
kubectl rollout restart deployment/momo-scheduler -n $NAMESPACE
# 等待就緒
log_info "等待服務就緒..."
kubectl rollout status deployment/momo-app -n $NAMESPACE --timeout=180s
log_success "服務重啟完成"
}
# =============================================================================
# 健康檢查
# =============================================================================
health_check() {
log_info "執行健康檢查..."
# 查看 Pod 狀態
echo ""
kubectl get pods -n $NAMESPACE -o wide
echo ""
# 檢查服務
local app_pod=$(kubectl get pod -n $NAMESPACE -l app=momo-app -o jsonpath='{.items[0].metadata.name}' 2>/dev/null)
if [[ -n "$app_pod" ]]; then
local health=$(kubectl exec -n $NAMESPACE $app_pod -- curl -s http://localhost:80/health 2>/dev/null || echo "error")
if echo "$health" | grep -q "healthy"; then
log_success "應用健康檢查通過"
else
log_warn "應用健康檢查未通過"
fi
fi
log_success "健康檢查完成"
}
# =============================================================================
# 主程式
# =============================================================================
main() {
echo ""
echo "=============================================="
echo " MOMO Pro System - GCP 部署"
echo " $(date '+%Y-%m-%d %H:%M:%S')"
echo "=============================================="
echo ""
local mode="${1:-full}"
case "$mode" in
--full|full)
check_environment
build_image
import_image
deploy_k8s
restart_services
health_check
;;
--update|update)
check_environment
build_image
import_image
restart_services
health_check
;;
--restart|restart)
restart_services
health_check
;;
*)
echo "用法: $0 [選項]"
echo " --full 完整部署(預設)"
echo " --update 更新應用"
echo " --restart 重啟服務"
exit 1
;;
esac
echo ""
echo "=============================================="
echo -e " ${GREEN}部署完成!${NC}"
echo "=============================================="
echo ""
echo "查看 Pod: kubectl get pods -n momo"
echo "查看日誌: kubectl logs -f deployment/momo-app -n momo"
echo ""
}
main "$@"