255 lines
5.6 KiB
Bash
255 lines
5.6 KiB
Bash
#!/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 "$@" |