# Dev Container Bugsink Setup Local Bugsink instance for development - NOT connected to production. ## Quick Reference | Item | Value | | ------------ | ----------------------------------------------------------- | | UI | `https://localhost:8443` (nginx proxy from 8000) | | Credentials | `admin@localhost` / `admin` | | Projects | Backend (Dev) = Project ID 1, Frontend (Dev) = Project ID 2 | | Backend DSN | `SENTRY_DSN=http://@localhost:8000/1` | | Frontend DSN | `VITE_SENTRY_DSN=http://@localhost:8000/2` | ## Configuration Files | File | Purpose | | ----------------- | ----------------------------------------------------------------- | | `compose.dev.yml` | Initial DSNs using `127.0.0.1:8000` (container startup) | | `.env.local` | **OVERRIDES** compose.dev.yml with `localhost:8000` (app runtime) | **CRITICAL**: `.env.local` takes precedence over `compose.dev.yml` environment variables. ## Why localhost vs 127.0.0.1? The `.env.local` file uses `localhost` while `compose.dev.yml` uses `127.0.0.1`. Both work in practice - `localhost` was chosen when `.env.local` was created separately. ## HTTPS Setup - Self-signed certificates auto-generated with mkcert on container startup - CSRF Protection: Django configured with `CSRF_TRUSTED_ORIGINS` for both `localhost` and `127.0.0.1` (see below) - HTTPS proxy: nginx on port 8443 proxies to Bugsink on port 8000 - HTTPS is for UI access only - Sentry SDK uses HTTP directly ### CSRF Configuration Django 4.0+ requires `CSRF_TRUSTED_ORIGINS` for HTTPS POST requests. The Bugsink configuration (`Dockerfile.dev`) includes: ```python CSRF_TRUSTED_ORIGINS = [ "https://localhost:8443", "https://127.0.0.1:8443", "http://localhost:8000", "http://127.0.0.1:8000", ] SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") ``` **Both hostnames are required** because browsers treat `localhost` and `127.0.0.1` as different origins. If you get "CSRF verification failed" errors, see [BUGSINK-SETUP.md](tools/BUGSINK-SETUP.md#csrf-verification-failed) for troubleshooting. ## Isolation Benefits - Dev errors stay local, don't pollute production/test dashboards - No Gitea secrets needed - everything self-contained - Independent testing of error tracking without affecting metrics ## Accessing Errors ### Via Browser 1. Open `https://localhost:8443` 2. Login with credentials above 3. Navigate to Issues to view captured errors ### Via MCP (bugsink-dev) Configure in `.claude/mcp.json`: ```json { "bugsink-dev": { "command": "node", "args": ["d:\\gitea\\bugsink-mcp\\dist\\index.js"], "env": { "BUGSINK_URL": "http://localhost:8000", "BUGSINK_API_TOKEN": "", "BUGSINK_ORG_SLUG": "sentry" } } } ``` **Get auth token**: API tokens must be created via Django management command (Bugsink 2.0.11 does not have a "Settings > API Keys" UI): ```bash podman exec flyer-crawler-dev sh -c 'cd /opt/bugsink/conf && \ DATABASE_URL=postgresql://bugsink:bugsink_dev_password@postgres:5432/bugsink \ SECRET_KEY=dev-bugsink-secret-key-minimum-50-characters-for-security \ DJANGO_SETTINGS_MODULE=bugsink_conf \ PYTHONPATH=/opt/bugsink/conf:/opt/bugsink/lib/python3.10/site-packages \ /opt/bugsink/bin/python -m django create_auth_token' ``` This will output a 40-character lowercase hex token. Copy it to your MCP configuration. **MCP Tools**: Use `mcp__bugsink-dev__*` tools (not `mcp__bugsink__*` which connects to production).