SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-27

VPS-এ Docker দিয়ে n8n সেটআপ করার নিয়ম

Docker Compose ও Postgres ব্যবহার করে VPS-এ n8n হোস্ট করার পূর্ণাঙ্গ গাইড। WEBHOOK_URL কনফিগারেশন, এনক্রিপশন কি এবং রিভার্স প্রক্সির মাধ্যমে HTTPS সেটআপের খুঁটিনাটি এখানে দেখুন।

আপনি যা তৈরি করছেন

n8n হলো একটি workflow automation টুল: এটি একটি ভিজ্যুয়াল এডিটর যেখানে কোনো trigger, webhook, schedule বা form submission নোডের একটি চেইন চালু করে, যা API কল করে, ডেটা পরিবর্তন করে এবং অন্যান্য সিস্টেমে লিখে রাখে। এটি AI-agent workflow-এর জন্য ডিফল্ট মাধ্যম হয়ে উঠেছে, কারণ কোনো সার্ভিস না লিখেই এটি প্রতিটি model provider এবং database-এর সাথে যোগাযোগ করতে পারে। একটি docker run ব্যবহার করে দুই মিনিটের মধ্যে একটি কার্যকর এডিটর পাওয়া যায়। এই নির্দেশিকাটি বাকি নব্বই শতাংশ কাজের জন্য: ডিফল্ট SQLite ফাইলের পরিবর্তে Postgres ব্যবহার করে এটিকে টেকসই করা, HTTPS-এর মাধ্যমে অ্যাক্সেসযোগ্য করা এবং যে বিষয়টি প্রায় সবাই ভুল করে, তা হলো—webhook-কে এমন একটি URL প্রদান করতে বাধ্য করা যা বাইরের জগত থেকে আসলেই অ্যাক্সেস করা যায়।

সম্পূর্ণ স্ট্যাকটি একটি Docker network-এ দুটি কন্টেইনার নিয়ে গঠিত: n8n নিজে এবং এর workflow ও credential সংরক্ষণকারী একটি Postgres database। হোস্টের একটি reverse proxy TLS termination সম্পন্ন করে এবং localhost-এ n8n-এর কাছে অনুরোধ পাঠায়, ফলে proxy ছাড়া অন্য কোনো কিছু সরাসরি ইন্টারনেটের মুখোমুখি হয় না। এটি 2026 self-hosting shortlist-এ থাকা অন্যান্য সার্ভিসের পাশাপাশি অবস্থান করে।

পূর্বশর্ত এবং বাস্তব সীমাবদ্ধতা

আপনার অন্তত 1 GB RAM-সমৃদ্ধ একটি VPS দরকার। Workflow বাস্তবে কাজ শুরু করলে 2 GB RAM ধরে পরিকল্পনা করুন। Execution এবং Node.js runtime মিলে মেমরি ব্যবহার করে। মাঝপথে container বন্ধ করে দেওয়া out-of-memory killer-এর মাধ্যমে এটি শেখা খুবই দুর্ভোগের বিষয়।

শুরু করার জন্য একটি vCPU যথেষ্ট। এই মেশিনে অন্য কোনো বেশি resource-নির্ভর service চালালে আগে সেই service অনুযায়ী VPS-এর আকার নির্ধারণ করুন। সাধারণত photo library-ই প্রধান কারণ। PhotoPrism এবং Immich-এর প্রকৃত RAM প্রয়োজনীয়তা n8n-এর চাহিদার তুলনায় অনেক বেশি।

Media box-এর ক্ষেত্রেও একই কথা প্রযোজ্য। Jellyfin server-এর সঙ্গে এর জন্য browsable front end, যেমন Halcyon, যা library-কে 90s-এর rental shop হিসেবে নতুন করে সাজায়, চালালে n8n-এর নজরে পড়ার অনেক আগেই RAM এবং transcoding headroom ব্যবহার হয়ে যাবে।

