SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor

Cara Self-Host n8n di VPS dengan Docker dan HTTPS

Panduan n8n di VPS dengan Docker Compose, Postgres, dan reverse proxy HTTPS. Hindari jebakan WEBHOOK_URL dan encryption key, lengkap dengan semua pesan error.

Yang Anda bangun

n8n adalah alat otomasi workflow: editor visual tempat sebuah trigger, webhook, schedule, atau pengiriman formulir memicu rangkaian node yang memanggil API, mengubah struktur data, dan menulisnya ke sistem lain. n8n telah menjadi glue standar untuk workflow agen AI karena dapat berkomunikasi dengan setiap penyedia model dan database tanpa mengharuskan Anda menulis service. Satu docker run menghasilkan editor yang dapat digunakan dalam dua menit. Panduan ini membahas sembilan puluh persen sisanya: membuatnya tahan terhadap gangguan dengan Postgres, bukan file SQLite bawaan; membuatnya dapat diakses melalui HTTPS; serta, bagian yang paling sering salah, membuat webhook memberikan URL yang benar-benar dapat dijangkau dari luar.

Stack akhir ini terdiri atas dua container dalam satu jaringan Docker: n8n itu sendiri dan database Postgres yang menyimpan workflow serta kredensialnya. Reverse proxy pada host menangani TLS termination dan meneruskan koneksi ke n8n melalui localhost, sehingga tidak ada yang menghadap Internet selain proxy tersebut. Stack ini berjalan berdampingan dengan service lain dalam daftar singkat self-hosting 2026.

Prasyarat dan batasan yang perlu diketahui

Anda memerlukan VPS dengan RAM minimal 1 GB. Siapkan 2 GB setelah workflow mulai menjalankan tugas nyata karena execution dan runtime Node.js menggunakan memori. Jika out-of-memory killer menghentikan container di tengah proses, Anda akan mengetahui kekurangan RAM dengan cara yang buruk. Satu vCPU sudah cukup untuk memulai.

Jika server ini juga akan menjalankan layanan yang lebih berat, tentukan ukurannya berdasarkan kebutuhan layanan tersebut terlebih dahulu. Photo library biasanya menjadi penyebab utama. Kebutuhan RAM nyata PhotoPrism dan Immich jauh lebih besar daripada kebutuhan n8n.

Hal yang sama berlaku untuk media box. Server Jellyfin beserta front end yang dapat digunakan untuk menelusurinya, seperti Halcyon, yang membangun ulang library seperti toko penyewaan pada era 90-an, akan menggunakan RAM dan kapasitas transcoding jauh sebelum n8n menyadarinya.

Anda memerlukan domain atau subdomain, misalnya n8n.example.com, dengan A record yang mengarah ke IP publik VPS dan sudah dapat di-resolve sebelum Anda meminta sertifikat. Port 80 dan 443 harus terbuka untuk proxy. Port milik n8n, yaitu 5678, tidak boleh menghadap ke Internet. Anda juga memerlukan Docker Engine dan plugin Compose. Jika docker compose version menghasilkan error docker: 'compose' is not a docker command, berarti Anda menggunakan binary standalone versi lama, sedangkan plugin menggunakan sudo apt install docker-compose-plugin.

SQLite cukup untuk pengujian, sedangkan Postgres diperlukan untuk apa pun yang Anda andalkan

Database default n8n adalah file SQLite di /home/node/.n8n/database.sqlite. Untuk uji coba, SQLite sudah memadai. Namun, jika Anda tidak memasang volume, database tersebut akan hilang saat container dibuat ulang untuk pertama kali. Ini juga menjadi pelajaran tersendiri. Alasan beralih ke Postgres bukan kecepatan mentah. SQLite hanya mengizinkan satu writer lock. Akibatnya, instance yang menjalankan beberapa workflow sekaligus, atau queue mode yang pada akhirnya mungkin Anda perlukan, akan menghasilkan SQLITE_BUSY: database is locked saat terjadi konkurensi. Postgres tidak memiliki batasan tersebut. Database ini juga dapat dicadangkan dengan baik menggunakan pg_dump dan menjadi database yang diasumsikan dalam dokumentasi n8n untuk server yang Anda andalkan. Jika beralih kemudian, Anda harus memigrasikan data secara manual. Jadi, jika server ini penting, gunakan Postgres sejak awal.

DNS dan firewall

