n8n چیست و چگونه آن را با Docker Compose روی VPS نصب کنیم

3 دقیقه خواندن
Tropic
n8n چیست و چگونه آن را با Docker Compose روی VPS نصب کنیم

Language: fa

n8n روی VPS: پلتفرم اتوماسیون اختصاصی شما بدون کار دستی تکراری

درخواستی از وب‌سایت دریافت می‌شود. n8n داده‌ها را اعتبارسنجی می‌کند، موارد تکراری را بررسی می‌کند، یک معامله می‌سازد، با کمک AI پیش‌نویس پاسخ آماده می‌کند و به مدیر در Telegram اطلاع می‌دهد. انسان فقط زمانی وارد فرایند می‌شود که تصمیمی لازم باشد، نه برای جابه‌جایی داده بین زبانه‌های مرورگر.

در ادامه می‌بینیم n8n چگونه کار می‌کند و چگونه آن را با Docker Compose، PostgreSQL، HTTPS و اجرای ایزولهٔ کد روی VPS نصب کنیم.

راه‌اندازی n8n در هفت مرحله

برنامهٔ حداقلی راه‌اندازی:

  1. یک VPS بسازید و یک زیردامنه را به آن متصل کنید؛ برای مثال n8n.example.com.
  2. Docker و Docker Compose را نصب کنید.
  3. n8n را همراه PostgreSQL، اجراکنندهٔ وظیفهٔ خارجی و Caddy اجرا کنید.
  4. رابط کاربری را با HTTPS باز کنید و حساب مالک را بسازید.
  5. Telegram، یک CRM، ایمیل یا هر API خارجی را متصل کنید.
  6. مدیریت خطا و مدت نگهداری داده‌های اجرا را تنظیم کنید.
  7. تهیهٔ نسخهٔ پشتیبان از پایگاه داده، داده‌ها و کلید رمزنگاری را خودکار کنید.

برای یک نصب تولیدی کوچک، شروع با 2 vCPU و 4 GB RAM منطقی است. برای آزمایش معمولاً 2 GB کافی است، اما PostgreSQL، Docker و فرایندهای هم‌زمان خیلی زود منابع باقی‌مانده را مصرف می‌کنند.

n8n چیست و چگونه کار می‌کند

n8n یک پلتفرم اتوماسیون گردش‌کار است. گردش‌کار از گره‌ها ساخته می‌شود: یکی فرایند را آغاز می‌کند، گره‌های بعدی داده را دریافت و تبدیل می‌کنند و گرهٔ پایانی یک عمل را انجام می‌دهد.

یک گردش‌کار ساده چنین شکلی دارد:

Webhook → data validation → CRM → Telegram → website response

یک زنجیره می‌تواند با webhook، زمان‌بندی، ایمیل، پیام یا رویدادی در یک سرویس خارجی آغاز شود. بین گره‌ها شرط‌ها، حلقه‌ها، فیلترها، انتظار و مدیریت خطا در دسترس است.

یکی از نقاط قوت n8n این است که اتوماسیون به یکپارچه‌سازی‌های آماده محدود نمی‌شود. با HTTP Request می‌توانید هر سرویس دارای API را فراخوانی کنید و در گرهٔ Code با JavaScript یا Python منطق سفارشی بنویسید. به همین دلیل n8n بین یک سازندهٔ سادهٔ no-code و کد سفارشی سمت سرور قرار می‌گیرد.

چرا n8n چیزی بیشتر از انتقال داده است

n8n زمانی مفید است که یک فرایند چند سامانه را دربر بگیرد و به تصمیم نیاز داشته باشد:

form → validation → duplicate search → AI assessment → manager approval → CRM

می‌توان انسان را فقط در نقطهٔ کنترل نگه داشت. برای نمونه، AI پاسخ را آماده می‌کند، اما پیام تنها پس از تأیید کارمند برای مشتری ارسال می‌شود.

