FabrikFabrik
FabrikDeployment

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:

ServiceRoleImageMemory budget
backendDjango + Daphne ASGI (HTTP + WebSocket)fabrik-backend:latest512 MB
frontendReact + Vite dev server (prod: nginx-served static)fabrik-frontend:latest1 GB
celery-workerBackground tasks (queries, AWX, MIM import)fabrik-backend:latest1 GB
celery-beatScheduled task dispatcherfabrik-backend:latest256 MB
event-consumer-jobAWX job status events (RabbitMQ)fabrik-backend:latest256 MB
event-consumer-workflowAWX workflow status eventsfabrik-backend:latest256 MB
event-consumer-outputAWX job output streamingfabrik-backend:latest256 MB
postgresPrimary relational store (users, queries, audit)postgres:17-alpine512 MB
neo4jACI MIM graph (class hierarchy, relationships)neo4j:5.262 GB
redisCelery broker, cache, Channels layerredis:8-alpine256 MB
rabbitmqAWX event stream (decoupled from Celery)rabbitmq:4.1-management-alpine1 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