Self-Hosting n8n on a VPS in Indonesia (2026): Docker Only, One Command

n8n 3.0 drops npm and npx. How to self-host it on an Indonesian VPS with the one-line installer, what it costs per month in rupiah, and what to check before upgrading.

By Khairul Muhtadin
  • n8n
  • self-hosted
  • Docker
  • VPS
  • Indonesia
  • n8n 3.0

If you learned n8n by typing npx n8n into a terminal, that habit is about to stop working. n8n 3.0.0 shipped as a beta on 27 October 2026, the stable release is planned for early December, and from 3.0 onward self-hosted n8n only runs in Docker. There is no runnable n8n package on npm anymore.

I have run my own instance for a while now (it is past 200 workflows at this point), so this post is the setup I would do today on a fresh VPS in Indonesia: which server to rent, the one command that replaces the whole npm install dance, and the handful of changes you have to make before the result is safe to put on the internet.

What actually changed in 3.0

The deployment part is short:

  • Installing with npm install n8n -g or npx n8n is no longer supported. n8n says part of the reason is that new security features depend on a container setup.
  • Existing npm installs keep working on 2.x for now, but new installs and future upgrades have to go through Docker.
  • Kubernetes and Helm setups are not affected. If you already run your own Docker Compose file, you do not need to change anything.
  • There is no direct upgrade path from 1.x to 3.x. You go to 2.x first. Support for 1.x ends on 31 December 2026.
  • You cannot roll back from 3.0 to 2.x.

The replacement for npx n8n is a one-line installer:

curl -fsSL https://get.n8n.io | sh

It checks that Docker and the Compose v2 plugin are present, writes a compose.yml and .env into a new ./n8n folder, generates secrets, pulls the images and starts everything. It is safe to run twice; if the folder already exists it tells you so and stops.

The rest of the 3.0 breaking changes are about workflows, not hosting. I cover the ones that bit people in the checklist at the end.

Pick a VPS: why 2 GB is not enough anymore

n8n itself is light. The docs say an idle instance sits around 100 MB. The reason you now need a bigger server is what the installer ships alongside it: a sandbox for n8n Assistant (a privileged Docker-in-Docker container that runs AI-generated code) plus a bundled SearXNG search service. The Docker Compose guide asks for at least 4 GB of RAM and 2 vCPUs for this stack.

So the tier to look at is 2 vCPU / 4 GB. Here is what that costs as of early November 2026, from the providers’ own price lists:

Provider Plan Spec Price / month Notes
Biznet Gio (Jakarta) NEO Lite MS 4.2 2 vCPU, 4 GB, 60 GB SSD Rp139.000 Unlimited bandwidth, 1 public IP included. Snapshots are a paid add-on.
Rumahweb (Indonesia) VPS L 2 vCPU, 4 GB, 80 GB SSD Rp245.000 Unlimited traffic
IDCloudHost (Indonesia / Singapore) Cloud VPS from 2 vCPU, 2 GB, 20 GB NVMe from Rp87.000 Check the live pricelist for the 4 GB tier; prices move.
DigitalOcean (Singapore) Basic Droplet 2 vCPU, 4 GB, 80 GB $24 (about Rp435.000 at Rp18.100/USD) 4 TB transfer
Hetzner (Germany/Finland only) CX23 2 vCPU, 4 GB, 40 GB €5.49 + €0.50 IPv4 (about Rp121.000 at Rp20.200/EUR) Not available in Singapore. After the June 2026 price rise the Singapore options start at CCX13, €53.99. Often sold out.

Two things stand out. The cheap Hetzner box everyone recommends only exists in Europe, so every webhook from Jakarta makes a round trip to Germany and back. And once you add that up, a Jakarta VPS at Rp139.000 ends up close to the same price anyway, with the server in the same country as your users and your data.

My pick for most people: Biznet Gio NEO Lite MS 4.2 or an IDCloudHost 4 GB plan, whichever is in stock. Take the 8 GB tier (Biznet MM 8.4 is Rp269.000) if you plan to turn on n8n Assistant and let it run code, or if you process a lot of PDFs and images in workflows.

Before you decide, run ping from where your users or client systems are to a test IP from each provider. Latency differs by ISP, so measure it yourself.

Install: from empty Ubuntu to a running n8n

I am assuming Ubuntu 24.04, a fresh server, and that you can SSH in as root or a sudo user.

1. Install Docker. The installer needs Docker Engine and the docker compose v2 plugin, not the old standalone docker-compose binary. The official convenience script gives you both:

curl -fsSL https://get.docker.com | sh
docker compose version   # should print v2.x

2. Run the n8n installer.

cd ~
curl -fsSL https://get.n8n.io | sh

You will see it confirm Docker, create ./n8n/compose.yml, ./n8n/.env and ./n8n/searxng-settings.yml, pull images, and finally print n8n is running at: http://localhost:5678. First run takes a few minutes because of the image downloads.

The script installs the current stable version. To try the 3.0 beta specifically, pin it:

curl -fsSL https://get.n8n.io | sh -s -- --version 3.0.0

3. Do not stop here. What you have now is n8n on plain HTTP, listening on port 5678 on every interface, with SQLite as the database. Fine for a laptop. Not fine for a server with a public IP.

Make it production-safe

Open ~/n8n/compose.yml and change the n8n service’s port mapping so only localhost can reach it:

    ports:
      - '127.0.0.1:5678:5678'

