The supported deployment artifact is the official Fabro image atDocumentation Index
Fetch the complete documentation index at: https://docs.fabro.sh/llms.txt
Use this file to discover all available pages before exploring further.
ghcr.io/fabro-sh/fabro. Everything else — docker compose, ECS, Cloud Run, Kubernetes, Railway — is just running this image somewhere with the right requirements.
Requirements
| Requirement | Value |
|---|---|
| Image | ghcr.io/fabro-sh/fabro:nightly (multi-arch; pin a version for production) |
| Persistent volume | Mount at /storage. Stores run history, checkpoints, sessions, the dev token, and JWT keys. |
| Port | The container binds to $PORT (default 32276). Expose it. |
| LLM provider key | At least one of ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, … |
| Replicas | One. The server expects exclusive ownership of /storage. |
Quickstart with docker compose
The repo ships adocker-compose.yaml at the root. Clone the repo (or copy the file), create a .env with at least one provider key, and start it:
- Pulls
ghcr.io/fabro-sh/fabro:nightly - Creates a named volume
fabro-storagemounted at/storage - Mounts
/var/run/docker.sockso Fabro can spawn sandbox containers on the host daemon - Exposes port
32276 - Loads environment from
.envif present
Adding a reverse proxy with TLS
For a production deployment exposed to the internet, layer thedocker-compose.prod.yaml overlay on top. It adds a Caddy reverse proxy that terminates TLS (auto-provisioning a Let’s Encrypt certificate) and forwards to Fabro:
FABRO_DOMAIN unset to serve plain HTTP on localhost.
Required environment variables
At minimum, set one LLM provider key in.env:
.env
openssl rand -hex 32.
Optional:
| Variable | Purpose |
|---|---|
FABRO_DEV_TOKEN | Pre-set the dev token instead of reading the one written to /storage on first boot |
GITHUB_APP_CLIENT_SECRET, GITHUB_APP_WEBHOOK_SECRET, GITHUB_APP_PRIVATE_KEY | Only if you enable GitHub OAuth or the GitHub App integration |
FABRO_DOMAIN | Public hostname when using the Caddy reverse-proxy overlay |
.env.example for the complete list.
Cloud container services
The same image works on any container orchestrator that supports the requirements above. Common patterns:- AWS ECS / Fargate — Task definition referencing
ghcr.io/fabro-sh/fabro:nightly, EFS volume mounted at/storage, port32276published, environment variables for keys. - Google Cloud Run — Cloud Run with a backed volume mount at
/storage. Pin minimum instances to 1; scale-to-zero interrupts running workflows. - Kubernetes — One-replica
StatefulSet(not Deployment) with aPersistentVolumeClaimmounted at/storage. Expose via Service + Ingress.
/storage, expose $PORT, set provider keys.
Pinning a version
docker-compose.yaml uses :nightly by default, so docker compose pull && docker compose up -d picks up the latest nightly. To pin a specific version, change the image: line to ghcr.io/fabro-sh/fabro:<version>.
Release artifacts ship with SLSA Build Provenance attestations you can verify with gh attestation verify.
Pointing the CLI at your server
Once the container is running, install the CLI on your local machine and point it at the server:~/.fabro/settings.toml
Caveats
- Volume is load-bearing. Without a persistent volume at
/storage, redeploys silently wipe all state — including the dev token and JWT signing keys. - Single replica. The server expects exclusive ownership of
/storage. Don’t scale to multiple replicas. - Architecture. The
:nightlytag is multi-arch. The amd64 variant is the most heavily tested.
Next steps
Server Operations
Install wizard, web UI, authentication, demo mode, and pointing the CLI at the server.
Server Configuration
Full settings.toml reference — auth, reverse-proxy TLS, run defaults, and more.
Deploy to Railway
One-click managed shortcut for the same Docker image.
Sandboxing
The Docker sandbox provider’s security model and trust assumptions.