Cara Self-host n8n di VPS pakai Docker
Panduan instalasi n8n dengan Docker Compose, Postgres, dan HTTPS. Pelajari cara mengatasi error WEBHOOK_URL dan masalah encryption-key agar sistem stabil.
Apa yang Anda bangun
n8n adalah alat otomatisasi alur kerja: sebuah editor visual di mana sebuah pemicu — webhook, jadwal, atau pengiriman formulir — menjalankan rangkaian node yang memanggil API, mengubah bentuk data, dan menulis ke sistem lain. n8n menjadi pilihan utama untuk alur kerja agen AI karena dapat terhubung ke setiap penyedia model dan database tanpa Anda perlu menulis layanan baru. Satu docker run akan mendapatkan editor yang berfungsi dalam dua menit. Panduan ini membahas sembilan puluh persen sisanya: membuat sistem menjadi tahan lama menggunakan Postgres alih-alih file SQLite bawaan, dapat diakses melalui HTTPS, dan — bagian yang hampir selalu salah dilakukan orang — membuat webhook memberikan URL yang dapat dijangkau oleh dunia luar.
Stack yang sudah jadi terdiri dari dua container dalam satu jaringan Docker: n8n itu sendiri, dan database Postgres yang menyimpan alur kerja serta kredensial. Sebuah reverse proxy pada host mengakhiri TLS dan meneruskan koneksi ke n8n di localhost, sehingga tidak ada yang menghadap internet kecuali melalui proxy tersebut. Layanan ini berada di samping layanan lainnya dalam daftar pendek self-hosting 2026.
Prasyarat, dan batasan yang nyata
Anda memerlukan VPS dengan RAM minimal 1 GB; siapkan 2 GB saat alur kerja mulai berjalan intensif. Proses eksekusi ditambah runtime Node.js mengonsumsi banyak memori. Jika out-of-memory killer menghentikan kontainer saat proses berjalan, hal ini akan menyulitkan Anda. Satu vCPU sudah cukup untuk memulai.
Anda memerlukan domain atau subdomain — misalnya n8n.example.com — dengan A record yang mengarah ke IP publik VPS yang sudah terkonfigurasi sebelum Anda meminta sertifikat. Port 80 dan 443 harus terbuka untuk proxy; port 5678 milik n8n tidak boleh terbuka ke internet. Anda memerlukan Docker Engine dan plugin Compose; jika docker compose version mengalami error dengan docker: 'compose' is not a docker command, berarti Anda menggunakan binary standalone lama, dan plugin tersebut adalah sudo apt install docker-compose-plugin.
SQLite memadai untuk pengujian, Postgres untuk kebutuhan produksi
Database default n8n adalah file SQLite di /home/node/.n8n/database.sqlite. Untuk sekadar uji coba, ini sudah cukup — jangan pasang volume agar data hilang saat kontainer dibuat ulang, yang merupakan pelajaran tersendiri. Alasan beralih ke Postgres bukan karena kecepatan murni; SQLite menggunakan single writer lock, sehingga instance yang menjalankan beberapa workflow secara bersamaan, atau mode queue yang akan Anda butuhkan nanti, akan memicu SQLITE_BUSY: database is locked saat terjadi konkurensi. Postgres tidak memiliki batasan tersebut, mendukung backup dengan bersih menggunakan pg_dump, dan merupakan standar yang diasumsikan oleh dokumentasi n8n untuk server produksi. Beralih di kemudian hari berarti melakukan migrasi data secara manual, jadi jika server ini penting, mulailah dengan Postgres.
DNS dan firewall
Arahkan record dan buka port terlebih dahulu. Hal ini dilakukan agar langkah sertifikat tidak gagal karena nama tidak dapat diresolusi.
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 host yang dapat menjangkaunya. Menggunakan ufw allow 5678 akan membatalkan isolasi tersebut.
File Compose
Buat direktori kerja dan sebuah docker-compose.yml. Ini adalah seluruh stack — dua layanan, satu jaringan privat, 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 dinyatakan secara jelas. DB_POSTGRESDB_HOST=postgres adalah nama layanan, yang diselesaikan Docker pada jaringan bersama — bukan localhost, yang di dalam kontainer n8n berarti n8n itu sendiri. depends_on dengan condition: service_healthy menghentikan n8n agar tidak mendahului Postgres saat booting; tanpa ini, n8n akan berjalan, tidak menemukan database, lalu keluar. Volume bernama n8n_data pada /home/node/.n8n menyimpan kunci enkripsi dan, pada SQLite, database — satu-satunya direktori yang tidak boleh hilang. Tetapkan citra ke versi eksak, jangan pernah gunakan latest; alasannya ada di bagian pembaruan di bawah.
File secrets
Jangan pernah memasukkan kata sandi ke dalam file compose. Masukkan kata sandi ke dalam file .env di sebelahnya agar Compose dapat membacanya secara otomatis, dan buatlah kata sandi tersebut secara 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 yang paling penting di sini — ini adalah kunci untuk mengenkripsi setiap kredensial yang disimpan. Tetapkan nilai ini secara eksplisit daripada membiarkan n8n membuatnya secara otomatis, karena nilai yang Anda buat sendiri dapat dicatat dan dipulihkan. Setelah n8n mengenkripsi kredensial pertamanya dengan kunci ini, mengubahnya akan membuat semua kredensial tidak dapat didekripsi — jadi tetapkan sekali sekarang, dan jangan pernah mengubah baris tersebut lagi.
Variabel env yang menentukan apakah webhook berfungsi
Empat variabel mengontrol cara n8n mendeskripsikan dirinya ke dunia luar. Kesalahan pada variabel ini adalah pertanyaan dukungan n8n yang paling umum.
N8N_HOSTadalah hostname publik,n8n.example.com. Biarkan tetap pada nilai defaultlocalhostjika menggunakan proxy. Jika tidak, editor akan mencoba memuat API miliknya sendiri darilocalhostdi browser Anda, yang akan menyebabkan kegagalan.N8N_PROTOCOL=httpsmemberi tahu n8n bahwa layanan berjalan melalui TLS, sehingga n8n menandai session cookieSecuredan membangun URLhttps://.N8N_PORT=5678adalah port tempat n8n mendengarkan di dalam container. Ini bukan port publik; port 443 dikelola oleh proxy.WEBHOOK_URL=https://n8n.example.com/adalah variabel yang paling krusial. n8n mencetak alamat webhook yang Anda tempelkan ke Stripe, GitHub, atau pemanggil eksternal lainnya dengan membangunnya dari nilai-nilai ini. Jika variabel ini tidak diatur atau salah, n8n akan menggunakanN8N_HOST:N8N_PORTdan memberikanhttps://n8n.example.com:5678/webhook/...atau, lebih buruk lagi,http://localhost:5678/webhook/...— yang dicetak tanpa error, terlihat masuk akal, namun tidak dapat dijangkau dari internet. Akibatnya, permintaan dari pemanggil tidak akan pernah sampai. Atur variabel ini ke base URL publik yang tepat dengan garis miring di akhir, lalu pastikan node webhook menampilkan URL tanpa port.
N8N_PROXY_HOPS=1 memberi tahu server Express n8n untuk mempercayai satu proxy di depannya. Dengan begitu, pembatasan laju (rate-limiting) dan fitur yang membaca IP klien akan melihat alamat asli, bukan alamat proxy. Satu variabel yang sengaja tidak perlu Anda atur di sini adalah N8N_RUNNERS_ENABLED: task runners — n8n yang menjalankan logika Code-node dalam proses sandbox terpisah — telah menjadi default sejak versi 1.69 dan bersifat wajib pada versi 2.x yang digunakan panduan ini, sehingga opsi lama sudah usang (deprecated). Jika Anda mengaturnya sekarang, n8n hanya akan mencatat pemberitahuan agar Anda menghapusnya.
First start
docker compose up -d
docker compose ps
docker compose logs -f n8nProses boot pertama yang berhasil akan diakhiri dengan baris Editor is now accessible via:, dengan baris n8n ready on ..., port 5678 di atasnya. docker compose ps harus menampilkan kedua kontainer Up, dengan postgres ditandai (healthy). Jika n8n terjebak dalam loop Restarting, periksa log — penyebabnya hampir selalu adalah koneksi database atau izin volume yang dijelaskan di bawah.
TLS dengan reverse proxy
n8n menggunakan protokol HTTP biasa pada port 5678; sebuah layanan di depannya bertugas melakukan terminasi HTTPS. Ada dua pilihan yang efisien.
Jika Anda sudah menjalankan beberapa container, letakkan 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 adalah satu-satunya aplikasi di server, menggunakan virtual host nginx dengan sertifikat Let's Encrypt lebih sederhana. Gunakan setup TLS Certbot dan nginx untuk Ubuntu 24.04 untuk mendapatkan 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" bersifat wajib. n8n mengirimkan pembaruan eksekusi secara langsung ke editor melalui WebSocket, dan tanpa dua baris tersebut, halaman login akan memuat lalu macet dengan spanduk "lost-connection". proxy_read_timeout 3600 mencegah eksekusi yang berjalan lama terputus pada batas default nginx yaitu 60 detik. Header X-Forwarded-Proto $scheme adalah pasangan dari N8N_PROXY_HOPS=1: header ini memberi tahu n8n bahwa permintaan asli menggunakan HTTPS meskipun proxy mengaksesnya melalui HTTP biasa, sehingga n8n tidak menganggap koneksi tidak aman dan menolak cookie miliknya sendiri.
Alur kerja pertama Anda untuk memulainya
Buka https://n8n.example.com/, buat akun pemilik (bagian berikutnya), dan buat alur kerja terkecil untuk membuktikan jalur tersebut berfungsi: input webhook, panggilan HTTP, dan output respons.
- Tambahkan node Webhook. Atur method ke
POSTdan path sepertihello. Akan muncul dua URL, yaitu Test URL dan Production URL — penyebab dari separuh laporan "webhook saya tidak berfungsi". Test URL hanya menanggapi satu panggilan dan hanya aktif saat Anda mengeklik Listen for test event; setelah itu, URL tersebut kedaluwarsa. Production URL menanggapi panggilan kapan pun alur kerja dalam status Active. - Tambahkan node HTTP Request setelahnya, arahkan ke API JSON publik apa pun — melakukan GET ke
https://api.github.com/zenakan mengembalikan string satu baris, yang sudah cukup. - Tambahkan node Respond to Webhook, lalu atur opsi Respond pada node Webhook ke "Using Respond to Webhook node" agar pemanggil menerima output dari node HTTP sebagai balasan.
- Aktifkan status Active pada alur kerja (kanan atas) dan lakukan panggilan ke:
curl -X POST https://n8n.example.com/webhook/hello. Anda seharusnya menerima kembali baris teks tersebut — input POST, panggilan API, dan output respons, yang merupakan pola dasar dari sebagian besar otomatisasi nyata.
Varian terjadwal mengganti node Webhook dengan Schedule Trigger dan memanggil endpoint model — menggunakan Ollama yang berjalan di VPS yang sama adalah cara yang efisien untuk membangun perangkum harian otomatis.
Manajemen pengguna, bukan basic auth
Panduan n8n versi lama menyarankan Anda untuk mengatur N8N_BASIC_AUTH_ACTIVE=true. Variabel tersebut telah dihapus pada n8n 1.0 dan tidak berfungsi lagi. Autentikasi saat ini menggunakan akun owner: saat pertama kali memuat editor, n8n mewajibkan Anda membuat owner dengan email-dan-password, dan gerbang tersebut bersifat wajib — tidak ada mode anonim. Buatlah akun tersebut segera setelah booting pertama, sebelum Anda memberikan URL kepada siapa pun: antara docker compose up dan pengiriman formulir pertama tersebut, instance dapat diambil alih oleh siapa pun yang mengaksesnya lebih dulu. Lapisan reverse-proxy basic-auth tambahan adalah pengaman ekstra yang wajar, tetapi itu adalah faktor kedua, bukan autentikasi yang sebenarnya.
Backups: kunci enkripsi terlebih dahulu, kemudian database
Ada dua hal yang perlu dicadangkan, dan keduanya tidak dapat digantikan dengan cara yang sama.
N8N_ENCRYPTION_KEY. Setiap kredensial yang Anda simpan di n8n — token API, kata sandi database, rahasia OAuth — dienkripsi saat istirahat menggunakan kunci ini. Workflow di Postgres tidak berguna tanpa kunci tersebut: jika Anda memulihkan database ke server baru dengan kunci yang berbeda, n8n tidak dapat mendekripsi satu kredensial pun, tanpa ada opsi pemulihan atau reset. File .env Anda menyimpan kunci tersebut; salin file tersebut ke luar server — menggunakan pengelola kata sandi adalah cara ideal — segera setelah Anda membuatnya. Ini adalah cadangan yang paling krusial.
Database Postgres, untuk workflow, riwayat eksekusi, dan kredensial terenkripsi itu sendiri:
docker compose exec -T postgres pg_dump -U n8n -d n8n \
| gzip > n8n-db-$(date +%F).sql.gzJalankan perintah tersebut secara terjadwal dan salin hasil dump ke luar server. Untuk pemulihan pada VPS baru: jalankan stack satu kali agar database terbentuk, hentikan n8n, muat kembali dump menggunakan psql, masukkan N8N_ENCRYPTION_KEY yang sama ke dalam .env, lalu jalankan n8n. Kunci yang sama ditambah dengan dump akan menghasilkan instance yang berfungsi; kunci yang baru akan menghasilkan workflow yang tidak dapat menggunakan satu kredensial pun.
Upgrades: pin the tag
File compose sengaja menggunakan n8nio/n8n:2.29.10 alih-alih latest. n8n merilis versi minor baru hampir setiap minggu dan terkadang mengubah skema database atau perilaku node di antaranya. Oleh karena itu, latest berarti proses pull otomatis dapat memberikan build yang langsung melakukan migrasi database saat dijalankan. Gunakan versi spesifik, baca release notes sebelum melakukan pembaruan — n8n mencantumkan perubahan yang merusak (breaking changes) di sana — dan lakukan upgrade secara sengaja:
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 di mana hal ini paling krusial. Sebagai contoh, lini 2.0 mengubah N8N_BLOCK_ENV_ACCESS_IN_NODE menjadi true secara default, sehingga node Code yang membaca process.env akan kehilangan akses secara diam-diam hingga Anda mengaturnya kembali ke false; rilis yang sama juga mulai menerapkan izin ketat pada file settings. Baca halaman breaking-changes 2.0 sebelum melewati batas versi mayor. n8n menjalankan migrasi database yang diperlukan secara otomatis saat startup — itulah alasan mengapa pg_dump sebelum upgrade bersifat wajib. Karena kredensial disimpan terenkripsi dengan kunci di .env dan data disimpan di Postgres, container bersifat disposable: Anda melakukan upgrade dengan menggantinya, dan melakukan rollback dengan menggunakan tag sebelumnya serta memulihkan dump.
Mode kegagalan, dengan string yang akan Anda lihat
The requested webhook "POST hello" is not registered. Error 404 terjadi saat memanggil webhook yang workflow-nya tidak Active, atau saat memanggil jalur test ketika tidak ada yang mendengarkan. Jalur test (/webhook-test/...) hanya merespons jika Anda telah mengeklik "Listen for test event"; jalur produksi (/webhook/...) hanya merespons jika toggle workflow dalam posisi on. Sibling This webhook is not registered for GET requests. Did you mean to make a POST request? berarti metode salah — node mengharapkan POST tetapi Anda mengirim GET.
URL webhook menunjukkan :5678 atau localhost. Node menampilkan https://n8n.example.com:5678/webhook/... atau http://localhost:5678/.... WEBHOOK_URL tidak disetel atau salah, sehingga n8n membangun alamat dari N8N_HOST:N8N_PORT alih-alih base publik Anda. Atur WEBHOOK_URL=https://n8n.example.com/, buat ulang container dengan docker compose up -d, dan port tersebut akan hilang.
There was a problem loading init data di browser. Editor berhasil dimuat tetapi tidak dapat menjangkau backend API miliknya sendiri. Di balik proxy, hal ini hampir selalu disebabkan oleh N8N_HOST atau WEBHOOK_URL yang salah, proxy yang tidak menyertakan header WebSocket Upgrade, atau N8N_PROTOCOL yang tidak sesuai dengan cara Anda terhubung. Pastikan empat variabel publik sudah benar dan proxy meneruskan Upgrade dan Connection.
password authentication failed for user "n8n" di log, disertai container yang melakukan restart. Kata sandi yang dikirim n8n tidak cocok dengan kata sandi saat database diinisialisasi. Masalahnya: Postgres hanya membaca POSTGRES_PASSWORD saat menginisialisasi direktori data yang kosong. Jalankan stack satu kali, lalu ubah POSTGRES_PASSWORD di .env, dan volume postgres_data yang ada tetap menyimpan kata sandi lama. Kembalikan ke nilai asli, atau jika Anda tidak memiliki data yang perlu disimpan, docker compose down dan docker volume rm volume postgres, lalu jalankan kembali secara baru.
EACCES: permission denied, open '/home/node/.n8n/config' saat startup. n8n berjalan sebagai user node (UID 1000) dan tidak dapat menulis ke direktori konfigurasinya. Ini terjadi pada pengguna yang melakukan bind-mount folder host (./n8n_data:/home/node/.n8n) milik root. Gunakan named volume yang ditunjukkan di atas, atau jika Anda tetap ingin menggunakan bind mount, lakukan 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 versi 2.x, n8n secara default menerapkan 0600 pada file pengaturan tersebut dan memperbaikinya sendiri saat boot — baris log ini berarti n8n telah memperbaiki mode tersebut, biasanya setelah bind mount atau setelah proses restore menyalin kembali file dengan izin yang longgar. Tidak ada tindakan yang diperlukan; atur N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false hanya jika sistem file Anda benar-benar tidak dapat mendukung izin tersebut.
Mismatching encryption keys — baris lengkapnya menyatakan bahwa kunci enkripsi pada file pengaturan /home/node/.n8n/config tidak cocok dengan N8N_ENCRYPTION_KEY di environment Anda. Kunci di environment Anda berbeda dari kunci yang ditulis n8n ke dalam volume datanya pada sesi sebelumnya — paling sering karena n8n menghasilkan kunci acak pada boot sebelumnya saat variabel belum disetel, lalu Anda menyetel kunci yang berbeda. Masukkan kembali kunci asli ke .env, atau, hanya jika Anda benar-benar tidak memiliki kredensial tersimpan yang berharga, hapus file config di dalam volume n8n_data dan biarkan n8n membuatnya ulang — dengan risiko kredensial yang ada menjadi tidak terbaca.
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 alih-alih melalui proxy HTTPS. Akseslah melalui https://n8n.example.com/. Hanya jika Anda benar-benar tidak dapat menggunakan HTTPS, Anda boleh menyetel N8N_SECURE_COOKIE=false, dan jangan pernah melakukannya pada server yang terhubung ke internet.
Untuk memasukkan 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) sudah cukup untuk mencoba n8n atau untuk penggunaan pribadi dengan satu alur kerja yang berjalan secara bergantian. Gunakan Postgres untuk penggunaan yang bersifat krusial: single writer lock pada SQLite menyebabkan database is locked saat terjadi konkurensi, sedangkan Postgres mendukung pencadangan yang bersih dengan pg_dump. Migrasi di kemudian hari dilakukan secara manual, jadi jika server tersebut penting, mulailah dengan Postgres.
Mengapa webhook n8n saya tidak pernah berjalan?
Hampir selalu karena WEBHOOK_URL. Jika tidak diatur atau salah, n8n akan mencetak alamat webhook yang dibangun dari N8N_HOST:N8N_PORT — sering kali mengandung :5678 atau localhost — yang terlihat valid tetapi tidak dapat dijangkau dari internet, sehingga permintaan pemanggil tidak pernah sampai. Atur WEBHOOK_URL=https://n8n.example.com/ dan pastikan node menampilkan URL tanpa port. Penyebab kedua adalah memanggil webhook yang alur kerjanya tidak dalam status Active, yang akan mengembalikan The requested webhook ... is not registered..
Apa yang harus saya cadangkan di n8n?
Dua hal. N8N_ENCRYPTION_KEY dari file .env Anda, karena setiap kredensial yang tersimpan dienkripsi dengannya dan kehilangan file tersebut membuat kredensial tidak dapat didekripsi selamanya — salin file tersebut keluar dari server pada hari Anda membuatnya. Dan pg_dump dari database Postgres untuk alur kerja, riwayat, dan kredensial. Pemulihan memerlukan keduanya: kunci yang sama ditambah file dump tersebut.
Bagaimana cara menggunakan HTTPS untuk n8n?
n8n melayani HTTP biasa pada port 5678; reverse proxy di depannya akan melakukan terminasi TLS. Hubungkan 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 WebSocket Upgrade agar editor tidak macet.
Bagaimana cara memperbarui n8n dengan aman?
Gunakan tag image spesifik alih-alih latest, lakukan pg_dump terlebih dahulu karena n8n menjalankan migrasi secara otomatis saat dijalankan, baca catatan rilis untuk perubahan yang merusak (breaking changes), lalu perbarui tag dan jalankan docker compose pull n8n && docker compose up -d n8n. Kontainer bersifat sementara, jadi lakukan rollback dengan menggunakan tag sebelumnya dan memulihkan dump sebelum pembaruan.