Tropic Host

n8n: apa itu dan cara memasangnya di VPS dengan Docker Compose

8 min dibaca
Tropic
n8n: apa itu dan cara memasangnya di VPS dengan Docker Compose

n8n di VPS: platform otomatisasi sendiri tanpa pekerjaan manual yang berulang

Sebuah permintaan masuk dari situs web. n8n memvalidasi data, memeriksa duplikat, membuat deal, menyiapkan draf balasan dengan AI, lalu memberi tahu manajer melalui Telegram. Seseorang hanya perlu turun tangan ketika keputusan diperlukan—bukan untuk memindahkan data antar-tab browser.

Di bawah ini, kita akan melihat cara kerja n8n dan cara memasangnya di VPS dengan Docker Compose, PostgreSQL, HTTPS, serta eksekusi kode yang terisolasi.

n8n dalam tujuh langkah

Rencana peluncuran minimal:

  1. Buat VPS dan arahkan subdomain ke sana, misalnya n8n.example.com.
  2. Pasang Docker dan Docker Compose.
  3. Jalankan n8n dengan PostgreSQL, task runner eksternal, dan Caddy.
  4. Buka antarmuka melalui HTTPS dan buat akun pemilik.
  5. Hubungkan Telegram, CRM, email, atau API eksternal lainnya.
  6. Konfigurasikan penanganan kesalahan dan retensi data eksekusi.
  7. Otomatiskan cadangan database, data, dan kunci enkripsi.

Untuk instalasi produksi kecil, memulai dengan 2 vCPU dan RAM 4 GB merupakan pilihan yang wajar. RAM 2 GB sering cukup untuk pengujian, tetapi PostgreSQL, Docker, dan proses bersamaan dengan cepat menghabiskan ruang cadangan yang tersisa.

Apa itu n8n dan bagaimana cara kerjanya

n8n adalah platform otomatisasi workflow. Workflow dirangkai dari node: satu node memulai proses, node berikutnya mengambil dan mengubah data, lalu node terakhir melakukan tindakan.

Workflow sederhana terlihat seperti ini:

Webhook → data validation → CRM → Telegram → website response

Rangkaian dapat dipicu oleh webhook, jadwal, email, pesan, atau peristiwa dalam layanan eksternal. Kondisi, loop, filter, penundaan, dan penanganan kesalahan tersedia di antara node.

Salah satu kekuatan n8n adalah otomatisasi tidak terbatas pada integrasi siap pakai. Anda dapat memanggil layanan apa pun dengan API melalui HTTP Request, sedangkan logika khusus dapat ditulis dalam node Code menggunakan JavaScript atau Python. Hal ini menempatkan n8n di antara pembuat no-code sederhana dan kode sisi server khusus.

Mengapa n8n lebih dari sekadar meneruskan data

n8n berguna ketika sebuah proses mencakup beberapa sistem dan membutuhkan keputusan:

form → validation → duplicate search → AI assessment → manager approval → CRM

Seseorang hanya perlu ditempatkan di titik kontrol. Misalnya, AI menyiapkan balasan, tetapi pesan baru dikirim kepada pelanggan setelah disetujui karyawan.

Kasus penggunaan umum:

  • penjualan dan dukungan: mengumpulkan permintaan, menetapkan prospek, dan membuat deal;
  • konten dan AI: membuat draf, mengklasifikasikan pertanyaan, dan menerbitkan setelah persetujuan;
  • DevOps: notifikasi gangguan, webhook Git, dan pemeriksaan API;
  • operasi internal: menyinkronkan spreadsheet, email, kalender, dan sistem perusahaan.

Instalasi self-hosted memberi Anda kendali atas proses dan database, tetapi tidak membuat layanan eksternal menjadi lokal. Data yang dikirim ke Telegram, CRM, atau model AI cloud akan meninggalkan VPS.

n8n Cloud atau server sendiri

