【安装版本】sentry 9.1.2
【安装方式】docker-compose
【先决环境】
Docker 17.05.0+
Docker-Compose 1.17.0+
服务器配置只少需要3G内存
PS:网上的多数资料因为sentry版本以及安装方式/smtp要求的不同导致不是很一致,本篇文章旨在明确9.1.2版本+支持ssl/tls加密的smtp服务器的安装指南
Sentry 是一个开源的实时错误报告和日志聚合工具平台,它专门监测错误并提取所有有用信息用于分析,不再麻烦地依赖用户反馈来定位问题。支持 web 前后端、移动应用以及游戏,支持 Python、OC、Java、Go、Node.js、Django、RoR 等主流编程语言和框架 ,还提供了 GitHub、Slack、Trello 等常见开发工具的集成。
sentry的配置可以在官方github里面下载release版本
[root@bogon ~]$ mkdir sentry && cd sentry
[root@bogon sentry]$ wget https://github.com/getsentry/onpremise/archive/9.1.2.tar.gz
[root@bogon sentry]$ tar -zxvf 9.1.2.tar.gz
[root@bogon sentry]$ tree
.
├── 9.1.2.tar.gz
└── onpremise-9.1.2
├── config.yml # 配置文件yaml,键值对yaml格式导入
├── docker-compose.yml # docker-compose文件,用于构建镜像
├── Dockerfile
├── install.sh # 自动安装脚本
├── LICENSE
├── Makefile
├── README.md
├── requirements.txt # 依赖包声明
├── sentry.conf.py # 配置文件python,通过python程序导入
└── test.sh
1 directory, 11 files
从上面可以看到,onpremise-9.1.2目录下几个主要文件,可以具体打开查看。
我们这里主要需要修改的是邮件模块,不过这里我们遇到了一点小问题,似乎需要区分下你的Email服务器是打算用普通smtp 25端口还是ssl/tls的465/587端口。
以下这个gmail表格解释的比较清楚,以便使用正确的信息更新您的客户端
项目 | Value |
---|---|
接收邮件 (IMAP) 服务器 | imap.gmail.com 要求 SSL:是 端口:993 |
发送邮件 (SMTP) 服务器 | smtp.gmail.com 要求 SSL:是 要求 TLS:是(如适用) 使用身份验证:是 SSL 端口:465 TLS/STARTTLS 端口:587 |
完整名称或显示名称 | 您的姓名 |
帐号名、用户名或电子邮件地址 | 您的完整电子邮件地址 |
密码 | 您的 Gmail 密码 |
如果你的smtp服务器支持ssl/tls,或者只支持这两种方式(可以提前telnet 服务器和端口验证),那么需要改动几个地方,下面以126邮箱为例:
[root@VM_0_5_centos onpremise-9.1.2]# cat config.yml
###############
# Mail Server #
###############
#mail.backend: 'smtp' # Use dummy if you want to disable email entirely
mail.backend: 'django_smtp_ssl.SSLEmailBackend'
mail.host: 'smtp.126.com'
mail.port: 465
mail.username: '[email protected]'
mail.password: '************'
mail.use-tls: true
# The email address to send on behalf of
#mail.from: 'root@localhost'
mail.from: '[email protected]'
这里需要单独说明一下
mail.from
,默认的是root@localhost
,但是我用126的邮箱得到的response错误:Mail from must equal authorized user
,这应该是126邮箱的限制,登录用户和发信人必须一致,不允许以其它账号打着自己的邮箱账号发送邮件,估计是为了防止邮箱名称的冲突?
通过pip安装上一步配置里面用到的django_stmp_ssl
模块,在requirements.txt里面的模块会在所有相关容器里面自动安装:
[root@VM_0_5_centos onpremise-9.1.2]# cat requirements.txt
# Add plugins here
django-smtp-ssl==1.0
Q&A:为何要修改默认的mail.backend呢?
这里主要是为了解决用默认的smtp作为backend无法收到邮件,点击测试发送邮件页面长时间无响应的情况,主要还是不支持ssl的原因,在issue上找打了一个解决方案,用支持ssl的smtp插件,如下:
github issue:Sentry is not sending emails #71
import socket
socket.setdefaulttimeout(20)
这里主要是为了解决邮件模块socket超时的问题,默认的socket超时时间是5s。否则很容易报错,特别是ssl协议:Connection unexpectedly closed: timed out.
github issue:SMTPServerDisconnected: Connection unexpectedly closed: timed out #2297
具体问题分析参见:Sentry email notifications not arriving?
Q&A:若邮件smtp服务器只支持普通的25端口呢?
那么就用官方的默认安装方式即可,即第(1)步中按如下编辑config.yml文件,把Mail Server段的注释去掉,并填上自己的参数配置,如下:
[root@VM_0_5_centos onpremise-9.1.2]# cat config.yml ############### # Mail Server # ############### mail.backend: 'smtp' # Use dummy if you want to disable email entirely mail.host: 'smtp.xxxx.com' mail.port: 25 mail.username: '[email protected]' mail.password: '**********' mail.use-tls: false #The email address to send on behalf of mail.from: 'root@localhost'
同时上面第(2)、(3)步的requirement.txt和sentry.conf.py也不必调整了
这里我们主要是配置邮件和pg数据库相关的环境变量:
(1)修改:x-defaults.environment.SENTRY_EMAIL_HOST: smtp.126.com
(2)新增:x-defaults.environment.SENTRY_DB_PASSWORD: postgres
(3)新增:services.postgres.environment.POSTGRES_PASSWORD=postgres
完整配置如下:
# NOTE: This docker-compose.yml is meant to be just an example of how
# you could accomplish this on your own. It is not intended to work in
# all use-cases and must be adapted to fit your needs. This is merely
# a guideline.
# See docs.getsentry.com/on-premise/server/ for full
# instructions
version: '3.4'
x-defaults: &defaults
restart: unless-stopped
build:
context: .
depends_on:
- redis
- postgres
- memcached
- smtp
env_file: .env
environment:
SENTRY_MEMCACHED_HOST: memcached
SENTRY_REDIS_HOST: redis
SENTRY_POSTGRES_HOST: postgres
SENTRY_DB_PASSWORD: postgres
SENTRY_EMAIL_HOST: smtp.126.com
volumes:
- sentry-data:/var/lib/sentry/files
services:
smtp:
restart: unless-stopped
image: tianon/exim4
memcached:
restart: unless-stopped
image: memcached:1.5-alpine
redis:
restart: unless-stopped
image: redis:3.2-alpine
postgres:
restart: unless-stopped
image: postgres:9.5
environment:
- POSTGRES_PASSWORD=postgres
volumes:
- sentry-postgres:/var/lib/postgresql/data
web:
<<: *defaults
ports:
- '9000:9000'
cron:
<<: *defaults
command: run cron
worker:
<<: *defaults
command: run worker
volumes:
sentry-data:
external: true
sentry-postgres:
external: true
Q&A:为什么要手动设置PG的环境变量?
如果不设置的话会在./install.sh的时候报错:
django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known
报错原因就是postgres没有密码,所以我们提前在配置里面设定好pg的密码
万事俱备,只欠东风
# 准备构建镜像
./install.sh
这里说明一下,在构建过程中在终端里会询问你是否要创建用户账号,选择是,然后输入邮箱和密码,并同意设置为超级管理员即可,如下所示:
Q&A:我安装没有弹出来该怎么办?
当然如果没有弹出来让你填写或者填错了取消也都没关系,在intall.sh脚本跑完之后可以单独创建用户就可以了。
docker-compose run --rm web createuser
稍微留意下的就是,如果报错没有组织团队,那么需要进入到db里面查看,可能没有初始化到,一般不会有这个问题:
1.使用docker命令进入postgres数据库:docker exec -it onpremise_postgres_1 bash
2.进入postgres数据库:psql -h 127.0.0.1 -d postgres -U postgres
3.查看这两个表是否有数据sentry_project,sentry_organizationpostgres=# select * from sentry_project; postgres=# select * from sentry_organization ;
如果确认是没有数据,进行创建
4.新开一个终端,进入sentry的web的shell里面,其实就是一个python端:docker-compose run --rm web shell
5. 输入以下命令进行初始化数据from sentry.models import Project from sentry.receivers.core import create_default_projects create_default_projects([Project])
6.退出第五步的shell,创建自己的用户:
docker-compose run --rm web createuser
好了,用户也有了,我们启动容器应用:
# 启动
docker-compose up -d
然后通过docker命令可以看到容器都起来了,如开头的框架图,sentry服务默认用到了7个容器。
[root@VM_0_5_centos onpremise-9.1.2]# docker ps |grep onpremise
8ec4557197f4 onpremise-912_worker "/entrypoint.sh run …" 14 hours ago Up 14 hours 9000/tcp onpremise-912_worker_1
9c173154c5a6 onpremise-912_web "/entrypoint.sh run …" 14 hours ago Up 14 hours 0.0.0.0:9000->9000/tcp onpremise-912_web_1
0b513728479b onpremise-912_cron "/entrypoint.sh run …" 14 hours ago Up 14 hours 9000/tcp onpremise-912_cron_1
e4e98dbaf0e2 postgres:9.5 "docker-entrypoint.s…" 23 hours ago Up 22 hours 5432/tcp onpremise-912_postgres_1
dc4281107dad tianon/exim4 "docker-entrypoint.s…" 23 hours ago Up 22 hours 25/tcp onpremise-912_smtp_1
c888e6567f55 redis:3.2-alpine "docker-entrypoint.s…" 23 hours ago Up 22 hours 6379/tcp onpremise-912_redis_1
d4a3f95533ba memcached:1.5-alpine "docker-entrypoint.s…" 23 hours ago Up 22 hours 11211/tcp onpremise-912_memcached_1
这几个容器应用的作用:
名称 | 描述 |
---|---|
cron | 定时任务,使用的是celery-beat |
memcached | memcached |
postgres | pgsql数据库 |
redis | 运行celery需要的服务 |
smtp | 邮件服务 |
web | 使用django+drf写的一套Sentry Web界面 |
worker | celery的worker服务,用来跑异步任务的 |
这里再聊一下这个构建过程涉及到的镜像
我们上述都是在线安装的,也就是说涉及到的所有docker image都是从docker hub registry当中远程拉取下来的,那么如果是本地局域网安装的话,我们需要哪些镜像呢?可以在docker-compose.yml和docker-compose build执行中找到答案。其中的sentry镜像经过docker-compose build会基于它构建出三个镜像,分别是web/cron/worker,从docker-compose build的执行里可以看到,这样最终就得到了sentry系统7个容器的7个镜像:
[root@VM_0_5_centos onpremise-9.1.2]# docker-compose build smtp uses an image, skipping memcached uses an image, skipping redis uses an image, skipping postgres uses an image, skipping Building web Step 1/2 : ARG SENTRY_IMAGE Step 2/2 : FROM ${SENTRY_IMAGE:-sentry:9.1.2}-onbuild Successfully built 1ce74ed80f84 Successfully tagged onpremise-912_web:latest Building cron Step 1/2 : ARG SENTRY_IMAGE Step 2/2 : FROM ${SENTRY_IMAGE:-sentry:9.1.2}-onbuild Successfully built 1ce74ed80f84 Successfully tagged onpremise-912_cron:latest Building worker Step 1/2 : ARG SENTRY_IMAGE Step 2/2 : FROM ${SENTRY_IMAGE:-sentry:9.1.2}-onbuild Successfully built 1ce74ed80f84 Successfully tagged onpremise-912_worker:latest
所以,如果需要在局域网离线安装,那么只需要将上述5个容器镜像提前下载下来并导入到内网即可:
(1)sentry:9.1.2-onbuild
(2)redis:3.2-alpine
(3)postgres:9.5
(4)tianon/exim4
(5)memcached:1.5-alpinedocker save -o xxx.tar xxxx:latest docker load -i xxx.tar
打开浏览器:输入http://localhost:9000就可以到登陆界面啦,输入在./install的时候创建的账号密码登陆即可,
Q&A:如果调整了配置要怎么重启应用?
docker-compose build # 重新构建镜像 docker-compose run --rm web upgrade # 同步数据 docker-compose up -d # 重新启动容器
看个人喜好,是想要默认的英文还是要改为中文,差别也不大,中文本地化可能为了表述清晰的原因不是做的很彻底,多数还是英文。在界面左上角Sentry账户那下拉选择User Settings,然后再Account Detail里面选择language为Simplified Chinese,看到提示成功后刷新页面即可。
在web界面上,点击左上角,admin,弹窗选择Email,然后点击测试发送邮件
如果按照之前步骤都配置好了这里问题不大,正常就可以收到邮件了:
按照提示随便用一个测试程序来验证,我们这里选择创建一个python的项目,比较简单。WEB UI中给出了如何使用的提示,即在项目运行环境中安装sdk,然后在项目代码里面插入模块即可,使用一个除0异常验证
运行python程序,我们可以看到这个错误并收到了邮件通知,美滋滋。。。
如果要集成其它模块,比如说钉钉通知,那么大体的流程都是
(1)在requirements.txt里面添加模块
# Add plugins here
django-smtp-ssl~=1.0 # 发邮件支持SSL协议
sentry-dingding~=0.0.2 # 钉钉通知插件
redis-py-cluster==1.3.4 # redis-cluster连接
(2)配置通知
Sentry服务启动后,任意选择一个项目 --> 点击设置 --> 点击Legacy Integrations --> 搜索到DingDing开启并配置钉钉机器人Access Token
(1)保留60天数据。cleanup的使用delete命令删除postgresql数据,但postgrdsql对于delete, update等操作,只是将对应行标志为DEAD,属于”软删除“,并没有真正释放磁盘空间
$ docker exec -it sentry_worker_1 bash
$ sentry cleanup --days 60
(2)postgres数据清理 (清理完后会释放磁盘空间)
$ docker exec -it sentry_postgres_1 bash
$ vacuumdb -U postgres -d postgres -v -f --analyze
(3)定时清理脚本
也可以直接设定定时执行上述(1)(2)两步,避免每次要手动清理或时间太久难以清理
#!/usr/bin/env bash
docker exec -i sentry_worker_1 sentry cleanup --days 60 && docker exec -i -u postgres sentry_postgres_1 vacuumdb -U postgres -d postgres -v -f --analyze
Sentry有非常好的数据迁移的设计,升级Sentry非常方便,每次使用pip更新Sentry包之后执行升级命令”sentry upgrade"即可。对应到docker-compose的方式,原则上我们只需要dockerfile里面更新sentry的docker镜像的版本号(如果是离线版本则要提前下载新镜像),然后按照上面提到的命令重启容器即可:
docker-compose build # 重新构建镜像
docker-compose run --rm web upgrade # 同步数据
docker-compose up -d # 重新启动容器
接下来一篇文章,将会记录如何通过helm将sentry部署到kubernetes集群当中。
参考文章: