Deployment
Self-host Fabrik on your own infrastructure with Docker Compose — nine services, clearly scoped dependencies, and a production topology you can reason about.
Fabrik ships as a Docker Compose stack. One .env file, one docker-compose up -d, and you have a working deployment. There is no hosted SaaS — every Fabrik installation runs inside your own environment, which keeps credentials, query data, and MIM snapshots inside your perimeter.
What you're deploying
A single install is nine long-running services on one Docker network:
| Service | Role | Image | Memory budget |
|---|---|---|---|
| backend | Django + Daphne ASGI (HTTP + WebSocket) | fabrik-backend:latest | 512 MB |
| frontend | React + Vite dev server (prod: nginx-served static) | fabrik-frontend:latest | 1 GB |
| celery-worker | Background tasks (queries, AWX, MIM import) | fabrik-backend:latest | 1 GB |
| celery-beat | Scheduled task dispatcher | fabrik-backend:latest | 256 MB |
| event-consumer-job | AWX job status events (RabbitMQ) | fabrik-backend:latest | 256 MB |
| event-consumer-workflow | AWX workflow status events | fabrik-backend:latest | 256 MB |
| event-consumer-output | AWX job output streaming | fabrik-backend:latest | 256 MB |
| postgres | Primary relational store (users, queries, audit) | postgres:17-alpine | 512 MB |
| neo4j | ACI MIM graph (class hierarchy, relationships) | neo4j:5.26 | 2 GB |
| redis | Celery broker, cache, Channels layer | redis:8-alpine | 256 MB |
| rabbitmq | AWX event stream (decoupled from Celery) | rabbitmq:4.1-management-alpine | 1 GB |
Backend, workers, beat, and event consumers all share one image — same code, different commands. That keeps the build matrix small and ensures every Python process sees identical migrations and dependencies.
Redis and RabbitMQ serve different purposes and neither replaces the other. Redis drives Celery queues, WebSocket channels, and the MIM cache. RabbitMQ carries AWX webhook events into the three event consumers. Removing either breaks a distinct part of the system.
Deployment model
Fabrik is self-hosted, Docker-first. A production topology looks like this:
Internet → nginx (TLS, rate limit) → ┬─ frontend (static React)
├─ backend (Daphne, WebSocket)
└─ docs (optional)
│
┌──────────────────────┴──────────────┐
│ postgres · neo4j · redis · rabbitmq │
│ celery-worker · celery-beat │
│ event-consumer × 3 │
└─────────────────────────────────────┘The reverse proxy terminates TLS and enforces per-endpoint rate limits (see Production setup). Internal services are not exposed to the public network — all cross-service traffic stays on the fabrik-network bridge.
Where to go next
Prerequisites
Host requirements, Docker versions, domain, TLS, and sizing guidance.
Environment variables
Every .env key that matters, with defaults, constraints, and production tips.
Services
What each of the nine services does, how it depends on the others, and how to monitor it.
Production setup
Production overrides, nginx reverse proxy, TLS, rate limiting, and the compose profile that ties it together.
Upgrading and backup
Backup strategy for Postgres, Neo4j, and volumes. Upgrade and rollback procedures.
AI provider
Configure the AI model that powers the AI query builder — OpenAI, Anthropic, Azure OpenAI, Google, Groq, OpenRouter, or a local Ollama instance. Per-user API keys supported.
Prerequisites
Host sizing, operating system, Docker version, domain, and TLS prerequisites for a production Fabrik install.