VPS-এ Docker দিয়ে n8n সেটআপ করার নিয়ম
Docker Compose, Postgres এবং HTTPS ব্যবহার করে n8n সেটআপ করুন। WEBHOOK_URL এবং encryption-key সংক্রান্ত সাধারণ ভুলগুলো এড়িয়ে সফলভাবে self-host করার উপায় জানুন।
আপনি যা তৈরি করছেন
n8n হলো একটি workflow automation tool: এটি একটি visual editor যেখানে একটি trigger — যেমন webhook, schedule, অথবা form submission — একগুচ্ছ node সক্রিয় করে। এই node গুলো API call করে, data reshape করে এবং অন্যান্য system-এ data write করে। এটি AI-agent workflow-এর জন্য একটি standard glue হিসেবে পরিচিত হয়েছে, কারণ কোনো service না লিখেই এটি প্রতিটি model provider এবং database-এর সাথে যোগাযোগ করতে পারে। মাত্র দুই মিনিটে একটি docker run একটি working editor পেয়ে যায়। এই guide-এর মূল লক্ষ্য হলো বাকি ৯০ শতাংশ কাজ সম্পন্ন করা: default SQLite file-এর পরিবর্তে Postgres ব্যবহার করে এটিকে durable করা, HTTPS-এর মাধ্যমে accessible করা, এবং — যা প্রায় সবাই ভুল করে — webhook-এর জন্য এমন একটি URL তৈরি করা যা বাইরের জগত থেকে আসলে reach করা সম্ভব।
সম্পূর্ণ stack-টি একটি Docker network-এর ওপর দুটি container নিয়ে গঠিত: n8n এবং একটি Postgres database যা এর workflows এবং credentials সংরক্ষণ করে। host-এ থাকা একটি reverse proxy TLS terminate করে এবং localhost-এ n8n-এ traffic forward করে; ফলে proxy ছাড়া ইন্টারনেটের সাথে সরাসরি কোনো সংযোগ থাকে না। এটি 2026 self-hosting shortlist-এর অন্যান্য service-এর সাথে যুক্ত।
পূর্বশর্ত এবং সীমাবদ্ধতা
আপনার অন্তত 1 GB RAM সম্পন্ন একটি VPS প্রয়োজন; যখন workflow গুলো বড় কাজ করতে শুরু করবে তখন 2 GB RAM রাখার পরিকল্পনা করুন। কারণ execution এবং Node.js runtime প্রচুর memory ব্যবহার করে; মাঝপথে container বন্ধ হয়ে যাওয়া (out-of-memory killer) শেখার জন্য একটি অত্যন্ত বাজে অভিজ্ঞতা। শুরুতে একটি single vCPU যথেষ্ট।
আপনার একটি domain বা subdomain প্রয়োজন — যেমন n8n.example.com — যার A record অবশ্যই VPS public IP-তে পয়েন্ট করা থাকতে হবে এবং certificate রিকোয়েস্ট করার আগেই এটি resolve হতে হবে। Proxy-র জন্য 80 এবং 443 port খোলা থাকতে হবে; n8n-এর নিজস্ব 5678 portটি ইন্টারনেটের জন্য খোলা থাকা উচিত নয়। আপনার Docker Engine এবং Compose plugin প্রয়োজন; যদি docker compose version এর ক্ষেত্রে docker: 'compose' is not a docker command error দেখায়, তবে আপনার কাছে পুরনো standalone binary আছে, এবং plugin টি হলো sudo apt install docker-compose-plugin।
পরীক্ষার জন্য SQLite যথেষ্ট, কিন্তু নির্ভরযোগ্য কাজের জন্য Postgres প্রয়োজন
n8n-এর ডিফল্ট ডাটাবেস হলো /home/node/.n8n/database.sqlite-এ থাকা একটি SQLite ফাইল। প্রাথমিক পরীক্ষার জন্য এটি ঠিক আছে — যদি আপনি কোনো volume mount না করেন, তবে প্রথমবার container recreate করার সময় ডাটা হারিয়ে যাবে। Postgres-এ পরিবর্তন করার মূল কারণ কেবল গতি নয়; SQLite একটি মাত্র writer lock ব্যবহার করে। ফলে একসাথে অনেকগুলো workflow চললে বা ভবিষ্যতে আপনি যখন queue mode ব্যবহার করবেন, তখন concurrency-র কারণে SQLITE_BUSY: database is locked সমস্যা দেখা দেয়। Postgres-এ এই সীমাবদ্ধতা নেই, এটি pg_dump দিয়ে সহজেই backup নেওয়া যায় এবং n8n-এর নিজস্ব docs-এ একটি নির্ভরযোগ্য server-এর জন্য Postgres ব্যবহারের পরামর্শ দেওয়া হয়েছে। পরে পরিবর্তন করতে চাইলে ডাটা হাতে migrate করতে হবে, তাই যদি এই সার্ভারটি গুরুত্বপূর্ণ হয়, তবে শুরু থেকেই Postgres ব্যবহার করুন।
DNS এবং firewall
প্রথমে record পয়েন্ট করুন এবং port গুলো ওপেন করুন। এতে করে পরবর্তীতে certificate তৈরির সময় name 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 enable5678 port ওপেন করবেন না। compose file-এ n8n কে 127.0.0.1:5678 এর সাথে bind করা হয়েছে, তাই শুধুমাত্র host-এর reverse proxy এটি অ্যাক্সেস করতে পারবে। একটি ufw allow 5678 এই isolation নষ্ট করে দেবে।
Compose file
একটি working directory এবং একটি docker-compose.yml তৈরি করুন। এটি সম্পূর্ণ stack — দুটি service, একটি private network এবং দুটি named volume।
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:কিছু সিদ্ধান্ত সরাসরি উল্লেখ করা প্রয়োজন। DB_POSTGRESDB_HOST=postgres হলো service name, যা Docker shared network-এ resolve করে — এটি localhost নয়, যা n8n container-এর ভেতরে n8n নিজেই বোঝায়। condition: service_healthy সহ depends_on n8n-কে boot হওয়ার সময় Postgres-এর সাথে প্রতিযোগিতা করা থেকে বিরত রাখে; এটি না থাকলে n8n চালু হয়, কোনো database খুঁজে পায় না এবং exit করে। /home/node/.n8n-এ থাকা n8n_data named volume-টি encryption key এবং SQLite-এর ক্ষেত্রে database ধারণ করে — এটি এমন একটি directory যা আপনার হারানো উচিত নয়। image-টি একটি নির্দিষ্ট version-এ pin করে রাখুন, কখনোই latest ব্যবহার করবেন না; এর কারণগুলো নিচের upgrade section-এ দেওয়া আছে।
The secrets file
Compose file-এ কখনো password রাখবেন না। এর পরিবর্তে পাশে একটি .env file রাখুন যা Compose স্বয়ংক্রিয়ভাবে পড়বে। password গুলো অবশ্যই random হতে হবে।
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 হলো সবচেয়ে গুরুত্বপূর্ণ string — এটি প্রতিটি stored credential encrypt করার জন্য ব্যবহৃত key। n8n-কে এটি generate করতে না দিয়ে আপনি নিজে explicitly সেট করুন। কারণ আপনার তৈরি করা value আপনি লিখে রাখতে এবং পরবর্তীতে restore করতে পারবেন। n8n যখন প্রথম credential-টি এই key দিয়ে encrypt করবে, তখন এই key পরিবর্তন করলে সব credential undecryptable হয়ে যাবে — তাই এটি একবার সেট করুন এবং সেই line-টি আর কখনো পরিবর্তন করবেন না।
Webhook কাজ করার জন্য দায়ী env vars সমূহ
n8n বাইরের জগতের কাছে নিজেকে কীভাবে উপস্থাপন করবে তা চারটি variable দ্বারা নিয়ন্ত্রিত হয়। এই variable গুলোর ভুল কনফিগারেশন n8n support-এ সবচেয়ে বেশি জিজ্ঞাসিত প্রশ্ন।
N8N_HOSTহলো public hostname,n8n.example.com। আপনি যদি proxy-এর পেছনে ডিফল্টlocalhostব্যবহার করেন, তবে editor আপনার browser-এlocalhostথেকে নিজস্ব API লোড করার চেষ্টা করবে, যা ব্যর্থ হবে।N8N_PROTOCOL=httpsn8n-কে জানায় যে এটি TLS-এর মাধ্যমে সার্ভ করা হচ্ছে, ফলে এটি এর session cookieSecureমার্ক করে এবংhttps://URL তৈরি করে।N8N_PORT=5678হলো সেই port যেটিতে n8n container-এর ভেতরে listen করে। এটি public port নয়; 443 portটি proxy দ্বারা নিয়ন্ত্রিত।WEBHOOK_URL=https://n8n.example.com/হলো সবচেয়ে গুরুত্বপূর্ণ variable। আপনি Stripe, GitHub বা যেকোনো external caller-এ যে webhook address গুলো পেস্ট করেন, n8n এই value গুলো ব্যবহার করে সেগুলো তৈরি করে। যদি এটি unset বা ভুল থাকে, তবে n8nN8N_HOST:N8N_PORTব্যবহার করে এবং আপনাকেhttps://n8n.example.com:5678/webhook/...অথবা আরও খারাপভাবেhttp://localhost:5678/webhook/...প্রদান করে — যা কোনো error ছাড়াই প্রিন্ট হয়, দেখতে সঠিক মনে হয়, কিন্তু ইন্টারনেট থেকে unreachable। ফলে caller-এর request গুলো নিঃশব্দে হারিয়ে যায়। এটিকে শেষে একটি trailing slash সহ সঠিক public base URL হিসেবে সেট করুন, তারপর নিশ্চিত করুন যে webhook node-এ কোনো port ছাড়া URL দেখাচ্ছে।
N8N_PROXY_HOPS=1 n8n-এর Express server-কে তার সামনে থাকা একটি proxy-কে trust করতে বলে, যাতে rate-limiting এবং client IP পড়া সংক্রান্ত ফিচারগুলো proxy-এর পরিবর্তে আসল address দেখতে পায়। এখানে আমরা ইচ্ছাকৃতভাবে একটি variable সেট করি না, তা হলো N8N_RUNNERS_ENABLED: task runners — n8n যখন Code-node logic একটি আলাদা sandboxed process-এ চালায় — তা 1.69 সংস্করণ থেকে default হিসেবে আছে এবং এই গাইডে উল্লিখিত 2.x সংস্করণ থেকে এটি বাধ্যতামূলক। তাই পুরনো opt-in পদ্ধতিটি এখন deprecated। এটি এখন সেট করে রাখলে n8n শুধুমাত্র একটি notice দেবে যে এটি সরিয়ে ফেলুন।
প্রথমবার শুরু করা
docker compose up -d
docker compose ps
docker compose logs -f n8nসফলভাবে প্রথমবার বুট করার পর একটি Editor is now accessible via: লাইন দেখা যাবে এবং তার উপরে একটি n8n ready on ..., port 5678 লাইন থাকবে। docker compose ps এ উভয় কন্টেইনারের Up দেখা যাবে এবং postgres (healthy) হিসেবে চিহ্নিত থাকবে। যদি n8n একটি Restarting লুপে আটকে যায়, তবে লগগুলো পরীক্ষা করুন — এটি সাধারণত ডাটাবেস কানেকশন বা নিচে বর্ণিত ভলিউম পারমিশনজনিত সমস্যা।
reverse proxy সহ TLS
n8n নিজে 5678 পোর্টে plain HTTP ব্যবহার করে; এর সামনে থাকা কোনো মাধ্যম HTTPS হ্যান্ডেল করে। এর জন্য দুটি সহজ উপায় আছে।
আপনি যদি ইতিমধ্যে অনেকগুলো container চালান, তবে n8n-কে [[traefik-reverse-proxy-docker-compose-multiple-apps|Traefik reverse proxy-এর] পেছনে রাখুন যা স্বয়ংক্রিয়ভাবে TLS certificate প্রদান করে]]। কিছু label ব্যবহার করলেই হবে — Traefik আপনার হয়ে certificate রিকোয়েস্ট এবং রিনিউ করবে।
যদি এটি সার্ভারের একমাত্র অ্যাপ হয়, তবে Let's Encrypt certificate সহ একটি nginx virtual host ব্যবহার করা সহজতর। সার্টিফিকেট পেতে Ubuntu 24.04-এর জন্য Certbot এবং nginx TLS setup ব্যবহার করুন, তারপর এই server block-টি ব্যবহার করুন:
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;
}
}Upgrade এবং Connection "upgrade" header দুটি অবশ্যই থাকতে হবে। n8n WebSocket-এর মাধ্যমে এডিটরে লাইভ execution আপডেট পাঠায়; এই দুটি লাইন না থাকলে login page লোড হওয়ার পর connection lost ব্যানার দেখিয়ে হ্যাং হয়ে যাবে। proxy_read_timeout 3600 নিশ্চিত করে যে দীর্ঘ সময় ধরে চলা execution গুলো nginx-এর ডিফল্ট 60 সেকেন্ডের মধ্যে বন্ধ হয়ে যাবে না। X-Forwarded-Proto $scheme header-টি N8N_PROXY_HOPS=1-এর পরিপূরক হিসেবে কাজ করে: এটি n8n-কে জানায় যে মূল request-টি HTTPS ছিল, যদিও proxy সেটি plain HTTP-এর মাধ্যমে পাঠাচ্ছে; ফলে n8n কানেকশনটিকে insecure মনে করে নিজের cookie রিজেক্ট করবে না।
আপনার প্রথম workflow তৈরি করা
https://n8n.example.com/ ওপেন করুন, owner account তৈরি করুন (পরবর্তী সেকশন দেখুন), এবং একটি ছোট workflow তৈরি করুন যা প্রমাণ করবে যে path টি কাজ করছে: একটি webhook ইনপুট, একটি HTTP call, এবং একটি response আউটপুট।
- একটি Webhook node যোগ করুন। method হিসেবে
POSTএবং path হিসেবেhelloএর মতো কিছু সেট করুন। এখানে দুটি URL দেখাবে, একটি Test URL এবং একটি Production URL — অনেক ক্ষেত্রে "my webhook doesn't work" সমস্যার কারণ এই দুটি URL এর পার্থক্য। Test URL শুধুমাত্র একটি call এর উত্তর দিতে পারে এবং সেটিও কেবল তখনই কাজ করে যখন আপনি Listen for test event বাটনে ক্লিক করবেন; এরপর এটি expire হয়ে যায়। Production URL তখনই কাজ করে যখন workflow টি Active থাকে। - এর পরে একটি HTTP Request node যোগ করুন, যা যেকোনো public JSON API এর দিকে নির্দেশিত হবে —
https://api.github.com/zenএ একটি GET request করলে একটি এক লাইনের string পাওয়া যাবে, যা যথেষ্ট। - একটি Respond to Webhook node যোগ করুন, এবং Webhook node এর Respond option টি "Using Respond to Webhook node" হিসেবে সেট করুন যাতে caller টি HTTP node এর output ফেরত পায়।
- workflow টি Active (উপরে ডানে) করুন এবং এটি কল করুন:
curl -X POST https://n8n.example.com/webhook/hello। আপনি সেই zen line টি ফেরত পাবেন — POST ইনপুট, API call, এবং response আউটপুট; এটাই বেশিরভাগ বাস্তবধর্মী automation এর গঠন।
একটি scheduled variant এ Webhook node এর পরিবর্তে Schedule Trigger ব্যবহার করা হয় এবং এটি কোনো model endpoint কে কল করে — Ollama running on the same VPS ব্যবহার করে একটি self-hosted endpoint ব্যবহার করা nightly summariser তৈরির একটি সহজ উপায়।
User management, basic auth নয়
পুরানো n8n গাইডগুলোতে N8N_BASIC_AUTH_ACTIVE=true সেট করার কথা বলা হয়েছে। n8n 1.0 ভার্সনে সেই variable গুলো সরিয়ে ফেলা হয়েছে এবং বর্তমানে সেগুলো কোনো কাজ করে না। বর্তমানের authentication হলো owner account: প্রথমবার editor লোড করার সময়, n8n আপনাকে একটি email-and-password দিয়ে owner অ্যাকাউন্ট তৈরি করতে বাধ্য করবে। এই ধাপটি বাধ্যতামূলক — কোনো anonymous mode নেই। প্রথমবার boot করার পরপরই এটি তৈরি করুন, URL অন্য কারো কাছে দেওয়ার আগেই: docker compose up এবং প্রথম form submission এর মধ্যবর্তী সময়ে যে কেউ instance টি দখল করে নিতে পারে। অতিরিক্ত নিরাপত্তার জন্য reverse-proxy basic-auth ব্যবহার করা একটি যুক্তিসঙ্গত পদক্ষেপ, তবে এটি একটি second factor মাত্র, আসল authentication নয়।
Backups: প্রথমে encryption key, তারপর database
দুটি জিনিস ব্যাকআপ রাখা প্রয়োজন, এবং এদের গুরুত্ব সমান নয়।
The N8N_ENCRYPTION_KEY. n8n-এ সংরক্ষিত প্রতিটি credential — যেমন API tokens, database passwords, OAuth secrets — এই key দিয়ে encrypt করা থাকে। এই key ছাড়া Postgres-এর workflows গুলো অকেজো: যদি আপনি একটি নতুন box-এ ভিন্ন key দিয়ে database restore করেন, তবে n8n একটি single credential-ও decrypt করতে পারবে না; এক্ষেত্রে কোনো recovery বা reset সম্ভব নয়। আপনার .env ফাইলে এই key থাকে; এটি তৈরি করার দিনই সার্ভারের বাইরে অন্য কোথাও কপি করে রাখুন — একটি password-manager ব্যবহার করা সবচেয়ে ভালো। এটিই হলো সবচেয়ে গুরুত্বপূর্ণ backup।
The Postgres database, যা workflows, execution history এবং encrypted credentials সংরক্ষণের জন্য ব্যবহৃত হয়:
docker compose exec -T postgres pg_dump -U n8n -d n8n \
| gzip > n8n-db-$(date +%F).sql.gzএটি একটি schedule অনুযায়ী চালান এবং dump ফাইলটি সার্ভার থেকে কপি করে রাখুন। একটি নতুন VPS-এ restore করার পদ্ধতি: প্রথমে stack-টি একবার চালু করুন যাতে database তৈরি হয়, তারপর n8n বন্ধ করুন, psql দিয়ে dump ফাইলটি load করুন, .env-এ একই N8N_ENCRYPTION_KEY ফাইলটি দিন, এবং n8n চালু করুন। একই key এবং dump ফাইল থাকলে একটি working instance পাওয়া যাবে; কিন্তু নতুন key ব্যবহার করলে workflows গুলো একটি single credential-ও ব্যবহার করতে পারবে না।
Upgrades: tag pin করুন
compose file-এ উদ্দেশ্যমূলকভাবে latest এর পরিবর্তে n8nio/n8n:2.29.10 ব্যবহার করা হয়েছে। n8n প্রতি সপ্তাহে নতুন minor version রিলিজ করে এবং মাঝেমধ্যে database schema বা node behaviour পরিবর্তন করে। তাই latest ব্যবহার করলে, unattended pull করার ফলে container চালু হওয়ার সাথে সাথেই database migration হয়ে যেতে পারে। একটি নির্দিষ্ট version pin করে রাখুন, version bump করার আগে release notes পড়ুন — n8n সেখানে breaking changes সম্পর্কে জানিয়ে দেয় — এবং সতর্কতার সাথে upgrade করুন:
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 n8nMajor-version jump করার সময় এটি সবচেয়ে বেশি গুরুত্বপূর্ণ। উদাহরণস্বরূপ, 2.0 line ডিফল্টভাবে N8N_BLOCK_ENV_ACCESS_IN_NODE থেকে true এ পরিবর্তন করেছে। ফলে যে সকল Code node process.env ব্যবহার করত, সেগুলো নিজে থেকেই access হারাবে যতক্ষণ না আপনি এটিকে পুনরায় false এ সেট করছেন; একই রিলিজ settings file-এর জন্য strict permissions প্রয়োগ করা শুরু করেছে। Major boundary অতিক্রম করার আগে 2.0 breaking-changes page পড়ুন। n8n স্টার্ট হওয়ার সময় প্রয়োজনীয় database migrations স্বয়ংক্রিয়ভাবে চালায় — আর এই কারণেই upgrade করার আগে pg_dump করা বাধ্যতামূলক। যেহেতু credentials .env এ একটি key দিয়ে encrypt করা থাকে এবং data Postgres-এ থাকে, তাই container গুলো disposable: আপনি container পরিবর্তন করে upgrade করতে পারেন, এবং আগের tag pin করে এবং dump restore করে roll back করতে পারেন।
Failure modes, with the strings you will see
The requested webhook "POST hello" is not registered. একটি 404 এরর আসে যখন এমন একটি webhook কল করা হয় যার workflow Active নয়, অথবা যখন কেউ শুনছে না এমন একটি test path কল করা হয়। Test paths (/webhook-test/...) কেবল তখনই সাড়া দেয় যখন আপনি "Listen for test event" ক্লিক করেন; production paths (/webhook/...) কেবল তখনই সাড়া দেয় যখন workflow toggle অন থাকে। এর পাশের This webhook is not registered for GET requests. Did you mean to make a POST request? নির্দেশ করে যে method টি ভুল — node টি POST আশা করছে কিন্তু আপনি GET পাঠিয়েছেন।
webhook URL এ :5678 বা localhost দেখাচ্ছে। node টি https://n8n.example.com:5678/webhook/... বা http://localhost:5678/... প্রদর্শন করছে। WEBHOOK_URL সেট করা নেই বা ভুল, তাই n8n আপনার public base এর পরিবর্তে N8N_HOST:N8N_PORT থেকে অ্যাড্রেসটি তৈরি করেছে। WEBHOOK_URL=https://n8n.example.com/ সেট করুন, docker compose up -d দিয়ে container টি পুনরায় তৈরি করুন, এবং port সমস্যাটি সমাধান হয়ে যাবে।
ব্রাউজারে There was a problem loading init data। editor লোড হয়েছে কিন্তু এটি এর নিজস্ব backend API এ পৌঁছাতে পারছে না। Proxy এর পেছনে এটি প্রায়শই ভুল N8N_HOST বা WEBHOOK_URL, WebSocket Upgrade header অনুপস্থিত থাকা, অথবা N8N_PROTOCOL এর সাথে আপনার সংযোগের অমিল হওয়ার কারণে ঘটে। চারটি public-facing variable এবং proxy যেন Upgrade ও Connection forward করে তা নিশ্চিত করুন।
logs এ password authentication failed for user "n8n" এবং container রিস্টার্ট হচ্ছে। n8n যে পাসওয়ার্ড পাঠাচ্ছে তা database এর initialisation পাসওয়ার্ডের সাথে মিলছে না। সমস্যাটি হলো: Postgres কেবল তখনই POSTGRES_PASSWORD পড়ে যখন এটি একটি empty data directory initialise করে। স্ট্যাকটি একবার চালু করুন, তারপর .env এ POSTGRES_PASSWORD পরিবর্তন করুন; বিদ্যমান postgres_data volume এ পুরনো পাসওয়ার্ডটিই থেকে যাবে। এটি পুনরায় আগের অবস্থায় সেট করুন, অথবা যদি আপনার কোনো ডেটা সংরক্ষণের প্রয়োজন না থাকে, তবে postgres volume টি docker compose down এবং docker volume rm করুন, তারপর এটি নতুনভাবে চালু করুন।
শুরু করার সময় EACCES: permission denied, open '/home/node/.n8n/config'। n8n node user (UID 1000) হিসেবে চলে এবং এর config directory তে লিখতে পারে না। এটি তাদের ক্ষেত্রে ঘটে যারা root দ্বারা মালিকানাধীন একটি host folder (./n8n_data:/home/node/.n8n) bind-mount হিসেবে ব্যবহার করেন। উপরে দেখানো named volume ব্যবহার করুন, অথবা যদি আপনি bind mount ব্যবহার করতে চান, তবে প্রথমে sudo chown -R 1000:1000 ./n8n_data করুন।
Permissions 0644 for n8n settings file /home/node/.n8n/config are too wide. Changing permissions to 0600.. n8n এর 2.x ভার্সন থেকে ডিফল্টভাবে settings file এর ওপর 0600 প্রয়োগ করে এবং বুট করার সময় এটি নিজেই ঠিক করে নেয় — এই log line এর অর্থ হলো এটি ইতিমধ্যে mode টি সংশোধন করেছে, যা সাধারণত bind mount করার পর বা restore করার সময় loose permissions সহ ফাইলটি কপি করার ফলে ঘটে। কোনো পদক্ষেপ নেওয়ার প্রয়োজন নেই; আপনার filesystem যদি সত্যিই permissions সাপোর্ট করতে না পারে তবেই N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false সেট করুন।
Mismatching encryption keys — পূর্ণাঙ্গ লাইনটি বলছে যে settings file এর encryption key /home/node/.n8n/config আপনার environment এর N8N_ENCRYPTION_KEY এর সাথে মিলছে না। আপনার environment এর key টি n8n এর আগের কোনো রান এর data volume এ লেখা key থেকে আলাদা — বেশিরভাগ ক্ষেত্রে এটি ঘটে কারণ n8n এর আগের কোনো বুটে variable unset থাকার কারণে একটি random key তৈরি করেছিল, এবং আপনি পরে অন্য একটি key সেট করেছেন। মূল key টি .env এ ফিরিয়ে আনুন, অথবা, যদি আপনার কাছে সংরক্ষণের মতো কোনো credential না থাকে, তবে n8n_data volume এর ভেতরে থাকা config ফাইলটি মুছে ফেলুন এবং n8n কে এটি পুনরায় তৈরি করতে দিন — মনে রাখবেন এতে বিদ্যমান credentials গুলো পড়া যাবে না।
secure cookies সম্পর্কে একটি login banner: Your n8n server is configured to use a secure cookie, however you are either visiting this via an insecure URL, or using Safari. আপনি N8N_PROTOCOL=https সেট করেছেন কিন্তু n8n এ plain HTTP এর মাধ্যমে প্রবেশ করেছেন — সাধারণত HTTPS proxy এর পরিবর্তে সরাসরি IP এবং port ব্যবহার করার ফলে এটি ঘটে। এটি https://n8n.example.com/ এর মাধ্যমে অ্যাক্সেস করুন। আপনি যদি সত্যিই HTTPS ব্যবহার করতে না পারেন তবেই N8N_SECURE_COOKIE=false সেট করবেন, এবং এটি কখনোই internet-facing box এ করবেন না।
এই workflow গুলোর মধ্যে একটি language model যুক্ত করতে, building AI workflows with Claude and n8n দেখুন।
FAQ
n8n-এর জন্য আমার SQLite নাকি Postgres ব্যবহার করা উচিত?
n8n পরীক্ষা করার জন্য বা একবারে একটি workflow চালানোর ব্যক্তিগত instance-এর জন্য SQLite (default) যথেষ্ট। গুরুত্বপূর্ণ কাজের জন্য Postgres ব্যবহার করুন: SQLite-এর single writer lock-এর কারণে concurrency-এর সময় database is locked ঘটে, আর Postgres pg_dump দিয়ে সহজে backup নেওয়া যায়। পরবর্তীতে migration করা ম্যানুয়ালি করতে হয়, তাই যদি সার্ভারটি গুরুত্বপূর্ণ হয়, তবে Postgres দিয়ে শুরু করুন।
আমার n8n webhooks কেন কাজ করছে না?
প্রায় সব ক্ষেত্রেই এটি WEBHOOK_URL। যদি unset বা ভুল থাকে, n8n N8N_HOST:N8N_PORT থেকে তৈরি webhook address প্রিন্ট করে — যাতে প্রায়ই :5678 বা localhost থাকে — যা দেখতে সঠিক মনে হলেও ইন্টারনেট থেকে সেখানে পৌঁছানো যায় না, ফলে caller-এর request গুলো আর পৌঁছায় না। WEBHOOK_URL=https://n8n.example.com/ সেট করুন এবং নিশ্চিত করুন যে node-টি কোনো port ছাড়া URL দেখাচ্ছে। দ্বিতীয় কারণ হলো এমন একটি webhook কল করা যার workflow-টি Active অবস্থায় নেই, যা The requested webhook ... is not registered. রিটার্ন করে।
n8n-এ আমার কী কী backup রাখা প্রয়োজন?
দুটি জিনিস। আপনার .env ফাইল থেকে N8N_ENCRYPTION_KEY, কারণ প্রতিটি stored credential এটি দিয়ে encrypt করা থাকে এবং এটি হারিয়ে ফেললে সেগুলো স্থায়ীভাবে undecryptable হয়ে যাবে — ফাইলটি তৈরি করার দিনই সার্ভার থেকে কপি করে রাখুন। এবং workflows, history ও credentials-এর জন্য Postgres database-এর একটি pg_dump। restore করার জন্য দুটিরই প্রয়োজন: একই key এবং dump।
আমি কীভাবে n8n-কে HTTPS-এর আড়ালে রাখতে পারি?
n8n port 5678-এ plain HTTP সার্ভ করে; এর সামনে একটি reverse proxy ব্যবহার করে TLS terminate করতে হয়। n8n-কে 127.0.0.1:5678-এ bind করুন যাতে শুধুমাত্র proxy এটি অ্যাক্সেস করতে পারে, তারপর automatic certificates সহ Traefik অথবা Let's Encrypt certificate সহ nginx ব্যবহার করুন। N8N_PROTOCOL=https এবং WEBHOOK_URL=https://your-host/ সেট করুন, এবং নিশ্চিত করুন যে proxy যেন WebSocket Upgrade headers ফরওয়ার্ড করে, অন্যথায় editor হ্যাং করবে।
আমি কীভাবে নিরাপদে n8n upgrade করতে পারি?
latest এর পরিবর্তে একটি নির্দিষ্ট image tag ব্যবহার করুন, প্রথমে একটি pg_dump নিন কারণ n8n স্টার্ট হওয়ার সময় স্বয়ংক্রিয়ভাবে migrations চালায়, breaking changes সম্পর্কে জানতে release notes পড়ুন, তারপর tag আপডেট করুন এবং docker compose pull n8n && docker compose up -d n8n চালান। container-টি disposable, তাই আগের tag ব্যবহার করে এবং upgrade-এর আগের dump restore করে আপনি আগের অবস্থায় ফিরে যেতে পারেন।