Skip to content

Deploy

fxquinox self-hosts with one command via Docker Compose, or on Kubernetes with the bundled Helm chart. Both run the same backend image. On startup it provisions the schema for a fresh database and seeds the built-in schema plus an admin login, so a new instance is usable immediately; upgrading an existing database is Alembic's job (alembic upgrade head).

Before exposing it

Work through the production hardening checklist — set a strong FXQ_SECRET, change default credentials, and terminate TLS.

Docker Compose (quickstart)

The stack in deploy/docker-compose.yml runs the backend, web UI, Postgres, Redis, and a MinIO object store.

git clone https://github.com/healkeiser/fxquinox
cd fxquinox/deploy

# set a strong secret (the compose default is a placeholder, not safe for use)
export FXQ_SECRET="$(python -c 'import secrets; print(secrets.token_urlsafe(48))')"

docker compose up -d --build

On first start the backend provisions the schema and seeds the built-in schema plus an admin login, so the instance is immediately usable. Sample demo data (projects/tasks) is opt-in — set FXQ_SEED_DEMO=1. Every step is idempotent, so restarting the container is safe.

Just kicking the tires?

For an even simpler, single-database evaluation stack (SQLite, demo data, no Postgres/Redis/MinIO) use the demo compose file:

cd deploy && docker compose -f docker-compose.demo.yml up -d --build

Configuration

Override any setting via the environment or a .env file (see Configuration). Key compose variables:

Variable Purpose
FXQ_SECRET JWT signing secret (≥32 chars, required).
FXQ_CORS_ORIGINS Web UI origin(s) allowed to call the API.
VITE_API_BASE API URL baked into the web image at build time.

For a real domain, rebuild the web image with your API URL:

docker compose build --build-arg VITE_API_BASE=https://api.example.com web

Volumes & backup

Three named volumes hold all persistent state — back these up:

  • pgdata — the Postgres database (the source of truth).
  • miniodata — the object store.
  • mediadata — uploaded media/thumbnails (FXQ_MEDIA_ROOT).
# database backup / restore
docker compose exec postgres pg_dump -U fxq fxquinox > backup.sql
cat backup.sql | docker compose exec -T postgres psql -U fxq fxquinox

Kubernetes (Helm)

A starter chart lives in deploy/helm/fxquinox. It deploys the backend and web UI (plus a media PVC and optional Ingress); bring your own Postgres, Redis, and object store (managed services or in-cluster operators) and point the backend at them through backend.env.

helm install fxq deploy/helm/fxquinox \
  --set-string backend.secret="$(python -c 'import secrets; print(secrets.token_urlsafe(48))')" \
  --set-string backend.env.FXQ_DATABASE_URL="postgresql+psycopg://user:pass@db:5432/fxquinox" \
  --set ingress.enabled=true --set ingress.host=fxquinox.example.com

See deploy/helm/fxquinox/values.yaml for all options.