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
199 lines
6.0 KiB
#!/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
|