لوگوی هاکان سرور
لوگوی هاکان سرور

نصب n8n روی سرور مجازی با داکر و دامنه؛ از HTTPS تا بکاپ

گره‌های ورک‌فلو n8n که از یک سرور مجازی به آیکون‌های پیام، ایمیل و جدول وصل شده‌اند
فهرست مطالب
  1. n8n چیست و به چه کاری می‌آید؟
  2. مفاهیم پایهٔ n8n
  3. کاربردهای واقعی n8n
  4. مجوز fair-code: رایگان، با یک شرط
  5. خودمیزبان یا n8n Cloud؟
  6. سرور مناسب n8n: ایران یا خارج؟
  7. منابع پیشنهادی سرور
  8. آماده‌سازی سرور: دامنه، Docker و فایروال
  9. ساخت رکورد DNS برای زیردامنه
  10. نصب Docker Engine و Docker Compose
  11. فایروال و نکتهٔ مهم Docker
  12. نصب n8n با Docker Compose، PostgreSQL و Caddy
  13. مرحلهٔ ۱: پوشهٔ پروژه و فایل .env
  14. مرحلهٔ ۲: فایل compose.yaml
  15. مرحلهٔ ۳: فایل Caddyfile
  16. مرحلهٔ ۴: اجرا و بررسی سلامت
  17. اگر از قبل Nginx دارید
  18. متغیرهای محیطی مهم n8n
  19. ساخت حساب مالک و اولین ورک‌فلو
  20. حساب مالک و ورود دومرحله‌ای
  21. ورک‌فلو نمونه: پیام تلگرام برای هر فرم جدید
  22. آدرس تست و آدرس Production
  23. بکاپ و بازگردانی n8n
  24. اسکریپت بکاپ روزانه
  25. بازگردانی روی همین سرور یا سرور جدید
  26. به‌روزرسانی امن n8n
  27. عیب‌یابی رایج n8n روی سرور
  28. چک‌لیست امنیت n8n
  29. سرور n8n در هاکان سرور
  30. پرسش‌های متداول
  31. آیا n8n رایگان است؟
  32. برای نصب n8n چقدر رم لازم است؟
  33. آیا می‌توان n8n را روی هاست اشتراکی cPanel یا با npm نصب کرد؟
  34. آیا n8n روی سرور ایران کار می‌کند؟
  35. آیا می‌توانم با n8n برای مشتری ورک‌فلو بسازم و هزینه بگیرم؟
  36. آیا بدون دامنه و HTTPS می‌شود از n8n استفاده کرد؟
  37. جمع‌بندی

برای نصب n8n روی سرور مجازی، مسیر توصیه‌شده این است که n8n، دیتابیس PostgreSQL و وب‌سرور Caddy را با Docker Compose کنار هم اجرا کنید تا n8n روی یک زیردامنه با HTTPS خودکار بالا بیاید. در این راهنما همهٔ فایل‌ها، دستورها و تنظیمات لازم را قدم‌به‌قدم و آمادهٔ کپی می‌بینید.

n8n ابزار اتوماسیون ورک‌فلو (Workflow Automation) است و سرویس‌ها و APIها را به هم وصل می‌کند؛ مثلاً هر پیام فرم سایت را به تلگرام می‌فرستد. نسخهٔ خودمیزبان (Self-hosted) روی سرور خودتان اجرا می‌شود و داده‌ها و اطلاعات ورود سرویس‌ها نزد خودتان می‌ماند.

دستورهای این مقاله در آبان ۱۴۰۵ با مستندات رسمی تطبیق داده شده‌اند؛ در زمان نگارش، نسخهٔ پایدار n8n شمارهٔ 2.45.7 است و n8n 3.0 هنوز پیش‌انتشار (Pre-release) است. آموزش‌هایی که از N8N_BASIC_AUTH_ACTIVE یا MySQL و MariaDB استفاده می‌کنند قدیمی‌اند: اولی از نسخهٔ 1.0 و پشتیبانی از این دو دیتابیس از نسخهٔ 2.0 حذف شده است. نصب با npm هم از n8n 3.0 دیگر پشتیبانی نمی‌شود.

به‌طور خلاصه: نصب n8n روی سرور در ۶ گام:

  1. سرور Ubuntu 24.04 یا 26.04 با دست‌کم ۲ گیگابایت رم؛ برای تلگرام، OpenAI و گوگل، خارج از ایران.
  2. رکورد A مثل n8n.example.com به IP سرور.
  3. نصب Docker Engine و Compose از مخزن رسمی Docker.
  4. ساخت .env، compose.yaml و Caddyfile و اجرای docker compose up -d.
  5. ساخت حساب مالک (Owner) و روشن کردن ورود دومرحله‌ای.
  6. بکاپ خودکار از روز اول و ثابت نگه داشتن (Pin) نسخهٔ n8n.

n8n چیست و به چه کاری می‌آید؟

n8n اتوماسیون را به شکل نمودار می‌سازد: هر مرحله یک جعبه است و داده از جعبه‌ای به جعبهٔ بعد می‌رود. صدها نود آماده دارد و هر جا نود آماده نباشد، با نود HTTP Request به هر API وصل می‌شوید یا در نود Code جاوااسکریپت یا پایتون می‌نویسید.

مفاهیم پایهٔ n8n

  • ورک‌فلو (Workflow): زنجیرهٔ مراحلی که با یک رویداد شروع می‌شود.
  • نود (Node): هر مرحله؛ مثل «ارسال پیام تلگرام» یا «درخواست HTTP».
  • تریگر (Trigger): نود شروع‌کننده؛ مثل زمان‌بندی (Schedule)، وب‌هوک (Webhook) یا ارسال فرم.
  • اعتبارنامه (Credential): توکن یا رمز اتصال به سرویس‌ها که رمزنگاری‌شده در دیتابیس می‌ماند.
  • اجرا (Execution): سابقهٔ هر بار اجرا با ورودی و خروجی همهٔ نودها، برای عیب‌یابی.

کاربردهای واقعی n8n

  • اعلان تلگرام یا ایمیل برای هر سفارش ووکامرس، فرم تماس یا تیکت جدید.
  • ثبت خودکار پاسخ فرم‌ها در Google Sheets یا یک جدول دیتابیس.
  • گزارش صبحگاهی که آمار دیروز را از چند سرویس جمع می‌کند.
  • ایجنت هوش مصنوعی (AI Agent) با مدل‌هایی مثل OpenAI یا Claude برای دسته‌بندی ایمیل‌ها یا پیش‌نویس پاسخ.
  • پایش یک آدرس و هشدار در صورت قطعی.

مجوز fair-code: رایگان، با یک شرط

n8n به معنای دقیق متن‌باز نیست؛ کدش در دسترس است اما با مجوز Sustainable Use License منتشر می‌شود که n8n آن را fair-code می‌نامد. استفادهٔ داخلی کسب‌وکار و استفادهٔ شخصی رایگان است و می‌توانید برای مشتری ورک‌فلو بسازید و بابت راه‌اندازی و نگهداری‌اش هزینه بگیرید؛ اما نمی‌توانید n8n را به‌صورت سرویس به مشتری بدهید تا خودش ورک‌فلو بسازد، یا آن را با برند خودتان (White-label) عرضه کنید. جزئیات در صفحهٔ مجوز n8n آمده است.

خودمیزبان یا n8n Cloud؟

مورد n8n Cloud خودمیزبان (Community)
نگهداری با n8n با شما
هزینه اشتراک ماهانه بر اساس تعداد اجرا فقط هزینهٔ سرور
پرداخت ارزی با کارت بین‌المللی بسته به ارائه‌دهندهٔ سرور
محل داده‌ها سرورهای n8n سرور خودتان

اگر نمی‌خواهید نگهداری سرور را خودتان انجام دهید و پرداخت ارزی برایتان ممکن است، n8n Cloud منطقی‌تر است. برای یادگیری می‌توانید n8n را روی کامپیوتر خودتان با Docker اجرا کنید؛ اما از اینترنت داخل ایران، دریافت ایمیج از Docker Hub با همان خطای 403 بخش بعد روبه‌رو می‌شود. پس برای بیشتر خوانندگان داخل ایران، ساده‌ترین محیط آزمایش یک سرور مجازی خارجی کوچک است. سرور برای کار واقعی هم لازم است: وقتی ورک‌فلوها باید شبانه‌روز روشن باشند و وب‌هوک‌ها از اینترنت در دسترس باشند.

سرور مناسب n8n: ایران یا خارج؟

n8n تقریباً همیشه با سرویس‌های خارجی حرف می‌زند و روی سرور داخل ایران به این محدودیت‌ها برمی‌خورد:

  • Docker: این شرکت به دلیل مقررات صادراتی آمریکا IPهای ایران را مسدود می‌کند و docker pull با خطای 403 Forbidden متوقف می‌شود. ایمیج‌های n8n و PostgreSQL روی همین Docker Hub هستند و مخزن نصب Docker هم ممکن است در دسترس نباشد.
  • تلگرام: api.telegram.org در ایران فیلتر است و نودهای Telegram روی سرور ایران کار نمی‌کنند.
  • هوش مصنوعی و گوگل: API شرکت OpenAI درخواست IP ایران را با خطای 403 و کد unsupported_country_region_territory رد می‌کند و بسیاری از سرویس‌های توسعه‌دهندهٔ گوگل هم برای ایران در دسترس نیستند.
  • اختلال اینترنت بین‌الملل: ورک‌فلوهای سرور ایران که به سرویس خارجی وابسته‌اند، با هر اختلال می‌ایستند.

روی سرور خارج وضع برعکس است: هنگام اختلال شاید از ایران به پنل دسترسی نداشته باشید، اما ورک‌فلوهای متکی به سرویس‌های خارجی کارشان را ادامه می‌دهند. در مقابل، برخی سرویس‌های داخلی مثل بعضی درگاه‌ها و پنل‌های پیامک ممکن است فقط IP ایران یا IP ثبت‌شده را بپذیرند؛ مستندات همان سرویس را بخوانید. اگر همهٔ سرویس‌هایتان داخلی‌اند، سرور مجازی ایران هم شدنی است، به شرط آنکه نصب Docker و دریافت ایمیج‌ها را جداگانه حل کنید. برای بیشتر کاربردهای n8n یک سرور مجازی خارجی انتخاب عملی‌تر است.