আপনার একটি ডোমেইন বা সাব-ডোমেইন প্রয়োজন, যেমন n8n.example.com। সার্টিফিকেট অনুরোধ করার আগেই এর একটি A record VPS-এর পাবলিক IP-কে নির্দেশ করতে হবে এবং তা সঠিকভাবে রিজলভ হতে হবে। পোর্ট 80 এবং 443 অবশ্যই প্রক্সির জন্য খোলা থাকতে হবে; n8n-এর নিজস্ব পোর্ট 5678 কখনোই ইন্টারনেটের সরাসরি মুখোমুখি থাকা উচিত নয়। আপনার Docker Engine এবং Compose plugin প্রয়োজন। যদি docker compose version কমান্ডটি চালালে docker: 'compose' is not a docker command এরর দেখায়, তবে বুঝবেন আপনি পুরনো standalone বাইনারি ব্যবহার করছেন, সেক্ষেত্রে সঠিক কমান্ডটি হলো sudo apt install docker-compose-plugin

পরীক্ষামূলক কাজের জন্য SQLite ঠিক আছে, তবে নির্ভরযোগ্য যেকোনো কিছুর জন্য Postgres ব্যবহার করুন

n8n-এর ডিফল্ট ডাটাবেস হলো /home/node/.n8n/database.sqlite-এ থাকা একটি SQLite ফাইল। প্রাথমিক যাচাই-বাছাইয়ের জন্য এটি ঠিক আছে, তবে কোনো volume mount না করলে প্রথমবার কন্টেইনার রিক্রিয়েট করার সময়ই আপনি সব ডেটা হারাবেন, যা নিজেই একটি শিক্ষা। Postgres-এ স্থানান্তরের কারণ কেবল গতি নয়; বরং SQLite একটি সিঙ্গেল রাইটার লক ব্যবহার করে। ফলে একই সময়ে একাধিক ওয়ার্কফ্লো চালানো হলে বা আপনি যখন কিউ মোড (queue mode) ব্যবহার করতে চাইবেন, তখন কনকারেন্সির কারণে SQLITE_BUSY: database is locked এরর দেখা দেবে। Postgres-এ এই সীমাবদ্ধতা নেই, pg_dump দিয়ে এটি সহজে ব্যাকআপ নেওয়া যায় এবং n8n-এর নিজস্ব ডকুমেন্টেশনেও নির্ভরযোগ্য সার্ভারের জন্য Postgres ব্যবহারের পরামর্শ দেওয়া হয়েছে। পরবর্তীতে ডাটাবেস পরিবর্তন করতে হলে ম্যানুয়ালি ডেটা মাইগ্রেট করতে হবে, তাই এই সার্ভারটি যদি গুরুত্বপূর্ণ হয়, তবে শুরু থেকেই Postgres ব্যবহার করুন।

DNS এবং ফায়ারওয়াল

প্রথমে DNS রেকর্ড সেট করুন এবং পোর্টগুলো খুলে দিন, যাতে পরবর্তী ধাপে সার্টিফিকেটের কাজ এমন কোনো নামের জন্য ব্যর্থ না হয় যা 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

5678 পোর্টটি খুলবেন না। compose ফাইলটি n8n-কে 127.0.0.1:5678-এ bind করে, ফলে শুধুমাত্র হোস্টের reverse proxy এটিতে পৌঁছাতে পারে, এবং একটি ufw allow 5678 সেই আইসোলেশন বা বিচ্ছিন্নতাকে নষ্ট করে দেবে।

Compose ফাইল

একটি ওয়ার্কিং ডিরেক্টরি এবং একটি docker-compose.yml তৈরি করুন। এটি সম্পূর্ণ স্ট্যাক, দুটি সার্ভিস, একটি প্রাইভেট নেটওয়ার্ক এবং দুটি নেমড ভলিউম নিয়ে গঠিত।

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 হলো সার্ভিস নেম, যা Docker শেয়ার্ড নেটওয়ার্কে রিজলভ করে, localhost নয়, যা n8n কন্টেইনারের ভেতরে n8n-কেই বোঝায়। condition: service_healthy সহ depends_on ব্যবহার করলে বুট হওয়ার সময় n8n এবং Postgres-এর মধ্যে রেসিং কন্ডিশন তৈরি হয় না; এটি ছাড়া n8n চালু হয়ে ডাটাবেস খুঁজে না পেয়ে বন্ধ হয়ে যায়। /home/node/.n8n-এ থাকা নেমড ভলিউম n8n_data এনক্রিপশন কি এবং SQLite-এর ক্ষেত্রে ডাটাবেস ধরে রাখে; এটি এমন একটি ডিরেক্টরি যা কোনোভাবেই হারানো যাবে না। ইমেজটিকে একটি নির্দিষ্ট ভার্সনের সাথে পিন করুন, কখনোই latest ব্যবহার করবেন না; এর কারণগুলো নিচের আপগ্রেড সেকশনে দেওয়া হয়েছে।