Arahkan record dan buka port terlebih dahulu agar langkah penerbitan sertifikat berikutnya tidak gagal karena nama tersebut belum dapat di-resolve.

dig +short n8n.example.com
curl -s ifconfig.me
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow OpenSSH
sudo ufw enable

Jangan buka port 5678. File compose mengikat n8n ke 127.0.0.1:5678 sehingga hanya reverse proxy pada host yang dapat menjangkaunya, dan ufw allow 5678 akan menghilangkan isolasi tersebut.

File Compose

Buat direktori kerja dan docker-compose.yml. Inilah seluruh stack: dua service, satu jaringan privat, dan dua volume bernama.

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

  n8n:
    image: docker.n8n.io/n8nio/n8n:2.29.10
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_HOST=n8n.example.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.example.com/
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_PROXY_HOPS=1
      - GENERIC_TIMEZONE=Europe/London
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - n8n_data:/home/node/.n8n
    networks:
      - n8n_net
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  postgres_data:
  n8n_data:

networks:
  n8n_net:

Beberapa keputusan perlu dijelaskan secara langsung. DB_POSTGRESDB_HOST=postgres adalah nama service yang digunakan Docker untuk resolusi pada jaringan bersama, bukan localhost, yang di dalam container n8n berarti n8n itu sendiri. depends_on dengan condition: service_healthy mencegah n8n berpacu dengan Postgres saat boot. Tanpanya, n8n akan start, tidak menemukan database, lalu berhenti. Volume bernama n8n_data pada /home/node/.n8n menyimpan encryption key dan, pada SQLite, database. Ini adalah satu-satunya direktori yang tidak boleh hilang. Tetapkan image ke versi yang persis, jangan pernah latest. Alasannya dijelaskan pada bagian upgrade di bawah.

File rahasia

Jangan pernah menaruh kata sandi dalam file compose. Simpan kata sandi dalam file .env di sebelahnya agar Compose membacanya secara otomatis, lalu buat kata sandi tersebut sehingga benar-benar acak.

printf 'POSTGRES_PASSWORD=%s\n'  "$(openssl rand -hex 24)" >  .env
printf 'N8N_ENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" >> .env
chmod 600 .env

N8N_ENCRYPTION_KEY adalah string terpenting di sini. String ini merupakan kunci yang digunakan untuk mengenkripsi setiap kredensial tersimpan. Tetapkan kunci ini secara eksplisit, bukan membiarkan n8n membuatnya, karena nilai yang Anda buat sendiri dapat dicatat dan dipulihkan. Setelah n8n mengenkripsi kredensial pertamanya dengan kunci ini, mengubahnya membuat semua kredensial tidak dapat didekripsi. Tetapkan kunci ini sekarang, lalu jangan pernah mengubah baris tersebut lagi.

Variabel lingkungan yang menentukan apakah webhook berfungsi

Empat variabel mengatur cara n8n memperkenalkan dirinya ke dunia luar. Kesalahan dalam mengaturnya merupakan pertanyaan dukungan n8n yang paling sering diajukan.

  • N8N_HOST adalah hostname publik, yaitu n8n.example.com. Jika dibiarkan pada nilai default localhost di belakang proxy, editor akan mencoba memuat API-nya sendiri dari localhost di browser Anda, sehingga gagal.
  • N8N_PROTOCOL=https memberi tahu n8n bahwa layanan diakses melalui TLS. Dengan demikian, n8n menandai cookie sesi sebagai Secure dan membuat URL https://.
  • N8N_PORT=5678 adalah port tempat n8n mendengarkan di dalam container. Port ini bukan port publik. Proxy yang menggunakan port 443.
  • WEBHOOK_URL=https://n8n.example.com/ adalah variabel yang paling sering menimbulkan masalah. n8n mencetak alamat webhook yang Anda masukkan ke Stripe, GitHub, atau pemanggil eksternal lainnya dengan membangunnya dari nilai-nilai ini. Jika tidak diatur atau nilainya salah, n8n menggunakan N8N_HOST:N8N_PORT sebagai fallback dan memberikan https://n8n.example.com:5678/webhook/... atau, yang lebih buruk, http://localhost:5678/webhook/.... Nilai tersebut dicetak tanpa error, terlihat masuk akal, tetapi tidak dapat dijangkau dari Internet. Akibatnya, permintaan dari pemanggil tidak pernah sampai dan tidak ada indikasi yang jelas. Atur variabel ini ke base URL publik yang tepat, termasuk garis miring di akhir. Kemudian, pastikan node webhook menampilkan URL tanpa port.

