在 Docker 上设置 Glitchtip 错误监控
Glitchtip 是一个开源的异常监控系统,它类似于**Sentry,它收集您的应用程序报告的错误并帮助您实时发现错误**帮助您了解应用程序的运行状况。
我们今天在做什么?
在本教程中,我们将在 Docker 上设置 Glitchtip,使用 Traefik 作为 LetsEncrypt 证书的负载均衡器和 SSL 终止,然后我们将创建一个 Python Flask 应用程序并启动一个错误,以便我们可以看看 Glitchtip 是如何收集这些错误的,我们还将添加一个 Webhook 服务器来演示将错误记录到 Webhook 端点,以便进一步开发错误。
这样我们就可以在我们的应用程序中看到我们的异常,如下所示:

假设
我假设你已经安装了docker和docker-compose。如果您需要有关Traefik的更多信息,您可以查看他们的网站,但我还写了一篇关于设置Traefik v2的详细信息,但我们将在这篇文章中涉及到这一点。
代码源
我将在我的Github Repository下发布本教程的代码:
- github.com/ruanbekker/docker-glitchtip-trae..
环境详情
我有 3 个 DNS 条目:
-
故障提示:
gc.civo.rbkr.xyz -
烧瓶应用程序:
flask-app.civo.rbkr.xyz -
网络钩子:
flask-webhook.civo.rbkr.xyz
这一切都指向运行 Glitchtip 的主机。
目录结构
首先为我们的故障提示演示创建目录结构并切换到目录:
mkdir glitchtip-tutorial
cd glitchtip-tutorial
为acme.json创建将存储证书数据的 traefik 目录,创建文件并更改文件的权限:
mkdir traefik
touch traefik/acme.json
chmod 600 traefik/acme.json
Traefik
打开docker-compose.yml并添加将 Traefik 的第一位,确保将me@example.com替换为certificatesResolvers.letsencrypt.acme.email下的电子邮件:
version: '3.8'
x-logging:
&default-logging
driver: "json-file"
options:
max-size: "1m"
services:
glitchtip-traefik:
image: traefik:2.4
container_name: glitchtip-traefik
restart: unless-stopped
volumes:
- ./traefik/acme.json:/acme.json
- /var/run/docker.sock:/var/run/docker.sock
networks:
- glitchtip
ports:
- 80:80
- 443:443
command:
- '--api'
- '--providers.docker=true'
- '--providers.docker.exposedByDefault=false'
- '--entrypoints.http=true'
- '--entrypoints.http.address=:80'
- '--entrypoints.http.http.redirections.entrypoint.to=https'
- '--entrypoints.http.http.redirections.entrypoint.scheme=https'
- '--entrypoints.https=true'
- '--entrypoints.https.address=:443'
- '--certificatesResolvers.letsencrypt.acme.email=me@example.com'
- '--certificatesResolvers.letsencrypt.acme.storage=acme.json'
- '--certificatesResolvers.letsencrypt.acme.httpChallenge.entryPoint=http'
- '--log=true'
- '--log.level=INFO'
logging:
driver: "json-file"
options:
max-size: "1m"
networks:
glitchtip:
name: glitchtip
你现在可以启动 Traefik 这么久了:
docker-compose up -d
故障提示
现在我们将添加 Glitchtip 组件,如果您想详细了解这些配置选项,可以参考他们的文档。在glitchtip-traefk下面添加如下服务:
glitchtip-postgres:
image: postgres:13
container_name: glitchtip-postgres
restart: unless-stopped
environment:
POSTGRES_HOST_AUTH_METHOD: "trust"
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
- glitchtip
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 5s
retries: 5
logging: *default-logging
glitchtip-redis:
image: redis
container_name: glitchtip-redis
restart: unless-stopped
networks:
- glitchtip
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 30s
retries: 50
logging: *default-logging
glitchtip-web:
image: glitchtip/glitchtip
container_name: glitchtip-web
restart: unless-stopped
depends_on:
glitchtip-traefik:
condition: service_started
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
GLITCHTIP_DOMAIN: "https://gt.civo.rbkr.xyz"
ENABLE_OPEN_USER_REGISTRATION: "True"
GLITCHTIP_MAX_EVENT_LIFE_DAYS: 90
networks:
- glitchtip
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.glitchtip.rule=Host(`gt.civo.rbkr.xyz`)'
- 'traefik.http.routers.glitchtip.entrypoints=https'
- 'traefik.http.routers.glitchtip.tls=true'
- 'traefik.http.routers.glitchtip.tls.certresolver=letsencrypt'
- 'traefik.http.routers.glitchtip.service=glitchtip-service'
- 'traefik.http.services.glitchtip-service.loadbalancer.server.port=8000'
logging: *default-logging
glitchtip-worker:
image: glitchtip/glitchtip
container_name: glitchtip-worker
restart: unless-stopped
command: celery -A glitchtip worker -B -l INFO
depends_on:
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
GLITCHTIP_DOMAIN: "https://gt.civo.rbkr.xyz"
networks:
- glitchtip
logging: *default-logging
glitchtip-migrate:
image: glitchtip/glitchtip
container_name: glitchtip-migrate
depends_on:
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
command: "./manage.py migrate"
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
GLITCHTIP_DOMAIN: "https://gt.civo.rbkr.xyz"
networks:
- glitchtip
logging: *default-logging
确保更改以下内容:
-
EMAIL_URL例如。smtp://apikey:your-password@smtp.sendgrid.net:587(sendgrid提供免费邮寄服务) -
DEFAULT_FROM_EMAIL例如。no-reply@yourdomain.com -
您在
'traefik.http.routers.glitchtip.rule=Host()'中的故障提示的 FQDN
更新配置后,启动故障提示:
docker-compose pull
docker-compose up -d
启动所有服务后,您应该能够访问 UI,并且看起来或多或少像这样:

由于ENABLE_OPEN_USER_REGISTRATION设置为True,我们可以注册我们的用户:

注册后,您将登录并在组织页面上创建组织:

对于本教程,我将使用名称my-org:

我将继续在我的组织中创建一个名为flask-service-dev的应用程序,我将为本教程选择 Python Flask,并且我想将此项目关联到一个名为engineering的团队,在底部选择团队并创建您的团队:

创建并选择团队后,选择框架并命名您的服务:

创建项目后,您将获得有关如何配置应用程序的入门指南:

在右侧,您将获得配置值,我们将在我们的应用程序中将其用作环境变量,我们希望将错误发送到故障提示:
-
https://6ee24c1a446347b99e9574edfe990393@gt.civo.rbkr.xyz/1 -
https://gt.civo.rbkr.xyz/api/1/security/?glitchtip_key=6ee24c1a446347b99e9574edfe990393
现在我们已经注册了,我们可以通过在docker-compose.yml中将其设置为False来禁用ENABLE_OPEN_USER_REGISTRATION,然后运行docker-compose up -d。
可选:Glitchtip 是用 Django 编写的,因此您也可以使用以下方法来管理用户和访问/admin上的管理面板:
$ docker-compose run glitchtip-migrate ./manage.py createsuperuser
Creating glitchdip_glitchtip-migrate_run ... done
Email: me@example.com
Password:
Password (again):
Superuser created successfully.
Python Flask 应用
现在我们将创建我们想要监控故障提示错误的应用程序。从glitchtip-tutorial目录中,为我们的 python flask 应用程序创建应用程序代码和 dockerfile:
mkdir flask-app
touch flask-app/requirements.txt
touch flask-app/app.py
touch flask-app/Dockerfile
首先在flask-app/requirements.txt中添加需求:
flask==1.1.2
sentry-sdk[flask]
gunicorn==20.0.4
接下来我们在flask-app/Dockerfile中的 dockerfile:
FROM python:3.8-slim
ADD requirements.txt /src/requirements.txt
ADD run.sh /src/run.sh
RUN chmod +x /src/run.sh
RUN pip install --upgrade -r /src/requirements.txt
ADD app.py /src/app.py
CMD ["/src/run.sh"]
我们的启动脚本将在flask-app/run.sh中使用 gunicorn 启动烧瓶:
#!/bin/sh
gunicorn app:app \
--workers 2 \
--threads 2 \
--bind 0.0.0.0:80 \
--capture-output \
--access-logfile '-' \
--error-logfile '-'
然后我们在flask-app/app.py中的应用代码:
import os
import logging
from flask import Flask
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
GLITCHTIP_DSN = os.environ['DSN']
sentry_sdk.init(
dsn=GLITCHTIP_DSN,
integrations=[FlaskIntegration()]
)
app = Flask(__name__)
app.config['DEBUG'] = False
@app.before_first_request
def setup_logging():
app.logger.addHandler(logging.StreamHandler())
app.logger.setLevel(logging.INFO)
app.logger.info('logs enabled')
@app.route('/')
def root():
return 'hello, world'
@app.route('/log-error')
def log_error():
app.logger.error('logging error with glitchtip')
return 'logged error'
@app.route('/trigger-error')
def trigger_error():
division_by_zero = 1 / 0
if __name__ == '__main__':
app.logger.info('starting server')
app.run()
然后我们将此部分添加到我们的docker-compose.yml中:
glitchtip-flask-app:
build:
context: flask-app
dockerfile: Dockerfile
container_name: glitchtip-flask-app
restart: unless-stopped
depends_on:
glitchtip-traefik:
condition: service_started
environment:
DSN: "https://6ee24c1a446347b99e9574edfe990393@gt.civo.rbkr.xyz/1"
networks:
- glitchtip
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.app.rule=Host(`flask-app.civo.rbkr.xyz`)'
- 'traefik.http.routers.app.entrypoints=https'
- 'traefik.http.routers.app.tls=true'
- 'traefik.http.routers.app.tls.certresolver=letsencrypt'
- 'traefik.http.routers.app.service=app-service'
- 'traefik.http.services.app-service.loadbalancer.server.port=80'
logging: *default-logging
所以现在我们完整的docker-compose.yml或多或少应该是这样的:
---
version: '3.8'
x-logging:
&default-logging
driver: "json-file"
options:
max-size: "1m"
services:
glitchtip-traefik:
image: traefik:2.4
container_name: glitchtip-traefik
restart: unless-stopped
volumes:
- ./traefik/acme.json:/acme.json
- /var/run/docker.sock:/var/run/docker.sock
networks:
- glitchtip
ports:
- 80:80
- 443:443
command:
- '--api'
- '--providers.docker=true'
- '--providers.docker.exposedByDefault=false'
- '--entrypoints.http=true'
- '--entrypoints.http.address=:80'
- '--entrypoints.http.http.redirections.entrypoint.to=https'
- '--entrypoints.http.http.redirections.entrypoint.scheme=https'
- '--entrypoints.https=true'
- '--entrypoints.https.address=:443'
- '--certificatesResolvers.letsencrypt.acme.email=me@example.com'
- '--certificatesResolvers.letsencrypt.acme.storage=acme.json'
- '--certificatesResolvers.letsencrypt.acme.httpChallenge.entryPoint=http'
- '--log=true'
- '--log.level=INFO'
logging:
driver: "json-file"
options:
max-size: "1m"
glitchtip-postgres:
image: postgres:13
container_name: glitchtip-postgres
restart: unless-stopped
environment:
POSTGRES_HOST_AUTH_METHOD: "trust"
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
- glitchtip
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 5s
retries: 5
logging: *default-logging
glitchtip-redis:
image: redis
container_name: glitchtip-redis
restart: unless-stopped
networks:
- glitchtip
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 30s
retries: 50
logging: *default-logging
glitchtip-web:
image: glitchtip/glitchtip
container_name: glitchtip-web
restart: unless-stopped
depends_on:
glitchtip-traefik:
condition: service_started
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
GLITCHTIP_DOMAIN: "https://gt.civo.rbkr.xyz"
ENABLE_OPEN_USER_REGISTRATION: "False"
GLITCHTIP_MAX_EVENT_LIFE_DAYS: 90
networks:
- glitchtip
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.glitchtip.rule=Host(`gt.civo.rbkr.xyz`)'
- 'traefik.http.routers.glitchtip.entrypoints=https'
- 'traefik.http.routers.glitchtip.tls=true'
- 'traefik.http.routers.glitchtip.tls.certresolver=letsencrypt'
- 'traefik.http.routers.glitchtip.service=glitchtip-service'
- 'traefik.http.services.glitchtip-service.loadbalancer.server.port=8000'
logging: *default-logging
glitchtip-worker:
image: glitchtip/glitchtip
container_name: glitchtip-worker
restart: unless-stopped
command: celery -A glitchtip worker -B -l INFO
depends_on:
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
networks:
- glitchtip
logging: *default-logging
glitchtip-migrate:
image: glitchtip/glitchtip
container_name: glitchtip-migrate
depends_on:
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
command: "./manage.py migrate"
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
GLITCHTIP_DOMAIN: "https://gt.civo.rbkr.xyz"
networks:
- glitchtip
logging: *default-logging
glitchtip-flask-app:
build:
context: flask-app
dockerfile: Dockerfile
container_name: glitchtip-flask-app
restart: unless-stopped
depends_on:
glitchtip-traefik:
condition: service_started
environment:
DSN: "https://6ee24c1a446347b99e9574edfe990393@gt.civo.rbkr.xyz/1"
networks:
- glitchtip
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.app.rule=Host(`flask-app.civo.rbkr.xyz`)'
- 'traefik.http.routers.app.entrypoints=https'
- 'traefik.http.routers.app.tls=true'
- 'traefik.http.routers.app.tls.certresolver=letsencrypt'
- 'traefik.http.routers.app.service=app-service'
- 'traefik.http.services.app-service.loadbalancer.server.port=80'
logging: *default-logging
networks:
glitchtip:
name: glitchtip
构建flask-app容器并启动服务:
docker-compose up --build -d
发出测试请求:
$ curl -IL http://flask-app.civo.rbkr.xyz
HTTP/1.1 308 Permanent Redirect
Location: https://flask-app.civo.rbkr.xyz/
Date: Tue, 28 Sep 2021 06:00:27 GMT
Content-Length: 18
Content-Type: text/plain; charset=utf-8
HTTP/2 200
content-type: text/html; charset=utf-8
date: Tue, 28 Sep 2021 06:00:27 GMT
server: gunicorn/20.0.4
content-length: 12
记录异常到 Glitchtip
现在让我们访问会导致异常的端点,让我们首先向/trigger-error发出请求,然后转到“问题”,或者如果您有多个项目,请选择您的组织,然后选择您的项目的问题:

