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
- Web UI → http://localhost:8080 (login
demo@fxquinox.dev/demo) - API → http://localhost:8000 (
/healthzfor a liveness check)
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:
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:
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.