منابع پیشنهادی سرور

n8n برای این چیدمان حداقل مشخصات رسمی اعلام نکرده است. سه ردیف اول برآورد ما برای همین چیدمان است و ردیف آخر عدد رسمی n8n برای دستیار هوش مصنوعی داخلی آن (n8n Assistant) با sandbox.

کاربری رم پردازنده دیسک
آزمایش و یادگیری ۱ تا ۲ گیگابایت ۱ هسته ۱۰ گیگابایت
شخصی و کسب‌وکار کوچک ۲ گیگابایت ۱ تا ۲ هسته ۲۰ تا ۴۰ گیگابایت
ایجنت AI، فایل حجیم، چند کاربر ۴ گیگابایت به بالا ۲ هسته به بالا ۴۰ گیگابایت به بالا
n8n Assistant با sandbox دست‌کم ۴ گیگابایت دست‌کم ۲ vCPU بسته به کار

مصرف رم بیشتر به حجم داده‌ای بستگی دارد که هر اجرا جابه‌جا می‌کند، نه تعداد ورک‌فلوها. کوچک شروع کنید و اگر در لاگ‌ها JavaScript heap out of memory دیدید، رم را بیشتر کنید.

آماده‌سازی سرور: دامنه، Docker و فایروال

فرض این بخش Ubuntu 24.04 LTS یا 26.04 LTS و کاربری با دسترسی sudo است. برای ورود به سرور، آموزش اتصال به سرور لینوکسی از طریق SSH را ببینید.

ساخت رکورد DNS برای زیردامنه

در پنل DNS یک رکورد A با نام n8n و مقدار IP سرور بسازید. برای دامنهٔ .ir، رکورد را در همان سرویس DNS بسازید که nameserverهای دامنه در nic.ir به آن اشاره می‌کنند. ساده‌ترین حالت، رکورد مستقیم و بدون پروکسی CDN است. سپس روی سرور بررسی کنید:

getent hosts n8n.example.com
# expected:
# 203.0.113.10    n8n.example.com

نصب Docker Engine و Docker Compose

از بسته‌های رسمی Docker استفاده کنید، نه docker.io و docker-compose مخزن اوبونتو. دستور اول بسته‌های ناسازگار را حذف می‌کند (اگر نصب نباشند، apt فقط اعلام می‌کند):

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)

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

sudo tee /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

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker --version
docker compose version
# Docker version 29.x.x, build ...
# Docker Compose version v5.x.x

شمارهٔ نسخه‌ها ممکن است فرق کند؛ مهم این است که docker compose (با فاصله) جواب بدهد. منبع این دستورها راهنمای رسمی نصب Docker روی Ubuntu است.

فایروال و نکتهٔ مهم Docker

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp    # HTTP/3 (optional)
sudo ufw enable
sudo ufw status verbose

اگر پورت SSH را عوض کرده‌اید، به‌جای OpenSSH همان پورت را باز کنید. توضیح بیشتر در فعال‌سازی فایروال در لینوکس آمده است.

هشدار: طبق مستندات Docker، پورتی که با ports منتشر شود از قوانین ufw عبور نمی‌کند و عملاً روی اینترنت باز است. به همین دلیل در این چیدمان فقط Caddy پورت‌های 80 و 443 را منتشر می‌کند و n8n (5678) و PostgreSQL (5432) هیچ پورتی روی سرور باز نمی‌کنند.

نصب n8n با Docker Compose، PostgreSQL و Caddy

سرویس ایمیج وظیفه
postgres postgres:18 دیتابیس ورک‌فلوها، اجراها و Credentialها
n8n n8nio/n8n:2.45.7 ویرایشگر، وب‌هوک‌ها و اجرای ورک‌فلوها
runners n8nio/runners:2.45.7 اجرای ایزولهٔ کد نود Code
caddy caddy:2 پروکسی معکوس و HTTPS خودکار

مستندات n8n، SQLite پیش‌فرض را برای آزمایش مناسب می‌داند و برای نمونه‌ای که شبانه‌روز کار می‌کند PostgreSQL (نسخه‌های 16 تا 18) را توصیه می‌کند. Task Runner هم تنها لایهٔ جداکنندهٔ کد نود Code از خود n8n است؛ حالت داخلی (internal) آن از n8n 3.0 منسوخ شده و حالت خارجی (external) برای سرور واقعی توصیه می‌شود.

مرحلهٔ ۱: پوشهٔ پروژه و فایل .env

این دستورها رمز دیتابیس، کلید رمزنگاری و توکن Task Runner را تصادفی می‌سازند:

sudo mkdir -p /opt/n8n
sudo chown "$USER": /opt/n8n
cd /opt/n8n

cat > .env <<EOF
N8N_VERSION=2.45.7
N8N_DOMAIN=n8n.example.com
GENERIC_TIMEZONE=Asia/Tehran
POSTGRES_USER=n8n
POSTGRES_DB=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 24)
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
N8N_RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env
cat .env

زیردامنهٔ خودتان را به‌جای n8n.example.com بنویسید و پیش از نصب، آخرین نسخهٔ پایدار را در صفحهٔ Releases گیت‌هاب n8n ببینید و در N8N_VERSION بگذارید. یک نسخه از N8N_ENCRYPTION_KEY را در مدیر رمز عبور نگه دارید: همهٔ Credentialها با این کلید رمزنگاری می‌شوند و بدون آن، بکاپ دیتابیس هم آن‌ها را برنمی‌گرداند.

هشدار: کلید را بعد از اولین اجرا عوض نکنید. اگر n8n یک بار بدون این متغیر اجرا شود، خودش کلیدی در /home/node/.n8n/config می‌سازد و گذاشتن کلید دیگری در .env به خطای Mismatching encryption keys می‌رسد.

مرحلهٔ ۲: فایل compose.yaml

با nano compose.yaml فایل را بسازید. همهٔ مقادیر از .env خوانده می‌شوند و لازم نیست چیزی را تغییر دهید:

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

  n8n:
    image: n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_DOMAIN}
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_DOMAIN}/
      N8N_WEBHOOK_URL: https://${N8N_DOMAIN}/
      N8N_PROXY_HOPS: "1"
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}
      NODE_ENV: production
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      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_RUNNERS_MODE: external
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
      N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN}
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy

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

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

volumes:
  db_data:
  n8n_data:
  caddy_data:
  caddy_config:
  • ایمیج‌های n8nio/n8n و n8nio/runners هر دو از N8N_VERSION خوانده می‌شوند؛ طبق مستندات n8n این دو باید هم‌نسخه باشند.
  • در PostgreSQL 18 مسیر پیش‌فرض داده به /var/lib/postgresql/18/docker تغییر کرده و حجم باید به /var/lib/postgresql وصل شود. اگر طبق آموزش‌های قدیمی حجم را به /var/lib/postgresql/data وصل کنید و PGDATA را صریحاً روی همین مسیر نگذارید، کانتینر Postgres با خطای in 18+, these Docker images are configured… بالا نمی‌آید. نمونهٔ رسمی n8n به همین دلیل PGDATA را تنظیم می‌کند.
  • کلید قدیمی version: بالای فایل لازم نیست؛ Compose جدید آن را منسوخ می‌داند.

مرحلهٔ ۳: فایل Caddyfile

با nano Caddyfile این چند خط را بنویسید. Caddy نام دامنه را از متغیر N8N_DOMAIN می‌خواند، پس این فایل هم ویرایش لازم ندارد:

{$N8N_DOMAIN} {
    reverse_proxy n8n:5678 {
        flush_interval -1
    }
}

Caddy برای دامنهٔ عمومی خودش از Let’s Encrypt یا ZeroSSL گواهی می‌گیرد، تمدیدش می‌کند و HTTP را به HTTPS می‌برد (مستندات HTTPS خودکار Caddy). هدرهای X-Forwarded-* را هم می‌فرستد و WebSocket را عبور می‌دهد؛ همان چیزی که n8n پشت پروکسی معکوس (Reverse Proxy) لازم دارد. خط flush_interval -1 از نمونهٔ رسمی n8n است و پاسخ‌ها را بدون بافر می‌رساند.

مرحلهٔ ۴: اجرا و بررسی سلامت

cd /opt/n8n
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps --format "table {{.Service}}\t{{.Status}}"
# SERVICE    STATUS
# caddy      Up 40 seconds
# n8n        Up 41 seconds
# postgres   Up 52 seconds (healthy)
# runners    Up 40 seconds

sudo docker compose logs -f n8n    # Ctrl+C to exit
# Editor is now accessible via:
# https://n8n.example.com

curl -s https://n8n.example.com/healthz
# {"status":"ok"}

sudo ss -tlnp | grep -E ':(5678|5432)\b'
# (no output = internal ports are closed)

اگر curl خطای گواهی داد، چند دقیقه صبر کنید و sudo docker compose logs caddy را بخوانید؛ علت معمولاً رکورد DNS یا پورت بسته است.

اگر از قبل Nginx دارید

سرویس caddy را از Compose حذف کنید، به سرویس n8n فقط روی localhost پورت بدهید (ports: ["127.0.0.1:5678:5678"]) و این پیکربندی را در /etc/nginx/sites-available/n8n بگذارید:

server {
    listen 80;
    server_name n8n.example.com;
    client_max_body_size 16m;    # nginx default is 1m

    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_set_header X-Forwarded-Host $host;
        proxy_buffering off;
        proxy_read_timeout 3600s;
    }
}
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/n8n
sudo nginx -t && sudo systemctl reload nginx
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d n8n.example.com

خطوط Upgrade و Connection حیاتی‌اند؛ بدون آن‌ها WebSocket عبور نمی‌کند، ویرایشگر پیام Connection lost می‌دهد و تریگرهای تستی منتظر می‌مانند. خط client_max_body_size هم لازم است، چون Nginx به‌طور پیش‌فرض درخواست‌های بزرگ‌تر از ۱ مگابایت را با خطای 413 رد می‌کند؛ اگر فرم‌هایتان فایل بزرگ‌تری می‌گیرند، عددش را بیشتر کنید. Certbot بلوک HTTPS و تمدید خودکار را خودش اضافه می‌کند. اگر Caddyfile نساخته‌اید، نامش را از خط tar اسکریپت بکاپ هم بردارید.