N8N_PROXY_HOPS=1 memberi tahu server Express milik n8n untuk mempercayai satu proxy di depannya. Dengan begitu, pembatasan laju dan fitur apa pun yang membaca IP klien akan melihat alamat sebenarnya, bukan alamat proxy. Salah satu variabel yang sengaja tidak Anda atur di sini adalah N8N_RUNNERS_ENABLED. Task runner adalah mekanisme yang menjalankan logika Code node n8n dalam proses terpisah yang diisolasi dari proses utama. Mekanisme ini bersifat opt-in sepanjang lini 1.x. Saat itu, nilai default variabel tersebut adalah false dan Anda harus mengaturnya ke true. n8n 2.0 mengaktifkannya secara default. Karena itu, pada lini 2.x panduan ini menetapkan bahwa variabel tersebut sudah deprecated, dan dokumentasi n8n menyatakan bahwa Anda tidak perlu lagi mengaturnya.

Mulai pertama

docker compose up -d
docker compose ps
docker compose logs -f n8n

Boot pertama yang sehat berakhir dengan baris Editor is now accessible via:, dengan baris n8n ready on ..., port 5678 di atasnya. docker compose ps harus menampilkan kedua container Up, dengan postgres ditandai sebagai (healthy). Jika n8n terus berada dalam loop Restarting, baca log karena penyebabnya hampir selalu koneksi database atau izin volume yang dibahas di bawah ini.

TLS dengan reverse proxy

n8n sendiri menggunakan HTTP biasa pada port 5678; komponen di depannya menangani terminasi HTTPS. Ada dua pilihan yang rapi.

Jika Anda sudah menjalankan beberapa container, tempatkan n8n di belakang reverse proxy Traefik yang menerbitkan sertifikat TLS secara otomatis dengan beberapa label. Traefik akan meminta dan memperbarui sertifikat untuk Anda.

Jika ini satu-satunya aplikasi pada server, virtual host nginx dengan sertifikat Let's Encrypt lebih sederhana. Gunakan konfigurasi TLS Certbot dan nginx untuk Ubuntu 24.04 untuk memperoleh sertifikat, lalu gunakan server block berikut:

server {
    listen 443 ssl;
    server_name n8n.example.com;

    ssl_certificate     /etc/letsencrypt/live/n8n.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.example.com/privkey.pem;

    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-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600;
        client_max_body_size 16m;
    }
}

Header Upgrade dan Connection "upgrade" wajib ada. n8n mengirim pembaruan eksekusi secara langsung ke editor melalui WebSocket. Tanpa kedua baris tersebut, halaman login akan dimuat lalu berhenti dengan banner koneksi terputus. proxy_read_timeout 3600 mencegah eksekusi yang berjalan lama dihentikan oleh batas waktu default nginx, yaitu 60 detik. Header X-Forwarded-Proto $scheme melengkapi N8N_PROXY_HOPS=1: header ini memberi tahu n8n bahwa permintaan asli menggunakan HTTPS meskipun proxy mengaksesnya melalui HTTP biasa. Dengan demikian, n8n tidak menganggap koneksi tersebut tidak aman lalu menolak cookie miliknya sendiri.

Alur kerja pertama Anda agar dapat digunakan

Buka https://n8n.example.com/, buat akun pemilik (bagian berikutnya), lalu buat alur kerja paling sederhana untuk membuktikan bahwa jalurnya berfungsi: webhook masuk, panggilan HTTP, lalu respons keluar.

  1. Tambahkan node Webhook. Atur metodenya ke POST dan path seperti hello. Node ini menampilkan dua URL, yaitu Test URL dan Production URL. Hal ini menjadi sumber banyak laporan "webhook saya tidak berfungsi". Test URL hanya merespons satu panggilan dan hanya saat Anda telah mengeklik Listen for test event. Setelah itu, URL tersebut kedaluwarsa. Production URL didaftarkan saat Anda publish alur kerja dan akan terus merespons setelahnya.
  2. Tambahkan node HTTP Request setelahnya. Arahkan node ini ke API JSON publik mana pun. Permintaan GET ke https://api.github.com/zen mengembalikan string satu baris, dan itu sudah cukup.
  3. Tambahkan node Respond to Webhook. Atur opsi Respond pada node Webhook ke "Using Respond to Webhook node" agar pemanggil menerima kembali output dari node HTTP.
  4. Klik Publish (di kanan atas), lalu panggil URL tersebut: curl -X POST https://n8n.example.com/webhook/hello. Anda seharusnya menerima kembali baris zen tersebut: POST masuk, panggilan API, lalu respons keluar. Inilah struktur sebagian besar otomatisasi nyata. Panduan lama menyarankan Anda mengaktifkan toggle Active di sini. n8n 2.0 mengganti toggle tersebut dengan Publish dan Unpublish.

