#!/bin/bash # Telegram管理系统部署脚本 set -e # 颜色定义 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_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 显示帮助信息 show_help() { echo "Telegram管理系统部署脚本" echo "" echo "用法: $0 [选项]" echo "" echo "选项:" echo " -e, --env ENV 设置环境 (dev|prod) [默认: dev]" echo " -b, --build 是否重新构建镜像 [默认: false]" echo " -d, --down 停止并删除容器" echo " -c, --clean 清理未使用的镜像和容器" echo " -l, --logs 查看应用日志" echo " -s, --status 查看服务状态" echo " -h, --help 显示帮助信息" echo "" echo "示例:" echo " $0 -e prod -b # 生产环境部署并重新构建镜像" echo " $0 -d # 停止所有服务" echo " $0 -l # 查看应用日志" } # 默认参数 ENVIRONMENT="dev" BUILD_IMAGE=false STOP_SERVICES=false CLEAN_DOCKER=false SHOW_LOGS=false SHOW_STATUS=false # 解析命令行参数 while [[ $# -gt 0 ]]; do case $1 in -e|--env) ENVIRONMENT="$2" shift 2 ;; -b|--build) BUILD_IMAGE=true shift ;; -d|--down) STOP_SERVICES=true shift ;; -c|--clean) CLEAN_DOCKER=true shift ;; -l|--logs) SHOW_LOGS=true shift ;; -s|--status) SHOW_STATUS=true shift ;; -h|--help) show_help exit 0 ;; *) log_error "未知参数: $1" show_help exit 1 ;; esac done # 检查Docker和Docker Compose check_dependencies() { log_info "检查依赖..." if ! command -v docker &> /dev/null; then log_error "Docker 未安装或不在PATH中" exit 1 fi if ! command -v docker-compose &> /dev/null; then log_error "Docker Compose 未安装或不在PATH中" exit 1 fi log_success "依赖检查通过" } # 停止服务 stop_services() { log_info "停止所有服务..." docker-compose down -v log_success "服务已停止" } # 清理Docker资源 clean_docker() { log_info "清理Docker资源..." docker system prune -f docker volume prune -f log_success "Docker资源清理完成" } # 构建镜像 build_image() { log_info "构建应用镜像..." docker-compose build --no-cache app log_success "镜像构建完成" } # 启动服务 start_services() { log_info "启动服务 (环境: $ENVIRONMENT)..." # 设置环境变量文件 if [ "$ENVIRONMENT" = "prod" ]; then export NODE_ENV=production ENV_FILE=".env.production" else export NODE_ENV=development ENV_FILE=".env" fi # 检查环境变量文件 if [ ! -f "$ENV_FILE" ]; then log_warning "环境变量文件 $ENV_FILE 不存在,使用默认配置" fi # 启动服务 if [ "$ENVIRONMENT" = "prod" ]; then docker-compose --profile with-nginx up -d else docker-compose up -d fi log_success "服务启动完成" } # 等待服务就绪 wait_for_services() { log_info "等待服务就绪..." # 等待应用健康检查通过 local max_attempts=30 local attempt=1 while [ $attempt -le $max_attempts ]; do if docker-compose exec -T app curl -f http://localhost:3000/health/quick > /dev/null 2>&1; then log_success "应用服务就绪" break fi if [ $attempt -eq $max_attempts ]; then log_error "应用服务启动超时" docker-compose logs app exit 1 fi log_info "等待应用启动... ($attempt/$max_attempts)" sleep 10 ((attempt++)) done } # 显示服务状态 show_service_status() { log_info "服务状态:" docker-compose ps echo "" log_info "健康检查:" echo "应用服务: $(curl -s http://localhost:3000/health/quick | jq -r '.status' 2>/dev/null || echo '无响应')" echo "MySQL: $(docker-compose exec -T mysql mysqladmin ping --silent && echo '正常' || echo '异常')" echo "Redis: $(docker-compose exec -T redis redis-cli ping 2>/dev/null || echo '异常')" echo "RabbitMQ: $(curl -s http://localhost:15672/api/overview > /dev/null 2>&1 && echo '正常' || echo '异常')" } # 显示日志 show_logs() { log_info "显示应用日志..." docker-compose logs -f app } # 主函数 main() { log_info "Telegram管理系统部署开始..." # 检查依赖 check_dependencies # 根据参数执行操作 if [ "$STOP_SERVICES" = true ]; then stop_services return 0 fi if [ "$CLEAN_DOCKER" = true ]; then clean_docker return 0 fi if [ "$SHOW_LOGS" = true ]; then show_logs return 0 fi if [ "$SHOW_STATUS" = true ]; then show_service_status return 0 fi # 常规部署流程 if [ "$BUILD_IMAGE" = true ]; then build_image fi start_services wait_for_services show_service_status log_success "部署完成! 🎉" echo "" log_info "访问地址:" echo " 应用: http://localhost:3000" echo " API文档: http://localhost:3000/api-docs" echo " 健康检查: http://localhost:3000/health" echo " RabbitMQ管理: http://localhost:15672 (admin/admin)" echo "" log_info "查看日志: $0 -l" log_info "查看状态: $0 -s" log_info "停止服务: $0 -d" } # 执行主函数 main