Every setting is environment variables read at server boot. There is no Settings UI for storage credentials — and there shouldn’t be: R2/S3 keys belong in .env, Docker secrets, or your host’s secret store, not in the browser.
Most self-hosters set two vars
For a typical single-user box with local disk storage, production needs only DOMAIN and BLOB_URL_SECRET. Everything else below has a sensible default. Cloud blob storage is optional — see Choosing storage .
You are… Set these Leave defaults for… Trying locally (dev compose)Nothing Everything — local SQLite + local blobs Production, local blobs DOMAIN, BLOB_URL_SECRETSTORAGE_KIND=local, TENANT_MODE=singleProduction, R2 or Azure blobs Above + storage block below Stripe, multi-tenant Running syncbins.com-style hosting TENANT_MODE=multi + Stripe vars—
Self-hosters run the same server binary as hosted syncbins.com. The difference is env: single-tenant vs multi-tenant, local disk vs cloud blobs, billing on or off.
Variable Default Description LISTEN_HOST0.0.0.0Bind address LISTEN_PORT8080HTTP port (Caddy proxies here in production) DATA_DIR./dataBase data directory SQLITE_PATH./data/syncbins.dbSQLite metadata DB (items, devices, sessions, sync log) LOG_LEVELinfoPino log level: trace … fatal
In Docker production compose, SQLITE_PATH is usually /data/syncbins.db with ./data bind-mounted on the host.
Variable Default Description STORAGE_KINDlocallocal, azure, or r2LOCAL_BLOB_DIR./data/blobsEncrypted blob files when STORAGE_KIND=local BLOB_URL_SECRET(dev default) Required in production. 32+ char HMAC secret for signed local blob URLs. Generate: openssl rand -hex 32
Variable Required Default AZURE_STORAGE_CONNECTION_STRINGyes — AZURE_BLOB_CONTAINERno syncbins
Variable Required Default R2_ACCOUNT_IDyes — R2_ACCESS_KEY_IDyes — R2_SECRET_ACCESS_KEYyes — R2_BUCKETno syncbins
R2 uses Cloudflare’s S3-compatible API. There is no separate generic S3 driver today — AWS S3 would use the same presigned-URL pattern in a future driver; for now use R2 (S3-compatible, zero egress) or Azure .
Variable Default Description BLOB_UPLOAD_URL_TTL_MS900000 (15 min)Presigned upload URL lifetime BLOB_DOWNLOAD_URL_TTL_MS300000 (5 min)Presigned download URL lifetime
Variable Default Description TENANT_MODEsinglesingle = one vault (default tenant). Self-hosters keep this.BASE_DOMAINsyncbins.comUsed when TENANT_MODE=multi to build tenant URLs STRIPE_BILLING_ENABLEDfalseSet true only for paid hosted service STRIPE_SECRET_KEY— Stripe API secret STRIPE_WEBHOOK_SECRET— Stripe webhook signing secret STRIPE_PRICE_ID— Stripe price for Pro tier
Variable Default Description PAIR_CODE_TTL_MS300000 (5 min)Pair-code lifetime
DOMAIN =box.yourdomain.com
BLOB_URL_SECRET =abc123… # openssl rand -hex 32
DOMAIN =box.yourdomain.com
R2_ACCOUNT_ID =your-cloudflare-account-id
DOMAIN =box.yourdomain.com
AZURE_STORAGE_CONNECTION_STRING = DefaultEndpointsProtocol =https ;AccountName=…;AccountKey=…
AZURE_BLOB_CONTAINER =syncbins
What the web app shows
Settings → Server shows live stats from your box (latency, items, devices). It does not configure storage — that’s deliberate. Settings → Backups still shows placeholder S3/R2 UI; automated backup destinations are not wired up yet.