Halo Sobat Online! Bayangkan kamu punya asisten kantor yang bekerja 24 jam: menerima pesanan, menyalin data ke spreadsheet, mengirim laporan ke Telegram, dan tidak pernah minta cuti. Itulah gambaran n8n, jagoan otomasi workflow open-source. Hari ini kita akan self-host n8n di VPS langkah demi langkah — rumusnya cuma satu file compose.yml, satu database Postgres, dan satu domain ber-HTTPS.
Kenapa pakai VPS? Karena n8n itu sudah seperti satu ruangan kerja milikmu sendiri: alurnya jalan terus walau laptop tidur, datanya tidak nongkrong di server orang lain, dan tidak ada hitungan per eksekusi. Biaya bulanannya cuma sewa VPS yang sudah kamu bayar untuk keperluan lain.
Kenapa Self-Host n8n di VPS Momennya Pas Sekarang?
Ada kabar penting dari dokumentasi resmi n8n: mulai n8n 3.0 (rencananya rilis Oktober 2026), n8n hanya didistribusikan lewat Docker. Cara lama npm install n8n atau npx n8n sudah tidak akan bisa dipakai untuk pemasangan baru, dan dokumentasinya pun sudah menggantinya dengan panduan Docker Compose plus skrip one-line setup. Artinya, siapa pun yang ingin otomasi jangka panjang tetap aman, jalur Docker inilah yang paling “tahan banting”.
Versi yang jadi acuan artikel ini pun masih seri 2.x: halaman Releases di GitHub mencatat n8n 2.41.0 pada 22 September 2026, dan seluruh seri 2.x adalah rilis pengerasan (hardening) — bukan rilis fitur besar, jadi cocok untuk dijalankan sebagai produksi.
Yang Perlu Disiapkan Sebelum Mulai
Persiapannya ringan, tapi jangan sampai terlewat:
- VPS Ubuntu 24.04 atau 26.04, minimal 2 vCPU dan 2 GB RAM. Kalau kamu juga ingin memakai n8n Assistant beserta sandbox-nya, dokumentasi resmi menyarankan 4 GB RAM dan 2 vCPU.
- Docker Engine + Docker Compose v2 — cek dengan
docker compose version(plugin v2, bukan biner lamadocker-compose). - Satu subdomain, misalnya
n8n.domainmu.com, diarahkan ke IP VPS. - Akses SSH ke VPS, karena semua perintah di bawah dijalankan dari terminal.
Buat folder proyeknya dulu:
sudo apt update && sudo apt install -y docker.io docker-compose-v2
sudo usermod -aG docker $USER && newgrp docker
mkdir -p ~/n8n && cd ~/n8n
Langkah 1: Buat Rahasia di File .env
Semua kunci dan kata sandi ditaruh di satu file .env supaya tidak menempel di dalam compose.yml. Buat kuncinya:
openssl rand -hex 24 # salin hasilnya untuk N8N_ENCRYPTION_KEY
openssl rand -base64 24 # salin hasilnya untuk POSTGRES_PASSWORD
Lalu buat file .env:
N8N_VERSION=2.41.0
N8N_HOST=n8n.domainmu.com
N8N_ENCRYPTION_KEY=ganti-dengan-hasil-openssl-pertama
POSTGRES_USER=n8ndb
POSTGRES_PASSWORD=ganti-dengan-hasil-openssl-kedua
POSTGRES_DB=n8n
Jangan pernah mengganti N8N_ENCRYPTION_KEY setelah n8n dipakai. Kunci ini yang mengenkripsi semua kredensial (token API, password SMTP) di database. Kalau hilang atau berubah, n8n akan mengeluh “could not decrypt credentials” dan kamu harus mengisi ulang semua kredensial dari nol. Simpan salinannya di password manager.
Langkah 2: Tulis compose.yml (n8n + Postgres)
Sekarang inti dari pekerjaan ini. Buat file compose.yml di folder yang sama:
volumes:
db_storage:
n8n_storage:
x-n8n: &n8n
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: always
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_HOST=${N8N_HOST}
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${N8N_HOST}/
- N8N_PROXY_HOPS=1
- GENERIC_TIMEZONE=Asia/Jakarta
- TZ=Asia/Jakarta
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_RUNNERS_ENABLED=true
volumes:
- n8n_storage:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
services:
postgres:
image: postgres:18
restart: always
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
- PGDATA=/var/lib/postgresql/data
volumes:
- db_storage:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 5s
timeout: 5s
retries: 10
n8n:
<<: *n8n
ports:
- 127.0.0.1:5678:5678
Ada beberapa pilihan di baris itu yang sengaja diambil, dan alasannya penting:
DB_TYPE=postgresdb— SQLite bawaan sebenarnya boleh dipakai untuk coba-coba, tapi dokumentasi n8n jelas menyarankan Postgres begitu instansinya dipakai lebih dari sekadar eksperimen. Postgres juga yang membuat n8n siap naik ke mode antrean nanti.POSTGRES_...tanpa nilai — Compose otomatis mengambil nilainya dari.env, jadi rahasianya tidak pernah tertulis dua kali.PGDATA=/var/lib/postgresql/data— Postgres 18 memindahkan lokasi data bawaan. Kalau tidak dipin seperti ini, volume mount-mu bisa berakhir di folder kosong dan database terasa “hilang” setelah upgrade image.ports: 127.0.0.1:5678:5678— port n8n hanya dibuka ke localhost. Nginx yang nanti menjadi satu-satunya pintu masuk dari internet. Ini penting: editor n8n itu sama kuatnya dengan kendali seluruh otomasimu.GENERIC_TIMEZONEdanTZ— dua-duanya diisiAsia/Jakarta. Yang pertama menentukan jam untuk node Schedule Trigger, yang kedua jam sistem di dalam container. Tanpa keduanya, jadwal “kirim laporan jam 7 pagi” bisa meleset beberapa jam.N8N_RUNNERS_ENABLED=true— mengaktifkan task runner, cara resmi n8n menjalankan tugas di proses terpisah supaya eksekusi node tidak mengganggu proses utama.
Repo resmi n8n-hosting menyediakan versi yang lebih lengkap: Postgres dengan dua akun (root untuk administrasi, satu akun non-root khusus n8n), Redis, worker, dan runner terpisah. Setup satu-user di atas adalah versi paling ramah untuk belajar — kamu bisa menaikkannya ke mode antrean saat beban eksekusinya sudah ramai.
Langkah 3: Nyalakan dan Cek Kesehatannya
docker compose up -d
docker compose ps
curl -sf http://localhost:5678/healthz && echo "n8n sehat!"
Perintah docker compose ps harus menampilkan Postgres berstatus healthy dan n8n running. Endpoint /healthz adalah jalur resmi untuk memastikan instansinya hidup: HTTP 200 berarti n8n bisa dijangkau. Dokumentasi n8n juga menyediakan /healthz/readiness yang memeriksa lebih dalam (termasuk kesiapan database) — pakai yang kedua itu kalau kamu menaruhnya di alat monitoring seperti Uptime Kuma. Sekarang buka http://IP-VPS:5678 lewat SSH tunnel (ssh -L 5678:127.0.0.1:5678 user@IP-VPS) untuk membuat akun pemilik pertama.
Langkah 4: Pasang HTTPS Pakai Nginx
Buat konfigurasi Nginx untuk subdomainmu:
sudo nano /etc/nginx/sites-available/n8n
server {
listen 80;
server_name n8n.domainmu.com;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600;
}
}
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d n8n.domainmu.com
Baris Upgrade dan Connection "upgrade" bukan hiasan: tanpa keduanya, editor n8n dan WebSocket-nya akan terputus-putus. Setelah sertifikat terpasang, jangan lupa tutup semua port kecuali 22, 80, dan 443:
sudo ufw allow 22,80,443/tcp && sudo ufw enable
Langkah 5: Jalankan Update Tanpa Drama
Karena versinya dipin di .env, update jadi urusan satu menit dan bisa dijadwalkan sendiri:
cd ~/n8n
docker compose pull # ambil image versi baru
docker compose down # hentikan container lama
docker compose up -d # nyalakan lagi
Jangan lompat versi mayor tanpa membaca catatan rilis, dan biasakan backup dua hal sebelum down: database (docker compose exec postgres pg_dump -U n8ndb n8n > backup-n8n.sql) dan volume n8n_storage yang berisi kunci enkripsi plus file lokal. Backup ke cloud otomatis bisa memakai pola yang sama seperti panduan rclone di blog ini.
Kesalahan yang Paling Sering Kena
- Kunci enkripsi berubah → semua kredensial gagal didekripsi. Simpan
N8N_ENCRYPTION_KEYdi tempat aman sejak awal. - Port 5678 dibuka langsung ke internet → siapa pun bisa menyentuh editor otomasimu. Biarkan hanya Nginx yang menghadap publik, dan tambahkan autentikasi dasar bila perlu.
- Zona waktu tidak diisi → jadwal harian meleset. Isi
GENERIC_TIMEZONEdanTZ. - Update image tanpa menarik versi Postgres yang cocok → container gagal naik karena
PGDATApindah. Selalu pinPGDATAdan baca breaking changes di rilis Postgres. - Masih memasang n8n dengan
npm→ jalur ini ditutup untuk pemasangan baru begitu n8n 3.0 keluar pada Oktober 2026.
Kalau kamu hanya ingin mencoba cepat di folder baru, dokumentasi resmi menyediakan one-line setup — curl -fsSL https://get.n8n.io | sh — yang langsung membuat compose.yml, .env, SearXNG, dan sandbox n8n Assistant. Untuk VPS produksi, jalur manual di atas tetap lebih enak dikontrol karena setiap barisnya kamu paham sendiri.
Kesimpulan: Otomasi Milik Sendiri, Jalan Terus 24 Jam
Dengan satu compose.yml, satu Postgres, dan satu domain ber-HTTPS, kamu sudah punya n8n self-hosted yang siap jadi tulang punggung otomasi: sinkronisasi data, notifikasi, sampai pekerjaan terjadwal yang berjalan tanpa kamu buka laptop. Semua perintah di artikel ini bisa disalin-tempel, dan begitu /healthz menjawab sehat, kamu tinggal mulai merangkai workflow pertamamu.
Selamat membangun ruang kerja otomasi sendiri, Sobat Online — satu workflow rapi hari ini lebih berharga daripada sepuluh ide yang belum dijalankan. Semangat!