موارد استفادهٔ معمول:

  • فروش و پشتیبانی: جمع‌آوری درخواست‌ها، تخصیص سرنخ‌ها و ایجاد معاملات؛
  • محتوا و AI: تهیهٔ پیش‌نویس، دسته‌بندی درخواست‌ها و انتشار پس از تأیید؛
  • DevOps: اعلان قطعی، webhookهای Git و بررسی API؛
  • عملیات داخلی: همگام‌سازی صفحه‌گسترده‌ها، ایمیل، تقویم‌ها و سامانه‌های سازمانی.

نصب self-hosted کنترل فرایند و پایگاه داده را در اختیار شما می‌گذارد، اما سرویس‌های خارجی را محلی نمی‌کند. داده‌ای که به Telegram، CRM یا مدل AI ابری فرستاده می‌شود از VPS خارج خواهد شد.

n8n Cloud یا سرور اختصاصی شما

پارامترn8n Cloudn8n روی VPS
راه‌اندازینیازی به تنظیم سرور نیستدامنه، Docker و HTTPS لازم است
به‌روزرسانی‌هاتوسط n8n انجام می‌شودتوسط مالک انجام می‌شود
پایگاه داده و فایل‌هادر زیرساخت سرویسروی سرور انتخاب‌شده
مقیاس‌پذیریمطابق طرح ابریمستقل تنظیم می‌شود
مسئولیتمدیریت کمترپشتیبان‌گیری، امنیت و نظارت بر عهدهٔ مالک است
مناسب برایشروع سریع بدون DevOpsکنترل، سفارشی‌سازی و فرایندهای همیشه‌فعال

Community Edition را می‌توان برای فرایندهای شخصی و داخلی کسب‌وکار به‌صورت self-hosted و رایگان روی سرور خود اجرا کرد. بااین‌حال n8n تحت مجوز سنتی open-source توزیع نمی‌شود، بلکه از fair-code Sustainable Use License استفاده می‌کند. این مجوز استفاده و تغییر داخلی را اجازه می‌دهد، اما اجازه نمی‌دهد n8n را صرفاً مستقر کنید، لوگوی خود را اضافه کنید و دسترسی را به‌عنوان یک SaaS مستقل بفروشید. برای چنین محصولی باید شرایط مجوز جداگانه بررسی شود.

نیازمندی‌های سرور n8n

بار کاری به حجم داده، هم‌زمانی و نوع عملیات بستگی دارد. فایل‌ها، فهرست‌های طولانی، گره‌های Code و گردش‌کارهای AI نسبت به انتقال بسته‌های کوچک JSON بین APIها به حافظهٔ بیشتری نیاز دارند.

سناریوپیکربندی شروع
آزمایش و گردش‌کارهای متنی شخصی1 vCPU، 2 GB RAM، 20 GB NVMe
نصب تولیدی کوچک2 vCPU، 4 GB RAM، 25–40 GB NVMe
فرایندهای هم‌زمان، AI یا فایل‌ها4 vCPU، 8 GB RAM یا بیشتر
چند فرایند worker در queue modeاندازه‌گذاری مطابق حجم اجرا

SQLite برای یادگیری و نصب کوچک تک‌نمونه‌ای مناسب است. PostgreSQL برای محیط تولید راحت‌تر است: پشتیبان‌گیری ساده‌تر می‌شود و مهاجرت بعدی به queue mode نیز آسان‌تر خواهد بود.

نصب n8n روی VPS

این مثال از Ubuntu 24.04، PostgreSQL، Caddy و یک اجراکنندهٔ وظیفهٔ خارجی استفاده می‌کند. n8n.example.com و منطقهٔ زمانی را با مقادیر خودتان جایگزین کنید.

۱. تنظیم DNS و آماده‌سازی سرور

یک رکورد DNS از نوع A بسازید که به آدرس IPv4 سرور VPS اشاره کند، سپس از طریق SSH متصل شوید:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl

Docker Engine و افزونهٔ Compose را از مخزن رسمی نصب کنید:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
docker compose version

فقط دسترسی SSH، HTTP و HTTPS را مجاز کنید:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

تا وقتی از کارکرد اتصال جدید مطمئن نشده‌اید، نشست SSH فعلی را نبندید.

۲. ایجاد متغیرهای محیطی

