249 lines
6.7 KiB
Markdown
249 lines
6.7 KiB
Markdown
# Sentry Self-Hosted - 崩溃收集与错误追踪
|
|
|
|
100% 自主可控的崩溃收集与错误追踪系统。
|
|
|
|
## 功能特性
|
|
|
|
- **崩溃收集**: 自动捕获 Flutter + Android/iOS 原生层崩溃
|
|
- **符号化**: 自动解析混淆后的堆栈,定位到源代码
|
|
- **设备信息**: 收集设备型号、系统版本、内存等兼容性信息
|
|
- **性能监控**: 页面加载、API 响应时间等性能指标
|
|
- **Session Replay**: 重放用户操作轨迹(可选)
|
|
- **告警通知**: 崩溃告警推送到邮件/钉钉等
|
|
|
|
## 系统要求
|
|
|
|
- Docker 20.10+
|
|
- Docker Compose v2+
|
|
- **最低 4GB 内存,推荐 8GB+**
|
|
- 约 20GB 磁盘空间
|
|
|
|
## 快速开始
|
|
|
|
### 1. 首次安装
|
|
|
|
```bash
|
|
cd backend/infrastructure/sentry
|
|
|
|
# 初始化 (会创建管理员账号)
|
|
./deploy.sh init
|
|
```
|
|
|
|
按提示输入管理员邮箱和密码。
|
|
|
|
### 2. 启动服务
|
|
|
|
```bash
|
|
./deploy.sh up
|
|
```
|
|
|
|
### 3. 访问 Web UI
|
|
|
|
打开浏览器访问: http://localhost:9000
|
|
|
|
使用初始化时创建的管理员账号登录。
|
|
|
|
### 4. 创建项目
|
|
|
|
1. 登录后点击 "Create Project"
|
|
2. 选择平台: **Flutter**
|
|
3. 记录生成的 **DSN** (Data Source Name)
|
|
|
|
DSN 格式示例:
|
|
```
|
|
http://your_public_key@localhost:9000/project_id
|
|
```
|
|
|
|
## 目录结构
|
|
|
|
```
|
|
sentry/
|
|
├── docker-compose.yml # Docker 编排
|
|
├── deploy.sh # 部署脚本
|
|
├── .env.example # 环境变量模板
|
|
├── sentry.conf.py # Sentry 配置
|
|
├── README.md # 本文档
|
|
│
|
|
├── clickhouse/
|
|
│ └── config.xml # ClickHouse 配置
|
|
│
|
|
├── relay/
|
|
│ ├── config.yml # Relay 配置
|
|
│ └── credentials.json # Relay 凭证
|
|
│
|
|
└── symbolicator/
|
|
└── config.yml # Symbolicator 配置
|
|
```
|
|
|
|
## 常用命令
|
|
|
|
```bash
|
|
# 启动
|
|
./deploy.sh up
|
|
|
|
# 停止
|
|
./deploy.sh down
|
|
|
|
# 查看状态
|
|
./deploy.sh status
|
|
|
|
# 查看日志
|
|
./deploy.sh logs
|
|
./deploy.sh logs sentry-web
|
|
|
|
# 升级
|
|
./deploy.sh upgrade
|
|
```
|
|
|
|
## 架构说明
|
|
|
|
```
|
|
┌─────────────────┐
|
|
│ Flutter App │
|
|
│ sentry_flutter │
|
|
└────────┬────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────────┐
|
|
│ Sentry Relay │
|
|
│ (事件接收网关 :3000) │
|
|
└────────────────────────────────┬────────────────────────────────────┘
|
|
│
|
|
┌───────────────────────┼───────────────────────┐
|
|
│ │ │
|
|
▼ ▼ ▼
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
│ Kafka │ │ Sentry Web │ │ Symbolicator │
|
|
│ (事件队列) │ │ (Web UI :9000) │ │ (符号化服务) │
|
|
└────────┬────────┘ └────────┬────────┘ └─────────────────┘
|
|
│ │
|
|
│ ┌────────┴────────┐
|
|
│ │ │
|
|
▼ ▼ ▼
|
|
┌─────────────────┐ ┌─────────────────┐
|
|
│ ClickHouse │ │ PostgreSQL │
|
|
│ (事件存储) │ │ (元数据) │
|
|
└─────────────────┘ └─────────────────┘
|
|
```
|
|
|
|
## 生产环境配置
|
|
|
|
### 1. 修改密钥
|
|
|
|
编辑 `.env` 文件:
|
|
|
|
```bash
|
|
# 生成强密钥
|
|
SENTRY_SECRET_KEY=$(openssl rand -hex 32)
|
|
SENTRY_DB_PASSWORD=$(openssl rand -hex 16)
|
|
```
|
|
|
|
### 2. 配置域名
|
|
|
|
如果需要公网访问,配置反向代理:
|
|
|
|
```nginx
|
|
# /etc/nginx/conf.d/sentry.conf
|
|
server {
|
|
listen 443 ssl;
|
|
server_name sentry.your-domain.com;
|
|
|
|
ssl_certificate /path/to/cert.pem;
|
|
ssl_certificate_key /path/to/key.pem;
|
|
|
|
location / {
|
|
proxy_pass http://localhost:9000;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
}
|
|
|
|
# Relay 端口 (SDK 上报)
|
|
server {
|
|
listen 443 ssl;
|
|
server_name sentry-relay.your-domain.com;
|
|
|
|
ssl_certificate /path/to/cert.pem;
|
|
ssl_certificate_key /path/to/key.pem;
|
|
|
|
location / {
|
|
proxy_pass http://localhost:3000;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
}
|
|
}
|
|
```
|
|
|
|
### 3. 配置邮件告警
|
|
|
|
编辑 `.env` 文件:
|
|
|
|
```bash
|
|
SENTRY_EMAIL_HOST=smtp.example.com
|
|
SENTRY_EMAIL_PORT=587
|
|
SENTRY_EMAIL_USER=your-email@example.com
|
|
SENTRY_EMAIL_PASSWORD=your-password
|
|
SENTRY_EMAIL_USE_TLS=true
|
|
SENTRY_SERVER_EMAIL=sentry@your-domain.com
|
|
```
|
|
|
|
### 4. 数据保留策略
|
|
|
|
编辑 `sentry.conf.py`:
|
|
|
|
```python
|
|
# 事件保留天数 (默认 90 天)
|
|
SENTRY_OPTIONS["system.event-retention-days"] = 30
|
|
```
|
|
|
|
## Flutter 端集成
|
|
|
|
详见 `frontend/mobile-app` 目录下的集成代码。
|
|
|
|
简要步骤:
|
|
|
|
1. 添加依赖:
|
|
```yaml
|
|
dependencies:
|
|
sentry_flutter: ^8.0.0
|
|
```
|
|
|
|
2. 初始化:
|
|
```dart
|
|
await SentryFlutter.init(
|
|
(options) {
|
|
options.dsn = 'http://your_key@your-server:9000/project_id';
|
|
},
|
|
appRunner: () => runApp(MyApp()),
|
|
);
|
|
```
|
|
|
|
## 故障排查
|
|
|
|
### 服务无法启动
|
|
|
|
检查内存是否足够:
|
|
```bash
|
|
free -h
|
|
docker stats
|
|
```
|
|
|
|
### 事件未上报
|
|
|
|
1. 检查 DSN 是否正确
|
|
2. 检查网络连通性
|
|
3. 查看 Relay 日志: `./deploy.sh logs sentry-relay`
|
|
|
|
### 符号化失败
|
|
|
|
1. 确保上传了符号文件 (Android: mapping.txt, iOS: dSYM)
|
|
2. 检查 Symbolicator 日志: `./deploy.sh logs sentry-symbolicator`
|
|
|
|
## 参考链接
|
|
|
|
- [Sentry 官方文档](https://docs.sentry.io/)
|
|
- [Self-Hosted 安装指南](https://develop.sentry.dev/self-hosted/)
|
|
- [sentry_flutter SDK](https://pub.dev/packages/sentry_flutter)
|