Self-host
One box, one image, Docker Compose. The single profile runs Caddy, Postgres 18, PgBouncer, Centrifugo, a one-shot migration job, the api, the worker and the mail ingest.
Quickstart
cp deploy/compose/.env.example deploy/compose/.env
openssl rand -hex 24 # POSTGRES_PASSWORD, FIKADESK_APP_PASSWORD
openssl rand -hex 32 # FIKADESK_AUTH_SECRET, FIKADESK_REALTIME_SECRET
$EDITOR deploy/compose/.env
docker compose -f deploy/compose/compose.yml --profile single up -d --wait
curl http://127.0.0.1/healthzThe first up builds the derived Postgres image and needs network access and a minute or two; later starts reuse it.
First administrator
With sign-up closed, the api prints a one-time setup token while the users table is empty. Spend it on the first administrator; everyone after that joins by invitation.
docker compose -f deploy/compose/compose.yml logs api | grep setupToken
curl -X POST http://127.0.0.1/api/setup -H 'content-type: application/json' \
-d '{"token":"<the token>","email":"[email protected]","name":"You","password":"<at least 12 characters>"}'Go public
Set FIKADESK_DOMAIN=support.example.com and FIKADESK_BIND=0.0.0.0 in .env. Caddy fetches a certificate on start and redirects HTTP to HTTPS.
Upgrade
Every merge to main publishes the OSS image as ghcr.io/fikadesk/fikadesk, tagged with the full commit sha and with main. Migrations run before the new code starts, never at boot.
The full guide covers reverse proxies, backups, email and security defaults: docs/self-hosting.md. A machine-readable version of these steps is at /install.