متغیرهای محیطی مهم n8n

متغیر مقدار کاربرد
N8N_HOST دامنهٔ شما نام میزبان n8n
N8N_PROTOCOL https پروتکل آدرس عمومی (پیش‌فرض http)
N8N_WEBHOOK_URL https://دامنه/ آدرس پایهٔ وب‌هوک‌ها پشت پروکسی
N8N_EDITOR_BASE_URL https://دامنه/ آدرس ویرایشگر در ایمیل‌ها و لینک‌ها
N8N_PROXY_HOPS 1 تعداد پروکسی‌های جلوی n8n
N8N_ENCRYPTION_KEY رشتهٔ تصادفی رمزنگاری Credentialها
GENERIC_TIMEZONE Asia/Tehran منطقهٔ زمانی نودهای زمان‌بندی (پیش‌فرض America/New_York)
N8N_RUNNERS_MODE external اجرای کد در کانتینر جدا
EXECUTIONS_DATA_MAX_AGE پیش‌فرض 336 حذف تاریخچهٔ اجراها پس از ۳۳۶ ساعت

N8N_WEBHOOK_URL جانشین WEBHOOK_URL است؛ نام قدیمی از نسخهٔ 2.35 منسوخ شده ولی هنوز کار می‌کند و در نسخه‌های قدیمی‌تر از 2.30 باید همان را بگذارید. فهرست کامل در مستندات متغیرهای محیطی n8n است. پس از هر تغییر در .env یا compose.yaml، sudo docker compose up -d بزنید؛ دستور restart متغیرهای جدید را اعمال نمی‌کند.

ساخت حساب مالک و اولین ورک‌فلو

حساب مالک و ورود دومرحله‌ای

  1. آدرس https://n8n.example.com را باز کنید و در فرم Set up owner account ایمیل، نام و رمزی با دست‌کم ۸ کاراکتر، یک عدد و یک حرف بزرگ وارد کنید.
  2. برای ورود دومرحله‌ای به Settings ← Personal بروید و Enable 2FA را بزنید، QR را با برنامهٔ Authenticator اسکن کنید، کد را وارد کنید و کدهای بازیابی را ذخیره کنید.
  3. اختیاری: در Settings ← Usage and plan ← Unlock با ثبت ایمیل یک کلید رایگان بگیرید که پوشه‌بندی ورک‌فلوها و چند امکان دیباگ را باز می‌کند.

بدون تنظیم SMTP، بازیابی رمز با ایمیل ممکن نیست؛ رمز مالک را در مدیر رمز عبور نگه دارید. اگر برنامهٔ Authenticator و کدهای بازیابی را از دست دادید، ورود دومرحله‌ای را از خط فرمان خاموش کنید:

sudo docker compose exec -u node n8n n8n mfa:disable --email=you@example.com

دستور n8n user-management:reset هم برای فراموشی رمز بدون SMTP وجود دارد، اما همهٔ حساب‌های کاربری را حذف می‌کند.

ورک‌فلو نمونه: پیام تلگرام برای هر فرم جدید