پوشه را آماده کنید:

mkdir -p /opt/n8n
cd /opt/n8n

فایل .env را بسازید. دستورهای زیر برای PostgreSQL، رمزنگاری n8n و اجراکنندهٔ وظیفه، بلافاصله اسرار تصادفی جداگانه تولید می‌کنند:

cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env

برچسب stable برای اولین راه‌اندازی راحت است. پس از بررسی نصب، بهتر است نسخهٔ مشخصی از n8n را ثابت کنید تا به‌روزرسانی image بعدی ناگهانی انجام نشود.

نباید N8N_ENCRYPTION_KEY را از دست بدهید. n8n از این کلید برای رمزنگاری گذرواژه‌ها، توکن‌ها و اعتبارنامه‌های ذخیره‌شده استفاده می‌کند. اگر فقط PostgreSQL را بدون کلید بازیابی کنید، رکوردها در پایگاه داده می‌مانند، اما n8n نمی‌تواند آن‌ها را بخواند.

۳. ایجاد فایل Docker Compose

فایل compose.yaml را ایجاد کنید:

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

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: "5432"
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}

      N8N_HOST: ${N8N_HOST}
      N8N_PORT: "5678"
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_HOST}
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: "1"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"

      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0

      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: "168"
      EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
    volumes:
      - n8n_data:/home/node/.n8n
    expose:
      - "5678"
    depends_on:
      postgres:
        condition: service_healthy

  n8n-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: unless-stopped
    environment:
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
    depends_on:
      - n8n

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_HOST}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - n8n

volumes:
  postgres_data:
    name: n8n_postgres_data
  n8n_data:
    name: n8n_data
  caddy_data:
    name: n8n_caddy_data
  caddy_config:
    name: n8n_caddy_config

اجراکنندهٔ وظیفهٔ خارجی کد را جدا از فرایند اصلی n8n اجرا می‌کند. این روش از حالت داخلی امن‌تر است و احتمال اثرگذاری خطای گرهٔ Code بر ویرایشگر و پردازش webhook را کاهش می‌دهد.

۴. فعال‌سازی HTTPS

فایل Caddyfile را بسازید:

{$N8N_HOST} {
    reverse_proxy n8n:5678
}

اگر DNS از قبل به VPS اشاره کند و پورت‌های 80 و 443 در دسترس باشند، Caddy گواهی TLS را خودکار دریافت می‌کند. پورت داخلی 5678 در اینترنت منتشر نمی‌شود: از بیرون فقط پورت‌های 80 و 443 در دسترس‌اند و Caddy از طریق شبکهٔ Docker به n8n دسترسی دارد.

متغیرهای N8N_WEBHOOK_URL و N8N_PROXY_HOPS لازم‌اند تا ویرایشگر آدرس‌های عمومی درست برای webhook تولید کند و به سربرگ‌های یک reverse proxy اعتماد داشته باشد.

۵. اجرای n8n

پیکربندی نهایی را اعتبارسنجی کنید و کانتینرها را راه‌اندازی کنید:

docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy

باز کنید:

https://n8n.example.com

حساب مالک را بسازید. گذرواژهٔ آن را با همکاران به اشتراک نگذارید: برای کار تیمی حساب‌های جداگانه بسازید و به هر فرد فقط دسترسی موردنیازش را بدهید.

اولین گردش‌کار کاربردی شما

یک آزمایش مناسب، پردازش درخواستی از یک وب‌سایت است:

  1. یک گرهٔ Webhook با روش POST اضافه کنید.
  2. با Edit Fields فقط نام، نشانی ایمیل و منبع را نگه دارید.
  3. برای رد کردن درخواست فاقد داده‌های ضروری از گرهٔ If استفاده کنید.
  4. در CRM یک معامله بسازید یا با HTTP Request درخواست بفرستید.
  5. اعلان Telegram را اضافه کنید.
  6. زنجیره را با گرهٔ Respond to Webhook تمام کنید.
  7. پس از آزمایش، گردش‌کار را فعال کنید و webhook آزمایشی را با URL تولیدی جایگزین کنید.