Parametern8n Cloudn8n di VPS
PeluncuranTidak perlu menyiapkan serverMembutuhkan domain, Docker, dan HTTPS
PembaruanDitangani n8nDitangani pemilik
Database dan fileDi infrastruktur layananDi server yang dipilih
PenskalaanSesuai paket cloudDikonfigurasi secara mandiri
Tanggung jawabAdministrasi lebih sedikitCadangan, keamanan, dan pemantauan menjadi tanggung jawab pemilik
Terbaik untukMemulai cepat tanpa DevOpsKendali, kustomisasi, dan proses yang selalu aktif

Community Edition dapat di-host sendiri secara gratis dan digunakan untuk proses pribadi serta bisnis internal. Namun, n8n didistribusikan bukan di bawah lisensi open source tradisional, melainkan Sustainable Use License berbasis fair-code. Lisensi ini mengizinkan penggunaan internal dan modifikasi, tetapi tidak mengizinkan Anda begitu saja menerapkan n8n, menambahkan logo sendiri, lalu menjual aksesnya sebagai SaaS mandiri. Untuk produk seperti itu, ketentuan lisensi perlu ditinjau secara terpisah.

Persyaratan server n8n

Beban bergantung pada volume data, konkurensi, dan jenis operasi. File, daftar panjang, node Code, dan workflow AI membutuhkan lebih banyak memori daripada meneruskan payload JSON kecil antar-API.

SkenarioKonfigurasi awal
Pengujian dan workflow teks pribadi1 vCPU, RAM 2 GB, NVMe 20 GB
Instalasi produksi kecil2 vCPU, RAM 4 GB, NVMe 25–40 GB
Proses bersamaan, AI, atau file4 vCPU, RAM 8 GB atau lebih
Beberapa proses worker dalam queue modeSesuaikan dengan volume eksekusi

SQLite cocok untuk belajar dan penyiapan satu instans kecil. PostgreSQL lebih nyaman untuk produksi: cadangan lebih mudah, dan migrasi ke queue mode nantinya lebih sederhana.

Cara memasang n8n di VPS

Contoh ini menggunakan Ubuntu 24.04, PostgreSQL, Caddy, dan task runner eksternal. Ganti n8n.example.com serta zona waktu dengan nilai Anda sendiri.

1. Konfigurasikan DNS dan siapkan server

Buat catatan DNS A yang mengarah ke alamat IPv4 VPS, lalu hubungkan melalui SSH:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl

Pasang Docker Engine dan plugin Compose dari repositori resmi:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
docker compose version

Izinkan hanya SSH, HTTP, dan HTTPS:

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

Jangan menutup sesi SSH saat ini sampai Anda memastikan koneksi baru dapat digunakan.

2. Buat variabel lingkungan

Siapkan direktori:

mkdir -p /opt/n8n
cd /opt/n8n

Buat .env. Perintah berikut langsung menghasilkan secret acak terpisah untuk PostgreSQL, enkripsi n8n, dan task runner:

cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env

Tag stable praktis untuk peluncuran pertama. Setelah instalasi diverifikasi, sebaiknya kunci versi n8n tertentu agar pembaruan image berikutnya tidak terjadi secara tidak terduga.

Anda tidak boleh kehilangan N8N_ENCRYPTION_KEY. n8n menggunakan kunci ini untuk mengenkripsi kata sandi, token, dan kredensial lainnya yang disimpan. Jika Anda hanya memulihkan PostgreSQL tanpa kunci tersebut, catatan tetap berada di database, tetapi n8n tidak akan dapat membacanya.

3. Buat file Docker Compose

Buat compose.yaml:

services:
  postgres:
    image: postgres:18-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: "5432"
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}

      N8N_HOST: ${N8N_HOST}
      N8N_PORT: "5678"
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_HOST}
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: "1"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"

      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0

      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: "168"
      EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
    volumes:
      - n8n_data:/home/node/.n8n
    expose:
      - "5678"
    depends_on:
      postgres:
        condition: service_healthy

  n8n-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: unless-stopped
    environment:
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
    depends_on:
      - n8n

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_HOST}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - n8n

volumes:
  postgres_data:
    name: n8n_postgres_data
  n8n_data:
    name: n8n_data
  caddy_data:
    name: n8n_caddy_data
  caddy_config:
    name: n8n_caddy_config