secrets ফাইল

কখনোই compose ফাইলে পাসওয়ার্ড রাখবেন না। সেগুলোকে এর পাশে একটি .env ফাইলে রাখুন যা Compose স্বয়ংক্রিয়ভাবে পড়ে নেয় এবং সেগুলোকে এমনভাবে তৈরি করুন যেন সেগুলো প্রকৃতপক্ষেই র‍্যান্ডম হয়।

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 হলো এখানকার সবচেয়ে গুরুত্বপূর্ণ স্ট্রিং, এটি সেই কী (key) যা দিয়ে প্রতিটি সংরক্ষিত ক্রেডেনশিয়াল এনক্রিপ্ট করা থাকে। n8n-কে নিজে থেকে একটি তৈরি করতে না দিয়ে বরং আপনি স্পষ্টভাবে একটি মান সেট করুন, কারণ আপনার তৈরি করা মানটি আপনি লিখে রাখতে পারবেন এবং প্রয়োজনে পুনরুদ্ধার করতে পারবেন। একবার n8n এই কী ব্যবহার করে তার প্রথম ক্রেডেনশিয়াল এনক্রিপ্ট করে ফেললে, এটি পরিবর্তন করলে প্রতিটি ক্রেডেনশিয়াল আর ডিক্রিপ্ট করা যাবে না, তাই এটি একবারই সেট করুন, এখনই, এবং এই লাইনটি আর কখনোই পরিবর্তন করবেন না।

যেসব env var নির্ধারণ করে webhook কাজ করবে কি না

চারটি ভেরিয়েবল নিয়ন্ত্রণ করে n8n বাইরের জগতের কাছে নিজেকে কীভাবে উপস্থাপন করবে, এবং এগুলো ভুল সেট করা n8n সাপোর্ট সংক্রান্ত সবচেয়ে সাধারণ সমস্যা।

  • N8N_HOST হলো পাবলিক হোস্টনাম, n8n.example.com। প্রক্সির পেছনে এটিকে ডিফল্ট localhost-এ রেখে দিলে এডিটর আপনার ব্রাউজারে localhost থেকে নিজস্ব API লোড করার চেষ্টা করে, যা ব্যর্থ হয়।
  • N8N_PROTOCOL=https n8n-কে জানায় যে এটি TLS-এর মাধ্যমে পরিবেশন করা হচ্ছে, তাই এটি সেশন কুকিকে Secure হিসেবে চিহ্নিত করে এবং https:// URL তৈরি করে।
  • N8N_PORT=5678 হলো সেই পোর্ট যেখানে n8n কন্টেইনারের ভেতরে লিসেন করে। এটি পাবলিক পোর্ট নয়; প্রক্সি 443 পোর্টটি ব্যবহার করে।
  • WEBHOOK_URL=https://n8n.example.com/ হলো সেই ভেরিয়েবল যা সবচেয়ে বেশি সমস্যা তৈরি করে। n8n এই ভ্যালুগুলো ব্যবহার করে webhook অ্যাড্রেস তৈরি করে, যা আপনি Stripe, GitHub বা অন্য কোনো এক্সটার্নাল সার্ভিসে পেস্ট করেন। যদি এটি সেট করা না থাকে বা ভুল হয়, তবে n8n ডিফল্টভাবে N8N_HOST:N8N_PORT ব্যবহার করে এবং আপনাকে https://n8n.example.com:5678/webhook/... বা আরও খারাপভাবে http://localhost:5678/webhook/... প্রদান করে। এটি কোনো এরর মেসেজ ছাড়াই প্রদর্শিত হয়, দেখতে সঠিক মনে হয়, কিন্তু ইন্টারনেট থেকে এটি অ্যাক্সেস করা যায় না, ফলে বাইরের কোনো রিকোয়েস্ট সার্ভারে পৌঁছায় না। এটিকে ট্রেইলিং স্ল্যাশসহ সঠিক পাবলিক বেস URL-এ সেট করুন, তারপর নিশ্চিত করুন যে webhook নোডটি পোর্ট ছাড়া একটি URL দেখাচ্ছে।

