275e5cc886
- 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: 故障排查
8.6 KiB
8.6 KiB
故障排查
概述
本文档提供 PR-Helper 常见问题的诊断和解决方案。
快速诊断
健康检查
# 检查服务状态
curl http://localhost:8080/
# 检查数据库连接
curl http://localhost:8080/api/repos
查看日志
# 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
解决方案:
# 查找占用端口的进程
lsof -i :8080
# 终止进程
kill -9 <PID>
# 或使用其他端口
PORT=8081 ./pr-helper
数据库连接失败
错误信息:
failed to initialize database: dial tcp 127.0.0.1:3306: connect: connection refused
解决方案:
# 检查 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'
解决方案:
CREATE DATABASE pr_helper CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
权限问题
错误信息:
permission denied
解决方案:
# 检查文件权限
ls -la pr-helper
# 添加执行权限
chmod +x pr-helper
# 检查数据目录权限
ls -la data/
chmod -R 755 data/
2. 克隆仓库失败
网络连接问题
错误信息:
dial tcp: lookup github.com: no such host
解决方案:
# 检查网络连接
ping github.com
# 检查 DNS
nslookup github.com
# 检查代理设置
echo $HTTP_PROXY
echo $HTTPS_PROXY
认证失败
错误信息:
authentication required
解决方案:
- 确认仓库 URL 正确
- 检查认证类型(none/https)
- 验证用户名和密码
- 对于私有仓库,使用个人访问令牌
磁盘空间不足
错误信息:
no space left on device
解决方案:
# 检查磁盘空间
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
解决方案:
- 访问设置页面
/settings - 配置 LLM API 密钥
- 保存设置
LLM API 调用失败
错误信息:
create stream: Post "https://api.deepseek.com/v1/chat/completions": dial tcp: lookup api.deepseek.com: no such host
解决方案:
# 检查网络连接
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. 前端显示异常
样式丢失
现象:
- 页面布局混乱
- 样式不生效
解决方案:
# 重新编译 Tailwind CSS
npx tailwindcss -i ./static/css/input.css -o ./static/css/style.css --minify
# 清除浏览器缓存
# Chrome: Ctrl+Shift+Delete
JavaScript 错误
现象:
- 功能不工作
- 控制台报错
解决方案:
- 打开浏览器开发者工具 (F12)
- 查看 Console 面板的错误信息
- 检查 Network 面板的请求状态
SSE 连接断开
现象:
- 流式输出中断
- 无响应
解决方案:
# 检查网络连接
ping localhost
# 检查防火墙
sudo ufw status
# 检查 Nginx 配置(如果有)
# 确保 proxy_buffering off;
6. 数据库问题
连接数过多
错误信息:
too many connections
解决方案:
-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';
-- 增加最大连接数
SET GLOBAL max_connections = 200;
-- 或修改 my.cnf
-- max_connections = 200
查询缓慢
现象:
- API 响应慢
- 页面加载超时
解决方案:
-- 查看慢查询
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
解决方案:
# 从备份恢复
mysql -u root -p pr_helper < backup.sql
# 或重新初始化
# 删除数据库并重启服务
7. Docker 问题
容器无法启动
错误信息:
Error response from daemon: driver failed programming external connectivity
解决方案:
# 重启 Docker 服务
sudo systemctl restart docker
# 清理停止的容器
docker container prune
# 重新启动
docker compose up -d
数据持久化问题
现象:
- 重启后数据丢失
解决方案:
# 确保 docker-compose.yml 中配置了 volumes
services:
app:
volumes:
- app-data:/app/data
db:
volumes:
- mysql-data:/var/lib/mysql
volumes:
app-data:
mysql-data:
网络问题
现象:
- 容器间无法通信
解决方案:
# 检查网络
docker network ls
docker network inspect pr-helper_default
# 重启网络
docker compose down
docker compose up -d
性能问题
1. 内存使用过高
诊断:
# 查看内存使用
free -h
top -o %MEM
# 查看进程内存
ps aux | grep pr-helper
解决方案:
- 减少并发数
- 限制 Top-N
- 增加系统内存
2. CPU 使用过高
诊断:
# 查看 CPU 使用
top -o %CPU
htop
解决方案:
- 减少并发数
- 优化数据库查询
- 使用更快的 LLM API
3. 磁盘 I/O 过高
诊断:
# 查看磁盘 I/O
iostat -x 1
iotop
解决方案:
- 使用 SSD
- 优化数据库索引
- 定期清理旧数据
安全问题
1. 未授权访问
现象:
- 陌生人访问了服务
解决方案:
- 配置防火墙
- 使用反向代理认证
- 不要暴露到公网
2. SQL 注入
预防:
- 使用参数化查询
- 验证输入数据
- 限制数据库权限
3. XSS 攻击
预防:
- 转义输出内容
- 使用 CSP 头
- 验证输入数据
调试工具
1. 日志级别
# 设置调试模式
GIN_MODE=debug ./pr-helper
# 查看详细日志
./pr-helper 2>&1 | tee debug.log
2. 数据库调试
# 连接数据库
mysql -u root -p pr_helper
# 查看表结构
DESCRIBE analyses;
# 查看数据
SELECT * FROM analyses LIMIT 10;
# 查看慢查询
SHOW PROCESSLIST;
3. 网络调试
# 测试 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. 前端调试
// 在浏览器控制台中
console.log('Debug info');
// 查看 SSE 连接
// Network 面板 → EventStream
// 查看 HTMX 请求
// Network 面板 → XHR
获取帮助
1. 收集信息
在报告问题时,请提供:
- 错误信息
- 复现步骤
- 环境信息(OS、Go 版本、MySQL 版本)
- 日志输出
- 配置文件(去除敏感信息)
2. 检查已知问题
# 查看 GitHub Issues
# https://github.com/your-org/pr-helper/issues
# 搜索类似问题
# 使用关键词搜索
3. 社区支持
- GitHub Issues: 报告 Bug
- GitHub Discussions: 提问和讨论
- Stack Overflow: 技术问题
预防措施
1. 定期备份
# 每日备份
0 2 * * * /opt/pr-helper/backup.sh
2. 监控告警
- 设置资源使用告警
- 监控错误率
- 监控响应时间
3. 更新维护
- 定期更新依赖
- 应用安全补丁
- 测试新版本
4. 文档记录
- 记录配置变更
- 记录故障处理
- 更新运维手册