#!/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 # 查看所有路由 # ============================================================================= set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 项目信息 PROJECT_NAME="rwa-api-gateway" KONG_ADMIN_URL="http://localhost:8001" KONG_PROXY_URL="http://localhost:8000" # 切换到脚本所在目录 cd "$(dirname "$0")" # 日志函数 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"; } # 检查 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 "清理完成" } # 显示帮助 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 " 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 ;; help|--help|-h) show_help ;; *) log_error "未知命令: $1" show_help exit 1 ;; esac } main "$@"