Description
Bugsink est un error tracker self-hosted écrit en Python/Django, conçu par Simon Willison (créateur de Django co-founder, Datasette) comme une alternative plus simple, plus légère, et 100% open source à Sentry. Le pari : offrir un sous-ensemble des fonctionnalités Sentry (capture d'exceptions, alertes, groupement) sans la complexité d'un stack à 15 services (PostgreSQL, Redis, Kafka, ClickHouse, Snuba…).
Concrètement, Bugsink utilise SQLite par défaut (un seul fichier !), est compatible avec le SDK Sentry (envelope endpoint, source maps), et reste performant jusqu'à plusieurs millions d'événements grâce à un schéma de données soigneusement optimisé. L'interface est volontairement épurée et lisible : on voit immédiatement les nouveaux événements, les issues groupées, les tendances.
Pour les équipes qui ont trouvé Sentry self-hosted trop lourd (l'image Docker officielle fait 1+ Go, 8 Go de RAM recommandés) ou GlitchTip pas assez complet, Bugsink représente un excellent compromis : simple à déployer, complet sur l'essentiel, et vraiment open source (MIT, pas de FSL).
Public cible : développeurs solos, petites équipes, indie hackers, projets personnels qui veulent un error tracker qui juste marche, sans Datadog.
Fonctionnalités principales
- ✅ Compatibilité SDK Sentry : les apps existantes migrent en 1 ligne (changement de DSN)
- ✅ Groupement intelligent : fingerprints, similarité, déduplication
- ✅ Source maps : débuggage code minifié JS
- ✅ Release tracking : corrélation avec déploiements
- ✅ Alertes email : nouveaux problèmes, pics d'erreurs
- ✅ Interface Django admin custom, sobre et rapide
- ✅ SQLite par défaut : zéro-setup, idéal pour démarrer
- ✅ PostgreSQL/MySQL : supporté pour les gros volumes
- ✅ API REST : ingestion, listing, management
- ✅ Multi-projets : séparés par tag
project - ✅ Retention configurable : 30j, 90j, 1an
- ✅ Pas de vendor lock-in : export des données en JSON/CSV
Installation
Via Docker (recommandé)
# docker-compose.yml
version: '3.8'
services:
bugsink:
image: bugsink/bugsink:latest
container_name: bugsink
restart: unless-stopped
ports:
- "8000:8000"
environment:
DEBUG: "false"
SECRET_KEY: "changez-moi-en-production-50-chars-random"
ALLOWED_HOSTS: "bugsink.example.com"
DATABASE_URL: "sqlite:////data/bugsink.db"
SINGLE_USER: "[email protected]"
volumes:
- bugsink_data:/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.bugsink.rule=Host(`bugsink.example.com`)"
- "traefik.http.routers.bugsink.entrypoints=websecure"
- "traefik.http.routers.bugsink.tls.certresolver=letsencrypt"
volumes:
bugsink_data:
Via pip
pip install bugsink bugsink migrate bugsink runserver
Installation manuelle
git clone https://github.com/bugsink/bugsink.git cd bugsink pip install -e . python manage.py migrate python manage.py runserver
Configuration
- Créer le compte admin :
python manage.py createsuperuserou viaSINGLE_USER - Créer un projet : admin > Projects > New (récupère le DSN)
- Intégrer le SDK dans votre app (le DSN Bugsink est compatible Sentry) :
import sentry_sdk sentry_sdk.init(dsn="https://<key>@bugsink.example.com/<project>")
- Configurer les alertes : Settings > Alerts > email destinataires
- Source maps : uploader via
sentry-cli releases(même CLI que Sentry) - Retention :
BUGSINK_RETENTION_DAYS=90dans l'env
Alternatives
- Sentry — Standard du marché, mais self-hosted lourd (FSL, 8 Go RAM min)
- GlitchTip — Clone Sentry en Python/Django, plus complet que Bugsink
- Errbit — Error tracker Ruby historique, plus maintenu
- Highlight.io — Error tracking + session replay, commercial
- Posthog — Module error tracking intégré (avec analytics produit)
- SigNoz — APM complet (traces + errors + metrics), plus large que Bugsink
Sécurité
- 🔐 SECRET_KEY robuste :
openssl rand -hex 50minimum - 🛡️ HTTPS obligatoire via [[app-traefik]] : les DSN et payloads d'erreur transitent en clair sinon
- 🔒 DSN en secret : ne pas exposer publiquement (même s'il est en lecture seule, c'est un canal d'écriture)
- 🛡️ Scrubbing PII : configurer
before_sendcôté SDK pour filtrer emails, mots de passe - 🛡️ Rétention : définir une durée de rétention raisonnable (90j suffit en général, RGPD)
- 🛡️ Auth admin : activer 2FA pour le compte admin

