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=gvisor once 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_KEY encrypts 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_RUNS and PERACTOR_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

VariableWhat it does
PERACTOR_DBPostgres connection string (required).
PERACTOR_PUBLIC_URLPublic origin — OAuth callbacks, secure cookies, links in email.
PERACTOR_ISOLATIONcontainer (default) or gvisor.
PERACTOR_RESEND_API_KEY, PERACTOR_EMAIL_FROMMail 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_QUOTAModel tokens per organization per month on this host's own credential; unset means unlimited.
PERACTOR_POLL_MSTracker poll interval (default 30000).
PERACTOR_GATE_TIMEOUT_MSHow long before a gate left waiting is announced again.
PERACTOR_MAX_RUN_CONTAINERSMost 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_URLThe 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.