278 lines
7.1 KiB
Bash
Executable File
278 lines
7.1 KiB
Bash
Executable File
#!/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 "$@" |