#!/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 "$@"