Sentry 离线部署
此篇为 Sentry 完全离线部署的操作步骤,来源于自己在一个无网络的 linux 系统中实际操作的总结。主要是一些踩坑的记录和操作手法,留作日后参考。
Sentry 的基本部署方法
首先,如果想在自己的环境中部署 Sentry,完全可以按照官网指南操作即可Self-Hosted Sentry
我已经在一台有网络的环境下部署了 sentry(23.7.1)并且已经正常运行了一段时间。 现在需要在一台没有网络的环境下安装 sentry。
下面是一些具体的操作步骤。
离线导出/导入镜像
官方的 self hosted 的版本最终安装后是运行 docker 上的。因为很自然的想到把镜像单独导出来,然后上传到新的服务器上,再进行导入操作。
因为 sentry 的服务很多,这里采用的是分批导出的方式
docker save -o common.tar redis:6.2.12-alpine clickhouse-self-hosted-local confluentinc/cp-zookeeper:5.5.7
在远端服务器上导入镜像
docker load -i common.tar
这里需要注意的是,由于我们是在一个已经运行起来的 sentry中导出的镜像,需要连带将sentry 的安装目录一起拷贝到新的环境,这里是 self-hosted-23.7.1
目录下的所有文件。这个目录也是后面运行 docker-compose 的目录。
启动 Sentry
现在就可以通过 docker-compose up -d
来启动 Sentry 服务了。这个启动和运行过程就是一个不断解决问题的过程。
报错 external volume sentry-kafka not found
这个比较好理解,我们在一台新的机器上,需要的卷肯定是没有的,用如下命令创建。
docker volume create sentry-kafka
之后通过 ls 可以查看是否创建成功
docker volumne ls
启动postgres 报错
错误如下
cp: cannot stat /opt/sentry/wal2json/wal2json.so, no such file or directory
这个报错主要还是因为之前用的 sentry 的安装包是全新的,不是从之前机器上拷贝出来的,因此这些文件都没有。如果使用的是从之前机器上拷贝的安装目录,就不会有这个问题的。
那这些确失的文件是哪来的呢,我们可以看下安装目录下的 install/install-wal2json.sh
mkdir -p "$WAL2JSON_DIR"
if [ ! -f "$WAL2JSON_DIR/$VERSION/$FILE_NAME" ]; then
mkdir -p "$WAL2JSON_DIR/$VERSION"
docker_curl -L \
"https://github.com/getsentry/wal2json/releases/download/$VERSION/$FILE_NAME" \
>"$WAL2JSON_DIR/$VERSION/$FILE_NAME"
fi
可以看出,正常能使用 install.sh
安装的情况下,会从网络上下载对应的文件。
table sentry_relay does not exist
这还是一个关于 Postgres 的报错。看起来是相应的数据库表不存在,应该是数据库没有做正确的初始化。
还是参考 install/set-up-and-migrate-database.sh
数据库初始化脚本
if [[ -n "${CI:-}" || "${SKIP_USER_CREATION:-0}" == 1 ]]; then
$dcr web upgrade --noinput
echo ""
echo "Did not prompt for user creation. Run the following command to create one"
echo "yourself (recommended):"
echo ""
echo " $dc_base run --rm web createuser"
echo ""
else
$dcr web upgrade
fi
$dcr
是一个变量,其实就是
这里最关键的就是需要运行
docker-compose run --rm web upgrade
运行完之后可以去 postgres 容器上确认一下
可以看到表已经创建出来了
Postgres tables.png
其他
出现的各种问题总结下来其实都和初始化相关,参考一下 install.sh 会有一些思路。
比如如果出现 kafka topic 没有创建的问题,运行一下 install/create-kafka-topics.sh
就可以了。
Nginx 转发的配置
Sentry 启动之后,我想把它放在已有域名的目录下进行访问,应该如何配置 nginx?
首先说这种转发的方式并不是官方推荐的,只是在一个网络受限的环境中不得以采用的访问方法。
为了让 sentry 的管理界面能够正常显示到域名的 sentry/ 路径下,在 nginx 相应的配置下增加如下
转发配置
注意这些路径是否和自己已有路径冲突,不要覆盖自己正常业务的访问。
另外就是要修改 sentry 自身的配置。sentry 的配置一般放在两个文件中,一个是 config.yml
, 另外一个是 sentry.conf.py
。如果是自定义的域名,首先要修改的就是 config.yml 的如下配置。
system.url-prefix: 'http://test.com/sentry'
转发后出现的问题
其实依然是和初始化相关的问题
-
clickhouse
报错table default.errors_local does not exist
,解决办法 参考install/bootstrap-snuba.sh
期间还遇到一个比较诡异的问题,sentry 管理界面进去之后,不能加载 issues 页面,访问接口 500。看日志发现入口容器 self-host-web
报错, 连不上 127.0.0.1:1218
。通过配置知道 1218 是 snuba-api
的接口,但是不知道为什么 snuba-api 解析到了 127.0.0.1
上去了。 通过一番调试后发现 docker-compose.yml
中定义的环境变量没有传递到容器内。 原来是自己在 yml 文件的 web 下添加了一个环境变量,导致最上层的环境变量不能传递进来
command: ["run", "web"]
environment:
PYTHONUSERBASE: "/data/custom-packages"
SENTRY_CONF: "/etc/sentry"
SNUBA: "http://snuba-api:1218"
VROOM: "http://vroom:8085"
DSN 的配置
最后需要验证的就是业务的异常能不能正常发送给 sentry 了。管理后台给出的 DSN 一般格式是 http://47279ec255024a269b4cfa3c9744aa14@test.com/sentry:9000/7这样的链接,但是使用时需要考虑业务所在的环境是否可以通过 test.com/sentry 正常发送数据。
由于之前已经申请了业务方所在的 pod(没错,这里是 k8s 环境) 和 sentry 安装机器的 9000 端口能直接通信,所以另外一种方案就是直接通过 ip 进行发送,比如 http://47279ec255024a269b4cfa3c9744aa14@192.168.0.2:9000/7
实际通过验证发现,通过域名发送会在 sentry 端报错,而 ip 直连的方式可以正常发送异常给 sentry。
通过以上一些配置,最后终于能在域名下看到了 sentry 界面和业务方发送的异常信息
网友评论