■概要
GlitchTip は、Sentry SDK と互換性を持つオープンソースのエラートラッキングプラットフォームです。
エラー収集・パフォーマンスモニタリング・アップタイム監視の 3 機能を 1 つのサービスで提供します。
Sentry が 2019 年にコアをプロプライエタリライセンスへ移行したことを受けて、2020 年に開発が開始されました。
GlitchTip は Sentry がオープンソースだった時代のコードベースを部分的に継承しつつ、Django + PostgreSQL を中心とした軽量な再実装として設計されています。
ライセンスは MIT であり、商用利用・再配布・改変が自由に行えます。
DSN の URL を変更するだけで Sentry SDK からの移行が完了するため、アプリケーションコードの修正は不要です。
セルフホスト環境では外部への通信(フォンホーム)を行わないため、プライバシーを確保できます。
最新バージョンは GlitchTip 6(2026 年 2 月リリース)で、UUIDv7 によるイベント ID 管理とデータベースパーティション管理の内製化により、イベント取得速度が向上しています。
●類似ツール比較
| 項目 |
GlitchTip |
Sentry self-hosted |
Sentry SaaS |
| ライセンス |
MIT |
FSL(Functional Source License) |
プロプライエタリ |
| 最小メモリ |
512 MB RAM |
16 GB RAM 以上 |
不要(クラウド管理) |
| コンテナ数 |
4(Web / Worker / Valkey / PostgreSQL) |
40 以上(Kafka / ClickHouse 等を含む) |
不要 |
| Sentry SDK 互換 |
あり(DSN 変更のみ) |
完全互換 |
完全互換 |
| エラートラッキング |
あり |
あり |
あり |
| パフォーマンス監視 |
基本機能のみ |
フル機能 |
フル機能 |
| アップタイム監視 |
あり |
なし(別途要) |
一部プランで対応 |
| セッションリプレイ |
なし |
あり |
あり |
| 分散トレーシング |
限定的 |
フル機能 |
フル機能 |
| CSP 違反レポート |
あり |
あり |
あり |
| 運用難易度 |
低(小規模 VPS 可) |
高(専用インフラ必須) |
不要 |
| SaaS 価格(最小) |
$15/月(10 万イベントまで) |
有料は $29/月〜 |
有料は $26/月〜 |
●ユースケース別推奨
| ユースケース |
推奨 |
理由 |
| 個人・インディー開発 |
GlitchTip セルフホスト |
MIT ライセンスで無償、最小リソースで運用可 |
| 小規模チーム(〜20 名) |
GlitchTip セルフホスト / SaaS |
低コストでコアのエラートラッキングをカバー |
| データをクラウド送信したくない |
GlitchTip セルフホスト |
フォンホームなし、MIT ライセンスで完全管理 |
| セッションリプレイが必要 |
Sentry SaaS |
GlitchTip は未対応 |
| 大規模エンタープライズ(高度なトレーシング) |
Sentry SaaS / self-hosted |
分散トレーシング・インテグレーション数で優位 |
| インフラ管理コストを最小化したい |
GlitchTip SaaS |
ホスティング版は $15/月から利用可 |
| Sentry から移行を検討中 |
GlitchTip |
DSN 変更のみで移行完了、リスクが低い |
■特徴
- Sentry SDK 互換: すべての Sentry 公式 SDK(Python・JavaScript・Go・Ruby・Java 等)をそのまま利用可能。DSN の URL 変更のみで移行完了
- エラートラッキング: 例外・ログメッセージを収集し、スタックトレース付きで一元管理。イシューのグルーピング・優先度付け・無視指定が可能
- パフォーマンスモニタリング: ウェブリクエスト・バックグラウンドタスク・DB コールのトランザクションをグルーピングし、遅いエンドポイントを特定
- アップタイム監視: 設定した URL に定期リクエストを送信し、応答がない場合にアラートを通知
- CSP 違反レポート: ブラウザが送信する Content Security Policy 違反レポートを収集・管理
- 軽量アーキテクチャ: 512 MB RAM・1 vCPU の小規模 VPS で稼働可能
- MIT ライセンス: 商用利用・改変・再配布が自由。セルフホスト環境ではフォンホームを行わない
- マルチプロジェクト対応: 複数のプロジェクト・チームを 1 インスタンスで管理可能
- アラート・通知: メール・Webhook・Slack 等への通知インテグレーションを提供
- JavaScript ソースマップ対応: ミニファイされた JavaScript のスタックトレースを元のソースに対応付けて表示
■構造
●システムコンテキスト図
| 要素 |
説明 |
| 開発者 |
GlitchTip を使用してアプリのエラーを追跡する利用者 |
| 運用者 |
アップタイム監視・アラート設定を行う利用者 |
| 監視対象アプリケーション |
Sentry SDK を組み込んでイベントを送信するアプリ |
| GlitchTip |
オープンソースのエラートラッキングプラットフォーム(Sentry 互換) |
| メールサーバー - SMTP |
アラート・通知メール送信先(Mailgun 等も利用可) |
| OAuthプロバイダー |
GitHub / GitLab / Google / Microsoft / Okta 等の SSO 認証基盤 |
| オブジェクトストレージ - S3 互換 |
ソースマップ・Debug Information Files・アップロードファイルの永続化 |
| Stripe - 決済 |
ホスティング版のサブスクリプション課金管理 |
●コンテナ図
| 要素 |
説明 |
| フロントエンド - Angular SPA |
Angular 製シングルページアプリ。Angular Material で UI 構築。ビルド成果物を静的ファイルとして配信 |
| Web - API サーバー - Django / Granian - ASGI |
Django REST フレームワーク + Django Ninja による API。Granian(ASGI サーバー)で起動。イベント受信・認証・組織管理を担当 |
| Worker - バックグラウンド処理 |
GlitchTip 6 以降は django-vtasks の runworker --scheduler で起動。5.x 以前は Celery + Celery Beat。アラート送信・アップタイム監視・データ集計を担当 |
| PostgreSQL - データベース |
バージョン 14 以上必須。イベント・Issue・組織・プロジェクトの永続化 |
| Valkey - Redis 互換 - キャッシュ・タスクキュー |
タスクブローカー・キャッシュ・セッション管理。最小構成では省略可能 |
| メールサーバー - 外部 |
アラート・ユーザー登録通知の送信先(SMTP / Mailgun 等) |
| オブジェクトストレージ - 外部 |
S3 互換ストレージ(ソースマップ・DIF・ユーザーアップロードファイル) |
all-in-one モード: 最小構成では Web コンテナが GLITCHTIP_EMBED_WORKER=true を設定し、Worker・スケジューラを同一プロセスに内包して起動します。
●コンポーネント図
| 要素 |
説明 |
| API 層 - Django Ninja |
Django Ninja を使用したスキーマ駆動 REST API。Sentry 互換エンドポイントも提供 |
| 認証 - allauth |
django-allauth による認証基盤。OAuth2 ソーシャルログイン・MFA・パスワードレス対応 |
| event-ingest |
Sentry SDK からのイベントを受信・検証・正規化してストアするパイプライン |
| issue-events |
正規化済みのイベントを Issue に集約・管理。検索・フィルタリングを提供 |
| projects |
プロジェクト(DSN 発行・SDK 設定)の CRUD 管理 |
| organizations-ext |
組織の CRUD・サブスクリプション・クォータ管理 |
| teams |
組織内チームの管理とプロジェクトへのアクセス制御 |
| users |
ユーザープロファイル・メンバーシップ・通知設定 |
| alerts |
アラートルール定義・通知チャンネル(メール・Webhook・Slack 等)・発火管理 |
| uptime |
URL の死活監視スケジュール管理・結果記録 |
| performance |
トランザクション・スパン・N+1 クエリ等のパフォーマンスデータ管理 |
| logs |
アプリケーションログ収集・保存(OpenTelemetry Logs 互換) |
| observability |
OpenTelemetry / Prometheus メトリクスエンドポイント提供 |
| releases |
デプロイリリースの記録・コミット関連付け |
| environments |
プロジェクト内環境(production / staging 等)の管理 |
| difs |
Debug Information Files(シンボルファイル)のアップロード・管理 |
| sourcecode |
ソースマップの処理・スタックトレースの逆変換 |
| files |
汎用ファイルアップロード管理(S3 互換ストレージ連携) |
| api-tokens |
ユーザー・組織単位の API トークン発行・管理 |
| oauth |
OAuth2 認可サーバー機能(外部アプリへのアクセス委譲) |
| stripe - 課金拡張 |
djstripe を拡張したサブスクリプション・クォータ課金管理 |
| importer - Sentry 移行インポート |
Sentry からのデータ移行用インポートユーティリティ |
■データ
●概念モデル
| 要素 |
説明 |
| Organization |
最上位の所有エンティティ。Team・Project・Environment・Release・Monitor を所有 |
| OrganizationUser |
User と Organization を紐付けるメンバーシップ。ロール情報を保持 |
| OrganizationOwner |
OrganizationUser から昇格されるオーナー指定 |
| Team |
組織内のチーム。OrganizationUser と Project を多対多で管理 |
| Environment |
production / staging 等の環境区分。Project と多対多 |
| Release |
デプロイされたアプリケーションバージョン |
| StatusPage |
複数 Monitor をまとめた公開ステータスページ |
| Project |
DSN を発行する単位。Issue・Monitor の所属先 |
| ProjectKey |
DSN の公開鍵。レート制限設定を保持 |
| ProjectAlert |
アラートルール。頻度閾値と通知先を持つ |
| AlertRecipient |
通知チャンネル(メール・Webhook 等) |
| Notification |
実際の通知送信インスタンス |
| Issue |
同一グループのエラー集約単位 |
| IssueEvent |
個別のエラーイベント(発生の瞬間のスナップショット) |
| IssueHash |
Issue をグルーピングするためのハッシュ |
| IssueTag |
Issue に付与されるタグ(環境・リリース等の検索用) |
| Comment |
Issue に対するコメント |
| UserReport |
エンドユーザーからのフィードバック |
| TransactionGroup |
パフォーマンストランザクションの集約 |
| SpanStaging |
スパンデータの一時領域 |
| Monitor |
アップタイム監視対象 |
| MonitorCheck |
Monitor の個別チェック結果 |
| User |
利用ユーザー |
IssueEvent.data の主要フィールド:
| フィールド |
説明 |
exception |
例外クラス名・メッセージ・スタックトレース情報 |
request |
HTTP リクエスト情報(URL・ヘッダー・ボディ・メソッド) |
user |
エンドユーザー識別情報(id・email・ip_address 等) |
breadcrumbs |
イベント発生前の操作ログ(ナビゲーション・クリック等) |
contexts |
OS・ランタイム・デバイス等のコンテキスト情報 |
sdk |
送信元 SDK の名前とバージョン |
●情報モデル
■構築方法
●必須環境変数一覧
| 環境変数 |
説明 |
例 |
SECRET_KEY |
セッション・暗号化用のランダム文字列 |
openssl rand -hex 32 で生成 |
DATABASE_URL |
PostgreSQL 14+ 接続文字列 |
postgres://user:pass@db:5432/glitchtip |
GLITCHTIP_DOMAIN |
スキーム付きのドメイン(末尾スラッシュなし) |
https://glitchtip.example.com |
EMAIL_URL |
メール送信設定 |
smtp+tls://user:pass@smtp.example.com:587 |
DEFAULT_FROM_EMAIL |
送信元メールアドレス |
glitchtip@example.com |
PORT |
Web サーバーのリスニングポート |
8000(v6 デフォルト) |
●オプション環境変数
| 環境変数 |
説明 |
デフォルト |
VALKEY_URL |
Valkey / Redis 接続 URL |
省略可 |
ENABLE_USER_REGISTRATION |
ユーザー自己登録を許可 |
true |
ENABLE_ORGANIZATION_CREATION |
一般ユーザーの組織作成を許可 |
false |
GLITCHTIP_RETENTION_DAYS |
イベントデータ保持日数 |
90 |
VTASKS_CONCURRENCY |
vtasks ワーカー並列数(v6 以降) |
20 |
CELERY_WORKER_AUTOSCALE |
Celery ワーカーの自動スケール(v5 以前) |
未設定 |
I_PAID_FOR_GLITCHTIP |
true で全機能有効化(寄付推奨) |
未設定 |
●docker-compose による構築
| ファイル |
用途 |
compose.sample.yml |
推奨構成(Web / Worker / Valkey / PostgreSQL 分離) |
compose.minimal.yml |
最小構成(256 MB RAM 環境向け、プロセス統合) |
x-environment: &default-environment
DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres
SECRET_KEY: your-secret-key-here
PORT: 8000
GLITCHTIP_DOMAIN: https://glitchtip.example.com
EMAIL_URL: smtp+tls://user:pass@smtp.example.com:587
DEFAULT_FROM_EMAIL: glitchtip@example.com
ENABLE_USER_REGISTRATION: "False"
GLITCHTIP_RETENTION_DAYS: "90"
services:
postgres:
image: postgres:17
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data
valkey:
image: valkey/valkey:8
restart: unless-stopped
web:
image: glitchtip/glitchtip:latest
depends_on: [postgres, valkey]
ports:
- "8000:8000"
environment: *default-environment
restart: unless-stopped
volumes:
- uploads:/code/uploads
worker:
image: glitchtip/glitchtip:latest
command: ./bin/run-worker.sh
depends_on: [postgres, valkey]
environment: *default-environment
restart: unless-stopped
volumes:
- uploads:/code/uploads
migrate:
image: glitchtip/glitchtip:latest
depends_on: [postgres]
command: "./manage.py migrate"
environment: *default-environment
volumes:
postgres-data:
uploads:
cp compose.sample.yml compose.yml
vi compose.yml
docker compose run --rm migrate
docker compose up -d
docker compose logs -f web
●メール設定の種類
EMAIL_URL="smtp+tls://user:pass@smtp.example.com:587"
EMAIL_URL="smtp+ssl://user:pass@smtp.example.com:465"
EMAIL_URL="smtp+tls://user%40gmail.com:pass@smtp.gmail.com:587"
EMAIL_URL="consolemail://"
EMAIL_BACKEND=anymail.backends.mailgun.EmailBackend
MAILGUN_API_KEY=key-xxxxx
EMAIL_BACKEND=anymail.backends.sendgrid.EmailBackend
SENDGRID_API_KEY=SG.xxxxx
●管理者ユーザー作成
docker compose run --rm web ./manage.py createsuperuser
●Helm / Kubernetes による構築
helm repo add glitchtip https://gitlab.com/api/v4/projects/16325141/packages/helm/stable
helm repo update
helm install glitchtip glitchtip/glitchtip -f my-values.yaml
image:
repository: glitchtip/glitchtip
tag: v6.0.0
pullPolicy: IfNotPresent
env:
normal:
GLITCHTIP_DOMAIN: https://glitchtip.example.com
ENABLE_USER_REGISTRATION: "false"
GLITCHTIP_RETENTION_DAYS: "90"
secret:
SECRET_KEY: "ランダムな文字列をここに設定"
DATABASE_URL: "postgresql://user:pass@external-db:5432/glitchtip"
EMAIL_URL: "smtp+tls://user:pass@smtp.example.com:587"
- PostgreSQL は外部マネージドサービス(Cloud SQL / RDS 等)を推奨
- Valkey の
auth.password は必須(未設定だと接続エラー)
- 複数ノード構成では PodDisruptionBudget と anti-affinity ルールを設定
●S3 互換ストレージ連携
DEFAULT_FILE_STORAGE=storages.backends.s3boto3.S3Boto3Storage
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_STORAGE_BUCKET_NAME=glitchtip-uploads
AWS_S3_ENDPOINT_URL=https://s3.example.com
AWS_S3_REGION_NAME=us-east-1
■利用方法
●DSN の構造
https://<public_key>@<host>/<project_id>
└── ProjectKey.public_key └── Project.id
| 要素 |
取得元 |
説明 |
<public_key> |
プロジェクト設定 → Client Keys |
認証用の公開鍵(ProjectKey.public_key) |
<host> |
GLITCHTIP_DOMAIN のホスト部分 |
GlitchTip のエンドポイント |
<project_id> |
Project.id |
プロジェクトの内部 ID |
●DSN 利用に必要な設定(SDK 共通)
| 設定項目 |
説明 |
例 |
dsn |
プロジェクト設定画面から取得する接続 URL |
https://<key>@glitchtip.example.com/<project-id> |
traces_sample_rate |
トランザクションサンプリング率(0.0〜1.0) |
0.01(1 % 推奨) |
auto_session_tracking |
セッション追跡(GlitchTip は未サポート) |
False に固定 |
release |
デプロイバージョン(任意) |
"v1.2.3" |
environment |
環境名(任意) |
"production" |
●組織 / プロジェクト作成
- ブラウザで
https://glitchtip.example.com にアクセスしログイン
- Organizations → Create Organization で組織を作成
- 組織内で Projects → Create Project でプロジェクトを作成(プラットフォームを選択)
- プロジェクト設定画面に DSN が表示される
●DSN 発行と確認
- プロジェクト作成直後の Issues ページに DSN が表示される
- 後から確認: Project Settings → DSN
●Python(基本)
import sentry_sdk
sentry_sdk.init(
dsn="https://abc123@glitchtip.example.com/1",
traces_sample_rate=0.01,
auto_session_tracking=False,
release="v1.2.3",
environment="production",
)
division_by_zero = 1 / 0
●Python Django / Flask
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
sentry_sdk.init(
dsn="https://abc123@glitchtip.example.com/1",
integrations=[DjangoIntegration()],
traces_sample_rate=0.01,
auto_session_tracking=False,
)
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
sentry_sdk.init(
dsn="https://abc123@glitchtip.example.com/1",
integrations=[FlaskIntegration()],
traces_sample_rate=0.01,
auto_session_tracking=False,
)
●JavaScript / Node.js / Next.js
npm install @sentry/browser @sentry/node @sentry/nextjs
import * as Sentry from "@sentry/browser";
Sentry.init({
dsn: "https://abc123@glitchtip.example.com/1",
tracesSampleRate: 0.01,
autoSessionTracking: false,
release: "v1.2.3",
environment: "production",
});
const Sentry = require("@sentry/node");
const express = require("express");
Sentry.init({
dsn: "https://abc123@glitchtip.example.com/1",
tracesSampleRate: 0.01,
autoSessionTracking: false,
});
const app = express();
Sentry.setupExpressErrorHandler(app);
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: "https://abc123@glitchtip.example.com/1",
tracesSampleRate: 0.01,
autoSessionTracking: false,
});
import "github.com/getsentry/sentry-go"
sentry.Init(sentry.ClientOptions{
Dsn: "https://abc123@glitchtip.example.com/1",
Environment: "production",
Release: "v1.2.3",
})
●Source Maps / Release アップロード
pip install glitchtip-cli
glitchtip-cli --url https://glitchtip.example.com login
glitchtip-cli releases new v1.2.3 --org my-org --project my-project
glitchtip-cli releases set-commits v1.2.3 --auto --org my-org --project my-project
glitchtip-cli sourcemaps inject ./dist
glitchtip-cli sourcemaps upload ./dist --release v1.2.3 --org my-org --project my-project
glitchtip-cli releases finalize v1.2.3 --org my-org --project my-project
[defaults]
url = https://glitchtip.example.com
org = my-org
project = my-project
[auth]
token = your-auth-token
●アラート設定
- Projects ページで対象プロジェクトの設定を開く
- Alerts セクションへ移動
- エラー発生頻度のしきい値を設定(例: 5 分間に 10 回以上)
- 通知先を設定(デフォルトはメール、Webhook 追加可)
- アラートを保存
●Uptime モニタ
| タイプ |
動作 |
用途 |
| Ping |
GlitchTip → 対象 URL へ HTTP HEAD |
一般的な死活監視 |
| GET |
GlitchTip → 対象 URL へ HTTP GET |
レスポンスボディが必要な場合 |
| POST |
GlitchTip → 対象 URL へ HTTP POST |
API エンドポイント監視 |
| Heartbeat |
対象サービス → GlitchTip へ定期送信 |
バッチジョブ・Cron の生存確認 |
*/5 * * * * curl -s https://glitchtip.example.com/api/0/monitors/<uuid>/checkin/
■運用
●起動 / 停止 / 状態確認 / ログ確認
docker compose pull
docker compose up -d
docker compose stop
docker compose down
docker compose ps
docker compose logs -f web
docker compose logs -f worker
- マイグレーションは
up -d 時に自動実行される
- ログ詳細度を上げる場合は環境変数
LOG_LEVEL=INFO または DEBUG を設定(デフォルトは WARNING)
●アップグレード
docker compose pull
docker compose stop
docker compose up -d
docker compose logs -f web
4.x → 6.x アップグレードの注意点:
- 4.x ユーザーは必ず 5.x に上げてから 6.x に進む(直接 6.x への上げは非サポート)
- GlitchTip 6 は UUIDv7 主キーへ移行。デフォルトで直近 10,000 件のみ自動移行
- 大量データを保持する場合は以下を設定してから手動移行
GLITCHTIP_RETAIN_LEGACY_DATA=True
docker compose exec web ./manage.py import_legacy_events --limit 100000 --delete-source
- GlitchTip 6 からポートが 8080 → 8000 に変更
●PostgreSQL バックアップ / リストア
docker compose exec postgres pg_dump -U postgres -Fc postgres > backup_$(date +%Y%m%d_%H%M%S).dump
docker compose exec postgres pg_dump -U postgres postgres > backup.sql
docker cp backup.dump <postgres_container>:/tmp/backup.dump
docker compose exec postgres pg_restore -c -U postgres -d postgres /tmp/backup.dump
0 2 * * * root docker compose -f /opt/glitchtip/compose.yml exec -T postgres pg_dump -U postgres -Fc postgres > /backup/glitchtip_$(date +\%Y\%m\%d).dump
●Worker スケール
environment:
- VTASKS_CONCURRENCY=20
- DATABASE_POOL_MAX_SIZE=20
environment:
- CELERY_WORKER_AUTOSCALE=2,8
- CELERY_WORKER_MAX_TASKS_PER_CHILD=10000
docker compose up -d --scale worker=3
- 水平スケール時はスケジューラ重複に注意。専用スケジューラコンテナを分離する構成が推奨
start-all-in-one.sh を使う場合はスケールせず 1 プロセスで運用
services:
scheduler:
image: glitchtip/glitchtip:latest
command: ./bin/run-worker.sh
environment:
<<: *default-environment
SERVER_ROLE: scheduler
VTASKS_CONCURRENCY: "1"
worker:
image: glitchtip/glitchtip:latest
command: ./bin/run-worker.sh
environment:
<<: *default-environment
SERVER_ROLE: worker
VTASKS_CONCURRENCY: "20"
deploy:
replicas: 3
●データ保持(イベントクリーンアップ)
GLITCHTIP_RETENTION_DAYS=90
GLITCHTIP_EVENT_HOT_DAYS=30
GLITCHTIP_LOG_HOT_DAYS=7
GLITCHTIP_RELEASE_RETENTION_DAYS=365
GLITCHTIP_ENABLE_DUCKDB=true
GLITCHTIP_COLD_STORAGE_BUCKET=s3://my-bucket/glitchtip-cold
GLITCHTIP_COLD_STORAGE_CLEANUP_ENABLED=true
DUCKDB_MEMORY_LIMIT=256MB
- 参考値: 月間 100 万イベントで約 30 GB のディスク使用量
●モニタリング
curl -f http://localhost:8000/api/0/
curl -H "Authorization: Bearer <AUTH_TOKEN>" http://localhost:8000/api/0/observability/
scrape_configs:
- job_name: 'glitchtip'
static_configs:
- targets: ['glitchtip.example.com']
scheme: https
metrics_path: /api/0/observability/
bearer_token: '<GLITCHTIP_AUTH_TOKEN>'
ENABLE_OBSERVABILITY_API=true
■ベストプラクティス
●リバースプロキシ配下配置(SSL)
server {
listen 80;
server_name glitchtip.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name glitchtip.example.com;
ssl_certificate /etc/letsencrypt/live/glitchtip.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/glitchtip.example.com/privkey.pem;
client_max_body_size 40M;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_request_buffering off;
}
}
services:
web:
image: glitchtip/glitchtip
labels:
- "traefik.enable=true"
- "traefik.http.routers.glitchtip.rule=Host(`glitchtip.example.com`)"
- "traefik.http.routers.glitchtip.entrypoints=websecure"
- "traefik.http.routers.glitchtip.tls.certresolver=letsencrypt"
- "traefik.http.services.glitchtip.loadbalancer.server.port=8000"
SECURE_HSTS_SECONDS=31536000
SECURE_HSTS_PRELOAD=true
SECURE_HSTS_INCLUDE_SUBDOMAINS=true
CSRF_TRUSTED_ORIGINS=https://glitchtip.example.com
●SMTP / OAuth 設定
- SMTP は
EMAIL_URL に加え、Mailgun / SendGrid / Postmark / Mailjet / Brevo 等を Anymail 経由で利用可能
- OAuth プロバイダーは Django Admin
/admin/socialaccount/socialapp/ から設定
- 対応プロバイダー: GitHub / GitLab / Gitea / Google / Microsoft / Okta / NextCloud / OpenID Connect(汎用)
- コールバック URL 形式:
https://glitchtip.example.com/accounts/<provider>/login/callback/
●シークレット管理
SECRET_KEY=your-very-long-random-secret-key
DATABASE_URL=postgres://glitchtip:password@postgres:5432/glitchtip
VALKEY_URL=redis://valkey:6379
EMAIL_URL=smtp+tls://sender:password@smtp.example.com:587
GLITCHTIP_DOMAIN=https://glitchtip.example.com
DEFAULT_FROM_EMAIL=noreply@example.com
- シークレットは
compose.yml に直書きせず、.env や外部シークレットマネージャーを使用
.env は .gitignore に追加
●マルチ環境構成
services:
web:
environment:
- LOG_LEVEL=WARNING
- GLITCHTIP_RETENTION_DAYS=90
services:
web:
environment:
- LOG_LEVEL=INFO
- GLITCHTIP_RETENTION_DAYS=14
- EMAIL_URL=consolemail://
docker compose -f compose.yml -f compose.production.yml up -d
●CI/CD 連携(Release 通知)
- name: Notify GlitchTip of release
env:
SENTRY_URL: https://glitchtip.example.com
SENTRY_AUTH_TOKEN: ${{ secrets.GLITCHTIP_AUTH_TOKEN }}
SENTRY_ORG: my-org
SENTRY_PROJECT: my-project
run: |
glitchtip-cli releases new ${{ github.sha }}
glitchtip-cli releases set-commits ${{ github.sha }} --auto
glitchtip-cli releases finalize ${{ github.sha }}
glitchtip-cli deploys new ${{ github.sha }} --env production
●リソース制限
services:
web:
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
memory: 256M
worker:
deploy:
resources:
limits:
cpus: '2.0'
memory: 1G
| 規模 |
構成 |
最小メモリ |
| 小(個人・小チーム) |
all-in-one モード(SERVER_ROLE=all_in_one) |
256 MB |
| 中(チーム) |
Web + Worker 分離 |
512 MB |
| 大(エンタープライズ) |
Web × N + Worker × N + 外部 DB / Valkey |
1 GB+ |
VTASKS_CONCURRENCY=20
DATABASE_POOL_MAX_SIZE=20
GRANIAN_WORKERS=2
■トラブルシューティング
●頻出エラー一覧
| 症状 |
原因 |
対処 |
| メール送信が届かない |
EMAIL_URL が Worker サービスに未設定 |
Worker にも同じ EMAIL_URL を設定 |
| メール設定で特殊文字を含むとエラー |
@ / + が未エスケープ |
URL エンコード(例: @ → %40) |
| DSN 送信が届かない |
GLITCHTIP_DOMAIN が http:// 始まり |
https:// に変更し DSN を再コピー |
| DSN 送信が届かない |
リバースプロキシが chunked Transfer-Encoding 非対応 |
Nginx で proxy_request_buffering off; を設定 |
| マイグレーションが失敗 |
PostgreSQL が 14 未満 |
14 以上にアップグレード |
| マイグレーションが失敗 |
DB ユーザーに CREATE / ALTER 権限がない |
DDL 権限を付与 |
| イベントが UI に表示されない |
Worker が停止 / クラッシュ |
docker compose logs worker を確認、restart worker |
| イベントが UI に表示されない |
Valkey 接続が切れている |
VALKEY_URL を確認、restart valkey |
| Worker が動かない |
VTASKS_CONCURRENCY がリソース超過 |
小規模では VTASKS_CONCURRENCY=4 に下げる |
| 503 / 接続エラー |
Granian のポートが変更された(v6 で 8080 → 8000) |
リバースプロキシのアップストリームを 8000 に |
| CSRF エラー |
CSRF_TRUSTED_ORIGINS 未設定 |
CSRF_TRUSTED_ORIGINS=https://glitchtip.example.com を追加 |
| v6 アップグレード後にイベントが消えた |
UUIDv7 移行で既定 10,000 件のみ自動移行 |
GLITCHTIP_RETAIN_LEGACY_DATA=True + import_legacy_events |
| ディスクがすぐに満杯 |
GLITCHTIP_RETENTION_DAYS が長すぎる |
保持期間短縮 or DuckDB コールドストレージ導入 |
| OAuth ログイン失敗 |
コールバック URL がプロバイダー設定と不一致 |
/accounts/<provider>/login/callback/ を確認 |
●デバッグ手順の基本フロー
LOG_LEVEL=DEBUG
docker compose up -d
docker compose logs -f web
docker compose logs -f worker
glitchtip-cli info
glitchtip-cli send-event -m "Test: $(date)"
MAINTENANCE_EVENT_FREEZE=true docker compose up -d
●GlitchTip 6 移行チェックリスト
■まとめ
GlitchTip は、Sentry SDK と完全互換の MIT ライセンスで提供されるエラートラッキングプラットフォームです。Django + PostgreSQL + Valkey の軽量構成で小規模 VPS から運用でき、DSN 変更のみで Sentry からの移行が完了します。
この記事が少しでも参考になった、あるいは改善点などがあれば、ぜひリアクションやコメント、SNS でのシェアをいただけると励みになります!
■参考リンク
- 公式ドキュメント
- GitHub / GitLab
- 記事