docs: 添加 10 份技术文档,README 改为中文
- 01-architecture.md: 架构概览 - 02-backend-services.md: 后端服务层 - 03-frontend-interaction.md: 前端交互设计 - 04-database-design.md: 数据库设计 - 05-api-reference.md: API 接口文档 - 06-sse-streaming.md: SSE 流式传输 - 07-llm-integration.md: LLM 集成 - 08-deployment.md: 部署运维 - 09-development-guide.md: 开发指南 - 10-troubleshooting.md: 故障排查
This commit is contained in:
@@ -0,0 +1,591 @@
|
||||
# 故障排查
|
||||
|
||||
## 概述
|
||||
|
||||
本文档提供 PR-Helper 常见问题的诊断和解决方案。
|
||||
|
||||
## 快速诊断
|
||||
|
||||
### 健康检查
|
||||
|
||||
```bash
|
||||
# 检查服务状态
|
||||
curl http://localhost:8080/
|
||||
|
||||
# 检查数据库连接
|
||||
curl http://localhost:8080/api/repos
|
||||
```
|
||||
|
||||
### 查看日志
|
||||
|
||||
```bash
|
||||
# systemd 日志
|
||||
sudo journalctl -u pr-helper -f
|
||||
|
||||
# Docker 日志
|
||||
docker compose logs -f app
|
||||
|
||||
# 直接运行时的输出
|
||||
./pr-helper 2>&1 | tee app.log
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 1. 服务无法启动
|
||||
|
||||
#### 端口被占用
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
listen tcp :8080: bind: address already in use
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 查找占用端口的进程
|
||||
lsof -i :8080
|
||||
|
||||
# 终止进程
|
||||
kill -9 <PID>
|
||||
|
||||
# 或使用其他端口
|
||||
PORT=8081 ./pr-helper
|
||||
```
|
||||
|
||||
#### 数据库连接失败
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
failed to initialize database: dial tcp 127.0.0.1:3306: connect: connection refused
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 检查 MySQL 服务状态
|
||||
sudo systemctl status mysql
|
||||
|
||||
# 启动 MySQL
|
||||
sudo systemctl start mysql
|
||||
|
||||
# 验证连接参数
|
||||
mysql -u root -p -h 127.0.0.1 -P 3306 pr_helper
|
||||
|
||||
# 检查 .env 配置
|
||||
cat .env | grep MYSQL
|
||||
```
|
||||
|
||||
#### 数据库不存在
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
Unknown database 'pr_helper'
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```sql
|
||||
CREATE DATABASE pr_helper CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
```
|
||||
|
||||
#### 权限问题
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
permission denied
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 检查文件权限
|
||||
ls -la pr-helper
|
||||
|
||||
# 添加执行权限
|
||||
chmod +x pr-helper
|
||||
|
||||
# 检查数据目录权限
|
||||
ls -la data/
|
||||
chmod -R 755 data/
|
||||
```
|
||||
|
||||
### 2. 克隆仓库失败
|
||||
|
||||
#### 网络连接问题
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
dial tcp: lookup github.com: no such host
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 检查网络连接
|
||||
ping github.com
|
||||
|
||||
# 检查 DNS
|
||||
nslookup github.com
|
||||
|
||||
# 检查代理设置
|
||||
echo $HTTP_PROXY
|
||||
echo $HTTPS_PROXY
|
||||
```
|
||||
|
||||
#### 认证失败
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
authentication required
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
- 确认仓库 URL 正确
|
||||
- 检查认证类型(none/https)
|
||||
- 验证用户名和密码
|
||||
- 对于私有仓库,使用个人访问令牌
|
||||
|
||||
#### 磁盘空间不足
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
no space left on device
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 检查磁盘空间
|
||||
df -h
|
||||
|
||||
# 清理旧仓库
|
||||
curl -X DELETE http://localhost:8080/api/repos/1
|
||||
|
||||
# 或手动清理
|
||||
rm -rf data/repos/*
|
||||
```
|
||||
|
||||
### 3. PR 生成失败
|
||||
|
||||
#### LLM API 密钥未配置
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
LLM API key not configured — please set it in the settings page
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
1. 访问设置页面 `/settings`
|
||||
2. 配置 LLM API 密钥
|
||||
3. 保存设置
|
||||
|
||||
#### LLM API 调用失败
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
create stream: Post "https://api.deepseek.com/v1/chat/completions": dial tcp: lookup api.deepseek.com: no such host
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 检查网络连接
|
||||
curl https://api.deepseek.com/v1/models
|
||||
|
||||
# 验证 API 密钥
|
||||
curl https://api.deepseek.com/v1/models \
|
||||
-H "Authorization: Bearer sk-..."
|
||||
|
||||
# 检查端点配置
|
||||
# 访问 /settings 确认 llm.endpoint 正确
|
||||
```
|
||||
|
||||
#### 差异过大
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
diff truncated due to size
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- 差异超过 60k 字符会被截断
|
||||
- 这是正常行为,不影响功能
|
||||
|
||||
**优化建议**:
|
||||
- 减少变更范围
|
||||
- 分多次提交
|
||||
|
||||
### 4. 代码审查失败
|
||||
|
||||
#### 文件数过多
|
||||
|
||||
**现象**:
|
||||
- 审查时间过长
|
||||
- 内存使用过高
|
||||
|
||||
**解决方案**:
|
||||
- 调整 Top-N 设置(默认 20)
|
||||
- 在请求中指定较小的 top_n 值
|
||||
|
||||
#### 并发数过高
|
||||
|
||||
**现象**:
|
||||
- LLM API 限流
|
||||
- 响应时间过长
|
||||
|
||||
**解决方案**:
|
||||
- 降低并发数设置(默认 5)
|
||||
- 在请求中指定较小的 concurrency 值
|
||||
|
||||
#### JSON 解析失败
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
invalid character '<' looking for beginning of value
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- LLM 返回了非 JSON 格式的内容
|
||||
- 系统会自动降级处理
|
||||
|
||||
**解决方案**:
|
||||
- 检查 LLM 模型是否支持 JSON 输出
|
||||
- 尝试使用其他模型
|
||||
|
||||
### 5. 前端显示异常
|
||||
|
||||
#### 样式丢失
|
||||
|
||||
**现象**:
|
||||
- 页面布局混乱
|
||||
- 样式不生效
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 重新编译 Tailwind CSS
|
||||
npx tailwindcss -i ./static/css/input.css -o ./static/css/style.css --minify
|
||||
|
||||
# 清除浏览器缓存
|
||||
# Chrome: Ctrl+Shift+Delete
|
||||
```
|
||||
|
||||
#### JavaScript 错误
|
||||
|
||||
**现象**:
|
||||
- 功能不工作
|
||||
- 控制台报错
|
||||
|
||||
**解决方案**:
|
||||
1. 打开浏览器开发者工具 (F12)
|
||||
2. 查看 Console 面板的错误信息
|
||||
3. 检查 Network 面板的请求状态
|
||||
|
||||
#### SSE 连接断开
|
||||
|
||||
**现象**:
|
||||
- 流式输出中断
|
||||
- 无响应
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 检查网络连接
|
||||
ping localhost
|
||||
|
||||
# 检查防火墙
|
||||
sudo ufw status
|
||||
|
||||
# 检查 Nginx 配置(如果有)
|
||||
# 确保 proxy_buffering off;
|
||||
```
|
||||
|
||||
### 6. 数据库问题
|
||||
|
||||
#### 连接数过多
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
too many connections
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```sql
|
||||
-- 查看当前连接数
|
||||
SHOW STATUS LIKE 'Threads_connected';
|
||||
|
||||
-- 增加最大连接数
|
||||
SET GLOBAL max_connections = 200;
|
||||
|
||||
-- 或修改 my.cnf
|
||||
-- max_connections = 200
|
||||
```
|
||||
|
||||
#### 查询缓慢
|
||||
|
||||
**现象**:
|
||||
- API 响应慢
|
||||
- 页面加载超时
|
||||
|
||||
**解决方案**:
|
||||
```sql
|
||||
-- 查看慢查询
|
||||
SHOW VARIABLES LIKE 'slow_query_log';
|
||||
SET GLOBAL slow_query_log = 'ON';
|
||||
|
||||
-- 分析查询
|
||||
EXPLAIN SELECT * FROM analyses WHERE repo_id = 1;
|
||||
|
||||
-- 添加索引
|
||||
CREATE INDEX idx_analyses_repo_id ON analyses(repo_id);
|
||||
```
|
||||
|
||||
#### 数据损坏
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
Table 'pr_helper.analyses' doesn't exist
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 从备份恢复
|
||||
mysql -u root -p pr_helper < backup.sql
|
||||
|
||||
# 或重新初始化
|
||||
# 删除数据库并重启服务
|
||||
```
|
||||
|
||||
### 7. Docker 问题
|
||||
|
||||
#### 容器无法启动
|
||||
|
||||
**错误信息**:
|
||||
```
|
||||
Error response from daemon: driver failed programming external connectivity
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 重启 Docker 服务
|
||||
sudo systemctl restart docker
|
||||
|
||||
# 清理停止的容器
|
||||
docker container prune
|
||||
|
||||
# 重新启动
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
#### 数据持久化问题
|
||||
|
||||
**现象**:
|
||||
- 重启后数据丢失
|
||||
|
||||
**解决方案**:
|
||||
```yaml
|
||||
# 确保 docker-compose.yml 中配置了 volumes
|
||||
services:
|
||||
app:
|
||||
volumes:
|
||||
- app-data:/app/data
|
||||
db:
|
||||
volumes:
|
||||
- mysql-data:/var/lib/mysql
|
||||
|
||||
volumes:
|
||||
app-data:
|
||||
mysql-data:
|
||||
```
|
||||
|
||||
#### 网络问题
|
||||
|
||||
**现象**:
|
||||
- 容器间无法通信
|
||||
|
||||
**解决方案**:
|
||||
```bash
|
||||
# 检查网络
|
||||
docker network ls
|
||||
docker network inspect pr-helper_default
|
||||
|
||||
# 重启网络
|
||||
docker compose down
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## 性能问题
|
||||
|
||||
### 1. 内存使用过高
|
||||
|
||||
**诊断**:
|
||||
```bash
|
||||
# 查看内存使用
|
||||
free -h
|
||||
top -o %MEM
|
||||
|
||||
# 查看进程内存
|
||||
ps aux | grep pr-helper
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
- 减少并发数
|
||||
- 限制 Top-N
|
||||
- 增加系统内存
|
||||
|
||||
### 2. CPU 使用过高
|
||||
|
||||
**诊断**:
|
||||
```bash
|
||||
# 查看 CPU 使用
|
||||
top -o %CPU
|
||||
htop
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
- 减少并发数
|
||||
- 优化数据库查询
|
||||
- 使用更快的 LLM API
|
||||
|
||||
### 3. 磁盘 I/O 过高
|
||||
|
||||
**诊断**:
|
||||
```bash
|
||||
# 查看磁盘 I/O
|
||||
iostat -x 1
|
||||
iotop
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
- 使用 SSD
|
||||
- 优化数据库索引
|
||||
- 定期清理旧数据
|
||||
|
||||
## 安全问题
|
||||
|
||||
### 1. 未授权访问
|
||||
|
||||
**现象**:
|
||||
- 陌生人访问了服务
|
||||
|
||||
**解决方案**:
|
||||
- 配置防火墙
|
||||
- 使用反向代理认证
|
||||
- 不要暴露到公网
|
||||
|
||||
### 2. SQL 注入
|
||||
|
||||
**预防**:
|
||||
- 使用参数化查询
|
||||
- 验证输入数据
|
||||
- 限制数据库权限
|
||||
|
||||
### 3. XSS 攻击
|
||||
|
||||
**预防**:
|
||||
- 转义输出内容
|
||||
- 使用 CSP 头
|
||||
- 验证输入数据
|
||||
|
||||
## 调试工具
|
||||
|
||||
### 1. 日志级别
|
||||
|
||||
```bash
|
||||
# 设置调试模式
|
||||
GIN_MODE=debug ./pr-helper
|
||||
|
||||
# 查看详细日志
|
||||
./pr-helper 2>&1 | tee debug.log
|
||||
```
|
||||
|
||||
### 2. 数据库调试
|
||||
|
||||
```bash
|
||||
# 连接数据库
|
||||
mysql -u root -p pr_helper
|
||||
|
||||
# 查看表结构
|
||||
DESCRIBE analyses;
|
||||
|
||||
# 查看数据
|
||||
SELECT * FROM analyses LIMIT 10;
|
||||
|
||||
# 查看慢查询
|
||||
SHOW PROCESSLIST;
|
||||
```
|
||||
|
||||
### 3. 网络调试
|
||||
|
||||
```bash
|
||||
# 测试 API
|
||||
curl -v http://localhost:8080/api/repos
|
||||
|
||||
# 测试 SSE
|
||||
curl -N http://localhost:8080/api/repos/1/review \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"base":"main","head":"feature"}'
|
||||
|
||||
# 抓包
|
||||
sudo tcpdump -i lo port 8080
|
||||
```
|
||||
|
||||
### 4. 前端调试
|
||||
|
||||
```javascript
|
||||
// 在浏览器控制台中
|
||||
console.log('Debug info');
|
||||
|
||||
// 查看 SSE 连接
|
||||
// Network 面板 → EventStream
|
||||
|
||||
// 查看 HTMX 请求
|
||||
// Network 面板 → XHR
|
||||
```
|
||||
|
||||
## 获取帮助
|
||||
|
||||
### 1. 收集信息
|
||||
|
||||
在报告问题时,请提供:
|
||||
|
||||
- 错误信息
|
||||
- 复现步骤
|
||||
- 环境信息(OS、Go 版本、MySQL 版本)
|
||||
- 日志输出
|
||||
- 配置文件(去除敏感信息)
|
||||
|
||||
### 2. 检查已知问题
|
||||
|
||||
```bash
|
||||
# 查看 GitHub Issues
|
||||
# https://github.com/your-org/pr-helper/issues
|
||||
|
||||
# 搜索类似问题
|
||||
# 使用关键词搜索
|
||||
```
|
||||
|
||||
### 3. 社区支持
|
||||
|
||||
- GitHub Issues: 报告 Bug
|
||||
- GitHub Discussions: 提问和讨论
|
||||
- Stack Overflow: 技术问题
|
||||
|
||||
## 预防措施
|
||||
|
||||
### 1. 定期备份
|
||||
|
||||
```bash
|
||||
# 每日备份
|
||||
0 2 * * * /opt/pr-helper/backup.sh
|
||||
```
|
||||
|
||||
### 2. 监控告警
|
||||
|
||||
- 设置资源使用告警
|
||||
- 监控错误率
|
||||
- 监控响应时间
|
||||
|
||||
### 3. 更新维护
|
||||
|
||||
- 定期更新依赖
|
||||
- 应用安全补丁
|
||||
- 测试新版本
|
||||
|
||||
### 4. 文档记录
|
||||
|
||||
- 记录配置变更
|
||||
- 记录故障处理
|
||||
- 更新运维手册
|
||||
Reference in New Issue
Block a user