SSD Nodes Learn 🎉 VPS from $5.50/mo
How to do am Matt ConnorBy Matt Connor · Updated 2026-08-13

Best self-hosted n8n alternatives for your VPS

Compare Activepieces, Windmill, Node-RED, Automatisch and Huginn with n8n on licence, RAM, database, AI steps and the backup wey fit spoil restores.

Wetin to use instead of n8n

The self-hosted n8n alternatives wey worth your time for VPS (virtual private server) na Activepieces, Windmill, Node-RED, Automatisch and Huginn. Activepieces na the closest replacement for how most people dey use n8n, and e core get MIT license. Windmill fit team wey prefer to write Python or TypeScript instead of dragging boxes around canvas. Node-RED na the smaller one, and e no need database at all.

Plenty readers suppose remain where dem dey. The n8n license allow internal business use, so if you dey run flows for your own company, license no be your problem. Migration no free too. Nothing for this list fit read n8n export, so you go rebuild every flow by hand and enter every credential again. Installing n8n itself na separate job, wey this n8n install for VPS with Docker and HTTPS cover, and n8n against Zapier and Make explain how this whole category compare with hosted services.

Why people dey look for self-hosted n8n alternatives

Two reasons dey come up again and again.

The first one na the licence. n8n releases under Sustainable Use License v1.0, and the project dey call am fair-code instead of open source. The licence give you right to "use or modify the software only for your own internal business purposes or for non-commercial or personal use", but e no allow you provide the software commercially to other people. Files and folders wey get .ee for the name dey under separate n8n Enterprise License. If you wan run automations for paying clients, na hard stop be that. If you dey work for internal operations team, e no change anything for your daily work.

The second one na memory. n8n na Node.js process, and workflow data dey memory while the run dey happen. n8n documentation list the causes: the amount of JSON data, the size of binary data, the number of nodes for workflow, the Code node, manual executions (wey copy the data again for the editor), and other workflows wey dey run at the same time. The documented fix no be another product. Na queue mode with separate worker processes, plus Postgres instead of the default SQLite file for ~/.n8n/database.sqlite. Large jobs also need batching, because Loop Over Items node wey dey feed sub-workflow keeps only one slice of the data for memory at one time. Try this one first before you rebuild sixty flows somewhere else.

Wich self-hosted n8n alternatives still dey maintained

Licence text easy to read, so everybody dey compare licences. Project health easy to ignore. These na the 6 projects wey dey this comparison, with the newest tagged release wey each one get on 4 August 2026.

ChartNewest tagged release, checked 4 August 2026
The data behind this chart
[
  {
    "tool": "n8n",
    "licence": "Sustainable Use License",
    "latest_release": "2.33.3",
    "released": "2026-07-31",
    "days_since_release": 4
  },
  {
    "tool": "Activepieces",
    "licence": "MIT core, commercial ee",
    "latest_release": "0.86.3",
    "released": "2026-07-17",
    "days_since_release": 18
  },
  {
    "tool": "Windmill",
    "licence": "AGPLv3 source, CE image",
    "latest_release": "v1.778.0",
    "released": "2026-08-04",
    "days_since_release": 0
  },
  {
    "tool": "Node-RED",
    "licence": "Apache 2.0",
    "latest_release": "5.0.4",
    "released": "2026-07-30",
    "days_since_release": 5
  },
  {
    "tool": "Automatisch",
    "licence": "AGPL-3.0, commercial ee",
    "latest_release": "v0.15.0",
    "released": "2025-08-08",
    "days_since_release": 361
  },
  {
    "tool": "Huginn",
    "licence": "MIT",
    "latest_release": "v2022.08.18",
    "released": "2022-08-18",
    "days_since_release": 1447
  }
]

Two rows dey change the shortlist. Automatisch last tagged v0.15.0, and e 361 days old. Its default branch no get commit since 15 January 2026. Huginn last tagged release 1447 days ago, but its commit log active this month. Na the opposite pattern be this: the code dey move but releases no dey, so if you run am, na untagged image you dey run.

Check this yourself before you trust any comparison, including this one. Open the project releases page for GitHub, then open the commit list for its default branch. Project wey get fresh release but quiet commit log dey just coast. Project wey get fresh commits but no release for years dey ask you to run code wey nobody don cut version for.

Activepieces: the closest match, and MIT dey for core

Activepieces na the closest like-for-like choice. Na visual builder wey get triggers and steps, and e dey call dem pieces. README talk say e get more than 280 of dem. Every piece dey also available as MCP (model context protocol) server, so LLM (large language model) client fit call the same connectors as tools. The core get MIT licence. Two directories, packages/ee/ and packages/server/api/src/app/ee, get commercial licence, and if you use wetin dey inside dem for your own server, you need paid agreement.

Read that separation before you migrate, because e wider pass wetin dey common for most MIT projects. Activepieces pricing page describe Community Edition as "open source, free forever, with no cap on runs, users, or flows", and e place Agents and Chat, Projects, API access, plus the whole administration layer (single sign-on, user roles, audit logs, secret managers, branding, Git sync) outside am. So Community Edition na complete automation engine wey get unlimited flows and users, but e no be platform wey you fit control through API. If your plan na to generate flows programmatically, you need licence for that plan.

The runtime shape na one app container, one or more worker containers, Postgres, and Redis. AP_DB_TYPE=POSTGRES and AP_REDIS_TYPE=STANDALONE na the defaults. E get single-container mode with embedded database and in-process queue (AP_DB_TYPE=PGLITE with AP_REDIS_TYPE=MEMORY), and documentation talk say e "is only meant for personal use or testing". Take that statement as e be. Those modes no fit run more than one instance, so when you outgrow dem, na migration you need, no be just flag change.

Windmill: code first, and e heavy pass wetin e look like

Windmill dey run scripts for Python, TypeScript, Go, Bash and SQL, then e dey combine dem into flows. If your automations mostly na code with small glue around dem, e fit you pass any node canvas.

You need handle the licence carefully. The source na AGPLv3 when you compile am without the enterprise feature flag. The images wey dem publish for ghcr.io/windmill-labs/windmill na Community Edition. E include code wey no be open source, and you fit use am free inside the quotas. Windmill pricing page set the quotas at 50 users, 3 workspaces and 10 GiB workspace object storage, with unlimited executions. For one person or one small team, you no go reach that limit soon, so quota no be the main issue. The issue be say the binary wey you run no be the AGPL build.

Weight na the other thing to consider. Windmill own docker-compose.yml dey ship with Postgres 16 database, one server, three default workers with 2048M memory limit each, one native worker and Caddy proxy. The documented rule of thumb na "1 worker per 1vCPU and 1-2 GB RAM". You fit reduce the replica count for small box. But make you know say na you dey reduce am, because the workers na dem dey actually run your jobs.

Windmill AI features dey documented as help wey you use during build: code generation, flow building, chat and form filling. First, you need add model provider resource for workspace settings. If wetin you want na agent step wey dey run on schedule and dey call tools, n8n AI Agent node still be the more direct option, and how to build AI agent for n8n cover that setup.

Node-RED: di small one, wey no get database at all

Node-RED na Apache 2.0, wey be the licence wey get the fewest restrictions for this comparison. Na one Node.js process e be, with one /data volume. No Postgres. No Redis. Pin am as nodered/node-red:5.0.4, wey be the current release.

E come from IoT (internet of things) wiring, so e dey shaped around events instead of connectors. Nodes for third-party services dey come from the community library, and their quality no dey the same. Na this trade-off you accept for the small footprint. E no get first-class AI agent step. For small VPS wey dey handle webhooks and message-queue traffic, na the lightest option here wey works, and e dey start within seconds.

Huginn and Automatisch: check commit log first

Huginn get MIT license, dem write am for Ruby on Rails, and e need MySQL or PostgreSQL. E dey think with agents wey dey monitor source and produce events. This model different from flow canvas, and e no get LLM story. Code still dey receive commits, but the last tagged release na from August 2022. So if you run am, na the ghcr.io/huginn/huginn image wey dem build from default branch you go dey use. Choose am when the agent model match your problem, no be as general replacement for n8n.

Automatisch get AGPL-3.0 license, except for e .ee files, and e look like simpler n8n: Postgres, Redis, and small catalogue of apps. Na this tool single-deploy tutorials dey recommend often. Release history say make you wait. One year without release and half year without commit no be reason to panic if you already dey run am. But e be reason make you no start new production deployment with am.

Wetin Activepieces stack really dey cost for RAM

Nobody fit publish exact idle and working memory figure for you, because e depend on your own flows and how much data dem carry. Wetin you fit read na wetin each vendor tell you to budget. Activepieces document the arrangement below, and the sentence beside am matter pass the numbers: "A concurrency-1 worker dey busy for the whole duration of a flow (up to 10 min), so size by concurrent flows, no be trigger rate."

ChartActivepieces published production sizing, per component
The data behind this chart
[
  {
    "label": "App container",
    "vcpu": 1,
    "ram_gb": 1
  },
  {
    "label": "Worker (each)",
    "vcpu": 0.5,
    "ram_gb": 1
  },
  {
    "label": "Postgres",
    "vcpu": 2,
    "ram_gb": 4
  },
  {
    "label": "Redis",
    "vcpu": 1,
    "ram_gb": 1
  }
]

