美文网首页
Sentry 完全离线部署

Sentry 完全离线部署

作者: luckriver | 来源:发表于2023-11-06 16:15 被阅读0次

    Sentry 离线部署

    此篇为 Sentry 完全离线部署的操作步骤,来源于自己在一个无网络的 linux 系统中实际操作的总结。主要是一些踩坑的记录和操作手法,留作日后参考。

    Sentry 的基本部署方法

    首先,如果想在自己的环境中部署 Sentry,完全可以按照官网指南操作即可Self-Hosted Sentry

    self_hosted.png

    我已经在一台有网络的环境下部署了 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 界面和业务方发送的异常信息

    相关文章

      网友评论

          本文标题:Sentry 完全离线部署

          本文链接:https://www.haomeiwen.com/subject/xlqxwdtx.html