N8N_PROXY_HOPS=1 n8n-এর Express সার্ভারকে নির্দেশ দেয় যেন এটি সামনের একটি প্রক্সিকে বিশ্বাস করে, যাতে রেট-লিমিটিং এবং ক্লায়েন্ট IP রিড করে এমন ফিচারগুলো প্রক্সির IP-এর পরিবর্তে আসল IP অ্যাড্রেস দেখতে পায়। একটি ভেরিয়েবল যা আপনি ইচ্ছাকৃতভাবে এখানে সেট করবেন না, তা হলো N8N_RUNNERS_ENABLED: টাস্ক রানার, যা n8n-এর Code-node লজিককে আলাদা স্যান্ডবক্সড প্রসেসে চালায়, 1.69 ভার্সন থেকে ডিফল্ট হিসেবে আছে এবং এই গাইডে উল্লিখিত 2.x লাইনে এটি বাধ্যতামূলক, তাই পুরনো অপ্ট-ইন পদ্ধতিটি এখন আর কার্যকর নয়। এটি সেট করলে n8n একটি নোটিশ লগ করবে যা আপনাকে এটি সরিয়ে ফেলার পরামর্শ দেবে।

প্রথম স্টার্ট

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 লুপে আটকে থাকে, তবে লগগুলো পড়ুন; এটি প্রায় সবসময়ই ডাটাবেস সংযোগ বা নিচে বর্ণিত ভলিউম পারমিশনের সমস্যার কারণে হয়।

রিভার্স প্রক্সির সাথে TLS

n8n নিজে 5678 পোর্টে plain HTTP ব্যবহার করে; তাই এর সামনে HTTPS টার্মিনেশন প্রয়োজন। এর জন্য দুটি সহজ উপায় আছে।

আপনি যদি ইতিমধ্যে একাধিক কন্টেইনার চালান, তবে n8n-কে স্বয়ংক্রিয়ভাবে TLS সার্টিফিকেট ইস্যু করা Traefik রিভার্স প্রক্সির পেছনে রাখুন। কিছু লেবেল যোগ করলেই Traefik আপনার জন্য সার্টিফিকেট রিকোয়েস্ট এবং রিনিউ করবে।

যদি সার্ভারে এটিই একমাত্র অ্যাপ হয়, তবে Let's Encrypt সার্টিফিকেটসহ একটি nginx ভার্চুয়াল হোস্ট ব্যবহার করা সহজ। সার্টিফিকেট পাওয়ার জন্য Ubuntu 24.04-এর জন্য Certbot এবং nginx TLS সেটআপ অনুসরণ করুন, তারপর নিচের সার্ভার ব্লকটি ব্যবহার করুন:

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" হেডারগুলো ঐচ্ছিক নয়। n8n ওয়েব-সকেটের মাধ্যমে এডিটরে লাইভ এক্সিকিউশন আপডেট পাঠায়, এই দুটি লাইন ছাড়া লগইন পেজ লোড হওয়ার পর সংযোগ বিচ্ছিন্ন হওয়ার বার্তা দেখাবে। proxy_read_timeout 3600 দীর্ঘ সময় ধরে চলা এক্সিকিউশনগুলোকে nginx-এর ডিফল্ট 60 সেকেন্ডের সময়সীমার কারণে বন্ধ হওয়া থেকে রক্ষা করে। X-Forwarded-Proto $scheme হেডারটি N8N_PROXY_HOPS=1-এর পরিপূরক: এটি n8n-কে জানায় যে মূল অনুরোধটি HTTPS ছিল, যদিও প্রক্সি এটিকে plain HTTP-এর মাধ্যমে পাঠিয়েছে। ফলে n8n সংযোগটিকে অনিরাপদ মনে করে নিজের কুকি প্রত্যাখ্যান করে না।

আপনার প্রথম ওয়ার্কফ্লো, বাস্তবায়নের জন্য

