#!/bin/bash # ============================================================================= # AWOOOI K3s Infrastructure Deployment Script # ============================================================================= # Phase 0: 基礎設施部署至 K3s Master (192.168.0.120) # # 用途: 將 k8s/awoooi-prod/ 下的 YAML 依序部署至 K3s 叢集 # 負責人: CIO + Claude Code # 日期: 2026-03-21 # # ============================================================================= # ⚠️ 前端 Docker Image 建置警告 ⚠️ # ============================================================================= # 前端 Next.js Docker Image 於 CI/CD 建置時,必須透過 --build-arg 注入 # 生產環境的 API 網址,絕對不可沿用本機 localhost 的預設值! # # 正確做法 (CI/CD Pipeline): # docker build --build-arg NEXT_PUBLIC_API_URL=https://awoooi.wooo.work \ # -f apps/web/Dockerfile -t awoooi-web:${TAG} . # # 錯誤做法: # 沿用 Dockerfile 預設值 http://localhost:8000 (僅限本機開發) # # ============================================================================= set -e # 遇到錯誤立即中斷 # ============================================================================= # 配置 (四主機架構常量) # ============================================================================= K3S_MASTER="192.168.0.120" K3S_USER="root" # 或 ogt (依據 SSH Key 配置) REMOTE_DIR="/tmp/awoooi-deploy" LOCAL_K8S_DIR="./k8s/awoooi-prod" NAMESPACE="awoooi-prod" # 顏色輸出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # ============================================================================= # 函數定義 # ============================================================================= 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" } # ============================================================================= # 前置檢查 # ============================================================================= echo "" echo "==============================================" echo " AWOOOI K3s Infrastructure Deployment" echo " Target: ${K3S_MASTER} (K3s Master)" echo " Namespace: ${NAMESPACE}" echo "==============================================" echo "" # 檢查本地 YAML 目錄 if [ ! -d "$LOCAL_K8S_DIR" ]; then log_error "K8s 配置目錄不存在: $LOCAL_K8S_DIR" exit 1 fi # 檢查 SSH 連線 log_info "測試 SSH 連線至 ${K3S_MASTER}..." if ! ssh -o ConnectTimeout=5 -o BatchMode=yes ${K3S_USER}@${K3S_MASTER} "echo 'SSH OK'" > /dev/null 2>&1; then log_error "無法透過 SSH 連線至 ${K3S_MASTER}" log_warn "請確認 SSH Key 已配置 (禁止硬編碼密碼)" exit 1 fi log_success "SSH 連線成功" # ============================================================================= # Step 1: 傳輸 YAML 檔案 # ============================================================================= log_info "Step 1: 傳輸 YAML 至遠端 ${REMOTE_DIR}..." # 建立遠端目錄 ssh ${K3S_USER}@${K3S_MASTER} "mkdir -p ${REMOTE_DIR}" # 複製所有 YAML (排除 secrets.yaml) scp -q ${LOCAL_K8S_DIR}/01-namespace-quota.yaml ${K3S_USER}@${K3S_MASTER}:${REMOTE_DIR}/ scp -q ${LOCAL_K8S_DIR}/02-network-policy.yaml ${K3S_USER}@${K3S_MASTER}:${REMOTE_DIR}/ scp -q ${LOCAL_K8S_DIR}/04-configmap.yaml ${K3S_USER}@${K3S_MASTER}:${REMOTE_DIR}/ scp -q ${LOCAL_K8S_DIR}/05-deployment-web.yaml ${K3S_USER}@${K3S_MASTER}:${REMOTE_DIR}/ scp -q ${LOCAL_K8S_DIR}/06-deployment-api.yaml ${K3S_USER}@${K3S_MASTER}:${REMOTE_DIR}/ scp -q ${LOCAL_K8S_DIR}/07-rbac.yaml ${K3S_USER}@${K3S_MASTER}:${REMOTE_DIR}/ log_success "YAML 檔案傳輸完成 (secrets.yaml 需單獨處理)" # ============================================================================= # Step 2: 依序執行 kubectl apply # ============================================================================= log_info "Step 2: 依序部署 K8s 資源..." # 2.1 Namespace + ResourceQuota (必須最先) log_info " [1/5] 部署 Namespace + ResourceQuota..." ssh ${K3S_USER}@${K3S_MASTER} "kubectl apply -f ${REMOTE_DIR}/01-namespace-quota.yaml" # 2.2 NetworkPolicy (安全隔離) log_info " [2/5] 部署 NetworkPolicy..." ssh ${K3S_USER}@${K3S_MASTER} "kubectl apply -f ${REMOTE_DIR}/02-network-policy.yaml" # 2.3 ConfigMap log_info " [3/5] 部署 ConfigMap..." ssh ${K3S_USER}@${K3S_MASTER} "kubectl apply -f ${REMOTE_DIR}/04-configmap.yaml" # 2.4 RBAC (ServiceAccount, ClusterRole, ClusterRoleBinding) log_info " [4/5] 部署 RBAC..." ssh ${K3S_USER}@${K3S_MASTER} "kubectl apply -f ${REMOTE_DIR}/07-rbac.yaml" # 2.5 Deployments (Web + API) - 僅建立資源,映像標籤由 CI 注入 log_info " [5/5] 部署 Deployment 模板 (映像標籤需由 CI 注入)..." ssh ${K3S_USER}@${K3S_MASTER} "kubectl apply -f ${REMOTE_DIR}/05-deployment-web.yaml" || log_warn "Web Deployment 可能因 ImagePullBackOff 失敗 (預期行為)" ssh ${K3S_USER}@${K3S_MASTER} "kubectl apply -f ${REMOTE_DIR}/06-deployment-api.yaml" || log_warn "API Deployment 可能因 ImagePullBackOff 失敗 (預期行為)" log_success "K8s 資源部署完成" # ============================================================================= # Step 3: 驗證部署結果 # ============================================================================= log_info "Step 3: 驗證部署結果..." echo "" echo "--- Namespace ---" ssh ${K3S_USER}@${K3S_MASTER} "kubectl get ns ${NAMESPACE}" echo "" echo "--- ResourceQuota ---" ssh ${K3S_USER}@${K3S_MASTER} "kubectl get quota -n ${NAMESPACE}" echo "" echo "--- NetworkPolicy ---" ssh ${K3S_USER}@${K3S_MASTER} "kubectl get netpol -n ${NAMESPACE}" echo "" echo "--- ServiceAccount (RBAC) ---" ssh ${K3S_USER}@${K3S_MASTER} "kubectl get sa -n ${NAMESPACE}" echo "" echo "--- Deployments ---" ssh ${K3S_USER}@${K3S_MASTER} "kubectl get deploy -n ${NAMESPACE}" echo "" # ============================================================================= # Step 4: 清理遠端暫存 # ============================================================================= log_info "Step 4: 清理遠端暫存 ${REMOTE_DIR}..." ssh ${K3S_USER}@${K3S_MASTER} "rm -rf ${REMOTE_DIR}" log_success "暫存清理完成" # ============================================================================= # 完成 # ============================================================================= echo "" echo "==============================================" echo -e "${GREEN} AWOOOI K3s 基礎設施部署完成!${NC}" echo "==============================================" echo "" echo "下一步:" echo " 1. 建立 Secrets: kubectl apply -f k8s/awoooi-prod/03-secrets.yaml" echo " 2. CI/CD 建置映像並推送至 Harbor (192.168.0.110:5000)" echo " 3. 使用 kustomize set image 更新 Deployment" echo "" log_warn "提醒: Deployment 目前使用 IMAGE_TAG_PLACEHOLDER,需由 CI 動態注入" echo ""