Documentation Index
Fetch the complete documentation index at: https://docs.safaridesk.io/llms.txt
Use this file to discover all available pages before exploring further.
Installation
This page shows a simple, repeatable path to get SafariDesk running on a single host using Docker Compose.Full customer journey (from zero to usable)
Use this sequence for enterprise self-hosted onboarding:- Prepare host machine (Docker + Compose, networking, DNS)
- Clone SafariDesk and create
.env - Configure core settings (
DB_*,REDIS_*,SUPERUSER_*, URLs) - Configure enterprise licensing values provided by SafariDesk
- Start the stack with Docker Compose
- Validate services, run first login, and confirm license status
- Configure email, optional AI, backups, and monitoring
Preflight (do this first)
- Install Docker and Docker Compose on your host
- Make sure you run commands from the
Core/directory (the Docker Compose file lives there) - Confirm you have 4+ GB RAM available
Operating system options
SafariDesk is Docker Compose-based and is not strictly Ubuntu-only.- Production recommendation: Linux host (Ubuntu 22.04+ recommended)
- Also possible: Debian/RHEL-family Linux, macOS, and Windows with Docker Desktop
Ubuntu / Debian (example)
RHEL / Rocky / AlmaLinux (example)
macOS (example)
Windows (example)
1. Clone the repository
Linux/macOS (bash):2. Create and edit the environment file
Linux/macOS (bash):SECRET_KEY— a random Django secretDB_PASSWORD— Postgres password used by thedbcontainerSUPERUSER_USERNAME,SUPERUSER_PASSWORD,SUPERUSER_EMAIL- SMTP values (if you want email functionality)
- Enterprise license values from SafariDesk (see Configuration)
3. Start the stack
Run fromCore/:
This command is the same in Linux/macOS and Windows PowerShell.
4. Verify the deployment
Check container health and logs: This command is the same in Linux/macOS and Windows PowerShell.FRONTEND_URL in .env) and sign in with the SUPERUSER_* account.
5. Activate and verify enterprise licensing (updated UI)
The License UI is in the user Profile page and is an admin-only tab. Follow these steps after you sign in as an administrator.- Sign in as the admin user (created from
SUPERUSER_*in.env). - Open your Profile page:
http://<frontend-host>/profile(or click the Profile link in the header). - Select the
Licensetab (next toSecurity). This page shows current licenseStatus,Edition,Features, andLast validated. - Paste the enterprise license key into the
License Keyfield and clickActivate.- The frontend posts to
POST /api/v1/license/activate/and the backend validates the key with the license-proxy (configured viaLICENSE_PROXY_URLinCore/.env). - Activation requires a staff/admin account and a valid JWT access token; the frontend includes the token automatically when logged-in.
- The frontend posts to
- On success you will see license metadata (customer, edition, features) and enterprise features will be unlocked.
- Admin-only: only staff users may activate or revalidate a license. Non-admin requests will receive an authorization error.
- Offline handling: if the API cannot reach the license-proxy the UI will display cached status and an “offline validation” notice; features remain available until revalidation fails.
- Security: license payloads are HMAC-signed by the proxy; the backend verifies signatures and stores license data encrypted when
LICENSE_ENCRYPTION_KEYis set.
- Confirm the frontend is pointing to the running API: check
Core/.envVITE_API_URL(should behttp://localhost:9100/api/v1for local setups). Rebuild the frontend if you change it. - From the admin browser session: open DevTools → Network, click
Activate, and verify thePOST /license/activate/request returns HTTP 200 and JSON with license details. - If you see CORS errors in the browser console (e.g. “No ‘Access-Control-Allow-Origin’ header”), add your frontend origin to
CORS_ALLOWED_ORIGINSinCore/backend/RNSafarideskBack/settings/base.py, then restart the API. - If activation fails with 4xx, capture the response JSON (it contains a helpful
detailfield). If the API returns 500, tail the API logs:
LICENSE_PROXY_URL is reachable (start the local license-proxy service) and LICENSE_RESPONSE_SIGNING_SECRET matches the proxy if you’re running a private proxy.
Quick curl examples (use a logged-in admin token if required):
Quick recovery tips
- If the API is failing,
docker compose logs apishows the error - If Postgres is not ready, wait and retry
migrate - If a container fails to build, check the build output and rerun
docker compose up -d --build

