n8n is one of those tools where self-hosting flips the economics entirely. On the cloud plans you pay per execution, so the more useful your automation becomes, the more it costs. On your own server, a workflow that fires ten thousand times a month costs exactly the same as one that fires ten: the price of the box.
If your workflows touch anything sensitive — customer data, API keys, internal systems — the second reason is stronger than the first. Self-hosted means the data never leaves a machine you control.
What n8n needs
More than a Telegram bot, less than you'd fear:
- RAM is the constraint. n8n plus Postgres wants breathing room. Small ($8/mo — 4 vCPU, 4 GB RAM) is the comfortable default. Micro ($5) works for light personal use on SQLite.
- A public IP, a domain, and TLS. Webhooks are half of what makes n8n worth running, and they need inbound HTTPS. That means a dedicated-IP plan — our NAT plans don't take inbound web traffic.
- Disk for execution history. n8n stores every run. NVMe keeps that snappy; 35 GB goes a long way if you prune old executions.
Docker Compose setup
# Ubuntu 24.04, dedicated-IP plan
apt update && apt install -y docker.io docker-compose-v2
systemctl enable --now docker
mkdir -p /opt/n8n && cd /opt/n8n
cat > docker-compose.yml <<'EOF'
services:
postgres:
image: postgres:16
restart: always
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: change_me
POSTGRES_DB: n8n
volumes: [ ./pgdata:/var/lib/postgresql/data ]
n8n:
image: docker.n8n.io/n8nio/n8n
restart: always
ports: [ "5678:5678" ]
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: change_me
N8N_HOST: n8n.yourdomain.com
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n.yourdomain.com/
N8N_ENCRYPTION_KEY: generate_a_long_random_string
volumes: [ ./n8n-data:/home/node/.n8n ]
depends_on: [ postgres ]
EOF
docker compose up -d
Then put Caddy or nginx in front for HTTPS — Caddy will fetch a Let's Encrypt certificate on its own once your domain's A record points at the server's IP.
Two things people regret skipping: set N8N_ENCRYPTION_KEY to something long and back it up (lose it and your stored credentials are unrecoverable), and turn on basic auth or n8n's user management before the instance is reachable from the internet.
Why host it here
No KYC, crypto payment. Email to register, USDC or USDT on Base, Ethereum, or Tron. If your automations are for a side project, a client, or something you'd rather not tie to a corporate identity, there's no paperwork step. New to crypto?
Flat, cheap, unmetered. $8/month, unmetered traffic at 1 Gbit/s. A workflow that hammers an API all day doesn't change the bill.
Picking a plan
| Use | Plan | Price |
|---|---|---|
| Personal, light workflows, SQLite | Micro-IP | $10/mo |
| The normal setup: n8n + Postgres + webhooks | Small-IP | $16/mo |
| Heavy workflows, lots of history, extra containers | Medium-IP | $20/mo |
Dedicated-IP plans are the ones to look at here — you need inbound HTTPS. Full root, NVMe, unmetered traffic, Germany or Finland. Yearly billing is one crypto transfer instead of twelve.
Related reading
- Self-host n8n on a VPS — the long-form walkthrough
- Secure a new VPS: a checklist — before you expose anything to the internet
Ready? Deploy an n8n server → — live in about a minute, paid in crypto, no ID required.