项目之前使用的是Sentry官方提供的付费服务,但是因为我们在国内,访问比较慢,体验很糟糕。Sentry本身就是开源的,打算自己动手搭建一个,老板就把这个光荣的任务交给我,Fight~~~
配置环境一直是一个比较繁琐的事情,还好现在容器盛行,我计划就是直接使用 Docker 来启动 Sentry 的服务。
Docker 安装
不得不说现在 Docker 的生态链比2014年我刚了解这个工具的时候好太多了,现在安装 Docker 也很简单。
系统源里面可能有 Docker,但是我喜欢使用最新版软件,于是打算从官网下载安装。但是现在已经有了Get Docker,打开这个网页,复制一行命令,再终端执行,OK,Docker 安装完成。
如果服务器的用户权限不是 root 的话,每次调用 docker 的命令需要加 sudo,有些人可能觉得这个很烦。
可以添加一个 docker 组来解决这个问题。参见:https://docs.docker.com/engine/installation/linux/ubuntulinux/#/create-a-docker-group
Sentry 安装
Sentry 在 DockerHub 上有官方的镜像,这个就大大方便了我们。
Sentry Official https://hub.docker.com/_/sentry/
核心的流程如下:
启动Sentry需要的Redis实例
docker run -d --name sentry-redis redis
启动Sentry需要的PostgreSQL实例
docker run -d --name sentry-postgres -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=sentry postgres
生成 SENTRY_SECRET_KEY
docker run --rm sentry config generate-secret-key
这个生成的 SENTRY_SECRET_KEY 需要记住,后面都要用到
初始化数据库
docker run -it --rm -e SENTRY_SECRET_KEY='<secret-key>' --link sentry-postgres:postgres --link sentry-redis:redis sentry upgrade
这里需要使用刚才生成的 SENTRY_SECRET_KEY。这个操作会在PostgresQL里面初始化表信息。
启动Sentry的Web服务
docker run -d -p 80:9000 --name my-sentry -e SENTRY_SECRET_KEY='<secret-key>' --link sentry-redis:redis --link sentry-postgres:postgres sentry
-p 参数设置实例暴露的端口号,我这台机器只跑这个就直接占了80端口。
启动Sentry的Worker
docker run -d --name sentry-cron -e SENTRY_SECRET_KEY='<secret-key>' --link sentry-postgres:postgres --link sentry-redis:redis sentry run cron
docker run -d --name sentry-worker-1 -e SENTRY_SECRET_KEY='<secret-key>' --link sentry-postgres:postgres --link sentry-redis:redis sentry run worker
worker 和 celery beat 根据实际情况添加,我这里就只加1个。
必要的配置
邮件设置
上面的步骤跑完,Sentry 就已经搭建好并且可以使用了,还有问题,你会发现没有邮件提醒,我们需要配置邮件服务。
官方的介绍了两种方法,一个是再 link 一个 SMTP 的 instance,一个是添加SMTP服务的配置。我两个都试了,前者发出的邮件很容易被当做垃圾邮件拦截,我现在采用的是后者。现在国内的免费邮件服务都提供了SMTP功能,一开始我直接使用了免费的QQ邮箱和163邮箱,一部分邮件可以发送成功,一部分会连接超时,这个让我很无语,这种不稳定不能用。Gmail估计不会有问题,但是可能被墙,就没试(其实是拿老板手机注册的时候没成功,没成功的原因的老板手机欠费停机,没收到验证短信。o(╯□╰)o)
考虑邮件推送服务。服务器在AWS中国上,AWS有邮件推送服务,但是这个AWS中国貌似还没开发这个功能;搜狐家有SendCloud,注册之后发现要获取免费的额度需要填太多东西,作罢;因为有阿里云的账号,阿里云家配置比较简单,暂时用的阿里云的邮件推送服务,地址:https://www.aliyun.com/product/directmail。实际使用中还是有发送失败的情况,没有说的那么好。
配好之后,我们需要将这些配置加到我们的Sentry实例中。我没有作为 instance 的启动参数,而是直接修改了 sentry.conf.py 文件,直接将配置文件 mount 到 instance 内。相关的部分如下
1 | # email = env('SENTRY_EMAIL_HOST') or (env('SMTP_PORT_25_TCP_ADDR') and 'smtp') |
启动命令如下:
docker run -d -p 80:9000 -v /path/to/sentry.conf.py:/etc/sentry/sentry.conf.py --link sentry-postgres:postgres --link sentry-redis:redis sentry
docker run -d -v /path/to/sentry.conf.py:/etc/sentry/sentry.conf.py --link sentry-postgres:postgres --link sentry-redis:redis sentry run worker
注意:如果只启动 Web,在 Sentry 内的测试发送邮件会成功,但是通知邮件依旧会失败。因为通知邮件是 Worker instance 发送的,不是 Web instance 发送的,邮件配置必须也传到 Worker instance 里面。
关闭注册功能
内部用的系统,不希望开放公开的注册。需要把这个功能 disable 掉。还是改sentry.conf.py
文件,添加一行 SENTRY_FEATURES['auth:register'] = False
更多的参数写到 sentry.conf.py
很多参数都是可以直接写到 sentry.conf.py 内的。我把system.secret-key
这个也写到文件内,这样 docker run 需要带的参数就大大减少。
Sentry 使用
这个就不多说了。用管理员账号登录之后,自己添加 Project 和 Member,再把 Sentry 的 Track 加到需要监测的项目里面就好。我们项目用的 Django,里面的 raven 配置加上新的链接就可用,非常方便。