Self-Host n8n di VPS dengan Docker
Panduan memasang n8n self-host di VPS Indonesia: Docker Compose dengan PostgreSQL, reverse proxy Caddy untuk HTTPS, webhook publik, enkripsi kredensial, dan backup.
4 Oktober 2026 · 8 menit baca · Tim VPS Indonesia
n8n self-host memberi eksekusi workflow tanpa batas dan kredensial yang tersimpan di servermu sendiri. Mini 2 GB cukup untuk belasan workflow; Lite 3 GB jika memakai browser headless; Standar 6 GB untuk tim dan mode queue.
Prasyarat
- Docker & Compose sudah terpasang (panduan Docker).
- Subdomain, misalnya
n8n.domainmu.com, recordA→ IP VPS. - Port 80/443 terbuka di firewall.
1. Struktur & environment
mkdir -p ~/apps/n8n && cd ~/apps/n8n
openssl rand -hex 24 # simpan sebagai N8N_ENCRYPTION_KEY
Buat .env:
N8N_HOST=n8n.domainmu.com
WEBHOOK_URL=https://n8n.domainmu.com/
GENERIC_TIMEZONE=Asia/Jakarta
N8N_ENCRYPTION_KEY=GANTI_DENGAN_HASIL_OPENSSL
POSTGRES_USER=n8n
POSTGRES_PASSWORD=GANTI_PASSWORD_KUAT
POSTGRES_DB=n8n
2. compose.yml
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${N8N_HOST}
N8N_PROTOCOL: https
N8N_PORT: 5678
WEBHOOK_URL: ${WEBHOOK_URL}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_RUNNERS_ENABLED: "true"
ports:
- "127.0.0.1:5678:5678"
volumes:
- ./n8n_data:/home/node/.n8n
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
Caddyfile:
n8n.domainmu.com {
reverse_proxy n8n:5678
}
docker compose up -d
docker compose logs -f n8n
Buka https://n8n.domainmu.com, buat akun pemilik. Sertifikat SSL diterbitkan Caddy otomatis.
3. Webhook & integrasi lokal
Karena VPS punya IP publik dan HTTPS, webhook dari WhatsApp API (Evolution/WAHA), payment gateway, atau Google Forms langsung sampai. Letakkan layanan WhatsApp API di Compose yang sama dan hubungkan via nama service (http://evolution:8080) — lihat VPS untuk bot WhatsApp.
4. Mode queue untuk beban besar (opsional)
Untuk ratusan eksekusi per jam, aktifkan EXECUTIONS_MODE=queue dengan Redis dan container worker terpisah. Butuh paket Standar ke atas.
5. Backup
Yang wajib disimpan: folder n8n_data (berisi kredensial terenkripsi) dan dump PostgreSQL:
docker compose exec postgres pg_dump -U n8n n8n | gzip > backup-$(date +%F).sql.gz
Simpan N8N_ENCRYPTION_KEY di tempat aman — tanpa kunci ini kredensial tidak bisa didekripsi saat restore. Jadwalkan backup ke penyimpanan terpisah dengan restic.
Pembaruan
docker compose pull && docker compose up -d
Baca catatan rilis n8n sebelum lompat versi mayor.