Troubleshooting
The container fails to start or reports database permissions errors
- Check directory permissions: The Slite container runs under the non-root user UID
5483. If using a host bind mount (e.g./srv/slite:/data), ensure UID5483owns the directory:shsudo chown -R 5483:5483 /srv/slite - Ensure single-process exclusivity: Only one process may hold open the SQLite and DuckDB databases. Verify no development server or secondary container has the same directory mounted.
- Inspect container logs:sh
docker compose logs -f
Cannot sign in to /dashboard or API calls return 401
- Verify
NUXT_SITE_TOKEN: EnsureNUXT_SITE_TOKENis explicitly defined in.env, contains at least 8 characters, and has no whitespace. - Ephemeral random token fallback: If
NUXT_SITE_TOKENis unset or empty, Slite generates a random token that exists purely in process memory. Public redirects work, but the dashboard and protected API cannot authenticate. Define a token and restart the container:shdocker compose up -d - Authorization header format: API requests must use the exact format
Authorization: Bearer YOUR_SITE_TOKEN.
Data disappeared after recreating or updating the container
- Verify volume mounts: Check
compose.yamlto ensure the persistent volume (defaultslite-data:/data) is properly mounted. - Did you use
down -v? Runningdocker compose down -vdeletes named volumes. During normal maintenance or upgrades, usedocker compose down(without-v) or rundocker compose up -ddirectly.
Country and city analytics charts are empty
- GeoIP database resolution: Release Docker images bundle the DB-IP City Lite database, which activates automatically. For source builds or custom images, ensure a valid MMDB file exists at
/data/geoip.mmdbor setNUXT_GEOIP_PATH. - Fail-open behavior: When no database is found, Slite fails open by leaving geographic fields empty rather than interrupting redirects.
- No time-zone data: City Lite contains country, region, city, and coordinates, but does not provide time zones. Slite never invents missing time zones.
- Proxy configuration: Setting
NUXT_TRUST_PROXY=truechanges which client IP is inspected, but does not generate location data on its own.
Client IP addresses are incorrect behind a reverse proxy
- Ensure direct connections to the application port are blocked and all traffic passes through your reverse proxy.
- Configure the reverse proxy to overwrite incoming
X-Forwarded-Foror provide a trusted header such asCF-Connecting-IP. - Set
NUXT_TRUST_PROXY=truein.env. If using a specific header, setNUXT_CLIENT_IP_HEADER=CF-Connecting-IP.
Realtime 3D globe events arrive in bursts or feel delayed
This is expected behavior. The realtime dashboard polls DuckDB approximately every 10 seconds and replays queued events at roughly one per second. It is a pseudo-live visual overview, not an SSE or WebSocket stream. Verify that the view is not paused and the browser tab remains active.
Custom short codes lose uppercase letters
Set NUXT_CASE_SENSITIVE=true in .env and restart the container. Case sensitivity applies only to custom short codes; auto-generated random codes always remain lowercase. Existing links are not retroactively renamed.
Cloaked page is blank or refuses to load
The destination website likely enforces anti-framing policies (X-Frame-Options or Content-Security-Policy: frame-ancestors). Disable cloaking for that link. Most third-party authentication and checkout pages disallow framing by design.
Safe browsing did not flag an unsafe domain
Automated DNS-over-HTTPS checks execute only when creating or editing a link with unsafe left unset. An explicit manual true or false always takes priority. If the DNS lookup fails or times out, Slite allows the link instead of blocking it.
AI suggestions return HTTP 501 or fail
- Both variables required: AI stays disabled until both
NUXT_AI_BASE_URLandNUXT_AI_MODELare set in.env. - Outbound network: Ensure the container can reach your provider's API endpoint.
- Model identifier: Verify that the configured model name is valid and enabled on your provider account.
Import skips or rejects records
- Active slug conflicts: Existing active short codes are skipped to protect current links from accidental overwrite.
- Batch limits: Ensure your batch size does not exceed
NUXT_IMPORT_REQUEST_LIMIT(default 100). - Password values: Use protected password strings from Slite/Sink JSON exports. Masked placeholder strings copied from dashboard inputs are invalid.