#!/bin/bash # 多客户端部署脚本 # 用于部署和管理3个不同地区客户端的反向代理服务 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" } # 检查依赖 check_dependencies() { log_info "检查系统依赖..." # 检查PM2 if ! command -v pm2 &> /dev/null; then log_error "PM2 未安装,请先安装: npm install -g pm2" exit 1 fi # 检查Nginx if ! command -v nginx &> /dev/null; then log_warning "Nginx 未安装,请手动安装并配置" fi # 检查Node.js if ! command -v node &> /dev/null; then log_error "Node.js 未安装" exit 1 fi log_success "依赖检查完成" } # 构建项目 build_project() { log_info "构建项目..." # 安装依赖 if [ -f "package-lock.json" ]; then npm ci else npm install fi # 构建项目 npm run build log_success "项目构建完成" } # 创建日志目录 create_log_dirs() { log_info "创建日志目录..." mkdir -p logs mkdir -p /var/log/nginx 2>/dev/null || log_warning "无法创建nginx日志目录,请手动创建" log_success "日志目录创建完成" } # 部署PM2应用 deploy_pm2() { log_info "部署PM2应用..." # 停止现有应用 pm2 delete all 2>/dev/null || log_warning "没有运行中的PM2应用" # 启动新应用 pm2 start ecosystem.config.cjs # 保存PM2配置 pm2 save # 设置开机自启 pm2 startup log_success "PM2应用部署完成" } # 配置Nginx configure_nginx() { log_info "配置Nginx..." # 检查配置文件 if [ ! -f "nginx-multi-client.conf" ]; then log_error "nginx-multi-client.conf 文件不存在" exit 1 fi # 复制配置文件到nginx目录 if [ -d "/etc/nginx/sites-available" ]; then sudo cp nginx-multi-client.conf /etc/nginx/sites-available/docreview-multi-client sudo ln -sf /etc/nginx/sites-available/docreview-multi-client /etc/nginx/sites-enabled/ elif [ -d "/etc/nginx/conf.d" ]; then sudo cp nginx-multi-client.conf /etc/nginx/conf.d/docreview-multi-client.conf else log_warning "请手动配置Nginx,配置文件: nginx-multi-client.conf" return fi # 测试nginx配置 sudo nginx -t # 重载nginx sudo systemctl reload nginx log_success "Nginx配置完成" } # 检查服务状态 check_status() { log_info "检查服务状态..." echo "\n=== PM2 应用状态 ===" pm2 status echo "\n=== 端口监听状态 ===" netstat -tlnp | grep -E ':(51701|51702|51703|51704)' echo "\n=== 服务健康检查 ===" for port in 51701 51702 51703 51704; do if curl -s "http://10.79.97.17:$port/health" > /dev/null; then log_success "端口 $port: 正常" else log_error "端口 $port: 异常" fi done } # 显示帮助信息 show_help() { echo "多客户端部署脚本" echo "" echo "用法: $0 [选项]" echo "" echo "选项:" echo " deploy 完整部署(构建+PM2+Nginx)" echo " build 仅构建项目" echo " pm2 仅部署PM2应用" echo " nginx 仅配置Nginx" echo " status 检查服务状态" echo " stop 停止所有服务" echo " restart 重启所有服务" echo " logs 查看日志" echo " help 显示帮助信息" echo "" echo "客户端访问地址:" echo " 客户端A: http://10.79.97.17:51701" echo " 客户端B: http://10.79.97.17:51702" echo " 客户端C: http://10.79.97.17:51704" echo " 主服务: http://10.79.97.17:51703" } # 停止服务 stop_services() { log_info "停止服务..." pm2 stop all log_success "服务已停止" } # 重启服务 restart_services() { log_info "重启服务..." pm2 restart all log_success "服务已重启" } # 查看日志 show_logs() { echo "选择要查看的日志:" echo "1) 主服务日志" echo "2) 客户端A日志" echo "3) 客户端B日志" echo "4) 客户端C日志" echo "5) 所有日志" read -p "请选择 (1-5): " choice case $choice in 1) pm2 logs docreview-main ;; 2) pm2 logs docreview-client-a ;; 3) pm2 logs docreview-client-b ;; 4) pm2 logs docreview-client-c ;; 5) pm2 logs ;; *) log_error "无效选择" ;; esac } # 主函数 main() { case "${1:-help}" in "deploy") check_dependencies create_log_dirs build_project deploy_pm2 configure_nginx check_status ;; "build") build_project ;; "pm2") check_dependencies create_log_dirs deploy_pm2 ;; "nginx") configure_nginx ;; "status") check_status ;; "stop") stop_services ;; "restart") restart_services ;; "logs") show_logs ;; "help") show_help ;; *) log_error "未知选项: $1" show_help exit 1 ;; esac } # 执行主函数 main "$@"