One worker na 0.5 vCPU and 1 GB, and e dey run exactly one flow at a time. Postgres size na 4 GB. The project's own compose file ship five worker replicas, so based on that sizing, the stack for the repository dey request roughly 11 GB before your flows do any serious work. Tutorials wey use one tool dey copy that file and call am small deployment.

For 4 GB VPS, run two workers, keep Postgres for the same compose project, and measure am. docker stats --no-stream dey print one line for each container with its real resident memory. This better pass any figure wey vendor or blog publish. If one container dey grow without limit, cap am, and memory limits for Docker Compose show the syntax.

Compose file wey dem fit use for Activepieces for one VPS

Pin the tag. latest mean say next docker compose pull fit change database schema under you without warning. Version 0.86.3 na the version wey project pin for im own compose file as of 4 August 2026.

Generate the two secrets first, using the lengths wey documentation specify.

openssl rand -hex 16    # AP_ENCRYPTION_KEY, encrypts stored connections
openssl rand -hex 32    # AP_JWT_SECRET, signs session tokens

Write .env beside the compose file:

AP_ENGINE_EXECUTABLE_PATH=dist/packages/engine/main.js
AP_ENVIRONMENT=prod
AP_FRONTEND_URL=https://automation.example.com
AP_ENCRYPTION_KEY=REPLACE_WITH_HEX_16
AP_JWT_SECRET=REPLACE_WITH_HEX_32
AP_DB_TYPE=POSTGRES
AP_POSTGRES_DATABASE=activepieces
AP_POSTGRES_HOST=postgres
AP_POSTGRES_PORT=5432
AP_POSTGRES_USERNAME=postgres
AP_POSTGRES_PASSWORD=REPLACE_WITH_A_LONG_RANDOM_PASSWORD
AP_REDIS_TYPE=STANDALONE
AP_REDIS_HOST=redis
AP_REDIS_PORT=6379
AP_EXECUTION_MODE=UNSANDBOXED
AP_TELEMETRY_ENABLED=false

AP_FRONTEND_URL gats be the public HTTPS address, because Activepieces fit otherwise try use your public IP address when e dey build webhook URLs. Every webhook wey you give third party dey build from that value. So, if e still point to localhost, the URL wey you paste into another service no go reach your server.

