Instal n8n Self-Hosted di VPS dengan Docker & HTTPS
Panduan deploy n8n di VPS dengan Docker Compose dan Caddy, termasuk HTTPS, credential, backup, webhook, dan operasional aman.
Ringkasan
n8n dapat dijalankan secara self-hosted di VPS menggunakan Docker. Pola ini cocok untuk tim kecil yang membutuhkan kontrol atas data dan integrasi workflow, tetapi tetap ingin deployment yang sederhana.
Panduan ini menggunakan Docker Compose dan Caddy sebagai reverse proxy dengan HTTPS otomatis. Semua nilai domain, password, dan secret adalah contoh. Ganti dengan nilai production yang aman.
Prasyarat
- VPS Linux dengan resource sesuai beban
- domain atau subdomain yang mengarah ke IP VPS
- port 80 dan 443 terbuka
- akses SSH dengan sudo
- Docker Engine dan Docker Compose Plugin
- backup storage yang terpisah dari server
Struktur directory
sudo mkdir -p /opt/n8n/data/n8n /opt/n8n/data/caddy /opt/n8n/data/caddy-config
sudo chown -R "$USER":"$USER" /opt/n8n
cd /opt/n8n
umask 077
File environment
Buat .env dengan permission terbatas:
TZ=Asia/Jakarta
DOMAIN=n8n.example.com
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=ganti-dengan-password-kuat
N8N_ENCRYPTION_KEY=ganti-dengan-secret-acak-yang-panjang
Buat secret dengan generator acak, bukan dengan kata yang mudah ditebak:
openssl rand -base64 32
Jangan simpan file .env di repository atau membagikannya lewat chat.
Docker Compose
Simpan sebagai /opt/n8n/docker-compose.yml:
services:
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
environment:
N8N_HOST: ${DOMAIN}
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: https://${DOMAIN}/
N8N_EDITOR_BASE_URL: https://${DOMAIN}/
GENERIC_TIMEZONE: ${TZ}
N8N_BASIC_AUTH_ACTIVE: "true"
N8N_BASIC_AUTH_USER: ${N8N_BASIC_AUTH_USER}
N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_SECURE_COOKIE: "true"
N8N_DIAGNOSTICS_ENABLED: "false"
volumes:
- ./data/n8n:/home/node/.n8n
caddy:
image: caddy:2
restart: unless-stopped
depends_on:
- n8n
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./data/caddy:/data
- ./data/caddy-config:/config
Port n8n tidak diekspos langsung ke internet. Hanya Caddy yang menerima koneksi publik.
Caddyfile
Simpan sebagai /opt/n8n/Caddyfile:
{$DOMAIN} {
encode gzip
reverse_proxy n8n:5678
}
Caddy akan mengurus sertifikat TLS jika DNS sudah benar dan port 80 serta 443 dapat diakses.
Jalankan dan validasi
cd /opt/n8n
docker compose config
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --since=10m n8n caddy
Buka https://n8n.example.com setelah DNS dan sertifikat siap. Jangan gunakan credential contoh pada deployment nyata.
Uji webhook
Buat workflow sederhana dengan Webhook node, lalu uji menggunakan request yang sesuai path node. Pastikan webhook production dan test memiliki URL berbeda sesuai mode n8n.
Jika URL webhook masih mengarah ke localhost, periksa DOMAIN, WEBHOOK_URL, protocol HTTPS, dan konfigurasi reverse proxy.
Backup dan update
Backup harus mencakup volume data n8n, file Compose, Caddyfile, dan .env yang disimpan secara terenkripsi. Uji restore, bukan hanya keberhasilan membuat arsip.
Sebelum update:
docker compose config
docker compose pull
docker compose up -d
docker compose logs --since=10m n8n
Gunakan versi image yang telah diuji. Hindari update otomatis tanpa rollback plan.
Operasional dan hardening
- batasi akses SSH dan gunakan firewall
- gunakan HTTPS dan password unik
- lindungi credential n8n dan backup
- pantau RAM, CPU, disk, restart count, dan execution error
- tetapkan retention untuk execution data dan log
- pertimbangkan PostgreSQL untuk beban lebih tinggi
- gunakan queue mode hanya jika volume eksekusi memang membutuhkan worker terpisah
Penutup
Deployment n8n yang baik bukan hanya berhasil dibuka di browser. Ia harus memiliki data persisten, HTTPS, credential yang aman, backup yang dapat dipulihkan, monitoring, dan prosedur update yang jelas. Mulailah dengan satu VPS yang terukur, lalu scale berdasarkan beban nyata.