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 enableJangan 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 .envN8N_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 env yang menentukan apakah webhook berfungsi
Empat variabel mengatur cara n8n memperkenalkan dirinya ke dunia luar. Kesalahan pada variabel-variabel ini merupakan pertanyaan dukungan n8n yang paling sering muncul.
N8N_HOSTadalah hostname publik,n8n.example.com. Jika dibiarkan pada nilai defaultlocalhostdi belakang proxy, editor akan mencoba memuat API-nya sendiri darilocalhostdi browser Anda. Upaya ini gagal.N8N_PROTOCOL=httpsmemberi tahu n8n bahwa layanan diakses melalui TLS. Dengan demikian, n8n menandai cookie sesi denganSecuredan membuat URLhttps://.N8N_PORT=5678adalah port tempat n8n melakukan listening di dalam container. Port ini bukan port publik. Proxy menggunakan port 443.WEBHOOK_URL=https://n8n.example.com/adalah variabel yang paling sering menyebabkan masalah. n8n mencetak alamat webhook yang Anda masukkan ke Stripe, GitHub, atau pemanggil eksternal lainnya dengan membangunnya dari nilai-nilai ini. Jika variabel ini tidak ditetapkan atau nilainya salah, n8n menggunakanN8N_HOST:N8N_PORTdan memberikanhttps://n8n.example.com:5678/webhook/...atau, yang lebih buruk,http://localhost:5678/webhook/.... Alamat tersebut dicetak tanpa error, terlihat masuk akal, tetapi tidak dapat dijangkau dari Internet. Akibatnya, request dari pemanggil tidak pernah sampai dan tidak menampilkan error. Tetapkan variabel ini ke URL dasar publik yang tepat, termasuk garis miring di akhir. Setelah itu, pastikan node webhook menampilkan URL tanpa port.
N8N_PROXY_HOPS=1 memberi tahu server Express milik n8n untuk mempercayai satu proxy di depannya. Dengan demikian, rate limiting dan fitur apa pun yang membaca IP client akan melihat alamat sebenarnya, bukan alamat proxy. Ada satu variabel yang sengaja tidak Anda tetapkan di sini, yaitu N8N_RUNNERS_ENABLED. Task runner, yaitu n8n yang menjalankan logika Code node dalam proses terpisah dan terisolasi, telah menjadi default sejak 1.69 dan wajib digunakan mulai lini 2.x yang ditetapkan dalam panduan ini. Oleh karena itu, opsi lama tersebut sudah deprecated. Jika Anda menetapkannya sekarang, n8n hanya mencatat pemberitahuan yang meminta Anda menghapusnya.
Mulai pertama
docker compose up -d
docker compose ps
docker compose logs -f n8nBoot 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 seluruh jalur berfungsi: webhook masuk, panggilan HTTP, lalu respons keluar.
- Tambahkan node Webhook. Atur metodenya ke
POSTdan path sepertihello. Node ini menampilkan dua URL, yaitu Test URL dan Production URL, yang sering menjadi penyebab 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 merespons setiap kali alur kerja berstatus Active. - Tambahkan node HTTP Request setelahnya, lalu arahkan ke API JSON publik mana pun. Permintaan GET ke
https://api.github.com/zenmengembalikan string satu baris, dan itu sudah cukup. - Tambahkan node Respond to Webhook, lalu atur opsi Respond pada node Webhook ke "Using Respond to Webhook node" agar pemanggil menerima kembali output dari node HTTP.
- Aktifkan alur kerja dengan mengubah statusnya menjadi Active (kanan atas), lalu panggil URL tersebut:
curl -X POST https://n8n.example.com/webhook/hello. Anda seharusnya menerima kembali baris zen tersebut. Data masuk melalui POST, API dipanggil, lalu respons keluar. Inilah bentuk dasar sebagian besar otomatisasi nyata.
Untuk varian terjadwal, ganti node Webhook dengan Schedule Trigger dan panggil endpoint model. Model yang di-host sendiri melalui Ollama yang berjalan pada VPS yang sama merupakan cara praktis untuk membuat peringkas yang berjalan setiap malam.
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.gzJalankan 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: kunci 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 memasang build yang memigrasikan database segera setelah dimulai. Kunci versinya, baca catatan rilis sebelum menaikkan versi, karena n8n mencantumkan perubahan yang menyebabkan ketidakcocokan 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 n8nLompatan versi mayor adalah kondisi yang paling memerlukan langkah ini. Misalnya, lini 2.0 mengubah default N8N_BLOCK_ENV_ACCESS_IN_NODE menjadi true. Akibatnya, setiap Code node yang membaca process.env akan kehilangan akses secara diam-diam sampai Anda mengembalikannya ke false. Rilis yang sama juga mulai menerapkan izin ketat pada file settings. Baca halaman perubahan yang menyebabkan ketidakcocokan pada 2.0 sebelum melewati batas versi mayor. n8n menjalankan migrasi database yang diperlukan secara otomatis saat start. Itulah alasan pg_dump sebelum upgrade tidak boleh dilewati. Karena kredensial disimpan dalam bentuk terenkripsi menggunakan key di .env, sedangkan data disimpan di Postgres, container dapat diperlakukan sebagai disposable. Lakukan upgrade dengan menggantinya, dan lakukan rollback dengan mengunci tag sebelumnya lalu memulihkan dump.
Mode kegagalan dan teks yang akan Anda lihat
The requested webhook "POST hello" is not registered. 404 muncul saat memanggil webhook yang alur kerjanya tidak Active, atau saat memanggil path pengujian ketika tidak ada proses yang sedang mendengarkan. Path pengujian (/webhook-test/...) hanya merespons setelah Anda mengeklik "Listen for test event"; path produksi (/webhook/...) hanya merespons saat toggle alur kerja aktif. Kode terkait 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 disetel atau nilainya salah, sehingga n8n membuat alamat dari N8N_HOST:N8N_PORT, bukan dari base publik Anda. Setel 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 yang tidak meneruskan header WebSocket Upgrade, atau N8N_PROTOCOL yang 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 dimulai ulang. Password yang dikirim n8n tidak cocok dengan password yang digunakan saat database diinisialisasi. Perangkapnya: Postgres hanya membaca POSTGRES_PASSWORD saat menginisialisasi direktori data yang kosong. Jalankan stack sekali, lalu ubah POSTGRES_PASSWORD di .env; volume postgres_data yang sudah ada tetap menyimpan password lama. Kembalikan nilainya ke password awal, atau, jika tidak ada data yang perlu dipertahankan, docker compose down dan docker volume rm volume postgres, lalu jalankan ulang dari awal.
EACCES: permission denied, open '/home/node/.n8n/config' saat mulai. n8n berjalan sebagai user node (UID 1000) dan tidak dapat menulis ke direktori konfigurasinya. Masalah ini sering terjadi jika 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.. Mulai lini 2.x, n8n secara default memberlakukan 0600 pada file pengaturan tersebut dan memperbaikinya sendiri saat boot. Baris log ini berarti n8n sudah memperbaiki mode tersebut, biasanya setelah bind mount atau setelah proses pemulihan menyalin kembali file dengan permission yang terlalu longgar. Tidak ada tindakan yang diperlukan; setel 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 yang paling sering adalah n8n membuat key acak saat boot sebelumnya ketika variabel tersebut belum disetel, kemudian Anda menetapkan key yang berbeda. Kembalikan key awal di .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 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 menyetel N8N_PROTOCOL=https, tetapi mengakses n8n melalui HTTP biasa, biasanya dengan mengakses IP dan port secara langsung, bukan melalui proxy HTTPS. Akses n8n melalui https://n8n.example.com/. Hanya jika Anda benar-benar tidak dapat menggunakan HTTPS, setel N8N_SECURE_COOKIE=false, dan jangan pernah melakukannya pada server yang menghadap Internet.
Untuk menempatkan language model di dalam alur kerja tersebut, lihat membangun alur kerja 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 hal apa pun yang Anda andalkan: single writer lock pada SQLite menimbulkan database is locked saat terjadi konkurensi, sedangkan Postgres dapat dicadangkan dengan baik menggunakan pg_dump. Migrasi setelahnya harus dilakukan secara manual. Jika server ini penting, gunakan Postgres sejak awal.
Mengapa webhook n8n saya tidak pernah terpicu?
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 pemanggilan webhook pada workflow yang belum diaktifkan, yang mengembalikan The requested webhook ... is not registered.
Apa yang harus saya cadangkan di n8n?
Ada dua hal. Pertama, N8N_ENCRYPTION_KEY dari file .env Anda. Setiap kredensial yang tersimpan dienkripsi dengan kunci tersebut. Jika kunci hilang, kredensial itu tidak dapat didekripsi secara permanen. Salin kunci tersebut ke luar server pada hari saat 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 menyajikan 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, lalu gunakan Traefik dengan sertifikat otomatis atau nginx dengan sertifikat Let's Encrypt. Atur N8N_PROTOCOL=https dan WEBHOOK_URL=https://your-host/, serta pastikan proxy meneruskan header Upgrade WebSocket. Jika tidak, editor akan berhenti merespons.
Bagaimana cara melakukan upgrade 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 inkompatibilitas, lalu perbarui tag dan jalankan docker compose pull n8n && docker compose up -d n8n. Container bersifat disposable. Untuk rollback, tetapkan tag sebelumnya dan pulihkan dump sebelum upgrade.