https://n8n.example.com/ খুলুন, ওনার অ্যাকাউন্ট তৈরি করুন (পরবর্তী সেকশন দেখুন), এবং পাথটি কাজ করছে কিনা তা নিশ্চিত করার জন্য সবচেয়ে ছোট একটি ওয়ার্কফ্লো তৈরি করুন: একটি ইনকামিং webhook, একটি HTTP কল এবং একটি আউটগোয়িং রেসপন্স।

  1. একটি Webhook নোড যোগ করুন। মেথডটিকে POST এবং পাথটিকে hello-এর মতো সেট করুন। এটি দুটি URL দেখাবে, একটি Test URL এবং একটি Production URL; "আমার webhook কাজ করছে না" এমন অভিযোগের অর্ধেকই এই দুটি URL গুলিয়ে ফেলার কারণে হয়। Test URL শুধুমাত্র একবার কল গ্রহণ করে এবং সেটিও কেবল যখন আপনি Listen for test event-এ ক্লিক করে রাখেন; এরপর এটি মেয়াদোত্তীর্ণ হয়ে যায়। ওয়ার্কফ্লো Active থাকলে Production URL যেকোনো সময় কল গ্রহণ করে।
  2. এর পরে একটি HTTP Request নোড যোগ করুন এবং সেটিকে যেকোনো পাবলিক JSON API-এর দিকে নির্দেশ করুন। https://api.github.com/zen-এ একটি GET রিকোয়েস্ট পাঠালে তা একটি এক লাইনের স্ট্রিং রিটার্ন করে, যা পরীক্ষার জন্য যথেষ্ট।
  3. একটি Respond to Webhook নোড যোগ করুন এবং Webhook নোডের Respond অপশনটিকে "Using Respond to Webhook node"-এ সেট করুন, যাতে কলার HTTP নোডের আউটপুটটি ফেরত পায়।
  4. ওয়ার্কফ্লোটিকে Active (উপরের ডানদিকে) করুন এবং এটিকে কল করুন: curl -X POST https://n8n.example.com/webhook/hello। আপনি zen লাইনটি ফেরত পাবেন। POST ইন, API কল এবং রেসপন্স আউট—অধিকাংশ বাস্তব অটোমেশনের গঠন এমনই হয়।

একটি শিডিউলড ভেরিয়েন্টে Webhook নোডের পরিবর্তে একটি Schedule Trigger ব্যবহার করা হয় এবং এর বদলে একটি মডেল এন্ডপয়েন্ট কল করা হয়। একই VPS-এ Ollama চালানো একটি রাতের বেলা সামারাইজার বা সারসংক্ষেপ তৈরির টুল বানানোর জন্য একটি চমৎকার উপায়।

ইউজার ম্যানেজমেন্ট, বেসিক অথ নয়

পুরোনো n8n guide-গুলোতে N8N_BASIC_AUTH_ACTIVE=true সেট করতে বলা হয়। n8n 1.0-এ ওই variable-গুলো সরিয়ে দেওয়া হয়েছে এবং এখন সেগুলো কোনো কাজ করে না। বর্তমানে authentication হলো owner account: প্রথমবার editor load করলে n8n আপনাকে email ও password দিয়ে একটি owner account তৈরি করতে বাধ্য করে। এই gate বাধ্যতামূলক; anonymous mode নেই। প্রথম boot-এর পরপরই এটি তৈরি করুন, অন্য কাউকে URL দেওয়ার আগে। docker compose up থেকে প্রথম form submission পর্যন্ত যে কেউ instance-এ পৌঁছাতে পারলে সেটি claim করতে পারে। এর ওপর reverse-proxy basic-auth layer যোগ করা অতিরিক্ত সুরক্ষা হিসেবে যুক্তিসংগত। তবে এটি second factor, প্রকৃত authentication নয়। Owner account এবং এই guide-এর বাকি সবকিছু free community edition-এ চলে। পরে granular role-সহ অতিরিক্ত user বা SSO দরকার হলে, পরিকল্পনা করার আগে কোন n8n feature-এর জন্য paid licence প্রয়োজন পড়ে নিন।

ব্যাকআপ: প্রথমে এনক্রিপশন কি, তারপর ডেটাবেস

দুটি জিনিসের ব্যাকআপ রাখা প্রয়োজন এবং এগুলোর গুরুত্ব সমান নয়।

N8N_ENCRYPTION_KEY n8n-এ আপনি যে সমস্ত ক্রেডেনশিয়াল, API টোকেন, ডেটাবেস পাসওয়ার্ড এবং OAuth সিক্রেট সংরক্ষণ করেন, তার সবকিছুই এই কি (key) দিয়ে এনক্রিপ্ট করা থাকে। এটি ছাড়া Postgres-এর ওয়ার্কফ্লোগুলো অকেজো: ভিন্ন কোনো কি ব্যবহার করে নতুন সার্ভারে ডেটাবেস রিস্টোর করলে n8n কোনো ক্রেডেনশিয়ালই ডিক্রিপ্ট করতে পারবে না, এবং এটি পুনরুদ্ধারের বা রিসেট করার কোনো উপায় নেই। আপনার .env ফাইলে এই কি-টি থাকে; এটি তৈরি করার দিনই সার্ভারের বাইরে কোথাও এটি কপি করে রাখুন, পাসওয়ার্ড ম্যানেজার এন্ট্রি এর জন্য সবচেয়ে উপযুক্ত। এটিই সেই ব্যাকআপ যা প্রকৃতপক্ষে সবচেয়ে গুরুত্বপূর্ণ।