این مثال دامنه، HTTPS، درخواست‌های ورودی، اعتبارنامه‌ها و یکپارچه‌سازی خارجی را فوراً بررسی می‌کند. سپس یک Error Workflow جدا اضافه کنید تا هنگام شکست زنجیرهٔ اصلی به شما اطلاع دهد.

ایمن‌سازی n8n پس از نصب

یک نمونهٔ نصب‌شدهٔ n8n خودکار به سامانه‌ای قابل‌اعتماد تبدیل نمی‌شود. پس از راه‌اندازی مطمئن شوید که:

  • ویرایشگر فقط از طریق HTTPS در دسترس است؛
  • .env مجوزهای 600 دارد و در Git قرار نمی‌گیرد؛
  • کلیدهای API خارجی حداقل مجوزهای موردنیاز را دارند؛
  • هر webhook امضا یا راز منبع را بررسی می‌کند؛
  • تاریخچهٔ اجرا به‌صورت خودکار حذف می‌شود؛
  • خطاهای گردش‌کارهای مهم برای مدیر ارسال می‌شوند.

گره‌های Community به‌صورت بسته نصب می‌شوند و ممکن است به داده‌های گردش‌کار و سرور دسترسی پیدا کنند. گره‌های ناشناس را بدون بررسی اضافه نکنید. اگر به آن‌ها نیاز ندارید، با N8N_COMMUNITY_PACKAGES_ENABLED=false غیرفعالشان کنید.

ممیزی داخلی را اجرا کنید:

docker compose exec n8n n8n audit

این کار به شناسایی webhookهای محافظت‌نشده، گره‌های پرخطر و مشکلات اعتبارنامه کمک می‌کند، اما جای بررسی دستی را نمی‌گیرد.

تاریخچهٔ اجرا و داده‌های شخصی

n8n داده‌های ورودی و خروجی را برای رفع اشکال ذخیره می‌کند. همراه با آن‌ها ممکن است پیام‌های ایمیل، شماره‌های تلفن، اسناد و پاسخ‌های API نیز در پایگاه داده باقی بمانند.

در پیکربندی بالا، اجراها پس از هفت روز حذف می‌شوند و تعدادشان به ۱۰٬۰۰۰ محدود است. برای فرایندهای حساس مدت نگهداری را مطابق سیاست نگهداری داده انتخاب کنید و پیش از پایان گردش‌کار، فیلدهای غیرضروری را حذف کنید.

نسخه‌های پشتیبان و به‌روزرسانی‌ها

بازیابی به یک dump از PostgreSQL، volume با نام n8n_data، فایل‌های پیکربندی و فایل .env حاوی N8N_ENCRYPTION_KEY نیاز دارد. پیش از کپی، پردازشگرها را متوقف کنید و PostgreSQL را روشن نگه دارید. این کار وقفه‌ای کوتاه در اجرای گردش‌کار ایجاد می‌کند:

cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner

docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
  | gzip > "backup/n8n-db-$(date +%F).sql.gz"

docker run --rm \
  -v n8n_data:/source:ro \
  -v "$PWD/backup":/backup \
  alpine sh -c \
  'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'

tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
  .env compose.yaml Caddyfile

docker compose start n8n n8n-runner

آرشیوی که .env را دربر دارد حاوی اسرار است: آن را رمزنگاری کنید و خارج از VPS نگه دارید. با انجام یک بازیابی آزمایشی، نسخهٔ پشتیبان را به‌صورت دوره‌ای بررسی کنید.

پیش از به‌روزرسانی نسخهٔ پشتیبان بگیرید و یادداشت‌های انتشار را بخوانید:

cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps

اجراکنندهٔ وظیفه و کانتینر اصلی باید از یک برچسب نسخه استفاده کنند.

چه زمانی مقیاس‌پذیری لازم می‌شود

پیش از وجود بار واقعی با Redis و چند worker شروع نکنید. نگهداری یک نمونه با PostgreSQL ساده‌تر است و معمولاً برای فرایندهای داخلی کوچک کافی خواهد بود.

