Sentry-docker版本
Sentry如何通过docker方式搭建?
简介
对于每一个项目,我们都没办法保证代码零BUG,零报错,即便是经历过测试,在上线后也会出现一些你预料不到的问题,而这种情况下,广大的用户其实才是最好的测试者。而sentry就扮演着一个错误收集的角色,将你的项目和sentry结合起来,无论谁在项目使用中报错,sentry都会第一次时间通知开发者,出现了什么错误,错误出现在哪,帮你记录错误,便于你解决问题,这就是sentry。使用方式,是在前端项目中配置sentry相关引用,捕捉错误,在sentry服务端接收。
环境:
Ubantu v20.04(华为云)
Docker : v19.03.15
Docker-compose:v1.28.6
sentry:9.1.2镜像 (docker)
redis (华为云)
postgre:14.0(docker)
宿主机持久化目录(对应的docker-compose启动的目录)
posegres: /op/postgres/data
sentry: /opt/sentry/conf /opt/sentry/data
Sentry 搭建
sentry官方提供的启动方式一共需要3个镜像,其实都是依据sentry镜像,每个镜像运行一个不同的命令,共同组成sentry服务。
三个image分别为:
- sentry (run web)
- sentry(run worker)
- sentry(run cron)
我们先用官方推荐的方式,运行一遍,中间会做初始化数据,创建管理员等操作,运行完成后,我们就可以改成docker-compose的方式来管理sentry啦!
一. 从0开始搭建sentry
1.启动一个redis容器
docker run -d --name sentry-redis redis
2.启动一个postgres容器
注意:这里最好是持久化数据到宿主机,后面sentry初始化创建库,表都是创建在这个postgres数据库中。
宿主机创建posetgres持久化目录
mkdir -pv /opt/postgres/data
docker run -d --name sentry-postgres -e POSTGRES_PASSWORD=123456 -e POSTGRES_USER=sentry -v /opt/postgres/data:/var/lib/postgresql/data -p 5432:5432 postgres:14.0
3. 运行sentry config 并记录下key值
docker run --rm sentry config generate-secret-key
记录key值 :
8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f
4.启动sentry : 初始化 (key值写自己的)
docker run -it --rm -e SENTRY_SECRET_KEY='8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f' --link sentry-postgres:postgres --link sentry-redis:redis sentry upgrade
注意: 这里会建库建表到link的 postgres容器中,最后提示创建超级管理员 ,创建上,初始化完成。
下面运行sentry,还是建议将配置文件最开始就持久化出来,方面我们后期修改。
宿主机上创建sentry持久化目录:
mkdir -pv /opt/sentry/conf
mkdir -pv /opt/sentry/data
5. 运行sentry - server
docker run -d --name my-sentry -e SENTRY_SECRET_KEY='8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f' --link sentry-redis:redis --link sentry-postgres:postgres -v /opt/sentry/conf:/etc/sentry/ -p 9000:9000 sentry:9.1.2
6. 运行sentry - cron
docker run -d --name sentry-cron -e SENTRY_SECRET_KEY='8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f' --link sentry-postgres:postgres --link sentry-redis:redis -v /opt/sentry/conf:/etc/sentry/ sentry:9.1.2 run cron
6. 运行sentry - worker
docker run -d --name sentry-worker-1 -e SENTRY_SECRET_KEY='8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f' --link sentry-postgres:postgres --link sentry-redis:redis -v /opt/sentry/conf:/etc/sentry/ sentry:9.1.2 run worker
到此sentry依照官方docker方式搭建完成,可以先试下是否可以正常访问:http://yours ip :9000/
二. 用docker-compose来管理sentry
前面我们已经按照官方的docker方式搭建好了,也是最传统的方式。显然,一个个的容器是单独启动的,也就意味着我们需要单独去管理,这也并不是我们预期的那样,问题来了:
- 我想用我公有云上的redis服务或者数据库服务?
- 如何一键管理多个docker容器?
1. 想用公有云上的redis服务或者数据库服务?
前面已经将sentry容器中的配置文件持久化出来了,我们直接修改配置文件,连接我们自己的redis或者数据库,我这里只修改redis。
1.config.yaml 修改部分
redis.clusters:
default:
hosts:
0:
host: dev.dbaddr1.xxxxx.com
port: 6379
password: xxxxxxx
- sentry.conf.py 在有注释[redis]字段处添加
redis = 'dev.dbaddr1.xxxxxx.com'
redis_password = 'xxxxxxx'
redis_port = '6379'
redis_db = '0'
除了以上直接修改配置文件,其实还可以在启动容器的时候通过变量传参进去。sentry的配置文件是通过变量来定义这些地方的,比如下面docker-compose中我就通过变量来传postgres的账号密码到sentry中。
2. 用docker-compose管理
这里改成docker-compose方式可实现一键管理多个容器。
vim /opt/sentry/docker-compose.yaml
version: '3'
services:
sentry-postgres:
image: postgres:14.0
privileged: true
restart: unless-stopped
volumes:
- /opt/postgres/data:/var/lib/postgresql/data
environment:
POSTGRES_USER: sentry
POSTGRES_PASSWORD: 123456
SENTRY_SECRET_KEY: 8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f
networks:
- sentry-jkyy
ports:
- "5432:5432"
sentry-server:
image: sentry:9.1.2
privileged: true
restart: unless-stopped
volumes:
- /opt/sentry/data:/var/lib/sentry/files
- /opt/sentry/conf:/etc/sentry/
environment:
C_FORCE_ROOT: "true"
SENTRY_SECRET_KEY: 8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f
#SENTRY_POSTGRES_HOST: 192.168.1.10
SENTRY_POSTGRES_HOST: sentry-postgres
SENTRY_DB_NAME: sentry
SENTRY_DB_USER: sentry
SENTRY_DB_PASSWORD: 123456
SENTRY_POSTGRES_PORT: 5432
depends_on:
- sentry-postgres
command: /bin/bash -c "sentry run web"
ports:
- "9000:9000"
networks:
- sentry-jkyy
sentry-worker:
image: sentry:9.1.2
privileged: true
restart: unless-stopped
volumes:
- /opt/sentry/data:/var/lib/sentry/files
- /opt/sentry/conf:/etc/sentry/
environment:
C_FORCE_ROOT: "true"
SENTRY_SECRET_KEY: 8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f
#SENTRY_POSTGRES_HOST: 192.168.1.10
SENTRY_POSTGRES_HOST: sentry-postgres
SENTRY_DB_NAME: sentry
SENTRY_DB_USER: sentry
SENTRY_DB_PASSWORD: 123456
SENTRY_POSTGRES_PORT: 5432
depends_on:
- sentry-postgres
command: /bin/bash -c "sentry run worker"
networks:
- sentry-jkyy
#busybox用来调试服务是否可以通信,这个可加可不加。
sentry-busybox:
image: busybox:1.28.2
restart: unless-stopped
depends_on:
- sentry-postgres
networks:
- sentry-jkyy
command: /bin/sh -c "ping 127.0.0.1 > /dev/null"
sentry-cron:
image: sentry:9.1.2
privileged: true
restart: unless-stopped
volumes:
- /opt/sentry/data:/var/lib/sentry/files
- /opt/sentry/conf:/etc/sentry/
environment:
C_FORCE_ROOT: "true"
SENTRY_SECRET_KEY: 8%a043n)x!oaon=kwu_yga5+&igl&k%zc&p)+2rs_wbx+p@7%f
#SENTRY_POSTGRES_HOST: 192.168.1.10
SENTRY_POSTGRES_HOST: sentry-postgres
SENTRY_DB_NAME: sentry
SENTRY_DB_USER: sentry
SENTRY_DB_PASSWORD: 123456
SENTRY_POSTGRES_PORT: 5432
depends_on:
- sentry-postgres
command: /bin/bash -c "sentry run cron"
networks:
- sentry-jkyy
networks:
sentry-jkyy:
启动sentry
docker-compose up -d
访问本地:9000端口即可访问sentry-web界面
配置项目
1 .创建一个js项目
image.png2. 找到DSN
DSN创建的时候这个界面会自动跳出来,或者设置中找到DSN
DSN是连接客户端(项目)与sentry服务端,让两者能够通信的钥匙;每当我们在sentry服务端创建一个新的项目,都会得到一个独一无二的DSN,也就是密钥。在客户端初始化时会用到这个密钥,这样客户端报错,服务端就能抓到你对应项目的错误了。之前版本的sentry对于密钥分为公钥和私钥,一般前端用公钥(DSN(Public)),但是现在的版本舍弃了这种概念,只提供了一个密钥。
3. 引入依赖配置到项目中
根据自己的前端框架不同引入安装不同依赖,再把dsn配置到你写的错误代码中,就可以捕获到了。
https://docs.sentry.io/platforms/javascript
遇到的问题
在配置项目的过程中,如小程序必须需要https的接口那sentry的访问链接建议提前做好https,这样创建项目时才可保证
自动生成出来的dsn等链接是https的。如果http://sentry.url 那出来的dsn也是http的,此时在配置https,只能重新搭建sentry进行初始化。
补充:关于postgres的一些操作
posetgre:
进入:
psql -U postgres
创建数据库
create database sentry;
查看数据库
\l