Troubleshooting
Common issues and solutions when running BurnerByte.
Emails Not Being Received
Symptoms: Inboxes are created but no emails arrive.
Check these in order:
- SMTP server running? — Verify
cmd/smtpdis running and listening on port 2525 - DNS records configured? — Both MX and TXT records must be verified. Check with
dig MX yourdomain.comanddig TXT yourdomain.com - Domain verified? — Go to Domains and check that both MX and TXT show green checkmarks
- Inbox active? — Expired inboxes stop receiving. Check the TTL countdown
- Port forwarding? — If running behind a firewall, port 25 must be forwarded to 2525. See Reverse Proxy
- Redis running? — The SMTP router looks inboxes up in Redis first and falls back to Postgres on a miss, so Redis being down slows ingest rather than stopping it.
GET /readyzcovers the API process;smtpdexposes no HTTP endpoint, so check its logs.
# Test SMTP directlyswaks --to test@yourdomain.com --server localhost:2525 # Check healthcurl http://localhost:8080/readyzDomain Never Verifies
Symptoms: MX and/or TXT stay red on the domain detail page no matter how many times you click Re-verify DNS.
- Is
BB_SMTP_HOSTNAMEset on the API process? — The API, notsmtpd, runs DNS verification. Setting it only on the SMTP container leaves the API on thelocalhostdefault, which no real MX record matches. Docker Compose sets it on both services for exactly this reason. - Does the MX target match it exactly? — The comparison is case-insensitive
equality with the trailing dot stripped; there is no suffix or subdomain
fallback. An MX of
mail.example.comagainst aBB_SMTP_HOSTNAMEofexample.comdoes not verify.bash dig +short MX yourdomain.com # must equal BB_SMTP_HOSTNAMEdocker compose exec api printenv BB_SMTP_HOSTNAME - Is the TXT token current? — The value is
burnerbyte-verify=<domain UUID>. Deleting and re-adding a domain mints a new one, so the old record stops matching. - SPF stuck red? — SPF is informational and gates nothing, but the check
needs a
v=spf1record containingBB_SMTP_HOSTNAMEas a literal substring."v=spf1 mx -all"is valid SPF and will still read red; use"v=spf1 a:mail.yourserver.com mx -all". - Was it green and went red? — That is not a transient lookup failure: a lookup error preserves the previous status. Red after green means a successful lookup returned no match, so the record really did change.
WebSocket Not Connecting
Symptoms: Real-time updates don't work, inbox page shows "Disconnected".
- Reverse proxy configured for WebSocket? — Nginx needs
proxy_http_version 1.1andUpgradeheaders. See Reverse Proxy - CORS origins correct? —
BB_CORS_ALLOWED_ORIGINSmust include your frontend URL - Auth failing? — The UI authenticates WebSockets with a short-lived one-time ticket: it calls
POST /api/v1/ws/ticketand connects with?ticket=<ticket>. A 401 on that POST means the access token has expired. Non-browser clients may still pass?token=<jwt>directly.
Setup Wizard Loops
Symptoms: Redirected back to /setup after completing it.
The setup state is stored in the setup_state database table. If the table is empty or the completed flag is false:
-- Check setup state (a singleton table — always exactly one row, id = true)SELECT * FROM setup_state; -- Force completion (if setup was done manually)UPDATE setup_state SET completed = true, completed_at = now() WHERE id = true;Database Connection Errors
Symptoms: API returns 500 errors, /readyz fails.
- Connection string correct? — Check
DATABASE_URLformat:postgres://user:pass@host:5432/dbname?sslmode=disable - Migrations applied? — Run
make migrate-up - Connection pool exhausted? — Increase
BB_DATABASE_MAX_OPEN_CONNS(default: 25)
SSO Login Fails
Symptoms: "SSO login failed" error after redirect.
- Redirect URL matches? — The callback URL in your provider must exactly match the
redirect_urlconfigured in BurnerByte - Client ID/Secret correct? — Use the Test button on the SSO provider card to verify connectivity
- Allowed domains? — If
allowed_domainsis set, the user's email domain must be in the list - Encryption key set? — SSO secrets are encrypted at rest. Ensure
BB_ENCRYPTION_KEYis a 64-character hex string
# Generate an encryption keyopenssl rand -hex 32Attachments Not Saving
Symptoms: Emails arrive but attachments are missing.
- Attachments enabled? — Check org settings (
attachments_enabled) and domain assignment settings - MinIO running? — Check
GET /api/v1/admin/healthfor MinIO status - Bucket exists? —
BB_MINIO_BUCKET(defaultburnerbyte) is created automatically at boot, not on first upload. If creation fails — typicallyAccessDenied— the process falls back to local-filesystem attachments at/data/attachments. Check the startup logs. - File size limit? — Check
BB_DEFAULTS_MAX_ATTACHMENT_SIZE_MB(default: 25 MB)
Rate Limiting
Symptoms: 429 Too Many Requests errors.
Default limits:
- Authenticated: 300 requests/minute
- Unauthenticated: 60 requests/minute
- Login: 10 attempts/minute per IP
- Password reset: 3 requests/hour per IP
Note that .env.example ships 100 / 20 / 5 for the first three — if you copied it,
those are your effective limits rather than the defaults above.
Adjust via config:
rate_limit: authenticated: 200 unauthenticated: 50 login: 10Account Lockout
Symptoms: "Account locked" error on login.
After 5 failed login attempts (configurable), the account is locked for 15 minutes. Wait for the lockout to expire, or have an admin unlock via the user detail dialog in Settings → Users.
Performance Issues
Symptoms: Slow page loads, high API latency.
- Check health endpoint —
GET /api/v1/admin/healthshows service latencies - Database indexes — Ensure all 50 migrations are applied (74 indexes)
- Redis cache — Analytics and inbox routing are cached in Redis. Verify Redis is running
- Connection pool — Increase
BB_DATABASE_MAX_OPEN_CONNSfor high-traffic deployments - Worker intervals — The analytics worker pre-computes stats every 5 minutes. Reduce
BB_WORKERS_ANALYTICS_INTERVALfor fresher data
Getting Help
- GitHub Issues: github.com/AmJaradat01/burnerbyte/issues
- API Docs: /docs/api — Full endpoint reference
- Health Check:
GET /api/v1/admin/health— Service status and latencies