从问题视图中,我们可以看到我们遇到了一个问题:

当我们选择问题时,我们可以看到有关此异常的更多信息,例如用户代理信息、请求路径、在我们的应用程序中引发异常的位置等:

如您所见,Glitchtip 还在引发异常的堆栈中提供了更深层次的信息:

有很多信息,但我也觉得不错的是,它记录了 span_id 和 trace_id、sdk 版本等:

如果我们看一下/log-error,它只会记录一个错误事件,从问题视图中,我们可以看到我们有一个问题:

当我们选择问题时,我们可以看到更多关于这个异常的信息,比如用户代理信息、请求路径等:

告警
我们可以在每次收到异常时设置警报,为此,请转到“设置”、“项目”,您将找到“项目警报”:

当我们选择“创建新警报”时,您将获得警报配置,默认情况下,警报将配置到项目团队成员的电子邮件地址。

如果我们“添加警报收件人”,您将看到我们可以选择添加“Webhook URL”,所以让我们回到我们的docker-compose.yml并设置 Python Flask Webhook:
glitchtip-flask-webhook:
build:
context: flask-webhook
dockerfile: Dockerfile
container_name: glitchtip-flask-webhook
restart: unless-stopped
depends_on:
glitchtip-traefik:
condition: service_started
networks:
- glitchtip
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.webhook.rule=Host(`flask-webhook.civo.rbkr.xyz`)'
- 'traefik.http.routers.webhook.entrypoints=https'
- 'traefik.http.routers.webhook.tls=true'
- 'traefik.http.routers.webhook.tls.certresolver=letsencrypt'
- 'traefik.http.routers.webhook.service=webhook-service'
- 'traefik.http.services.webhook-service.loadbalancer.server.port=80'
logging: *default-logging
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/health"]
interval: 5s
timeout: 3s
retries: 60
然后我们创建我们的 flask-webhook 目录:
mkdir flask-webhook
创建所需文件,首先是我们的应用程序flask-webhook/app.py:
import logging
from flask import Flask, request, jsonify
app = Flask(__name__)
app.config['DEBUG'] = False
@app.before_first_request
def setup_logging():
app.logger.addHandler(logging.StreamHandler())
app.logger.setLevel(logging.INFO)
@app.route('/', methods=['POST'])
def webhook():
payload = request.get_json(force=True)
app.logger.info(payload)
return jsonify(payload)
@app.route('/health', methods=['GET'])
def health():
payload = {'status': 'up'}
return jsonify(payload)
if __name__ == '__main__':
app.logger.info('starting server')
app.run()
然后我们的flask-webhook/Dockerfile:
FROM python:3.8-slim
RUN apt update && apt install curl -y
WORKDIR /src
ADD requirements.txt /src/requirements.txt
ADD run.sh /src/run.sh
RUN chmod +x /src/run.sh
RUN pip install --upgrade -r /src/requirements.txt
ADD app.py /src/app.py
CMD ["/src/run.sh"]
然后我们的flask-webhook/requirements.txt:
flask==1.1.2
gunicorn==20.0.4
然后当一切就绪后,构建并启动容器:
docker-compose up --build -d
应用程序启动后,在设置、项目、项目警报中,当我们添加新的警报收件人时,我们选择 webhook 作为收件人类型并添加我们的 webhook url:

现在我们应该看到:

选择提交,然后调用/trigger-errorurl:
$ curl -I https://flask-app.civo.rbkr.xyz/trigger-error
HTTP/2 500
content-type: text/html; charset=utf-8
date: Tue, 28 Sep 2021 09:36:29 GMT
server: gunicorn/20.0.4
content-length: 290
现在,当我们查看 webhook 容器的日志时:
$ docker-compose logs -f glitchtip-flask-webhook
...
glitchtip-flask-webhook | {'alias': 'GlitchTip', 'text': 'GlitchTip Alert', 'attachments': [{'title': 'ZeroDivisionError: division by zero', 'title_link': 'https://gt.civo.rbkr.xyz/my-org/issues/2', 'text': 'trigger_error', 'image_url': None, 'color': '#e52b50'}], 'sections': [{'activityTitle': 'ZeroDivisionError: division by zero', 'activitySubtitle': '[View Issue FLASK-SERVICE-DEV-1](https://gt.civo.rbkr.xyz/my-org/issues/2)'}]}
如果我们对其进行美化,您可以看到我们可以使用这些信息并进行我们自己的集成:
>>> print(json.dumps(e, indent=2))
{
"alias": "GlitchTip",
"text": "GlitchTip Alert",
"attachments": [
{
"title": "ZeroDivisionError: division by zero",
"title_link": "https://gt.civo.rbkr.xyz/my-org/issues/2",
"text": "trigger_error",
"image_url": null,
"color": "#e52b50"
}
],
"sections": [
{
"activityTitle": "ZeroDivisionError: division by zero",
"activitySubtitle": "[View Issue FLASK-SERVICE-DEV-1](https://gt.civo.rbkr.xyz/my-org/issues/2)"
}
]
}
我们的电子邮件通知将如下所示:

完整的作曲
这将发布到我的github 存储库,但完整的docker-compose.yml:
---
version: '3.8'
x-logging:
&default-logging
driver: "json-file"
options:
max-size: "1m"
services:
glitchtip-traefik:
image: traefik:2.4
container_name: glitchtip-traefik
restart: unless-stopped
volumes:
- ./traefik/acme.json:/acme.json
- /var/run/docker.sock:/var/run/docker.sock
networks:
- glitchtip
ports:
- 80:80
- 443:443
command:
- '--api'
- '--providers.docker=true'
- '--providers.docker.exposedByDefault=false'
- '--entrypoints.http=true'
- '--entrypoints.http.address=:80'
- '--entrypoints.http.http.redirections.entrypoint.to=https'
- '--entrypoints.http.http.redirections.entrypoint.scheme=https'
- '--entrypoints.https=true'
- '--entrypoints.https.address=:443'
- '--certificatesResolvers.letsencrypt.acme.email=email@example.com'
- '--certificatesResolvers.letsencrypt.acme.storage=acme.json'
- '--certificatesResolvers.letsencrypt.acme.httpChallenge.entryPoint=http'
- '--log=true'
- '--log.level=INFO'
logging:
driver: "json-file"
options:
max-size: "1m"
glitchtip-postgres:
image: postgres:13
container_name: glitchtip-postgres
restart: unless-stopped
environment:
POSTGRES_HOST_AUTH_METHOD: "trust"
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
- glitchtip
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 5s
retries: 5
logging: *default-logging
glitchtip-redis:
image: redis
container_name: glitchtip-redis
restart: unless-stopped
networks:
- glitchtip
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 30s
retries: 50
logging: *default-logging
glitchtip-web:
image: glitchtip/glitchtip
container_name: glitchtip-web
restart: unless-stopped
depends_on:
glitchtip-traefik:
condition: service_started
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
GLITCHTIP_DOMAIN: "https://gt.civo.rbkr.xyz"
ENABLE_OPEN_USER_REGISTRATION: "False"
GLITCHTIP_MAX_EVENT_LIFE_DAYS: 90
networks:
- glitchtip
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.glitchtip.rule=Host(`gt.civo.rbkr.xyz`)'
- 'traefik.http.routers.glitchtip.entrypoints=https'
- 'traefik.http.routers.glitchtip.tls=true'
- 'traefik.http.routers.glitchtip.tls.certresolver=letsencrypt'
- 'traefik.http.routers.glitchtip.service=glitchtip-service'
- 'traefik.http.services.glitchtip-service.loadbalancer.server.port=8000'
logging: *default-logging
glitchtip-worker:
image: glitchtip/glitchtip
container_name: glitchtip-worker
restart: unless-stopped
command: celery -A glitchtip worker -B -l INFO
depends_on:
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
GLITCHTIP_DOMAIN: "https://gt.civo.rbkr.xyz"
networks:
- glitchtip
logging: *default-logging
glitchtip-migrate:
image: glitchtip/glitchtip
container_name: glitchtip-migrate
depends_on:
glitchtip-postgres:
condition: service_healthy
glitchtip-redis:
condition: service_healthy
command: "./manage.py migrate"
environment:
DATABASE_URL: postgres://postgres:postgres@glitchtip-postgres:5432/postgres
REDIS_URL: redis://glitchtip-redis:6379/0
SECRET_KEY: jsdf93892309fhufhr
PORT: 8000
EMAIL_URL: "${EMAIL_URL}"
DEFAULT_FROM_EMAIL: ${EMAIL_FROM_ADDRESS}
GLITCHTIP_DOMAIN: "https://gt.civo.rbkr.xyz"
networks:
- glitchtip
logging: *default-logging
glitchtip-flask-app:
build:
context: flask-app
dockerfile: Dockerfile
container_name: glitchtip-flask-app
restart: unless-stopped
depends_on:
glitchtip-traefik:
condition: service_started
environment:
DSN: "https://6ee24c1a446347b99e9574edfe990393@gt.civo.rbkr.xyz/1"
networks:
- glitchtip
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.app.rule=Host(`flask-app.civo.rbkr.xyz`)'
- 'traefik.http.routers.app.entrypoints=https'
- 'traefik.http.routers.app.tls=true'
- 'traefik.http.routers.app.tls.certresolver=letsencrypt'
- 'traefik.http.routers.app.service=app-service'
- 'traefik.http.services.app-service.loadbalancer.server.port=80'
logging: *default-logging
glitchtip-flask-webhook:
build:
context: flask-webhook
dockerfile: Dockerfile
container_name: glitchtip-flask-webhook
restart: unless-stopped
depends_on:
glitchtip-traefik:
condition: service_started
networks:
- glitchtip
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.webhook.rule=Host(`flask-webhook.civo.rbkr.xyz`)'
- 'traefik.http.routers.webhook.entrypoints=https'
- 'traefik.http.routers.webhook.tls=true'
- 'traefik.http.routers.webhook.tls.certresolver=letsencrypt'
- 'traefik.http.routers.webhook.service=webhook-service'
- 'traefik.http.services.webhook-service.loadbalancer.server.port=80'
logging: *default-logging
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/health"]
interval: 5s
timeout: 3s
retries: 60
networks:
glitchtip:
name: glitchtip
出于演示目的,我故意将域端点和故障提示应用程序密钥留在代码中,但在撰写本文后删除了堆栈。
谢谢
我希望这会有所帮助,我对 Glitchtip 印象深刻。如果您喜欢此内容,请务必在我的网站或推特上分享或来打个招呼:
-
网址:ruan.dev
-
Twitter:@ruanbekker
更多推荐



所有评论(0)