#!/bin/bash # PM2启动脚本 - 用于一键启动应用并处理常见问题 # 设置中文显示 export LANG=zh_CN.UTF-8 echo "====================================" echo " 微信小程序服务器PM2启动脚本" echo "====================================\n" # 检查当前目录 echo "当前目录: $(pwd)" # 检查是否在正确的项目目录 if [ ! -f "server-mysql.js" ]; then echo "❌ 错误: 请在server-example目录下运行此脚本" echo "请执行: cd /path/to/wechat-app/server-example && bash start-pm2.sh" exit 1 fi # 检查Node.js版本 node_version=$(node -v 2>/dev/null) if [ $? -ne 0 ]; then echo "❌ 错误: Node.js未安装" echo "请运行: sudo npm install -g node" exit 1 fi echo "Node.js版本: $node_version" major_version=$(echo $node_version | sed 's/v//' | cut -d. -f1) if [ $major_version -lt 14 ]; then echo "⚠️ 警告: Node.js版本低于14.x,可能与某些依赖不兼容" fi # 检查PM2是否安装 pm2_version=$(pm2 -v 2>/dev/null) if [ $? -ne 0 ]; then echo "❌ PM2未安装,正在安装..." sudo npm install -g pm2 if [ $? -ne 0 ]; then echo "❌ PM2安装失败,请手动安装: sudo npm install -g pm2" exit 1 fi echo "✅ PM2安装成功,版本: $(pm2 -v)" else echo "PM2版本: $pm2_version" fi # 检查并安装项目依赖 echo "\n检查项目依赖..." if [ ! -d "node_modules" ]; then echo "⚠️ node_modules目录不存在,正在安装依赖..." npm install if [ $? -ne 0 ]; then echo "❌ 依赖安装失败,请检查网络连接或package.json文件" exit 1 fi echo "✅ 依赖安装成功" else echo "✅ node_modules目录已存在" # 更新依赖 echo "正在更新依赖..." npm update fi # 检查.env文件 echo "\n检查.env文件..." if [ ! -f ".env" ]; then echo "❌ .env文件不存在,正在从模板创建..." if [ -f ".env.example.mysql" ]; then cp .env.example.mysql .env echo "✅ 已从.env.example.mysql创建.env文件" echo "请编辑.env文件,填写正确的数据库配置" exit 1 else echo "❌ 无法找到.env.example.mysql模板文件" exit 1 fi else echo "✅ .env文件已存在" # 检查关键环境变量 echo "检查关键环境变量配置..." missing_vars=false # 读取.env文件中的关键变量 db_host=$(grep '^DB_HOST=' .env | cut -d'=' -f2 | tr -d ' "') db_user=$(grep '^DB_USER=' .env | cut -d'=' -f2 | tr -d ' "') db_password=$(grep '^DB_PASSWORD=' .env | cut -d'=' -f2 | tr -d ' "') db_database=$(grep '^DB_DATABASE=' .env | cut -d'=' -f2 | tr -d ' "') port=$(grep '^PORT=' .env | cut -d'=' -f2 | tr -d ' "') # 检查变量是否为空 [ -z "$db_host" ] && echo "❌ DB_HOST未设置" && missing_vars=true [ -z "$db_user" ] && echo "❌ DB_USER未设置" && missing_vars=true [ -z "$db_database" ] && echo "❌ DB_DATABASE未设置" && missing_vars=true [ -z "$port" ] && echo "❌ PORT未设置" && missing_vars=true if [ "$missing_vars" = true ]; then echo "请编辑.env文件,填写完整的配置信息" exit 1 else echo "✅ 关键环境变量已设置" echo " 数据库主机: $db_host" echo " 数据库名: $db_database" echo " 数据库用户: $db_user" echo " 服务器端口: $port" fi fi # 检查PM2配置文件 echo "\n检查PM2配置文件..." if [ ! -f "ecosystem.config.js" ]; then echo "❌ ecosystem.config.js文件不存在,正在创建..." cat > ecosystem.config.js << EOF module.exports = { apps: [ { name: 'wechat-miniprogram-server', script: 'server-mysql.js', instances: 1, autorestart: true, watch: false, max_memory_restart: '1G', env: { NODE_ENV: 'production', PORT: $port }, log_date_format: 'YYYY-MM-DD HH:mm:ss', error_file: './logs/error.log', out_file: './logs/output.log', merge_logs: true, log_file_max_size: '10MB' } ] }; EOF echo "✅ ecosystem.config.js文件创建成功" else echo "✅ ecosystem.config.js文件已存在" fi # 检查日志目录 echo "\n检查日志目录..." if [ ! -d "logs" ]; then echo "⚠️ logs目录不存在,正在创建..." mkdir -p logs echo "✅ logs目录创建成功" else echo "✅ logs目录已存在" fi # 检查端口占用 echo "\n检查端口占用情况..." # 尝试使用lsof检查端口 if command -v lsof >/dev/null 2>&1; then port_used=$(lsof -i :$port 2>/dev/null) if [ -n "$port_used" ]; then echo "❌ 端口 $port 已被占用,进程信息:" echo "$port_used" echo "请先停止占用该端口的进程,或修改.env文件中的PORT配置" exit 1 else echo "✅ 端口 $port 可用" fi else echo "ℹ️ lsof命令不可用,无法检查端口占用情况" fi # 停止已有的PM2实例 echo "\n停止已有的PM2实例(如果有)..." pm2 stop wechat-miniprogram-server 2>/dev/null # 启动应用 echo "\n启动应用..." pm2 start ecosystem.config.js # 检查启动结果 if [ $? -eq 0 ]; then echo "\n✅ 应用启动成功!" echo "====================================" echo "\n应用状态:" pm2 status wechat-miniprogram-server echo "\n操作指南:" echo "1. 查看应用日志: pm2 logs wechat-miniprogram-server" echo "2. 监控应用: pm2 monit" echo "3. 重启应用: pm2 restart wechat-miniprogram-server" echo "4. 设置开机自启: pm2 startup && pm2 save" echo "\n如果遇到问题,请查看详细文档: README_PM2.md" echo "或运行诊断工具: node pm2-debug.js" else echo "\n❌ 应用启动失败!" echo "请查看错误日志: pm2 logs wechat-miniprogram-server --lines 100" echo "或运行诊断工具: node pm2-debug.js" fi # 清理 unset node_version major_version pm2_version db_host db_user db_password db_database port port_used missing_vars