作为一名长期奋战在一线的前端开发者,我深知错误监控对于项目稳定性的重要性。最近在为一个Vite+React项目搭建本地Sentry监控系统时,经历了从环境准备到问题排查的全过程。本文将详细记录这次部署的完整历程,特别是那些官方文档没有提及的"坑"和解决方案。
Sentry作为一款开源的错误监控工具,能够帮助我们实时捕获前端运行时错误、记录完整的堆栈信息,并与具体用户、版本和环境关联。与SaaS版本相比,本地部署的Sentry更适合企业级应用,既能满足数据隐私要求,又能根据业务需求进行深度定制。
在开始部署前,必须确保系统满足以下最低要求:
提示:内存不足是新手最常见的失败原因。在Mac上,可以通过Docker Desktop的Preferences → Resources调整内存分配。
官方推荐的self-hosted仓库包含了完整的部署配置:
bash复制git clone https://github.com/getsentry/self-hosted.git
cd self-hosted
这个仓库实际上是一个Docker Compose项目的模板,包含了Sentry及其所有依赖服务(PostgreSQL、Redis、Kafka、ClickHouse等)的配置。
运行安装脚本将自动完成以下操作:
bash复制./install.sh
这个脚本会:
问题现象:
bash复制#3 ERROR: failed to authorize: DeadlineExceeded: failed to fetch oauth token
解决方案(国内用户特别有用):
bash复制# 创建或修改daemon.json
vim ~/.docker/daemon.json
# 添加以下内容
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.com"
]
}
错误信息:
bash复制FAIL: Required minimum RAM available to Docker is 14000 MB, found 7837 MB
解决方法:
bash复制sudo sysctl vm.swappiness=10
错误信息:
bash复制FAIL: Expected minimum bash version to be 4.4.0 but found 3.2.57(1)-release
完整解决方案:
bash复制# 安装新版Bash
brew install bash
# 验证版本
/opt/homebrew/bin/bash --version
# 设置为默认shell
sudo sh -c 'echo /opt/homebrew/bin/bash >> /etc/shells'
chsh -s /opt/homebrew/bin/bash
# 重新登录后验证
bash --version
Sentry self-hosted实际上是一个微服务架构,包含以下核心组件:
| 服务 | 作用 | 关键依赖 |
|---|---|---|
| Web | 主界面和API入口 | PostgreSQL, Redis |
| Worker | 异步任务处理 | Redis, Kafka |
| Kafka | 消息队列 | Zookeeper |
| ClickHouse | 事件存储和分析 | - |
| Snuba | 查询服务(基于ClickHouse) | ClickHouse |
正确的启动顺序应该是:
错误示例(会导致Web unhealthy):
bash复制# 错误:一次性启动所有服务
docker compose up -d
正确做法:
bash复制# 分阶段启动
docker compose up -d postgres redis zookeeper
docker compose up -d kafka clickhouse
docker compose up -d snuba-api
docker compose run --rm web upgrade
docker compose up -d
即使所有容器都显示为"running",Web服务仍可能处于unhealthy状态。这是因为Docker的健康检查不仅检查进程是否存在,还会检查API端点是否响应。
Web服务健康检查依赖多个底层服务:
完整恢复流程:
bash复制# 1. 停止所有服务
docker compose stop
# 2. 启动基础服务
docker compose up -d postgres redis kafka clickhouse
# 3. 初始化Snuba
docker compose run --rm snuba-api bootstrap --force
# 4. 执行数据库迁移
docker compose run --rm web upgrade
# 5. 启动全部服务
docker compose up -d
这个命令实际上执行了以下操作:
python复制# 伪代码表示实际执行流程
def upgrade():
apply_database_migrations()
create_kafka_topics()
initialize_snuba()
create_default_users()
setup_initial_projects()
推荐方案(保持状态):
bash复制# 暂停服务
docker compose stop
# 恢复服务
docker compose start
替代方案(需要重新初始化):
bash复制# 完整重启流程
docker compose down
docker compose up -d postgres redis kafka clickhouse
docker compose run --rm snuba-api bootstrap --force
docker compose run --rm web upgrade
docker compose up -d
由于Sentry使用多种存储后端,备份需要覆盖:
bash复制# PostgreSQL备份
docker compose exec postgres pg_dump -U postgres sentry > sentry_db.sql
# Redis备份
docker compose exec redis redis-cli SAVE
cp ./data/redis/dump.rdb ./backup/
# ClickHouse备份
docker compose exec clickhouse clickhouse-client --query="BACKUP DATABASE sentry TO Disk('backup', 'sentry_backup')"
建议配置日志聚合:
bash复制# 查看实时日志
docker compose logs -f --tail=100 web
# 导出日志到文件
docker compose logs --no-color > sentry_logs.txt
安装必要的包:
bash复制npm install --save @sentry/react @sentry/tracing
创建sentry.client.config.js:
javascript复制import * as Sentry from '@sentry/react';
import { BrowserTracing } from '@sentry/tracing';
Sentry.init({
dsn: 'http://your-local-sentry-dsn',
integrations: [new BrowserTracing()],
tracesSampleRate: 0.2,
environment: 'development',
release: 'your-project@1.0.0'
});
在vite.config.js中添加:
javascript复制import { sentryVitePlugin } from "@sentry/vite-plugin";
export default {
plugins: [
sentryVitePlugin({
org: "your-org",
project: "your-project",
authToken: process.env.SENTRY_AUTH_TOKEN,
sourcemaps: {
assets: "./dist/**"
}
})
]
}
对于开发环境,推荐的最小资源配置:
| 服务 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| Web | 2 | 4GB | 10GB |
| Worker | 2 | 4GB | - |
| Postgres | 2 | 4GB | 20GB |
| ClickHouse | 4 | 8GB | 50GB |
在.env文件中可以配置:
ini复制# Kafka内存调整
KAFKA_HEAP_OPTS=-Xmx4g -Xms4g
# ClickHouse配置
CLICKHOUSE_MAX_MEMORY_USAGE=8G
CLICKHOUSE_MAX_CONCURRENT_QUERIES=20
bash复制# Web健康检查
curl http://localhost:9000/_health/
# 服务状态API
curl -H "Authorization: Bearer YOUR_TOKEN" \
http://localhost:9000/api/0/relays/status/
在sentry.conf.py中添加:
python复制SENTRY_FEATURES['projects:alert-rules'] = True
# 示例规则:5分钟内相同错误超过10次触发告警
{
"conditions": [
["count()", ">", 10]
],
"actionMatch": "all",
"actions": [
{
"type": "email",
"targetType": "team",
"targetIdentifier": "dev-team"
}
],
"frequency": 5
}
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Web unhealthy | 依赖服务未就绪 | 执行web upgrade |
| 事件延迟 | Kafka积压 | 检查docker compose logs worker |
| 查询超时 | ClickHouse负载高 | 优化查询或扩容 |
| 登录失败 | CSRF配置错误 | 检查SESSION_COOKIE_DOMAIN |
检查Kafka主题:
bash复制docker compose exec kafka kafka-topics --list --bootstrap-server localhost:9092
测试ClickHouse连接:
bash复制docker compose exec clickhouse clickhouse-client --query="SHOW DATABASES"
验证Snuba:
bash复制curl http://localhost:1218/health
经过这次完整的部署实践,我深刻体会到Sentry作为一个企业级监控系统的复杂性。关键在于理解其微服务架构的依赖关系,掌握正确的服务启停顺序,并建立完善的监控机制来确保系统稳定运行。对于前端开发者而言,能够自主搭建和维护这样一套系统,无疑会大大提升项目的可观测性和稳定性保障能力。