services:
  app:
    image: ghcr.io/activepieces/activepieces:0.86.3
    restart: unless-stopped
    ports:
      - '127.0.0.1:8080:80'
    depends_on:
      - postgres
      - redis
    env_file: .env
    environment:
      - AP_CONTAINER_TYPE=APP
    volumes:
      - ./cache:/usr/src/app/cache
  worker:
    image: ghcr.io/activepieces/activepieces:0.86.3
    restart: unless-stopped
    depends_on:
      - app
    env_file: .env
    environment:
      - AP_CONTAINER_TYPE=WORKER
    deploy:
      replicas: 2
    volumes:
      - ./cache:/usr/src/app/cache
  postgres:
    image: pgvector/pgvector:0.8.0-pg14
    restart: unless-stopped
    env_file: .env
    environment:
      - POSTGRES_DB=${AP_POSTGRES_DATABASE}
      - POSTGRES_USER=${AP_POSTGRES_USERNAME}
      - POSTGRES_PASSWORD=${AP_POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
  redis:
    image: redis:7.0.7
    restart: unless-stopped
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

That file na the project own compose with four changes: worker count drop from five to two, published port bind to 127.0.0.1 instead of every interface, fixed container names comot because service wey get replicas no fit use dem, and explicit network block comot because compose dey create one anyway.

docker compose up -d
docker compose ps

Every service suppose show Up, including two worker containers. Container wey dey restart for loop go print the reason for docker compose logs worker, so read am before you change anything. The port binding mean say nothing fit reach the app from outside until you put reverse proxy with TLS (transport layer security) in front. Running Traefik in front of several compose apps explain this. Keep .env for mode 600 and comot am from git, as e dey explained for Handling secrets for compose env files.

Backup wey every guide dey leave out

All these tools dey encrypt credentials wey dem store, so database dump by itself no be backup. You need the dump and the key wey go decrypt am. The problem be say most of these tools dey generate that key for you quietly, then store am somewhere wey you no dey back up.

n8n na the clearest example. If you never set N8N_ENCRYPTION_KEY, n8n "creates a random encryption key automatically on the first launch and saves it in the ~/.n8n folder", then e dey use that key encrypt credentials before dem reach the database. Dump Postgres, restore am for fresh container with fresh volume, and the workflows go come back while every credential go remain ciphertext wey nobody fit read. Set the variable explicitly, and use the same value for every worker when you run queue mode.

Node-RED get the same arrangement. Credentials dey inside their own encrypted file, and the key na credentialSecret for settings.js. When you no set one, the runtime dey generate random key and save am under _credentialSecret for its own settings store inside /data. The stock settings file state the consequence: "once you set this property, do not change it - doing so will prevent node-red from being able to decrypt your existing credentials and they will be lost." Back up the whole /data volume, no be only the flows file.

Activepieces dey keep AP_ENCRYPTION_KEY for your .env, and documentation describe am as a "32-character (16-byte) hexadecimal key used to encrypt connections". Huginn dey keep APP_SECRET_TOKEN for its environment. Automatisch get three of them: ENCRYPTION_KEY, WEBHOOK_SECRET_KEY and APP_SECRET_KEY. For every case, the secret dey inside environment file, so the environment file na part of the backup.

Windmill na the exception wey you suppose know. Its variables and secrets dey encrypted with workspace-specific symmetric key wey Windmill dey store inside its own database, so one Postgres dump carry both parts. This make restore easier, but e also mean say the dump alone enough to read every secret, so protect the file like say na the secrets themselves.

For the Activepieces stack above, the backup na two files:

cd /srv/activepieces
docker compose exec -T postgres pg_dump -U postgres -Fc activepieces > "ap-$(date +%F).dump"
cp .env "ap-env-$(date +%F).bak"
chmod 600 ap-*.dump ap-env-*.bak

Then prove say the backup dey work, because backup wey nobody test na guess. Restore the dump into scratch compose project wey use deliberately different AP_ENCRYPTION_KEY, then run flow wey use saved connection. E go fail, because the ciphertext for the database come from the other key. Repeat the restore with the real key from .env and the same flow go run. Those two runs na the only evidence say your backup really be backup. Send both files commot from the server on schedule with restic backups from a VPS, because backup wey dey for the same disk go die when the disk die.

When to stay on n8n

Stay if the work dey inside your own company, because na exactly wetin the Sustainable Use License permit. Stay if you depend on plenty integrations, since n8n claim say e get more than 1500 integrations, or on e AI Agent node wey dey built on LangChain. Nothing else for here match am for ready-made agent steps. How to drive n8n workflows with Claude show how e dey work for real use.

Move to Activepieces if you want permissive licence for the automation core and stack wey you fit read from beginning to end. Move to Windmill if your flows na really code wey get user interface on top. Move to Node-RED if the box small and the work dey follow events. No move because benchmark tell you say n8n heavy. Measure your own instance first, then read wetin worth self-hosting for 2026 and choose once, because second migration cost as much as the first one.

FAQ

Which self-hosted n8n alternative dey closest to n8n?

Activepieces. Na the same idea: visual builder wey trigger dey start flow, and each step dey call service, with plenty connectors for catalogue. Its core get MIT licence, e dey run on Postgres and Redis under Docker, and its pieces fit also work as MCP servers for LLM clients. The main gap na say API access and agent features dey inside commercial enterprise directories, so Community Edition instance dey controlled through web interface instead of programmatically.

Activepieces really be open source?

The core dey, under MIT licence. Two directories, packages/ee/ and packages/server/api/src/app/ee, get commercial licence, and to use those features for your own server you need paid licence. Vendor pricing page put Agents and Chat, Projects, API access, single sign-on, user roles, audit logs, secret managers, branding and Git sync outside Community Edition, while runs, users and flows no get limit. So e genuinely be open source for building and running automations, but e no be open source for team and governance layer.

How much RAM Activepieces need for VPS?

Activepieces document 0.5 vCPU and 1 GB for each worker, 1 vCPU and 1 GB for app container, 4 GB for Postgres and 1 GB for Redis. Worker dey handle one flow at a time for the full duration of that flow, so size am based on peak concurrent flows, no be how often triggers fire. The compose file for the repository ships five workers, wey be around 11 GB of published sizing. Two workers for 4 GB VPS na reasonable starting point, and docker stats --no-stream go confirm the real number for your flows while dem dey run.

Wetin I need back up so restore go really work?

The database dump and encryption key, together. For Activepieces, na a pg_dump of the activepieces database plus the .env file wey dey hold AP_ENCRYPTION_KEY. For n8n, na the database plus N8N_ENCRYPTION_KEY, wey n8n generate for you inside ~/.n8n folder if you never set am. For Node-RED, back up the whole /data volume, because credentials file and the key wey decrypt am both dey there. Windmill na the exception: its workspace key dey inside its own Postgres database, so the dump carry everything and you must protect am as if na the secrets themselves.

I fit import my n8n workflows into another tool?

No. These projects dey import and export their own flow formats, not n8n own. Migration mean say you go rebuild each flow for the new builder and create each credential again from the original service. That work na the real cost of switching, so count your flows before you decide. Twelve flows na one afternoon. Two hundred flows na project, and e usually cheaper to fix n8n memory use with queue mode and Postgres than to rebuild everything.

#n8n#activepieces#windmill#workflows#self-hosting