Postgres ডেটাবেস, যা ওয়ার্কফ্লো, এক্সিকিউশন হিস্ট্রি এবং এনক্রিপ্ট করা ক্রেডেনশিয়ালগুলোর জন্য প্রয়োজন:

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

এটি একটি নির্দিষ্ট সময়সূচী অনুযায়ী চালান এবং ডাম্প ফাইলটি সার্ভারের বাইরে কপি করে রাখুন। নতুন কোনো VPS-এ রিস্টোর করতে হলে: স্ট্যাকটি একবার চালু করুন যাতে ডেটাবেস তৈরি হয়, n8n বন্ধ করুন, psql ব্যবহার করে ডাম্পটি লোড করুন, একই N8N_ENCRYPTION_KEY ফাইলটি .env-এ রাখুন এবং n8n চালু করুন। একই কি এবং ডাম্প থাকলে একটি সচল ইনস্ট্যান্স পাওয়া যাবে; নতুন কি ব্যবহার করলে ওয়ার্কফ্লোগুলো কোনো ক্রেডেনশিয়ালই ব্যবহার করতে পারবে না।

আপগ্রেড: নির্দিষ্ট ট্যাগ ব্যবহার করা

আপনার compose ফাইলে ইচ্ছাকৃতভাবে latest-এর পরিবর্তে n8nio/n8n:2.29.10 ট্যাগটি পিন করা হয়েছে। n8n প্রায় প্রতি সপ্তাহে নতুন মাইনর ভার্সন রিলিজ করে এবং মাঝেমধ্যে তাদের ডাটাবেস স্কিমা বা নোড আচরণ পরিবর্তন করে। তাই latest ব্যবহারের অর্থ হলো, কোনো অটোমেটেড পুলের মাধ্যমে আপনি এমন একটি বিল্ড পেতে পারেন যা স্টার্ট হওয়ার সাথে সাথেই আপনার ডাটাবেস মাইগ্রেট করে ফেলবে। একটি নির্দিষ্ট ভার্সন পিন করুন, ভার্সন বাড়ানোর আগে রিলিজ নোট পড়ুন, কারণ n8n সেখানে ব্রেকিং চেঞ্জগুলো উল্লেখ করে। এরপর সচেতনভাবে আপগ্রেড করুন:

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

মেজর ভার্সন পরিবর্তনের ক্ষেত্রে এটি সবচেয়ে বেশি গুরুত্বপূর্ণ। উদাহরণস্বরূপ, 2.0 ভার্সনে ডিফল্টভাবে N8N_BLOCK_ENV_ACCESS_IN_NODE থেকে true-এ পরিবর্তন আনা হয়েছিল। ফলে যেসব Code নোড process.env রিড করত, সেগুলো false-এ সেট না করা পর্যন্ত অ্যাক্সেস হারিয়ে ফেলে। একই রিলিজ থেকে সেটিংস ফাইলে কঠোর পারমিশন প্রয়োগ করা শুরু হয়। মেজর ভার্সন পরিবর্তনের আগে 2.0 ব্রেকিং-চেঞ্জ পেজ পড়ুন। n8n স্টার্ট হওয়ার সময় প্রয়োজনীয় ডাটাবেস মাইগ্রেশন স্বয়ংক্রিয়ভাবে সম্পন্ন করে, আর ঠিক এই কারণেই আপগ্রেডের আগে pg_dump করা ঐচ্ছিক নয়। যেহেতু ক্রেডেনশিয়ালগুলো .env-এ একটি কী (key) দিয়ে এনক্রিপ্ট করা থাকে এবং ডাটা Postgres-এ থাকে, তাই কন্টেইনারগুলো ডিসপোজেবল বা পরিবর্তনযোগ্য। আপনি আগের ট্যাগটি পিন করে এবং ডাটাবেস ডাম্প রিস্টোর করার মাধ্যমে সহজেই রোলব্যাক করতে পারেন।

