jiachenlong/docs/BACKEND_SERVICE_GUIDE.md

292 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 后端服务守护进程配置指南
**配置时间**: 2026-03-14
**版本**: v2.7.4
---
## 🔍 后端不稳定原因分析
### 可能原因
1. **手动启动无守护** - 之前使用 `nohup` 但没有监控
2. **服务器重启** - 服务器重启后需要手动启动
3. **内存不足** - 检查发现内存充足 (3.5GB 可用 1.5GB)
4. **磁盘空间** - 检查发现磁盘充足 (49GB 可用 31GB)
5. **进程意外终止** - 可能因系统资源调度被 kill
### 日志分析
检查 `/tmp/zodiac-backend.log` 发现:
- ✅ 没有 Python 异常
- ✅ 没有内存溢出
- ✅ 没有数据库连接错误
- ✅ 服务正常运行直到意外停止
**结论**: 进程缺少守护机制,意外停止后无法自动恢复
---
## ✅ 解决方案:双重守护
### 方案 1: 启动脚本 + Crontab 监控(已配置)
**启动脚本**: `/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh`
**功能**:
- ✅ 检查进程是否已在运行
- ✅ 停止旧进程
- ✅ 启动新进程
- ✅ 保存 PID 到文件
- ✅ 验证启动是否成功
**Crontab 监控**: 每 2 分钟检查一次
```bash
*/2 * * * * if ! ps aux | grep -v grep | grep 'uvicorn app.main:app' > /dev/null; then
/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh >> /tmp/backend-watch.log 2>&1;
fi
```
**优点**:
- 简单可靠
- 自动恢复
- 日志记录
---
### 方案 2: systemd 服务(备选)
如果 crontab 方案不可靠,可以使用 systemd
**服务文件**: `/etc/systemd/system/zodiac-backend.service`
```ini
[Unit]
Description=甲辰藏品管理系统 FastAPI 后端服务
After=network.target
[Service]
Type=simple
User=admin
WorkingDirectory=/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi
ExecStart=/usr/local/python3.12/bin/python3.12 -m uvicorn app.main:app --port 3000 --host 0.0.0.0
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
```
**启用命令**:
```bash
sudo systemctl daemon-reload
sudo systemctl enable zodiac-backend
sudo systemctl start zodiac-backend
```
---
## 📋 使用指南
### 启动服务
```bash
# 方法 1: 使用启动脚本
/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh
# 方法 2: 手动启动
cd /home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi
nohup /usr/local/python3.12/bin/python3.12 -m uvicorn app.main:app --port 3000 --host 0.0.0.0 > /tmp/zodiac-backend.log 2>&1 &
```
### 停止服务
```bash
# 方法 1: 使用 PID 文件
kill $(cat /tmp/zodiac-backend.pid)
# 方法 2: 杀死进程
pkill -f "uvicorn app.main:app"
```
### 查看状态
```bash
# 查看进程
ps aux | grep uvicorn
# 查看日志
tail -f /tmp/zodiac-backend.log
# 查看监控日志
tail -f /tmp/backend-watch.log
```
### 重启服务
```bash
pkill -f "uvicorn app.main:app"
sleep 2
/home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh
```
---
## 🔧 故障排查
### 问题 1: 服务无法启动
**检查端口占用**:
```bash
netstat -tlnp | grep 3000
# 如果占用,杀死进程
kill -9 $(lsof -t -i:3000)
```
**检查 Python 路径**:
```bash
which python3.12
# 应该是:/usr/local/python3.12/bin/python3.12
```
**检查依赖**:
```bash
cd /home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi
pip3 list | grep -i "fastapi\|uvicorn\|sqlalchemy"
```
### 问题 2: 服务频繁重启
**查看监控日志**:
```bash
tail -100 /tmp/backend-watch.log
```
**查看系统日志**:
```bash
dmesg | grep -i "killed\|oom"
```
**检查资源使用**:
```bash
free -h
df -h
top -bn1 | head -20
```
### 问题 3: Crontab 不执行
**检查 crontab 配置**:
```bash
crontab -l
```
**检查 cron 服务**:
```bash
systemctl status crond
```
**查看 cron 日志**:
```bash
tail -f /var/log/cron
```
---
## 📊 监控指标
### 进程状态
```bash
# 进程是否在运行
ps aux | grep uvicorn | grep -v grep | wc -l
# 应该返回1
```
### 服务响应
```bash
# 测试 API 响应
curl -s http://localhost:3000/api/auth/login -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin&password=admin123" | python3 -c "import sys,json; d=json.load(sys.stdin); print('正常' if 'access_token' in d else '异常')"
```
### 日志大小
```bash
# 检查日志文件大小
ls -lh /tmp/zodiac-backend.log
# 如果>100MB考虑轮转
```
---
## 🎯 最佳实践
### 1. 定期重启
建议每周重启一次服务,释放内存:
```bash
# 添加到 crontab
0 3 * * 0 pkill -f "uvicorn app.main:app" && sleep 2 && /home/admin/.openclaw/workspace/zodiac-collector/backend-fastapi/start.sh
```
### 2. 日志轮转
创建 `/etc/logrotate.d/zodiac-backend`:
```
/tmp/zodiac-backend.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 admin admin
}
```
### 3. 监控告警
可以添加简单的告警脚本:
```bash
#!/bin/bash
if ! curl -s http://localhost:3000/health > /dev/null; then
echo "后端服务异常!" | mail -s "告警:后端服务宕机" admin@example.com
fi
```
---
## 📝 配置文件清单
| 文件 | 路径 | 说明 |
|------|------|------|
| **启动脚本** | `backend-fastapi/start.sh` | 服务启动脚本 |
| **PID 文件** | `/tmp/zodiac-backend.pid` | 进程 ID |
| **日志文件** | `/tmp/zodiac-backend.log` | 运行日志 |
| **监控日志** | `/tmp/backend-watch.log` | 监控日志 |
| **Crontab** | `crontab -l` | 定时任务 |
---
## ✅ 验证清单
- [x] 启动脚本已创建
- [x] 脚本权限已设置 (chmod +x)
- [x] Crontab 监控已配置
- [x] 服务正在运行
- [x] API 响应正常
- [ ] systemd 服务(备选)
- [ ] 日志轮转配置
- [ ] 监控告警配置
---
**配置完成!后端服务现在具有自动恢复能力!** 🎉