You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
6.0 KiB

3 months ago
#!/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