← Kembali ke blog

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.

Instal n8n Self-Hosted di VPS dengan Docker & HTTPS

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.