Varian terjadwal mengganti node Webhook dengan Schedule Trigger dan memanggil endpoint model. Varian yang di-host sendiri dari Ollama yang berjalan pada VPS yang sama merupakan cara praktis untuk membuat peringkas malam hari.

Manajemen pengguna, bukan basic auth

Panduan n8n lama meminta Anda mengatur N8N_BASIC_AUTH_ACTIVE=true. Variabel tersebut telah dihapus pada n8n 1.0 dan sekarang tidak berfungsi. Autentikasi saat ini menggunakan akun owner: saat pertama kali membuka editor, n8n meminta Anda membuat owner dengan email dan password, dan mekanisme ini wajib digunakan karena tidak ada mode anonim. Buat akun tersebut segera setelah boot pertama, sebelum memberikan URL kepada siapa pun: antara docker compose up dan pengiriman formulir pertama, instance dapat diklaim oleh siapa saja yang lebih dahulu mengaksesnya. Lapisan basic-auth pada reverse proxy dapat digunakan sebagai perlindungan tambahan, tetapi itu merupakan faktor kedua, bukan autentikasi utama. Akun owner dan seluruh fitur lain dalam panduan ini tersedia pada edisi komunitas gratis; jika nanti Anda memerlukan pengguna tambahan dengan peran terperinci atau SSO, bacalah fitur n8n yang memerlukan lisensi berbayar sebelum menjadikannya bagian dari rencana Anda.

Cadangan: kunci enkripsi terlebih dahulu, kemudian database

Ada dua hal yang perlu dicadangkan, dan keduanya tidak dapat digantikan dengan tingkat kemudahan yang sama.

N8N_ENCRYPTION_KEY. Setiap kredensial yang Anda simpan di n8n—token API, password database, secret OAuth—dienkripsi saat tersimpan menggunakan kunci ini. Workflow di Postgres tidak berguna tanpanya: jika Anda memulihkan database ke server baru dengan kunci yang berbeda, n8n tidak dapat mendekripsi satu pun kredensial. Tidak ada pemulihan atau pengaturan ulang. File .env berisi kunci tersebut. Salin file itu ke lokasi di luar server pada hari Anda membuatnya. Entri di password manager adalah pilihan yang ideal. Inilah cadangan yang paling penting.

Database Postgres, untuk workflow, riwayat eksekusi, dan kredensial yang telah dienkripsi:

docker compose exec -T postgres pg_dump -U n8n -d n8n \
  | gzip > n8n-db-$(date +%F).sql.gz

Jalankan perintah tersebut secara terjadwal dan salin dump ke luar server. Untuk memulihkannya pada VPS baru, jalankan stack satu kali agar database dibuat, hentikan n8n, muat kembali dump dengan psql, masukkan N8N_ENCRYPTION_KEY yang sama ke dalam .env, lalu jalankan n8n. Kunci yang sama ditambah dump menghasilkan instance yang berfungsi. Kunci baru menghasilkan workflow yang tidak dapat menggunakan satu pun kredensial.

Upgrade: pin tag

File compose sengaja mengunci n8nio/n8n:2.29.10, bukan latest. n8n merilis versi minor baru hampir setiap minggu dan sesekali mengubah skema database atau perilaku node di antara versi tersebut. Karena itu, latest berarti pull tanpa pengawasan dapat memberikan build yang memigrasikan database saat pertama kali dijalankan. Kunci versinya, baca catatan rilis sebelum menaikkan versi, karena n8n mencantumkan perubahan yang menyebabkan inkompatibilitas di sana, lalu lakukan upgrade secara terencana:

docker compose exec -T postgres pg_dump -U n8n -d n8n | gzip > pre-upgrade.sql.gz
# edit the image tag in docker-compose.yml, then:
docker compose pull n8n
docker compose up -d n8n
docker compose logs -f n8n