این مثال هر پاسخ فرم تماس را به تلگرام شما می‌فرستد و فقط روی سرور خارج از ایران کار می‌کند.

  1. در تلگرام به @BotFather پیام دهید، /newbot را بفرستید، نام و نام کاربری ربات (با پایان bot) را وارد و توکن را کپی کنید.
  2. به ربات خودتان /start بفرستید و روی سرور شناسهٔ چت را بگیرید؛ عدد جلوی "chat":{"id": همان Chat ID است:
    curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates"
    # ... "chat":{"id":123456789,"first_name":"Ali","type":"private"} ...
  3. در n8n روی Create workflow و سپس Add first step… بزنید، Form را جست‌وجو و On form submission را انتخاب کنید.
  4. در Form Title بنویسید «تماس با ما» و با Add Form Element سه فیلد بسازید: «نام» (Text Input)، «ایمیل» (Email) و «پیام» (Textarea). برای هر فیلد از Add Attributes مقدار Custom Field Name را به ترتیب name، email و message بگذارید.
  5. روی + بعد از تریگر بزنید، Telegram را جست‌وجو و Send a text message را انتخاب کنید. در Credential گزینهٔ Create new credential را بزنید و توکن را در Access Token بگذارید.
  6. در Chat ID عدد مرحلهٔ ۲ را بنویسید و کادر Text را روی Expression بگذارید (متن فارسی هم مشکلی ندارد). برای حذف جملهٔ تبلیغ n8n از انتهای پیام، از Add Field گزینهٔ Append n8n Attribution را خاموش کنید.
    New message from the contact form
    Name: {{ $json.name }}
    Email: {{ $json.email }}
    Message: {{ $json.message }}
  7. Execute workflow را بزنید، فرم آزمایشی را پر کنید و رسیدن پیام را ببینید.
  8. روی Publish بزنید و آدرس Production فرم (https://n8n.example.com/form/...) را در سایت بگذارید.

آدرس تست و آدرس Production

هر تریگر وب‌هوکی دو آدرس دارد: /webhook-test/ که فقط هنگام Execute workflow فعال است و /webhook/ که پس از Publish همیشه فعال می‌ماند. در n8n 2.x دکمهٔ Publish جای کلید قدیمی Active را گرفته است: ویرایش‌ها خودکار ذخیره می‌شوند، اما تا دوباره Publish نکنید نسخهٔ قبلی اجرا می‌شود. تلگرام برای هر ربات فقط یک وب‌هوک می‌پذیرد؛ پس هنگام تست Telegram Trigger، ورک‌فلو را Unpublish کنید یا ربات جداگانه‌ای برای تست بسازید.

بکاپ و بازگردانی n8n

طبق مستندات بکاپ n8n، بکاپ کامل یعنی دیتابیس به‌همراه پوشهٔ .n8n که کلید رمزنگاری در آن است؛ در این چیدمان .env، compose.yaml و Caddyfile را هم نگه دارید. خروجی دستورهای n8n export:workflow و n8n export:credentials فقط ورک‌فلوها و Credentialها را دارد و جای بکاپ کامل را نمی‌گیرد.

اسکریپت بکاپ روزانه

فایل /opt/n8n/backup.sh را بسازید:

#!/usr/bin/env bash
set -euo pipefail
umask 077
cd /opt/n8n
TS=$(date +%F-%H%M)
mkdir -p backups

# 1) PostgreSQL dump (custom format)
docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc' > "backups/db-$TS.dump"

# 2) n8n home folder (encryption key, settings, binary data)
docker compose cp n8n:/home/node/.n8n "backups/n8n-home-$TS"
tar czf "backups/n8n-home-$TS.tar.gz" -C backups "n8n-home-$TS"
rm -rf "backups/n8n-home-$TS"

# 3) config files
tar czf "backups/config-$TS.tar.gz" .env compose.yaml Caddyfile

# keep 14 days
find backups -type f -mtime +14 -delete
sudo chmod 700 /opt/n8n/backup.sh
sudo /opt/n8n/backup.sh && sudo ls -lh /opt/n8n/backups
sudo crontab -e
# add this line:
30 3 * * * /opt/n8n/backup.sh >> /var/log/n8n-backup.log 2>&1

cron با ساعت سیستم کار می‌کند که اغلب UTC است (timedatectl). بکاپی که فقط روی همان سرور بماند با خرابی دیسک از بین می‌رود. یک نسخه را مرتب بیرون از سرور نگه دارید؛ مثلاً با scp یا SFTP روی کامپیوتر خودتان یا یک هاست بکاپ خارج.

بازگردانی روی همین سرور یا سرور جدید

روی سرور جدید، اول Docker را مثل بخش نصب Docker راه بیندازید و رکورد A را به IP تازه برگردانید تا Caddy بتواند گواهی بگیرد. سپس پوشه را بسازید، فایل‌های بکاپ را در /opt/n8n/backups کپی کنید و دستورها را به ترتیب اجرا کنید (تاریخ نام فایل‌ها را با بکاپ خودتان عوض کنید):

# new server only
sudo mkdir -p /opt/n8n/backups
sudo chown -R "$USER": /opt/n8n
# copy the backup files into /opt/n8n/backups, then:

cd /opt/n8n
sudo tar xzf backups/config-2026-11-01-0330.tar.gz -C /opt/n8n
sudo docker compose stop n8n runners    # same server only
sudo docker compose up -d --wait postgres
sudo cat backups/db-2026-11-01-0330.dump | sudo docker compose exec -T postgres sh -c 'pg_restore -U "$POSTGRES_USER" -d "$POSTGRES_DB" --clean --if-exists'
sudo docker compose up -d

روی همین سرور، پیش از بازگردانی n8n و runners را متوقف کنید تا هنگام پاک‌شدن و ساخت دوبارهٔ جدول‌ها به دیتابیس وصل نباشند. گزینهٔ --wait هم صبر می‌کند تا PostgreSQL سالم (healthy) شود؛ بدون آن، روی سرور جدید ممکن است بازگردانی وسط راه‌اندازی اولیهٔ دیتابیس ناقص بماند.

آرشیو config فایل .env را با همان کلید رمزنگاری برمی‌گرداند؛ پس همین آرشیو و دیتابیس برای برگرداندن ورک‌فلوها، کاربران و Credentialها کافی‌اند. آرشیو .n8n فقط برای فایل‌های باینری اجراهای قبلی لازم است.

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

n8n تقریباً هر هفته نسخهٔ جدید می‌دهد و مستنداتش توصیه می‌کند دست‌کم ماهی یک بار به‌روزرسانی کنید. مستندات تگ stable را برای محیط عملیاتی معرفی می‌کند، اما پیشنهاد ما این است که مثل راهنمای رسمی Docker Compose، شمارهٔ دقیق نسخه را در N8N_VERSION ثابت کنید تا ارتقا فقط با تصمیم خودتان انجام شود؛ به‌خصوص که با پایدار شدن n8n 3.0، تگ‌های latest و stable با اولین pull شما را بی‌خبر یک نسخهٔ اصلی جلو می‌برند. روال امن:

  1. یادداشت انتشار را در صفحهٔ Releases در گیت‌هاب n8n بخوانید.
  2. بکاپ بگیرید و N8N_VERSION را در .env عوض کنید.
  3. ایمیج‌ها را بگیرید، کانتینرها را بازسازی کنید، لاگ را ببینید و یک ورک‌فلو مهم را دستی اجرا کنید.
cd /opt/n8n
sudo ./backup.sh
nano .env    # set N8N_VERSION to the new version
sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f n8n
sudo docker image prune -f

n8n هنگام اجرای نسخهٔ جدید ساختار دیتابیس را مهاجرت (Migrate) می‌دهد؛ اگر به نسخهٔ قبل برگشتید، دیتابیس را هم از بکاپ پیش از به‌روزرسانی برگردانید. تگ postgres:18 را به نسخهٔ اصلی بعدی تغییر ندهید؛ ارتقای نسخهٔ اصلی PostgreSQL با عوض‌کردن تگ انجام نمی‌شود.

نکته: پیش از رفتن از 2.x به 3.0، گزارش Settings ← Migration Report را ببینید که ورک‌فلوهای نیازمند تغییر را فهرست می‌کند، و صفحهٔ تغییرات ناسازگار n8n 3.0 را بخوانید؛ از جمله: سقف پیش‌فرض زمان اجرای کد در Task Runner از ۵ دقیقه به ۱ دقیقه می‌رسد و نصب نودهای انجمنی تأییدنشده به‌طور پیش‌فرض غیرفعال می‌شود.

عیب‌یابی رایج n8n روی سرور

نشانه علت محتمل راه‌حل
پیام Your n8n server is configured to use a secure cookie ورود با http یا IP:5678 با آدرس https دامنه وارد شوید
آدرس وب‌هوک با localhost یا :5678 N8N_WEBHOOK_URL تنظیم نشده متغیر را بگذارید و up -d بزنید
Connection lost یا تریگر تستی بی‌پایان عبور نکردن WebSocket خطوط Upgrade و Connection در Nginx
خطای 413 در Nginx فایل یا داده بزرگ‌تر از ۱ مگابایت client_max_body_size
خطای 502 کانتینر n8n بالا نیست docker compose ps و لاگ n8n
Caddy گواهی نمی‌گیرد رکورد A اشتباه یا پورت 80 و 443 بسته getent hosts، ufw status و لاگ caddy
docker pull با 403 Forbidden IP سرور در ایران است سرور خارج از ایران
toomanyrequests هنگام pull سقف دریافت ناشناس Docker Hub sudo docker login با حساب رایگان
تلگرام: An HTTPS URL must be provided آدرس وب‌هوک http است N8N_WEBHOOK_URL با https
تریگر تلگرام فقط در تست یا فقط در Production هر ربات یک وب‌هوک دارد Unpublish هنگام تست یا ربات تست
Mismatching encryption keys کلید .env با کلید ذخیره‌شده فرق دارد کلید قبلی را برگردانید
Schedule در ساعت اشتباه منطقهٔ زمانی تنظیم نشده GENERIC_TIMEZONE و Timezone ورک‌فلو
heap out of memory یا ری‌استارت پیاپی کمبود رم ارتقای رم یا کم‌کردن دادهٔ هر اجرا
Postgres 18 با خطای in 18+, these Docker images… بالا نمی‌آید حجم روی /var/lib/postgresql/data بدون PGDATA حجم را به /var/lib/postgresql وصل کنید

برای یافتن علت معمولاً sudo docker compose logs --tail=100 n8n، لاگ caddy، free -h و df -h کافی است. اگر لاگ n8n سالم بود و باز 502 گرفتید، راهنمای خطای 502 Bad Gateway در سرور مجازی را ببینید. n8n به‌طور پیش‌فرض اجراهای قدیمی‌تر از ۱۴ روز را حذف می‌کند و حدود ۱۰ هزار اجرا را نگه می‌دارد، اما ورک‌فلوهایی که فایل جابه‌جا می‌کنند دیسک را سریع‌تر پر می‌کنند.

چک‌لیست امنیت n8n

  • ورود دومرحله‌ای برای همهٔ کاربران و حساب فقط برای کسانی که لازم دارند.
  • فقط پورت‌های SSH، 80 و 443 باز؛ هرگز 5678 یا 5432 را روی همهٔ آدرس‌ها (0.0.0.0) منتشر نکنید. در حالت Nginx فقط 127.0.0.1:5678 مجاز است.
  • ورود SSH با کلید و بستن ورود با رمز؛ پیش از بستن ورود با رمز، ورود با کلید را در یک نشست SSH جداگانه آزمایش کنید و نشست فعلی را باز نگه دارید.
  • Task Runner در حالت external. نودهای Execute Command و Local File Trigger از n8n 2.0 پیش‌فرض غیرفعال‌اند؛ فقط در صورت نیاز با متغیر NODES_EXCLUDE فعال‌شان کنید.
  • برای وب‌هوک عمومی در نود Webhook یکی از روش‌های Basic Auth، Header Auth یا JWT Auth را بگذارید.
  • نودهای انجمنی (Community Nodes) فقط از منبع مطمئن؛ این بسته‌ها با دسترسی خود n8n اجرا می‌شوند.
  • گزارش امنیتی داخلی: sudo docker compose exec -u node n8n n8n audit
  • .env و پوشهٔ backups رمزها را دارند؛ فقط برای root یا کاربر خودتان خواندنی باشند.
  • برای سخت‌گیری بیشتر، مثل نمونهٔ withPostgres در مخزن n8n-hosting، برای n8n یک کاربر جداگانهٔ غیر superuser در PostgreSQL بسازید.

سرور n8n در هاکان سرور

اگر تصمیم گرفتید n8n را روی سرور خودتان اجرا کنید، هاکان سرور در ۵۲ لوکیشن سرور مجازی ارائه می‌کند. برای n8n که با تلگرام، هوش مصنوعی یا گوگل کار می‌کند، یک سرور لینوکس در لوکیشن خارجی مثل سرور مجازی آلمان مناسب است و طبق جدول منابع بالا، برای شروع لازم نیست سرور بزرگی بگیرید. ارتقای منابع سرویس با ثبت تیکت انجام می‌شود. تحویل سرویس خودکار و کمتر از یک ساعت است. IP سرویس تا زمانی که سرویس تمدید شود ثابت می‌ماند؛ پس رکورد A زیردامنه را لازم نیست مدام به‌روز کنید.

تهیهٔ بکاپ بر عهدهٔ کاربر است و با ثبت تیکت هم قابل درخواست است. پس اسکریپت بکاپ این مقاله را از روز اول فعال کنید. اگر نمی‌خواهید درگیر نگهداری سرور شوید و پرداخت ارزی برایتان ممکن است، n8n Cloud شاید انتخاب مناسب‌تری باشد.

پرسش‌های متداول

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

نسخهٔ Community خودمیزبان برای استفادهٔ داخلی و شخصی رایگان است و فقط هزینهٔ سرور را می‌دهید. n8n Cloud اشتراک ماهانه بر اساس تعداد اجرا دارد. در نسخهٔ خودمیزبان، چند امکان سازمانی مثل SSO و کنترل نسخه با Git فقط با مجوز پولی فعال می‌شوند.

برای نصب n8n چقدر رم لازم است؟

برای چیدمان این مقاله با ۲ گیگابایت شروع کنید. ایجنت‌های هوش مصنوعی و فایل‌های حجیم ۴ گیگابایت یا بیشتر می‌خواهند و n8n Assistant با sandbox طبق مستندات رسمی دست‌کم ۴ گیگابایت رم و ۲ vCPU لازم دارد.

آیا می‌توان n8n را روی هاست اشتراکی cPanel یا با npm نصب کرد؟

روی هاست اشتراکی در عمل نه؛ n8n یک فرایند همیشه‌روشن است و هاست اشتراکی Docker نمی‌دهد. نصب با npm در نسخه‌های 2.x هنوز کار می‌کند، اما n8n 3.0 دیگر از نصب با npm یا npx n8n پشتیبانی نمی‌کند و استقرار با Docker را می‌خواهد. پس به سرور مجازی با دسترسی root نیاز دارید.

آیا n8n روی سرور ایران کار می‌کند؟

خود n8n اجرا می‌شود، اما Docker Hub روی IP ایران دریافت ایمیج را با خطای 403 رد می‌کند، مخزن نصب Docker هم ممکن است در دسترس نباشد و سرور داخل ایران به API تلگرام، OpenAI و بسیاری از سرویس‌های گوگل دسترسی ندارد. برای اتصال سرویس‌های داخلی شدنی است؛ در غیر این صورت سرور خارج ساده‌تر است.

آیا می‌توانم با n8n برای مشتری ورک‌فلو بسازم و هزینه بگیرم؟

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

آیا بدون دامنه و HTTPS می‌شود از n8n استفاده کرد؟

برای آزمایش روی کامپیوتر خودتان و آدرس localhost بله (اگر دریافت ایمیج از Docker Hub برایتان ممکن باشد)، اما روی سرور نه. n8n پیش‌فرض کوکی امن دارد و روی http خطای secure cookie می‌دهد. تلگرام هم فقط وب‌هوک HTTPS روی پورت‌های 443، 80، 88 یا 8443 را می‌پذیرد و بسیاری از سرویس‌ها برای OAuth آدرس HTTPS می‌خواهند.

جمع‌بندی

نصب n8n روی سرور با Docker Compose، PostgreSQL و Caddy حدود نیم ساعت کار است و نتیجه‌اش نمونه‌ای روی دامنهٔ خودتان با HTTPS، دیتابیس قابل اتکا و اجرای ایزولهٔ کد است. سه چیز را از روز اول جدی بگیرید: کلید N8N_ENCRYPTION_KEY را امن نگه دارید، بکاپ روزانه را با یک نسخهٔ بیرون از سرور راه بیندازید و نسخهٔ n8n را ثابت نگه دارید تا ارتقا، به‌خصوص به 3.0، با تصمیم خودتان انجام شود.

قدم بعدی، اولین اتوماسیون واقعی است: با همان نمونهٔ فرم و تلگرام شروع کنید، سپس یک تریگر Schedule برای گزارش روزانه بسازید و هر وقت سراغ ایجنت‌های هوش مصنوعی رفتید، مصرف رم سرور را زیر نظر بگیرید.