Queue mode زمانی لازم می‌شود که وظایف طولانی webhookها را به تأخیر بیندازند، گردش‌کارهای زیادی هم‌زمان شروع شوند یا پردازش فایل مرتباً تمام حافظهٔ موجود را مصرف کند. در این ساختار نمونهٔ اصلی رویدادها را دریافت می‌کند، Redis کارها را توزیع می‌کند و workerها آن‌ها را موازی اجرا می‌کنند. همهٔ اجزا باید به یک پایگاه دادهٔ PostgreSQL متصل شوند و از همان N8N_ENCRYPTION_KEY استفاده کنند.

کدام VPS را برای n8n انتخاب کنیم

برای اجرای هم‌زمان n8n، PostgreSQL، Caddy و اجراکنندهٔ وظیفه، شروع با 2 vCPU، 4 GB RAM و دیسک NVMe منطقی است. در tropic.host، طرح Light با این پیکربندی مطابقت دارد: 2 vCPU، 4 GB RAM و 25 GB NVMe. این مقدار برای نخستین گردش‌کارهای تولیدی بدون پردازش سنگین فایل کافی است.

برای اسناد، مجموعه‌داده‌های بزرگ و گردش‌کارهای متعدد AI که هم‌زمان اجرا می‌شوند، 8 GB RAM انتخاب بهتری است. شبکهٔ پایدار نیز مهم است: webhookها، callbackهای OAuth و وظایف زمان‌بندی‌شده باید پیوسته در دسترس بمانند.

جمع‌بندی

n8n عملیات تکراری را به جریان‌های بصری روشن تبدیل می‌کند: گره‌های آماده راه‌اندازی را سریع‌تر می‌کنند، HTTP Request تقریباً هر API را متصل می‌کند و گرهٔ Code امکان افزودن منطق اختصاصی را می‌دهد.

نسخهٔ self-hosted کنترل سرور و پایگاه داده را در اختیار شما می‌گذارد، اما به HTTPS، کلیدهای محدود، پاک‌سازی تاریخچه و نسخه‌های پشتیبان آزمایش‌شده نیاز دارد. N8N_ENCRYPTION_KEY را همراه PostgreSQL نگه دارید؛ بدون آن اعتبارنامه‌های بازیابی‌شده قابل رمزگشایی نیستند.

FAQ

آیا n8n رایگان است؟

بله. Community Edition را می‌توان برای فرایندهای شخصی و داخلی، رایگان روی سرور خود میزبانی کرد. فروش مجدد hosted n8n به‌عنوان SaaS مستقل، طبق مجوز fair-code محدود است.

آیا نصب n8n بدون دامنه ممکن است؟

برای آزمایش محلی بله. برای webhookهای عمومی و OAuth بهتر است از دامنه و HTTPS استفاده کنید.

n8n به چه مقدار RAM نیاز دارد؟

گردش‌کارهای شخصی ساده اغلب با 2 GB RAM اجرا می‌شوند. برای n8n همراه PostgreSQL، Caddy و اجراکنندهٔ وظیفه، 4 GB منطقی‌تر است؛ فایل‌ها و اجراهای هم‌زمان ممکن است به 8 GB یا بیشتر نیاز داشته باشند.

آیا همهٔ داده‌ها داخل VPS باقی می‌مانند؟

فقط داده‌ای که گردش‌کار به جای دیگری ارسال نمی‌کند در VPS می‌ماند. پایگاه داده و تاریخچهٔ اجرا روی VPS ذخیره می‌شوند، اما گره‌های Telegram، CRM یا مدل AI خارجی داده‌های انتخاب‌شده را به سرویس مربوطه می‌فرستند.

نسخهٔ پشتیبان n8n باید شامل چه چیزهایی باشد؟

یک dump از PostgreSQL، volume با نام n8n_data، فایل‌های compose.yaml و Caddyfile و فایل .env حاوی N8N_ENCRYPTION_KEY. نسخهٔ پشتیبان را خارج از VPS و به‌صورت رمزنگاری‌شده نگه دارید و با بازیابی آن را بررسی کنید.