Skip to content

Troubleshooting

Start every investigation with two commands:

Terminal window
curl -s https://YOUR-DOMAIN/api/health
docker compose -f App/docker/docker-compose.yml logs syncbins --tail=200

{"ok":true,"version":"…"} means the process is up. Everything else narrows from there.

Log / symptomCauseFix
BLOB_URL_SECRET is requiredMissing env in production composeSet in docker/.env: openssl rand -hex 32
Invalid server configurationZod validation failed on envMatch Configuration reference
EADDRINUSE :8080Port conflictStop other service or change LISTEN_PORT
SQLite permission errorBind mount not writablechown/chmod on ./data for container user
SymptomFix
Browser stuck on HTTP or cert warningConfirm DNS A/AAAA record, ports 80+443 open, hit HTTPS not :8080
Caddy loop / no cert (multi-tenant)Ensure tenant exists — curl "https://apex/api/tls-check?domain=slug.domain" returns 200
LE rate limitReduce repeated failed issuances; fix tls-check before retrying

See TLS & domains.

SymptomFix
”Already has devices” on fresh self-hostSomeone else claimed first — use pair path, or POST /api/devices/bootstrap/restart if single-tenant orphan (see First-time setup)
Server unreachable from browserCheck Caddy → syncbins network, DOMAIN matches URL
Recovery phrase mismatchWrong vault — compare fingerprint in onboarding with Settings → Encryption
ErrorFix
pair_expiredCode older than 5 minutes — generate new code
pair_invalidTypo in six words — copy hyphenated code from Copy code button
Hangs on “waiting”Keep generating device online with active session

Client-side: Pairing more devices.

SymptomFix
Items save but don’t appear elsewhereCheck WS in browser devtools — should stay connected to wss://…/ws?token=…
Constant reconnect loopToken expired (30-day session) — re-pair device
Stale feed after offlineNormal — client sends hello with last version on reconnect; wait for caught_up

Protocol details: How sync works, WebSocket protocol.

SymptomFix
Upload URL rejectedstorage_full — raise STORAGE_CAP_BYTES or free space (multi-tenant quotas)
Download 403 on local storageBLOB_URL_SECRET changed since upload — secrets must stay stable or URLs invalidate
R2/Azure errorsVerify credentials in .env, bucket exists, clock skew minimal
  1. Confirm bind mount still points at ./data:/data in compose.
  2. Check SQLITE_PATH and LOCAL_BLOB_DIR inside container env.
  3. If you restored backup, ensure blob files match blob_ref entries in SQLite.

Hosted: info@syncbins.com (never send recovery phrase or PIN).

Self-hosted: open a GitHub issue with redacted logs, TENANT_MODE, storage backend, and steps to reproduce. On a Raspberry Pi, include docker compose exec syncbins uname -m (expect aarch64) — see Raspberry Pi.