Then add a reverse proxy with automatic HTTPS. Caddy is the least work. Point an A record (say n8n.yourdomain.com) at the VPS first, then:

sudo apt install -y caddy
sudo tee /etc/caddy/Caddyfile > /dev/null <<'EOF'
n8n.yourdomain.com {
    reverse_proxy 127.0.0.1:5678
}
EOF
sudo systemctl reload caddy

Now tell n8n what its public address is, otherwise webhook URLs and OAuth callbacks will point at localhost. Add these to ~/n8n/.env:

N8N_HOST=n8n.yourdomain.com
N8N_PROTOCOL=https
N8N_PORT=5678
WEBHOOK_URL=https://n8n.yourdomain.com/
GENERIC_TIMEZONE=Asia/Jakarta
TZ=Asia/Jakarta
N8N_PROXY_HOPS=1

Restart:

docker compose -f ~/n8n/compose.yml up -d

Lock the firewall down to SSH and web:

sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable

Port 5678 is no longer reachable from outside, and the sandbox and runner containers never were. The compose file n8n ships already keeps them internal; do not add port mappings to them. The sandbox runner is a privileged container, which the docs describe as equivalent to root on the host.

Postgres instead of SQLite

SQLite is what the installer gives you and it is fine for one person and a few dozen workflows. For a team, or anything running around the clock, swap in Postgres. The n8n Docker Compose guide has the exact postgres service block and the DB_* variables to add. One warning from that page worth repeating: this is for a fresh instance. Existing SQLite data does not migrate into Postgres by itself, so export your workflows first if you are switching later.

Day-to-day commands

Task Command
Stop docker compose -f ~/n8n/compose.yml down
Start docker compose -f ~/n8n/compose.yml up -d
Upgrade n8n and sandbox curl -fsSL https://get.n8n.io | sh -s -- --upgrade
Pin a version curl -fsSL https://get.n8n.io | sh -s -- --version 3.0.0
Logs docker compose -f ~/n8n/compose.yml logs -f n8n
Remove everything incl. data docker compose -f ~/n8n/compose.yml down -v && rm -rf ~/n8n

The upgrade command only edits N8N_VERSION and N8N_SANDBOX_VERSION in .env. Your data, secrets and the rest of the compose file stay as they are.

Back up two things on a schedule: the n8n-data Docker volume (it holds the SQLite database and the encryption key) and the ~/n8n folder. If you moved to Postgres, back up that volume too. Losing the encryption key means losing every stored credential, so copy .env and the volume somewhere off the server.

Before you upgrade to 3.0: the checklist

If you are moving an existing 2.x instance (npm or Docker) to 3.0, open Settings > Migration Report first. It lists the workflows and settings on your instance that need attention. The items that most often break:

  • Removed nodes. Function, Function Item, Item Lists, Cron, Interval, HTML Extract, Read/Write Binary File, Read PDF, the legacy OpenAI node, the legacy HTTP Request Tool, and several LangChain-era loader and vector store nodes are gone. Workflows that use them fail, and published ones do not activate after the upgrade. Most have a direct replacement (Code, Schedule Trigger, HTML, Read/Write Files from Disk, Extract from File).
  • $getPairedItem is removed. Use $('Node').item, .itemMatching(i) or .pairedItem(i).
  • Slack Trigger needs a signing secret on the Slack credential, or the workflow will not activate.
  • Code node tasks time out after 60 seconds by default instead of 300. Set N8N_RUNNERS_TASK_TIMEOUT if you have long-running code.
  • Unverified community nodes are off by default. Set N8N_UNVERIFIED_PACKAGES_ENABLED=true or move to verified ones.
  • ~/.n8n/binaryData is renamed to ~/.n8n/storage. If you mount a volume there, change the mount path. n8n refuses to start if both directories exist.
  • Encryption key rotation is on by default. Nothing to do, but back up the database first.

Export your workflows (Settings or the CLI) before the upgrade. There is no rollback.

Monthly cost

For a solo builder or a small team on a Jakarta VPS:

  • VPS 2 vCPU / 4 GB: Rp139.000 (Biznet Gio) to Rp245.000 (Rumahweb)
  • Domain: whatever you already pay; a subdomain of an existing domain is free
  • TLS: free via Caddy and Let’s Encrypt
  • Backups: a few thousand rupiah if you push them to object storage, or free to a second disk

So roughly Rp140.000 to Rp250.000 a month for unlimited workflows and executions, with the server in Indonesia. That is the number to compare against n8n Cloud when you decide, and I wrote up the rest of that comparison in Self-hosted n8n vs n8n Cloud for Indonesian teams.

If you want someone to set this up, harden it and hand it over with documentation, that is part of what I do under n8n automation services. Start with a free automation audit and we can decide whether self-hosting even makes sense for your case.


Prices checked 1 November 2026 against each provider’s public price list. Exchange rates used: Rp18.100/USD and Rp20.200/EUR, rounded. Check the live pages before buying; Hetzner changed prices twice in 2026 alone.

Sources: n8n blog “Introducing n8n 3.0” (27 Oct 2026), n8n docs: v3.0 breaking changes, One-line setup, Install using Docker Compose; Biznet Gio pricelist; Rumahweb VPS page; Hetzner price adjustment notice (15 June 2026); DigitalOcean Droplet pricing.