ব্যর্থতার ধরন এবং যে বার্তাগুলো আপনি দেখবেন

The requested webhook "POST hello" is not registered. এমন একটি webhook কল করলে 4-0-4 (404) এরর আসে যার workflow Active নয়, অথবা এমন সময় test path কল করলে যখন কেউ তা শুনছে না। Test path-গুলো (/webhook-test/...) শুধুমাত্র তখনই সাড়া দেয় যখন আপনি "Listen for test event"-এ ক্লিক করেন; production path-গুলো (/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, proxy-তে WebSocket Upgrade header-এর অনুপস্থিতি, অথবা আপনি যেভাবে সংযোগ করছেন তার সাথে N8N_PROTOCOL-এর অমিলের কারণে হয়। চারটি public-facing variable নিশ্চিত করুন এবং দেখুন proxy যেন UpgradeConnection ফরোয়ার্ড করে।

লগে password authentication failed for user "n8n" এবং container বারবার restart হচ্ছে। n8n যে password পাঠাচ্ছে তা database-এর প্রাথমিক password-এর সাথে মিলছে না। ফাঁদটি হলো: Postgres শুধুমাত্র তখনই POSTGRES_PASSWORD পড়ে যখন এটি একটি খালি data directory initialize করে। Stack-টি একবার চালু করুন, তারপর .env-এ POSTGRES_PASSWORD পরিবর্তন করুন; বিদ্যমান postgres_data volume-টিতে পুরনো password-ই থেকে যাবে। এটিকে আগের অবস্থায় ফিরিয়ে আনুন, অথবা যদি আপনার কোনো data রাখার প্রয়োজন না থাকে, তবে docker compose down করুন এবং postgres volume-টি 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.. 2.x ভার্সন থেকে n8n ডিফল্টভাবে সেই settings file-এ 0600 কার্যকর করে এবং boot-এর সময় নিজেই তা ঠিক করে নেয়। এই log line-এর অর্থ হলো এটি ইতিমধ্যেই mode সংশোধন করেছে, যা সাধারণত bind mount-এর পরে অথবা restore করার সময় loose permission-সহ ফাইল কপি হলে ঘটে। কোনো পদক্ষেপের প্রয়োজন নেই; শুধুমাত্র তখনই N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false সেট করুন যদি আপনার filesystem সত্যি permission সমর্থন করতে না পারে।

Mismatching encryption keys, বিস্তারিত লাইনে বলা থাকে যে settings file /home/node/.n8n/config-এর encryption key আপনার environment-এর N8N_ENCRYPTION_KEY-এর সাথে মিলছে না। আপনার environment-এর key-টি আগের কোনো রান-এ n8n-এর data volume-এ লেখা key-এর চেয়ে আলাদা। এটি সাধারণত তখন ঘটে যখন variable সেট করা না থাকা অবস্থায় n8n আগের কোনো boot-এ একটি random key তৈরি করেছিল এবং আপনি পরে অন্য একটি key সেট করেছেন। .env-এ আসল key-টি ফিরিয়ে আনুন, অথবা যদি আপনার কোনো সংরক্ষিত credential রাখার প্রয়োজন না থাকে, তবে n8n_data volume-এর ভেতরে থাকা config ফাইলটি মুছে ফেলুন এবং n8n-কে তা পুনরায় তৈরি করতে দিন। মনে রাখবেন, এতে বিদ্যমান credential-গুলো আর পড়া যাবে না।

Secure cookie সংক্রান্ত একটি 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 সেট করেছেন কিন্তু plain HTTP-এর মাধ্যমে n8n-এ পৌঁছেছেন, যা সাধারণত HTTPS proxy-এর পরিবর্তে সরাসরি IP এবং port-এ হিট করার কারণে হয়। https://n8n.example.com/-এর মাধ্যমে এটি ব্যবহার করুন। যদি আপনি কোনোভাবেই HTTPS ব্যবহার করতে না পারেন, কেবল তখনই N8N_SECURE_COOKIE=false সেট করুন, তবে ইন্টারনেটের সাথে যুক্ত কোনো বক্সে এটি কখনোই করবেন না।

Workflow-এর ভেতরে language model যুক্ত করতে, দেখুন Claude এবং n8n দিয়ে AI workflow তৈরি

FAQ

n8n-এর জন্য আমার কি SQLite নাকি Postgres ব্যবহার করা উচিত?

SQLite (ডিফল্ট) n8n পরীক্ষা করার জন্য এবং ব্যক্তিগত ব্যবহারের ক্ষেত্রে, যেখানে একসাথে একটি মাত্র workflow চলে, তার জন্য উপযুক্ত। তবে যে কোনো গুরুত্বপূর্ণ কাজের জন্য Postgres-এ চলে যান: concurrency-র সময় SQLite-এর single writer lock database is locked ত্রুটি তৈরি করে এবং Postgres-এর ক্ষেত্রে pg_dump দিয়ে সহজে ব্যাকআপ নেওয়া যায়। পরবর্তীতে মাইগ্রেশন করা একটি ম্যানুয়াল প্রক্রিয়া, তাই যদি সার্ভারটি গুরুত্বপূর্ণ হয়, তবে শুরু থেকেই Postgres ব্যবহার করুন।

আমার n8n webhook কেন কাজ করে না?

এর কারণ প্রায় সবসময়ই WEBHOOK_URL। এটি সেট করা না থাকলে বা ভুল থাকলে, n8n N8N_HOST:N8N_PORT থেকে webhook অ্যাড্রেস তৈরি করে, যার মধ্যে প্রায়ই :5678 বা localhost থাকে। এগুলো দেখতে সঠিক মনে হলেও ইন্টারনেট থেকে এগুলোতে পৌঁছানো যায় না, ফলে কলকারীর অনুরোধ সার্ভারে পৌঁছায় না। WEBHOOK_URL=https://n8n.example.com/ সেট করুন এবং নিশ্চিত করুন যে নোডটি এমন একটি URL দেখাচ্ছে যাতে কোনো port নেই। দ্বিতীয় কারণ হলো এমন একটি webhook কল করা যার workflow Active মোডে নেই, যা The requested webhook ... is not registered. রিটার্ন করে।

n8n-এ আমার কী কী ব্যাকআপ রাখা উচিত?

দুটি জিনিস। আপনার .env ফাইল থেকে N8N_ENCRYPTION_KEY, কারণ প্রতিটি সংরক্ষিত credential এটি দিয়ে এনক্রিপ্ট করা থাকে এবং এটি হারিয়ে গেলে সেগুলো আর কখনোই ডিক্রিপ্ট করা সম্ভব হবে না; তাই এটি তৈরির দিনই সার্ভারের বাইরে কোথাও কপি করে রাখুন। এবং workflow, history ও credential-এর জন্য Postgres ডাটাবেসের একটি pg_dump। রিস্টোর করার জন্য দুটিই প্রয়োজন: একই কী এবং ডাটাবেস ডাম্প।

আমি কীভাবে n8n-কে HTTPS-এর পেছনে রাখব?

n8n পোর্ট 5678-এ plain HTTP সার্ভ করে; এর সামনে একটি reverse proxy TLS termination সম্পন্ন করে। n8n-কে 127.0.0.1:5678-এ bind করুন যাতে শুধুমাত্র প্রক্সি এটিতে পৌঁছাতে পারে, তারপর automatic certificate-এর জন্য Traefik অথবা Let's Encrypt certificate-এর সাথে nginx ব্যবহার করুন। N8N_PROTOCOL=https এবং WEBHOOK_URL=https://your-host/ সেট করুন এবং নিশ্চিত করুন যে প্রক্সি যেন WebSocket Upgrade হেডারগুলো ফরওয়ার্ড করে, অন্যথায় এডিটর হ্যাং হয়ে যাবে।

আমি কীভাবে নিরাপদে n8n আপগ্রেড করব?

latest-এর পরিবর্তে একটি নির্দিষ্ট image tag ব্যবহার করুন, প্রথমে একটি pg_dump নিন কারণ n8n স্টার্ট হওয়ার সময় স্বয়ংক্রিয়ভাবে মাইগ্রেশন চালায়, ব্রেকিং চেঞ্জগুলোর জন্য রিলিজ নোটগুলো পড়ুন, তারপর ট্যাগটি পরিবর্তন করে docker compose pull n8n && docker compose up -d n8n চালান। কন্টেইনারটি ডিসপোজেবল, তাই আগের ট্যাগটি পিন করে এবং আপগ্রেড-পূর্ববর্তী ডাম্প রিস্টোর করে সহজেই রোলব্যাক করা সম্ভব।