Self-Hosting FactoryThread
FactoryThread can run entirely on your own infrastructure. Everything is driven
by ftctl — a single, self-contained CLI that fetches a signed release
bundle, verifies it offline, generates all secrets on your server, and
deploys the whole stack from one compose file on Docker or Podman.
Nothing needs to be installed to run ftctl — the runtime is embedded in the
binary. Secrets never leave the box.
The one command
curl -fsSL https://control.factorythread.com/ftctl -o ftctl && chmod +x ftctl
sudo ./ftctl install --version 2026.09.04.7
That single install fetches → verifies → loads images → configures → deploys.
Then open http://<host> and install your licence.
What you get
One compose stack with fixed container names on a single network:
| Service | Port | Role |
|---|---|---|
| PostgreSQL 18 | 5432 | primary database |
| RabbitMQ | 5672 / 15672 | RPC + async execution |
| Redis | 6379 | locking + cache |
| Backend (Fastify API) | 3000 | API |
| Worker | — | flow execution |
| Frontend (Nginx + React) | 80 / 443 | the app |
A one-shot migrate step runs database migrations and provisions the runtime role before the app starts, and a backup scheduler takes periodic dumps.
How the pieces fit
- Distribution — a signed
factory-thread-<version>.tar.gzbundle served by the Control Service (control.factorythread.com), or side-loaded for air-gapped hosts. See Air-Gapped Install. - Integrity — every bundle carries a SHA-256 checksum and an ECDSA signature
that
ftctlverifies against a trust anchor baked into the binary. A tampered or unsigned bundle is refused. - Configuration — generated on first install into
/opt/factorythread/current/.env.deploy; you're prompted only for optional capabilities. See Configuration. - Licensing — a signed Entitlement sets your plan, installed offline. See Licensing.
- Upgrades —
ftctl upgradedoes drain → backup → migrate → swap with snapshot rollback. See Upgrades & Operations.
Where to start
| I want to… | Go to |
|---|---|
| Install for the first time | Installation |
Understand .env.deploy and the prompts | Configuration |
| Activate my plan | Licensing |
| Back up / restore the database | Backup & Restore |
| Upgrade, roll back, read logs, restart | Upgrades & Operations |
| Protect against a lost server | Disaster Recovery |
| Install without internet access | Air-Gapped Install |
Move off the old setup.sh stack | Migrating from a Legacy Deployment |
A Linux x86-64 host with 8 GB RAM (16 GB for heavier workloads), 20 GB
free disk, root/sudo, and either Docker 20.10+ (Compose v2) or
Podman 4.4+. ftctl can install Podman for you if you have neither.