Perubahan versi mayor paling membutuhkan perhatian dalam hal ini. Misalnya, lini 2.0 mengubah default N8N_BLOCK_ENV_ACCESS_IN_NODE menjadi true. Akibatnya, Code node yang membaca process.env akan kehilangan akses secara diam-diam sampai Anda mengubahnya kembali ke false. Rilis yang sama juga mulai menerapkan permission ketat pada file settings, mengaktifkan task runner secara default, dan mengganti toggle Activate workflow dengan Publish. Baca halaman perubahan inkompatibel pada versi 2.0 sebelum berpindah melintasi batas versi mayor. n8n menjalankan migrasi database yang diperlukan secara otomatis saat start. Justru karena itu, pg_dump sebelum upgrade tidak boleh dilewati. Karena kredensial disimpan dalam bentuk terenkripsi menggunakan key di .env dan data disimpan di Postgres, container dapat dibuang dan dibuat ulang. Anda melakukan upgrade dengan menggantinya, lalu melakukan rollback dengan mengunci tag sebelumnya dan memulihkan dump.

Mode kegagalan dan string yang akan Anda lihat

The requested webhook "POST hello" is not registered. 404 dari pemanggilan webhook yang workflow-nya belum dipublikasikan, atau dari pemanggilan path pengujian saat tidak ada proses yang listening. Path pengujian (/webhook-test/...) hanya merespons selama Anda mengeklik "Listen for test event"; path produksi (/webhook/...) hanya merespons setelah workflow dipublikasikan. Kode saudaranya, This webhook is not registered for GET requests. Did you mean to make a POST request?, berarti metodenya salah: node mengharapkan POST, tetapi Anda mengirim GET.

URL webhook menampilkan :5678 atau localhost. Node menampilkan https://n8n.example.com:5678/webhook/... atau http://localhost:5678/.... WEBHOOK_URL belum diatur atau nilainya salah, sehingga n8n membuat alamat dari N8N_HOST:N8N_PORT, bukan dari base publik Anda. Atur WEBHOOK_URL=https://n8n.example.com/, buat ulang container dengan docker compose up -d, lalu port tersebut tidak lagi muncul.

There was a problem loading init data di browser. Editor berhasil dimuat, tetapi tidak dapat menjangkau API backend-nya sendiri. Di balik proxy, penyebabnya hampir selalu N8N_HOST atau WEBHOOK_URL yang salah, proxy tidak meneruskan header WebSocket Upgrade, atau N8N_PROTOCOL tidak sesuai dengan cara Anda terhubung. Pastikan keempat variabel yang menghadap publik sudah benar dan proxy meneruskan Upgrade serta Connection.

password authentication failed for user "n8n" di log, dan container terus melakukan restart. Password yang dikirim n8n tidak cocok dengan password yang digunakan saat database diinisialisasi. Hal yang sering terlewat: Postgres hanya membaca POSTGRES_PASSWORD saat menginisialisasi direktori data yang kosong. Jalankan stack satu kali, lalu ubah POSTGRES_PASSWORD di .env; volume postgres_data yang sudah ada tetap menyimpan password lama. Kembalikan nilainya ke password asli, atau, jika tidak ada data yang perlu disimpan, docker compose down dan docker volume rm volume postgres, lalu jalankan kembali dari awal.

EACCES: permission denied, open '/home/node/.n8n/config' saat start. n8n berjalan sebagai user node (UID 1000) dan tidak dapat menulis ke direktori konfigurasinya. Masalah ini sering terjadi saat Anda melakukan bind-mount folder host (./n8n_data:/home/node/.n8n) yang dimiliki root. Gunakan named volume yang ditunjukkan di atas, atau jika tetap ingin menggunakan bind mount, jalankan sudo chown -R 1000:1000 ./n8n_data terlebih dahulu.

Permissions 0644 for n8n settings file /home/node/.n8n/config are too wide. Changing permissions to 0600.. Sejak lini 2.x, n8n secara default menerapkan 0600 pada file pengaturan tersebut dan memperbaikinya sendiri saat boot. Baris log ini berarti mode file sudah diperbaiki, biasanya setelah bind mount atau setelah proses restore menyalin kembali file dengan permission yang terlalu longgar. Tidak ada tindakan yang diperlukan; atur N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false hanya jika filesystem Anda benar-benar tidak mendukung permission.

Mismatching encryption keys, baris lengkapnya menyatakan bahwa encryption key dalam file pengaturan /home/node/.n8n/config tidak cocok dengan N8N_ENCRYPTION_KEY di environment Anda. Key di environment Anda berbeda dari key yang ditulis n8n ke volume datanya pada proses sebelumnya. Penyebab paling umum adalah n8n membuat key acak saat boot sebelumnya karena variabel tersebut belum diatur, lalu Anda menetapkan key yang berbeda. Kembalikan key asli ke .env, atau, hanya jika Anda benar-benar tidak memiliki kredensial tersimpan yang perlu dipertahankan, hapus file config di dalam volume n8n_data dan biarkan n8n membuatnya kembali. Kredensial yang sudah ada akan menjadi tidak dapat dibaca.

Banner login tentang secure cookies: Your n8n server is configured to use a secure cookie, however you are either visiting this via an insecure URL, or using Safari. Anda menetapkan N8N_PROTOCOL=https, tetapi mengakses n8n melalui HTTP biasa, biasanya dengan langsung membuka IP dan port, bukan melalui proxy HTTPS. Akses melalui https://n8n.example.com/. Hanya jika Anda benar-benar tidak dapat menggunakan HTTPS, tetapkan N8N_SECURE_COOKIE=false, dan jangan pernah melakukannya pada server yang menghadap Internet.

Untuk menempatkan model bahasa ke dalam workflow tersebut, lihat membangun workflow AI dengan Claude dan n8n.

FAQ

Apakah saya harus menggunakan SQLite atau Postgres untuk n8n?

SQLite (default) cukup untuk mencoba n8n dan untuk instance pribadi yang menjalankan satu workflow pada satu waktu. Gunakan Postgres untuk apa pun yang Anda andalkan: kunci penulis tunggal SQLite menimbulkan database is locked saat terjadi konkurensi, sedangkan Postgres dapat dicadangkan dengan baik menggunakan pg_dump. Migrasi di kemudian hari harus dilakukan secara manual. Jika server tersebut penting, gunakan Postgres sejak awal.

Mengapa webhook n8n saya tidak pernah aktif?

Hampir selalu karena WEBHOOK_URL. Jika tidak diatur atau nilainya salah, n8n mencetak alamat webhook yang dibentuk dari N8N_HOST:N8N_PORT, sering kali berisi :5678 atau localhost. Alamat tersebut tampak valid, tetapi tidak dapat dijangkau dari Internet. Akibatnya, permintaan dari pemanggil tidak pernah sampai. Atur WEBHOOK_URL=https://n8n.example.com/ dan pastikan node menampilkan URL tanpa port. Penyebab kedua adalah memanggil URL produksi dari workflow yang belum Anda publikasikan. Kondisi ini mengembalikan The requested webhook ... is not registered.

Apa saja yang harus saya cadangkan di n8n?

Ada dua hal. Pertama, N8N_ENCRYPTION_KEY dari file .env Anda. Setiap kredensial tersimpan dienkripsi dengan kunci tersebut. Jika kunci hilang, kredensial itu tidak dapat didekripsi secara permanen. Salin kunci tersebut ke luar server pada hari Anda membuatnya. Kedua, buat pg_dump database Postgres untuk workflow, riwayat, dan kredensial. Pemulihan memerlukan keduanya: kunci yang sama dan dump tersebut.

Bagaimana cara menjalankan n8n di balik HTTPS?

n8n menyediakan HTTP biasa pada port 5678. Reverse proxy di depannya menangani terminasi TLS. Bind n8n ke 127.0.0.1:5678 agar hanya proxy yang dapat menjangkaunya. Kemudian, gunakan Traefik dengan sertifikat otomatis atau nginx dengan sertifikat Let's Encrypt. Atur N8N_PROTOCOL=https dan WEBHOOK_URL=https://your-host/. Pastikan proxy meneruskan header Upgrade WebSocket. Jika tidak, editor akan berhenti berfungsi.

Bagaimana cara memutakhirkan n8n dengan aman?

Tetapkan tag image tertentu, bukan latest. Buat pg_dump terlebih dahulu karena n8n menjalankan migrasi secara otomatis saat start. Baca catatan rilis untuk mengetahui perubahan yang dapat menyebabkan ketidakcocokan. Kemudian, ubah tag dan jalankan docker compose pull n8n && docker compose up -d n8n. Container dapat dibuat ulang, sehingga Anda dapat melakukan rollback dengan menetapkan tag sebelumnya dan memulihkan dump sebelum pemutakhiran.