Self-hosting
Run the whole platform yourself with Docker Compose — the same product, on your own box.
Peractor is one MIT-licensed product with two supported ways to run it: Peractor Cloud, which we operate, and self-hosted, which you do.
Self-hosting is not a reduced edition — same workflows, gates, connectors, tracker, wiki, and apps. The officially supported deployment is a single-node Docker Compose stack.
What you need
- Docker. Postgres ships as a service in the compose file, and every run executes in an isolated container the host launches. Isolation is mandatory, so the run image must exist.
- An agent credential. Runs execute inside containers, which
cannot see an interactive login on the machine. Use a subscription
token from
claude setup-token, or an Anthropic API key; add an OpenAI key if your workflows select Codex. - Mail. Sign-up confirms an email address, so the host needs a mail sender configured and refuses to boot without one.
- A git push credential for runs that push branches and open pull requests — a GitHub App, or a token or SSH key connected in the app. See Git & credentials.
Quick start
# 1. Get the source and build the run image (mandatory)
git clone https://github.com/peractor-ai/peractor && cd peractor
docker build -f infra/docker/Dockerfile --target sandbox -t peractor-sandbox .
# 2. Configure — at minimum: POSTGRES_PASSWORD, PERACTOR_SECRET_KEY,
# a mail sender, and an agent credential
cp infra/docker/.env.example infra/docker/.env
# 3. Up
docker compose -f infra/docker/compose.saas.yaml \
--env-file infra/docker/.env up --build
Open http://localhost:7878, sign up — the first account
is yours — and create your organization. A fresh host works out of the
box: a built-in default workflow, and no connectors required.
Point your apps at it
Repositories choose their control plane with
peractorrc.json at the repository root:
{ "host": "https://peractor.internal.example.com", "project": "…" }
Without a host entry, the apps use Peractor Cloud. The
extension fills this file in when you connect a repository to a
project.
Hardening
- Every run container is one-shot and locked down: non-root, all
capabilities dropped, no privilege escalation, with CPU, memory, and
process caps (
PERACTOR_RUN_CPU,PERACTOR_RUN_MEM_MB,PERACTOR_RUN_PIDS). - Set
PERACTOR_ISOLATION=gvisoronce the Docker daemon has the gVisor runtime, for a kernel-level boundary. Recommended when people you do not fully trust can start runs. PERACTOR_SECRET_KEYencrypts every per-organization secret at rest. Keep it stable and backed up — rotating it makes existing secrets undecryptable.- The host mounts the Docker socket to launch run containers. Treat the host as your trust boundary and give it an isolated daemon.
- Cap load with
PERACTOR_MAX_CONCURRENT_RUNSandPERACTOR_MONTHLY_RUN_QUOTA. Both count jobs, so a workflow that fans out counts one per lane. - Cap spend with
PERACTOR_MONTHLY_TOKEN_QUOTA— the model tokens one organization may spend a month on this deployment's own credential.
Useful knobs
| Variable | What it does |
|---|---|
PERACTOR_DB | Postgres connection string (required). |
PERACTOR_PUBLIC_URL | Public origin — OAuth callbacks, secure cookies, links in email. |
PERACTOR_ISOLATION | container
(default) or gvisor. |
PERACTOR_RESEND_API_KEY,
PERACTOR_EMAIL_FROM | Mail delivery. Required — the host will not boot without both. |
PERACTOR_GITHUB_OAUTH_CLIENT_ID and its
secret | "Continue with GitHub". Same pattern for Google and Linear. |
PERACTOR_APNS_*,
PERACTOR_FCM_* | Mobile push, each platform independent. |
PERACTOR_MONTHLY_TOKEN_QUOTA | Model tokens per organization per month on this host's own credential; unset means unlimited. |
PERACTOR_POLL_MS | Tracker poll interval (default 30000). |
PERACTOR_GATE_TIMEOUT_MS | How long before a gate left waiting is announced again. |
PERACTOR_MAX_RUN_CONTAINERS | Most containers one run may need at once — the ceiling a fan-out is checked against (default 5). |
PERACTOR_PREVIEW_* | How many previews this host serves at once, how long one nobody is reading stays up, and how long a phase holds its container before parking. A preview costs a container only while somebody is looking at it. |
PERACTOR_APPS_URL | The wildcard origin your apps are served from. |
Every knob — sign-in providers, tracker and notifier OAuth apps, push,
quotas — is documented in .env.example, and every optional
group degrades gracefully when unset.
Local repositories. Unlike Cloud, a self-hosted control plane can bind a project to a folder on its own disk — handy for trying Peractor against a repository on the same box before wiring up a git remote.
To run phases on other machines you own, see Run on your own machine. For limits and metering, see Plans & usage.