−25%

on annual Windows plans, until 31 Oct. See plans

EQVPS
Get started

VPS for Activepieces: self-hosted automation

Run Activepieces, the open-source automation builder, on your own server: no per-task billing, webhooks on your domain. Tested setup, the URL trap, sizing.

Hosted automation services bill per task, and the meter runs on things that aren't even work. A flow that checks a feed every five minutes is 8,640 runs a month before it has done anything useful. Run the same flow on your own server and the bill is the server.

Activepieces is an open-source automation builder — triggers, steps, branches, a few hundred ready-made integrations, plus code steps when the ready-made ones run out. The community edition is MIT-licensed, and it runs fine on one small server with Docker Compose.

Which plan

We installed it on a test server and measured. The stock compose file starts the app and five workers: about 2.6–3 GB of RAM together with Postgres and Redis. Cut it to one worker and it drops to around 1.6 GB.

What you runPlan
A few personal flows, one workerMicro-IP — 2 vCPU, 2 GB, 25 GB ($10/mo), add swap
The default setup: five workers, team flows, webhooksSmall-IP — 4 vCPU, 4 GB, 35 GB ($16/mo)
Many runs at once, heavy code stepsMedium-IP — 6 vCPU, 6 GB, 45 GB ($20/mo)

Take a plan with its own IPv4. Webhooks are the main reason to self-host this, and the services that call them must reach ports 80 and 443; on NAT plans only the SSH port is reachable from outside. Locations are Germany and Finland — availability is shown at checkout. Pay in crypto if you like; there's no KYC.

Install

Point a domain — say flows.example.com — at the server first. Then, as root on Ubuntu 24.04 or Debian 12:

curl -fsSL https://get.docker.com | sh
git clone --depth 1 https://github.com/activepieces/activepieces.git
cd activepieces
sh tools/deploy.sh

deploy.sh copies .env.example to .env and fills in random secrets. Before the first start, change two lines in .env and one in the compose file:

sed -i 's|^AP_FRONTEND_URL=.*|AP_FRONTEND_URL=https://flows.example.com|; s|^AP_TELEMETRY_ENABLED=.*|AP_TELEMETRY_ENABLED=false|' .env
sed -i "s|- '8080:80'|- '127.0.0.1:8080:80'|" docker-compose.yml

The first line is the one that matters. AP_FRONTEND_URL isn't only for links in the UI: the workers connect to the app through it. Leave it at http://localhost:8080 and every worker container looks for the app inside itself, can't find it, and your flows never publish. We hit exactly that: „Socket.IO connection error“ in the worker logs, a publish request that hung, and webhooks answering 404. With the real domain in place, the same flow published and the webhook ran.

The sed on docker-compose.yml keeps port 8080 on localhost. Docker's published ports go around ufw, so without it the app would be open on a raw port next to your HTTPS.

On Micro-IP, also drop to one worker:

sed -i 's/replicas: 5/replicas: 1/' docker-compose.yml

Now HTTPS and the start:

apt install -y caddy
cat > /etc/caddy/Caddyfile <<'EOF'
flows.example.com {
    reverse_proxy 127.0.0.1:8080
}
EOF
systemctl reload caddy
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable
docker compose -p activepieces up -d

Give it half a minute, then open https://flows.example.com and create your account straight away. The first sign-up owns the platform; after that, sign-up is invite-only.

Check that webhooks work

Create a flow with the Webhook trigger (Catch Webhook), add any step, publish it. The trigger panel shows the URL. Fire a test event at it:

curl -X POST https://flows.example.com/api/v1/webhooks/YOUR_FLOW_ID \
  -H 'content-type: application/json' \
  -d '{"event":"payment.paid","amount":16}'

You should get a 200, and the run appears under Runs as succeeded. If you get 404 instead, go back and check AP_FRONTEND_URL.

Day-two notes

  • Updates. The compose file pins an exact version (0.92.2 at the time of writing). Change the tag in docker-compose.yml, then docker compose -p activepieces pull && docker compose -p activepieces up -d. Skim the release notes first; automation tools love renaming things.
  • Backups. Flows, connections and run history live in the Postgres volume. Dump it on a schedule and keep the copy off the server — the connections hold your API tokens for other services.
  • Code steps aren't sandboxed in this setup (AP_EXECUTION_MODE=UNSANDBOXED). It's your server and your flows, so that's acceptable. It stops being acceptable the moment you let people you don't trust build flows.

If you already know n8n, the idea is the same — see VPS for n8n. Pick the editor you find easier to think in; both are happy on the same plans.

Ready to deploy? Pay with crypto, no KYC — live in about a minute.

Deploy now →

FAQ

How much RAM does Activepieces need?

The stock docker-compose.yml starts the app plus five workers; on our test server that came to roughly 2.6–3 GB with Postgres and Redis. With one worker it was about 1.6 GB. Small-IP (4 GB) runs the default setup with room to spare; Micro-IP (2 GB) works only with a single worker and a swap file.

My flow won't publish and the webhook answers 404. What's wrong?

Check AP_FRONTEND_URL. The workers reach the app through that address, and if it's left at http://localhost:8080, „localhost“ inside a worker container is the worker itself. Workers can't connect, publishing hangs and webhooks return 404. Set it to your real https:// domain before the first start.

Do I need a dedicated IP?

Yes, if you use webhooks — and most people do. Services that call your flows need to reach ports 80 and 443 on your domain, and a NAT plan only accepts your SSH port from outside.

Can anyone sign up on my instance?

Only the first person. In our test the first sign-up went through and the second got „User is not invited to the platform“: after the first account, sign-up is invite-only. So create your account the minute the site is up, before anyone else reaches the page.

Are code steps isolated?

Not by default: the compose setup runs code steps with AP_EXECUTION_MODE=UNSANDBOXED, inside the worker. That's fine when only you and people you trust build flows. Don't hand out builder access to strangers on this setup.

Comments

No comments yet. Be the first.

Leave a comment

Comments are moderated before they appear.