docker-compose安装sentry 9.1.2不踩坑指南

docker-compose安装sentry 9.1.2

【安装版本】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

Sentry 是一个开源的实时错误报告和日志聚合工具平台,它专门监测错误并提取所有有用信息用于分析,不再麻烦地依赖用户反馈来定位问题。支持 web 前后端、移动应用以及游戏,支持 Python、OC、Java、Go、Node.js、Django、RoR 等主流编程语言和框架 ,还提供了 GitHub、Slack、Trello 等常见开发工具的集成。

主要架构如下图所示:
在这里插入图片描述

一、拉取sentry配置

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邮箱为例:

1、config.yml文件

[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邮箱的限制,登录用户和发信人必须一致,不允许以其它账号打着自己的邮箱账号发送邮件,估计是为了防止邮箱名称的冲突?

2、requirements.txt文件

通过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

3、修改sentry.conf.py文件,在头部插入如下两行代码

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也不必调整了

4、docker-compose.yml

这里我们主要是配置邮件和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的密码

三、自动安装并启动

万事俱备,只欠东风

1、准备并构建镜像

# 准备构建镜像
./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_organization

postgres=#  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

2、启动应用

好了,用户也有了,我们启动容器应用:

# 启动
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-alpine

docker 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        					# 重新启动容器

四、验证邮箱及配置

1、调整web ui语言

看个人喜好,是想要默认的英文还是要改为中文,差别也不大,中文本地化可能为了表述清晰的原因不是做的很彻底,多数还是英文。在界面左上角Sentry账户那下拉选择User Settings,然后再Account Detail里面选择language为Simplified Chinese,看到提示成功后刷新页面即可。
在这里插入图片描述

2、验证邮箱

在web界面上,点击左上角,admin,弹窗选择Email,然后点击测试发送邮件
在这里插入图片描述
如果按照之前步骤都配置好了这里问题不大,正常就可以收到邮件了:
在这里插入图片描述

3、配置SDK并验证异常捕获及通知

按照提示随便用一个测试程序来验证,我们这里选择创建一个python的项目,比较简单。WEB UI中给出了如何使用的提示,即在项目运行环境中安装sdk,然后在项目代码里面插入模块即可,使用一个除0异常验证
在这里插入图片描述
运行python程序,我们可以看到这个错误并收到了邮件通知,美滋滋。。。
在这里插入图片描述
在这里插入图片描述

附:其它备忘

1、集成其它模块示例

如果要集成其它模块,比如说钉钉通知,那么大体的流程都是
(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

2、清理历史数据

(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

3、升级

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集群当中。


参考文章:

  1. 官方文档:Self-Hosted Sentry
  2. centos7 docker方式部署sentry
  3. sentry使用docker-compose部署
  4. Sentry Docker Compose部署
  5. Centos7使用docker搭建Sentry
  6. Sentry 入门实战
发布了25 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/arnolan/article/details/105595994