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:
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
Executable
+128
@@ -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
|
||||
Reference in New Issue
Block a user