feat: 添加PM2和保活监控解决前端崩溃问题

问题:Vite开发服务器经常崩溃导致前端无法访问

解决方案:
1. PM2稳定模式(推荐):
   - ecosystem.config.js: PM2配置文件
   - start_with_pm2.sh: PM2一键启动脚本
   - 自动重启崩溃服务,内存限制500MB(前端)/1GB(后端)
   - 日志管理,所有日志保存到logs目录

2. 保活监控模式(备选):
   - keep_alive.sh: 每10秒检测服务状态
   - 发现崩溃自动重启前端/后端服务

3. 更新README.md:详细说明三种启动方式及优劣

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
This commit is contained in:
2025-12-25 17:41:08 +08:00
co-authored by Claude Sonnet 4.5
parent ef5b45377d
commit 3906e06eef
4 changed files with 299 additions and 2 deletions
+42 -2
View File
@@ -133,10 +133,48 @@ npm run dev
# 访问: http://localhost:5173
```
### 方式三: 一键启动脚本(Mac/Linux,推荐)
### 方式三: 一键启动脚本(Mac/Linux)
#### 🔥 PM2 稳定模式(强烈推荐,生产级)
```bash
# 使用快速启动脚本
# 首次使用需安装 PM2
npm install -g pm2
# 一键启动(自动监控,崩溃自动重启)
./start_with_pm2.sh
# PM2 管理命令
pm2 logs ljwx-stock-frontend # 查看前端日志
pm2 logs ljwx-stock-backend # 查看后端日志
pm2 restart all # 重启所有服务
pm2 stop all # 停止所有服务
pm2 delete all # 删除所有服务
pm2 monit # 实时监控面板
```
**优势**:
- ✅ 自动重启崩溃的服务(前端Vite开发服务器经常崩溃)
- ✅ 日志管理,所有日志保存在 `logs/` 目录
- ✅ 资源限制(前端500MB,后端1GB)
- ✅ 生产级进程管理
#### 基础模式 + 保活监控
```bash
# 终端1:启动应用
./start_app.sh
# 终端2:启动保活监控(推荐,防止前端崩溃)
./keep_alive.sh
```
**保活监控**: 每10秒检测服务状态,崩溃后自动重启
#### 基础模式(不推荐)
```bash
# 启动服务
./start_app.sh
# 停止服务
@@ -146,6 +184,8 @@ npm run dev
./stop_app.sh --all
```
⚠️ **警告**: Vite开发服务器可能会崩溃导致前端无法访问,建议使用PM2模式
**访问地址**:
- 本地访问:
- Frontend: http://localhost:8448
+49
View File
@@ -0,0 +1,49 @@
module.exports = {
apps: [
{
name: 'ljwx-stock-frontend',
cwd: './frontend',
script: 'npm',
args: 'run dev',
env: {
NODE_ENV: 'development',
VITE_API_URL: '/api'
},
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '500M',
error_file: '../logs/frontend-error.log',
out_file: '../logs/frontend-out.log',
log_file: '../logs/frontend-combined.log',
time: true,
merge_logs: true,
min_uptime: '10s',
max_restarts: 10,
restart_delay: 3000
},
{
name: 'ljwx-stock-backend',
cwd: './backend',
script: '.venv/bin/uvicorn',
args: 'main:app --host 0.0.0.0 --port 8028 --reload',
env: {
PYTHONPATH: '.',
PYTHON_ENV: 'development'
},
interpreter: 'none',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '1G',
error_file: '../logs/backend-error.log',
out_file: '../logs/backend-out.log',
log_file: '../logs/backend-combined.log',
time: true,
merge_logs: true,
min_uptime: '10s',
max_restarts: 10,
restart_delay: 3000
}
]
}
Executable
+80
View File
@@ -0,0 +1,80 @@
#!/bin/bash
# ==========================================
# ljwx-stock - 保活监控脚本
# 自动检测并重启崩溃的前端服务
# ==========================================
FRONTEND_PORT=8448
BACKEND_PORT=8028
CHECK_INTERVAL=10 # 每10秒检查一次
# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() {
echo -e "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}
check_and_restart_frontend() {
if ! lsof -Pi :$FRONTEND_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
log "${RED}✗ Frontend service down!${NC}"
log "${YELLOW}→ Restarting frontend...${NC}"
# 清理旧进程
if [ -f ".frontend.pid" ]; then
kill $(cat .frontend.pid) 2>/dev/null || true
rm -f .frontend.pid
fi
# 重启前端
cd frontend
mkdir -p ../logs
npm run dev > ../logs/frontend.log 2>&1 &
echo $! > ../.frontend.pid
cd ..
sleep 5
if lsof -Pi :$FRONTEND_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
log "${GREEN}✓ Frontend restarted successfully${NC}"
else
log "${RED}✗ Frontend restart failed${NC}"
fi
fi
}
check_and_restart_backend() {
if ! lsof -Pi :$BACKEND_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
log "${RED}✗ Backend service down!${NC}"
log "${YELLOW}→ Restarting backend...${NC}"
# 重启后端
cd backend
source .venv/bin/activate
uvicorn main:app --host 0.0.0.0 --port $BACKEND_PORT --reload > ../logs/backend.log 2>&1 &
cd ..
sleep 5
if lsof -Pi :$BACKEND_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
log "${GREEN}✓ Backend restarted successfully${NC}"
else
log "${RED}✗ Backend restart failed${NC}"
fi
fi
}
# 主循环
log "${GREEN}Starting keep-alive monitor...${NC}"
log "Monitoring ports: Frontend=$FRONTEND_PORT, Backend=$BACKEND_PORT"
log "Check interval: ${CHECK_INTERVAL}s"
while true; do
check_and_restart_frontend
check_and_restart_backend
sleep $CHECK_INTERVAL
done
+128
View File
@@ -0,0 +1,128 @@
#!/bin/bash
# ==========================================
# ljwx-stock - PM2 启动脚本(更稳定)
# ==========================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
print_banner() {
echo -e "${CYAN}"
echo "╔════════════════════════════════════════════════════════╗"
echo "║ Claude Stock - PM2 稳定启动模式 ║"
echo "╚════════════════════════════════════════════════════════╝"
echo -e "${NC}"
}
print_step() { echo -e "\n${BLUE}==>${NC} ${CYAN}$1${NC}"; }
print_success() { echo -e "${GREEN}✓${NC} $1"; }
print_error() { echo -e "${RED}✗${NC} $1"; }
print_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
print_msg() { echo -e "${GREEN}[INFO]${NC} $1"; }
# 检查 PM2 是否安装
check_pm2() {
if ! command -v pm2 >/dev/null 2>&1; then
print_error "PM2 not installed"
echo ""
echo "请安装 PM2:"
echo " ${CYAN}npm install -g pm2${NC}"
echo ""
exit 1
fi
print_success "PM2 已安装"
}
# 检查并启动数据库
start_databases() {
print_step "Starting databases..."
# PostgreSQL
if brew services list | grep postgresql@16 | grep started >/dev/null 2>&1; then
print_msg "PostgreSQL already running"
else
brew services start postgresql@16
print_success "PostgreSQL started"
fi
# Redis
if brew services list | grep redis | grep started >/dev/null 2>&1; then
print_msg "Redis already running"
else
brew services start redis
print_success "Redis started"
fi
sleep 2
}
# 创建日志目录
setup_logs() {
mkdir -p logs
print_success "Log directory created"
}
# 启动应用
start_apps() {
print_step "Starting applications with PM2..."
# 停止旧的进程(如果存在)
pm2 delete ljwx-stock-frontend ljwx-stock-backend 2>/dev/null || true
# 使用 PM2 启动
pm2 start ecosystem.config.js
# 保存 PM2 进程列表
pm2 save
print_success "Applications started"
}
# 显示状态
show_status() {
echo ""
print_step "Application Status:"
pm2 list
echo ""
print_step "Access URLs:"
echo " Frontend: ${CYAN}http://localhost:8448${NC}"
echo " Frontend (远程): ${CYAN}http://192.168.1.83:8448${NC}"
echo " Backend: ${CYAN}http://localhost:8028${NC}"
echo " API Docs: ${CYAN}http://localhost:8028/docs${NC}"
echo ""
print_step "PM2 管理命令:"
echo " 查看日志: ${CYAN}pm2 logs ljwx-stock-frontend${NC}"
echo " 重启服务: ${CYAN}pm2 restart ljwx-stock-frontend${NC}"
echo " 停止服务: ${CYAN}pm2 stop all${NC}"
echo " 删除服务: ${CYAN}pm2 delete all${NC}"
echo " 查看监控: ${CYAN}pm2 monit${NC}"
echo ""
}
# 主流程
main() {
print_banner
check_pm2
start_databases
setup_logs
start_apps
show_status
print_success "✅ All services started successfully!"
echo ""
print_msg "PM2 will automatically restart services if they crash"
echo ""
}
main