Task runner eksternal menjalankan kode secara terpisah dari proses utama n8n. Ini lebih aman daripada mode internal dan mengurangi kemungkinan kesalahan pada node Code memengaruhi editor serta pemrosesan webhook.

4. Aktifkan HTTPS

Buat Caddyfile:

{$N8N_HOST} {
    reverse_proxy n8n:5678
}

Caddy akan memperoleh sertifikat TLS secara otomatis jika DNS sudah mengarah ke VPS dan port 80 serta 443 dapat dijangkau. Port internal 5678 tidak terbuka ke internet: hanya port 80 dan 443 yang tersedia dari luar, sementara Caddy mengakses n8n melalui jaringan Docker.

Variabel N8N_WEBHOOK_URL dan N8N_PROXY_HOPS diperlukan agar editor menghasilkan alamat webhook publik yang benar dan memercayai header dari satu reverse proxy.

5. Jalankan n8n

Validasi konfigurasi akhir dan jalankan container:

docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy

Buka:

https://n8n.example.com

Buat akun pemilik. Jangan membagikan kata sandinya kepada rekan kerja: untuk kerja tim, gunakan akun terpisah dan berikan hanya akses yang diperlukan setiap orang.

Workflow pertama yang berguna

Pengujian yang baik adalah memproses permintaan dari situs web:

  1. Tambahkan node Webhook dengan metode POST.
  2. Gunakan Edit Fields untuk menyisakan nama, alamat email, dan sumber.
  3. Gunakan node If untuk menolak permintaan tanpa data wajib.
  4. Buat deal di CRM atau kirim permintaan melalui HTTP Request.
  5. Tambahkan notifikasi Telegram.
  6. Akhiri rangkaian dengan node Respond to Webhook.
  7. Setelah pengujian, aktifkan workflow dan ganti webhook pengujian dengan URL produksi.

Contoh ini langsung memeriksa domain, HTTPS, permintaan masuk, kredensial, dan integrasi eksternal. Berikutnya, tambahkan Error Workflow terpisah yang akan memberi tahu Anda ketika rangkaian utama gagal.

Mengamankan n8n setelah instalasi

Instans n8n yang telah dipasang belum otomatis menjadi instans yang andal. Setelah peluncuran, pastikan bahwa:

  • editor hanya dapat diakses melalui HTTPS;
  • .env memiliki izin 600 dan tidak di-commit ke Git;
  • kunci API eksternal memiliki izin minimum yang diperlukan;
  • setiap webhook memverifikasi signature atau secret sumber;
  • riwayat eksekusi dihapus secara otomatis;
  • kesalahan dalam workflow penting dikirim kepada administrator.

Community node dipasang sebagai paket dan mungkin mendapatkan akses ke data workflow serta server. Jangan menambahkan node yang tidak dikenal tanpa meninjaunya. Jika tidak membutuhkannya, nonaktifkan dengan N8N_COMMUNITY_PACKAGES_ENABLED=false.

Jalankan audit bawaan:

docker compose exec n8n n8n audit

Audit membantu mengidentifikasi webhook yang tidak terlindungi, node berisiko, dan masalah kredensial, tetapi tidak menggantikan peninjauan manual.

Riwayat eksekusi dan data pribadi

n8n menyimpan data input dan output untuk debugging. Bersamaan dengan itu, pesan email, nomor telepon, dokumen, dan respons API dapat tetap berada di database.

Dalam konfigurasi di atas, eksekusi dihapus setelah tujuh hari dan jumlahnya dibatasi hingga 10.000. Untuk proses sensitif, pilih periode retensi sesuai kebijakan penyimpanan data Anda dan hapus kolom yang tidak diperlukan sebelum workflow selesai.

Cadangan dan pembaruan

Pemulihan memerlukan dump PostgreSQL, volume n8n_data, file konfigurasi, dan .env yang berisi N8N_ENCRYPTION_KEY. Sebelum menyalin, hentikan processor sambil membiarkan PostgreSQL tetap berjalan. Ini menyebabkan gangguan singkat pada eksekusi workflow:

cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner

docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
  | gzip > "backup/n8n-db-$(date +%F).sql.gz"

docker run --rm \
  -v n8n_data:/source:ro \
  -v "$PWD/backup":/backup \
  alpine sh -c \
  'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'

tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
  .env compose.yaml Caddyfile

docker compose start n8n n8n-runner

Arsip yang berisi .env memuat secret: enkripsi arsip tersebut dan simpan di luar VPS. Verifikasi cadangan secara berkala dengan melakukan pemulihan uji.

Sebelum memperbarui, buat cadangan dan tinjau catatan rilis:

cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps

Task runner dan container utama harus menggunakan tag versi yang sama.

Kapan penskalaan diperlukan

Jangan memulai dengan Redis dan beberapa worker sebelum ada beban nyata. Satu instans dengan PostgreSQL lebih mudah dipelihara dan biasanya cukup untuk proses internal kecil.

Queue mode diperlukan ketika tugas panjang menunda webhook, banyak workflow dimulai bersamaan, atau pemrosesan file secara rutin menghabiskan seluruh memori yang tersedia. Dalam penyiapan tersebut, instans utama menerima event, Redis membagikan pekerjaan, dan worker mengeksekusinya secara paralel. Semua komponen harus terhubung ke database PostgreSQL yang sama dan menggunakan N8N_ENCRYPTION_KEY yang sama.

VPS mana yang dipilih untuk n8n

Untuk n8n, PostgreSQL, Caddy, dan task runner secara bersamaan, memulai dengan 2 vCPU, RAM 4 GB, dan drive NVMe adalah pilihan yang wajar. Di tropic.host, paket Light sesuai dengan konfigurasi ini: 2 vCPU, RAM 4 GB, dan NVMe 25 GB. Kapasitas tersebut cukup untuk workflow produksi pertama tanpa pemrosesan file berat.

Untuk dokumen, dataset besar, dan banyak workflow AI yang berjalan bersamaan, RAM 8 GB lebih baik. Jaringan yang stabil juga penting: webhook, callback OAuth, dan pekerjaan terjadwal harus selalu tersedia.

Kesimpulan

n8n mengubah operasi berulang menjadi alur visual yang jelas: node siap pakai mempercepat peluncuran, HTTP Request menghubungkan hampir semua API, dan node Code memungkinkan Anda menambahkan logika sendiri.

Versi self-hosted memberi kendali atas server dan database, tetapi memerlukan HTTPS, kunci yang dibatasi, pembersihan riwayat, dan cadangan yang telah diverifikasi. Simpan N8N_ENCRYPTION_KEY bersama PostgreSQL: tanpa kunci tersebut, kredensial yang dipulihkan tidak dapat didekripsi.

FAQ

Apakah n8n dapat digunakan secara gratis?

Ya. Community Edition dapat di-host di server sendiri secara gratis untuk proses pribadi dan internal. Menjual kembali n8n yang di-host sebagai SaaS mandiri dibatasi oleh lisensi fair-code.

Apakah n8n dapat dipasang tanpa domain?

Untuk pengujian lokal, ya. Untuk webhook publik dan OAuth, sebaiknya gunakan domain dan HTTPS.

Berapa banyak RAM yang dibutuhkan n8n?

Workflow pribadi sederhana sering berjalan dengan RAM 2 GB. Untuk n8n dengan PostgreSQL, Caddy, dan task runner, RAM 4 GB lebih masuk akal; file dan eksekusi bersamaan mungkin memerlukan 8 GB atau lebih.

Apakah semua data tetap berada di dalam VPS?

Hanya data yang tidak dikirim oleh workflow ke tempat lain. Database dan riwayat eksekusi disimpan di VPS, tetapi node Telegram, CRM, atau model AI eksternal mengirim data yang dipilih ke layanan terkait.

Apa saja yang harus dimasukkan dalam cadangan n8n?

Dump PostgreSQL, volume n8n_data, compose.yaml, Caddyfile, dan .env yang berisi N8N_ENCRYPTION_KEY. Simpan cadangan di luar VPS dalam bentuk terenkripsi dan verifikasi dengan memulihkannya.