278 lines
7.1 KiB
Bash
278 lines
7.1 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
# 结伴客后端服务启动脚本 - 在CentOS服务器上运行
|
|||
|
|
# 使用PM2管理Node.js应用
|
|||
|
|
|
|||
|
|
# 设置颜色输出
|
|||
|
|
RED='\033[0;31m'
|
|||
|
|
GREEN='\033[0;32m'
|
|||
|
|
YELLOW='\033[1;33m'
|
|||
|
|
BLUE='\033[0;34m'
|
|||
|
|
NC='\033[0m' # No Color
|
|||
|
|
|
|||
|
|
# 配置参数
|
|||
|
|
APP_DIR="$(pwd)"
|
|||
|
|
NODE_ENV=${NODE_ENV:-"production"}
|
|||
|
|
PORT=${PORT:-"3200"}
|
|||
|
|
|
|||
|
|
# 检查Node.js环境
|
|||
|
|
check_node() {
|
|||
|
|
if ! command -v node &> /dev/null; then
|
|||
|
|
echo -e "${RED}错误:Node.js环境未安装!${NC}"
|
|||
|
|
echo -e "${YELLOW}请先安装Node.js: curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash - && sudo yum install -y nodejs${NC}"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
echo -e "${GREEN}Node.js版本: $(node -v)${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 检查PM2是否安装
|
|||
|
|
check_pm2() {
|
|||
|
|
if ! command -v pm2 &> /dev/null; then
|
|||
|
|
echo -e "${YELLOW}PM2未安装,正在全局安装...${NC}"
|
|||
|
|
npm install -g pm2
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo -e "${RED}PM2安装失败!${NC}"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
fi
|
|||
|
|
echo -e "${GREEN}PM2版本: $(pm2 -v)${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 检查环境变量文件
|
|||
|
|
check_env() {
|
|||
|
|
if [ ! -f "$APP_DIR/.env" ]; then
|
|||
|
|
echo -e "${RED}错误:未找到.env文件!${NC}"
|
|||
|
|
echo -e "${YELLOW}请确保.env文件已正确配置,包含必要的数据库连接信息和其他配置。${NC}"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
echo -e "${GREEN}已找到.env文件${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 检查ecosystem.config.js文件
|
|||
|
|
check_ecosystem() {
|
|||
|
|
if [ ! -f "$APP_DIR/ecosystem.config.js" ]; then
|
|||
|
|
echo -e "${YELLOW}未找到ecosystem.config.js文件,正在创建默认配置...${NC}"
|
|||
|
|
cat > "$APP_DIR/ecosystem.config.js" << EOF
|
|||
|
|
module.exports = {
|
|||
|
|
apps: [{
|
|||
|
|
name: 'jiebanke-backend',
|
|||
|
|
script: './src/server.js',
|
|||
|
|
instances: 'max',
|
|||
|
|
exec_mode: 'cluster',
|
|||
|
|
env: {
|
|||
|
|
NODE_ENV: 'development',
|
|||
|
|
PORT: $PORT,
|
|||
|
|
WATCH: true
|
|||
|
|
},
|
|||
|
|
env_production: {
|
|||
|
|
NODE_ENV: 'production',
|
|||
|
|
PORT: $PORT,
|
|||
|
|
WATCH: false
|
|||
|
|
},
|
|||
|
|
log_file: '$APP_DIR/logs/combined.log',
|
|||
|
|
out_file: '$APP_DIR/logs/out.log',
|
|||
|
|
error_file: '$APP_DIR/logs/error.log',
|
|||
|
|
max_memory_restart: '1G',
|
|||
|
|
kill_timeout: 3000,
|
|||
|
|
wait_ready: true,
|
|||
|
|
listen_timeout: 3000,
|
|||
|
|
autorestart: true,
|
|||
|
|
max_restarts: 10,
|
|||
|
|
restart_delay: 4000,
|
|||
|
|
ignore_watch: [
|
|||
|
|
'node_modules',
|
|||
|
|
'logs',
|
|||
|
|
'.git',
|
|||
|
|
'uploads'
|
|||
|
|
]
|
|||
|
|
}]
|
|||
|
|
};
|
|||
|
|
EOF
|
|||
|
|
echo -e "${GREEN}ecosystem.config.js文件已创建${NC}"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 安装依赖
|
|||
|
|
install_dependencies() {
|
|||
|
|
echo -e "${BLUE}正在安装生产依赖...${NC}"
|
|||
|
|
cd "$APP_DIR"
|
|||
|
|
npm install --production
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo -e "${RED}依赖安装失败!${NC}"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
echo -e "${GREEN}依赖安装完成!${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 创建日志和上传目录
|
|||
|
|
create_directories() {
|
|||
|
|
echo -e "${BLUE}正在创建必要的目录...${NC}"
|
|||
|
|
mkdir -p "$APP_DIR/logs" "$APP_DIR/uploads"
|
|||
|
|
chmod 755 "$APP_DIR/logs" "$APP_DIR/uploads"
|
|||
|
|
echo -e "${GREEN}目录创建完成!${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 启动服务
|
|||
|
|
start_service() {
|
|||
|
|
echo -e "${BLUE}正在使用PM2启动结伴客后端服务...${NC}"
|
|||
|
|
cd "$APP_DIR"
|
|||
|
|
|
|||
|
|
# 设置NODE_ENV环境变量
|
|||
|
|
export NODE_ENV=$NODE_ENV
|
|||
|
|
|
|||
|
|
# 使用PM2启动应用
|
|||
|
|
pm2 start ecosystem.config.js --env $NODE_ENV
|
|||
|
|
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo -e "${RED}服务启动失败!${NC}"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo -e "${GREEN}服务启动成功!${NC}"
|
|||
|
|
echo -e "${BLUE}应用名称: jiebanke-backend${NC}"
|
|||
|
|
echo -e "${BLUE}环境: $NODE_ENV${NC}"
|
|||
|
|
echo -e "${BLUE}端口: $PORT${NC}"
|
|||
|
|
echo -e "${YELLOW}提示:使用 pm2 logs jiebanke-backend 查看日志${NC}"
|
|||
|
|
echo -e "${YELLOW}提示:使用 pm2 monit 监控应用状态${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 设置PM2开机自启
|
|||
|
|
setup_autostart() {
|
|||
|
|
echo -e "${BLUE}正在配置PM2开机自启...${NC}"
|
|||
|
|
pm2 startup
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo -e "${RED}PM2开机自启配置失败!${NC}"
|
|||
|
|
else
|
|||
|
|
pm2 save
|
|||
|
|
echo -e "${GREEN}PM2开机自启配置完成!${NC}"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 显示帮助信息
|
|||
|
|
show_help() {
|
|||
|
|
echo ""
|
|||
|
|
echo "结伴客后端服务管理脚本"
|
|||
|
|
echo ""
|
|||
|
|
echo "用法: $0 [命令] [环境]"
|
|||
|
|
echo ""
|
|||
|
|
echo "命令选项:"
|
|||
|
|
echo " start - 启动服务(默认)"
|
|||
|
|
echo " stop - 停止服务"
|
|||
|
|
echo " restart - 重启服务"
|
|||
|
|
echo " status - 查看服务状态"
|
|||
|
|
echo " logs - 查看服务日志"
|
|||
|
|
echo " install - 仅安装依赖"
|
|||
|
|
echo " setup - 配置PM2开机自启"
|
|||
|
|
echo " help - 显示此帮助信息"
|
|||
|
|
echo ""
|
|||
|
|
echo "环境选项:"
|
|||
|
|
echo " production - 生产环境(默认)"
|
|||
|
|
echo " development - 开发环境"
|
|||
|
|
echo " test - 测试环境"
|
|||
|
|
echo ""
|
|||
|
|
echo "示例:"
|
|||
|
|
echo " $0 start production # 在生产环境启动服务"
|
|||
|
|
echo " $0 restart development # 在开发环境重启服务"
|
|||
|
|
echo " $0 logs # 查看服务日志"
|
|||
|
|
echo ""
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 停止服务
|
|||
|
|
stop_service() {
|
|||
|
|
echo -e "${BLUE}正在停止结伴客后端服务...${NC}"
|
|||
|
|
pm2 stop jiebanke-backend
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo -e "${YELLOW}服务可能未在运行!${NC}"
|
|||
|
|
else
|
|||
|
|
echo -e "${GREEN}服务已停止!${NC}"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 重启服务
|
|||
|
|
restart_service() {
|
|||
|
|
echo -e "${BLUE}正在重启结伴客后端服务...${NC}"
|
|||
|
|
export NODE_ENV=$NODE_ENV
|
|||
|
|
pm2 restart ecosystem.config.js --env $NODE_ENV
|
|||
|
|
if [ $? -ne 0 ]; then
|
|||
|
|
echo -e "${RED}服务重启失败!${NC}"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
echo -e "${GREEN}服务重启成功!${NC}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 查看服务状态
|
|||
|
|
status_service() {
|
|||
|
|
echo -e "${BLUE}正在查看结伴客后端服务状态...${NC}"
|
|||
|
|
pm2 status jiebanke-backend
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 查看服务日志
|
|||
|
|
logs_service() {
|
|||
|
|
echo -e "${BLUE}正在查看结伴客后端服务日志...${NC}"
|
|||
|
|
pm2 logs jiebanke-backend
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 主函数
|
|||
|
|
handle_command() {
|
|||
|
|
# 解析命令和环境参数
|
|||
|
|
COMMAND="start"
|
|||
|
|
if [ $# -ge 1 ]; then
|
|||
|
|
case $1 in
|
|||
|
|
start|stop|restart|status|logs|install|setup|help) COMMAND=$1 ;;
|
|||
|
|
*) echo -e "${RED}未知命令:$1${NC}"; show_help; exit 1 ;;
|
|||
|
|
esac
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if [ $# -ge 2 ]; then
|
|||
|
|
case $2 in
|
|||
|
|
production|development|test) NODE_ENV=$2 ;;
|
|||
|
|
*) echo -e "${RED}未知环境:$2${NC}"; show_help; exit 1 ;;
|
|||
|
|
esac
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 执行相应的命令
|
|||
|
|
case $COMMAND in
|
|||
|
|
start)
|
|||
|
|
check_node
|
|||
|
|
check_pm2
|
|||
|
|
check_env
|
|||
|
|
check_ecosystem
|
|||
|
|
install_dependencies
|
|||
|
|
create_directories
|
|||
|
|
start_service
|
|||
|
|
;;
|
|||
|
|
stop)
|
|||
|
|
check_pm2
|
|||
|
|
stop_service
|
|||
|
|
;;
|
|||
|
|
restart)
|
|||
|
|
check_node
|
|||
|
|
check_pm2
|
|||
|
|
check_env
|
|||
|
|
install_dependencies
|
|||
|
|
restart_service
|
|||
|
|
;;
|
|||
|
|
status)
|
|||
|
|
check_pm2
|
|||
|
|
status_service
|
|||
|
|
;;
|
|||
|
|
logs)
|
|||
|
|
check_pm2
|
|||
|
|
logs_service
|
|||
|
|
;;
|
|||
|
|
install)
|
|||
|
|
check_node
|
|||
|
|
install_dependencies
|
|||
|
|
;;
|
|||
|
|
setup)
|
|||
|
|
check_pm2
|
|||
|
|
setup_autostart
|
|||
|
|
;;
|
|||
|
|
help)
|
|||
|
|
show_help
|
|||
|
|
;;
|
|||
|
|
esac
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 执行主函数
|
|||
|
|
handle_command "$@"
|