#!/bin/bash # ============================================================================= # RWADurian API Gateway (Kong) - 部署脚本 # ============================================================================= # Usage: # ./deploy.sh up # 启动网关 # ./deploy.sh down # 停止网关 # ./deploy.sh restart # 重启网关 # ./deploy.sh logs # 查看日志 # ./deploy.sh status # 查看状态 # ./deploy.sh health # 健康检查 # ./deploy.sh reload # 重载 Kong 配置 # ./deploy.sh routes # 查看所有路由 # ./deploy.sh monitoring # 启动监控栈 (Prometheus + Grafana) # ./deploy.sh metrics # 查看 Prometheus 指标 # ============================================================================= set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日志函数 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"; } # 项目信息 PROJECT_NAME="rwa-api-gateway" KONG_ADMIN_URL="http://localhost:8001" KONG_PROXY_URL="http://localhost:8000" # 脚本目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 切换到脚本所在目录 cd "$SCRIPT_DIR" # 加载环境变量 if [ -f ".env" ]; then log_info "Loading environment from .env file" set -a source .env set +a elif [ -f ".env.example" ]; then log_warn ".env file not found!" log_warn "Creating .env from .env.example..." cp .env.example .env log_error "Please edit .env file to configure your environment, then run again" exit 1 else log_error "Neither .env nor .env.example found!" exit 1 fi # 检查 Docker check_docker() { if ! command -v docker &> /dev/null; then log_error "Docker 未安装" exit 1 fi if ! docker info &> /dev/null; then log_error "Docker 服务未运行" exit 1 fi } # 检查 Docker Compose check_docker_compose() { if docker compose version &> /dev/null; then COMPOSE_CMD="docker compose" elif command -v docker-compose &> /dev/null; then COMPOSE_CMD="docker-compose" else log_error "Docker Compose 未安装" exit 1 fi } # 检查后端服务连通性(可选) check_backend() { local BACKEND_IP="${BACKEND_SERVER_IP:-192.168.1.111}" log_info "检查后端服务器 $BACKEND_IP 连通性..." if ping -c 1 -W 2 $BACKEND_IP &> /dev/null; then log_success "后端服务器可达" else log_warn "无法 ping 通后端服务器 $BACKEND_IP" log_warn "请确保后端服务已启动且网络可达" fi } # 启动服务 cmd_up() { log_info "启动 Kong API Gateway..." check_backend $COMPOSE_CMD up -d log_info "等待 Kong 启动..." sleep 10 # 检查状态 if docker ps | grep -q rwa-kong; then log_success "Kong API Gateway 启动成功!" echo "" echo "服务地址:" echo " Proxy: http://localhost:8000" echo " Admin API: http://localhost:8001" echo " Admin GUI: http://localhost:8002" echo "" echo "查看路由: ./deploy.sh routes" else log_error "Kong 启动失败,查看日志: ./deploy.sh logs" exit 1 fi } # 停止服务 cmd_down() { log_info "停止 Kong API Gateway..." $COMPOSE_CMD down log_success "Kong 已停止" } # 重启服务 cmd_restart() { log_info "重启 Kong API Gateway..." $COMPOSE_CMD restart log_success "Kong 已重启" } # 查看日志 cmd_logs() { $COMPOSE_CMD logs -f } # 查看状态 cmd_status() { log_info "Kong API Gateway 状态:" $COMPOSE_CMD ps } # 健康检查 cmd_health() { log_info "Kong 健康检查..." # 检查 Kong 状态 response=$(curl -s $KONG_ADMIN_URL/status 2>/dev/null) if [ $? -eq 0 ]; then log_success "Kong Admin API 正常" echo "$response" | python3 -m json.tool 2>/dev/null || echo "$response" else log_error "Kong Admin API 不可用" exit 1 fi } # 重载配置 (触发 deck sync) cmd_reload() { log_info "重载 Kong 配置..." $COMPOSE_CMD run --rm kong-config log_success "配置已重载" } # 同步配置到数据库 cmd_sync() { log_info "同步 kong.yml 配置到数据库..." $COMPOSE_CMD run --rm kong-config log_success "配置同步完成" echo "" echo "查看路由: ./deploy.sh routes" } # 查看所有路由 cmd_routes() { log_info "Kong 路由列表:" curl -s $KONG_ADMIN_URL/routes | python3 -m json.tool 2>/dev/null || curl -s $KONG_ADMIN_URL/routes } # 查看所有服务 cmd_services() { log_info "Kong 服务列表:" curl -s $KONG_ADMIN_URL/services | python3 -m json.tool 2>/dev/null || curl -s $KONG_ADMIN_URL/services } # 测试 API cmd_test() { log_info "测试 API 路由..." echo "" echo "测试 /api/v1/versions (admin-service):" curl -s -o /dev/null -w " HTTP Status: %{http_code}\n" $KONG_PROXY_URL/api/v1/versions echo "" echo "测试 /api/v1/auth (identity-service):" curl -s -o /dev/null -w " HTTP Status: %{http_code}\n" $KONG_PROXY_URL/api/v1/auth } # 清理 cmd_clean() { log_info "清理 Kong 容器和数据..." $COMPOSE_CMD down -v --remove-orphans docker image prune -f log_success "清理完成" } # 启动监控栈 cmd_monitoring_up() { log_info "启动监控栈 (Prometheus + Grafana)..." $COMPOSE_CMD -f docker-compose.yml -f docker-compose.monitoring.yml up -d prometheus grafana log_info "等待服务启动..." sleep 5 log_success "监控栈启动成功!" echo "" echo "监控服务地址:" echo " Grafana: http://localhost:3030 (admin/admin123)" echo " Prometheus: http://localhost:9099" echo " Kong 指标: http://localhost:8001/metrics" echo "" } # 安装监控栈 (包括 Nginx + SSL) cmd_monitoring_install() { local domain="${1:-monitor.szaiai.com}" log_info "安装监控栈..." if [ ! -f "$SCRIPT_DIR/scripts/install-monitor.sh" ]; then log_error "安装脚本不存在: scripts/install-monitor.sh" exit 1 fi sudo bash "$SCRIPT_DIR/scripts/install-monitor.sh" "$domain" } # 停止监控栈 cmd_monitoring_down() { log_info "停止监控栈..." docker stop rwa-prometheus rwa-grafana 2>/dev/null || true docker rm rwa-prometheus rwa-grafana 2>/dev/null || true log_success "监控栈已停止" } # 查看 Prometheus 指标 cmd_metrics() { log_info "Kong Prometheus 指标概览:" echo "" # 获取关键指标 metrics=$(curl -s $KONG_ADMIN_URL/metrics 2>/dev/null) if [ $? -eq 0 ]; then echo "=== 请求统计 ===" echo "$metrics" | grep -E "^kong_http_requests_total" | head -20 echo "" echo "=== 延迟统计 ===" echo "$metrics" | grep -E "^kong_latency_" | head -10 echo "" echo "完整指标: curl $KONG_ADMIN_URL/metrics" else log_error "无法获取指标,请确保 Kong 正在运行且 prometheus 插件已启用" fi } # 显示帮助 show_help() { echo "" echo "RWADurian API Gateway (Kong) 部署脚本" echo "" echo "用法: ./deploy.sh [命令]" echo "" echo "命令:" echo " up 启动 Kong 网关" echo " down 停止 Kong 网关" echo " restart 重启 Kong 网关" echo " logs 查看日志" echo " status 查看状态" echo " health 健康检查" echo " sync 同步 kong.yml 配置到数据库" echo " reload 重载 Kong 配置 (同 sync)" echo " routes 查看所有路由" echo " services 查看所有服务" echo " test 测试 API 路由" echo " clean 清理容器和数据" echo "" echo "监控命令:" echo " monitoring install [domain] 一键安装监控 (Nginx+SSL+服务)" echo " monitoring up 启动监控栈" echo " monitoring down 停止监控栈" echo " metrics 查看 Prometheus 指标" echo "" echo " help 显示帮助" echo "" echo "注意: 需要先启动 backend/services 才能启动 Kong" echo "" } # 主函数 main() { check_docker check_docker_compose case "${1:-help}" in up) cmd_up ;; down) cmd_down ;; restart) cmd_restart ;; logs) cmd_logs ;; status) cmd_status ;; health) cmd_health ;; sync) cmd_sync ;; reload) cmd_reload ;; routes) cmd_routes ;; services) cmd_services ;; test) cmd_test ;; clean) cmd_clean ;; monitoring) case "${2:-up}" in install) cmd_monitoring_install "$3" ;; up) cmd_monitoring_up ;; down) cmd_monitoring_down ;; *) log_error "未知监控命令: $2" echo "用法: ./deploy.sh monitoring [install|up|down]" exit 1 ;; esac ;; metrics) cmd_metrics ;; help|--help|-h) show_help ;; *) log_error "未知命令: $1" show_help exit 1 ;; esac } main "$@"