#!/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 "$@"