TürkiyeVPS

نصب n8n: راه‌اندازی n8n روی VPS با Docker

راهنمای گام به گام برای راه‌اندازی سرور اتوماسیون n8n شخصی: نصب Docker Engine، فایل docker compose، پراکسی معکوس Nginx، SSL رایگان، به‌روزرسانی و پشتیبان‌گیری.

8 دقیقه مطالعه

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

در این راهنما n8n را با Docker روی یک VPS با Ubuntu 24.04 نصب می‌کنیم. ساختاری که راه‌اندازی می‌کنیم این است:

  1. Docker Engine از مخزن رسمی بسته‌های Docker نصب می‌شود.
  2. n8n با یک فایل docker compose اجرا می‌شود و فقط به نشانی 127.0.0.1:5678 گوش می‌دهد که تنها از داخل سرور در دسترس است.
  3. Nginx درخواست‌های بیرونی را دریافت می‌کند و به n8n می‌رساند.
  4. Certbot با گواهی رایگان Let's Encrypt، HTTPS را فعال می‌کند.

۱. سرور را آماده کنید

با SSH متصل شوید و بسته‌ها را به‌روز کنید:

sudo apt update && sudo apt upgrade -y

اگر سرور تازه است، پیشنهاد می‌کنیم ابتدا مراحل پایه راهنمای امنیت سرور لینوکس را انجام دهید (کلید SSH، غیرفعال کردن ورود root، فایروال). همچنین برای زیردامنه‌ای که به n8n اختصاص می‌دهید، در پنل DNS یک رکورد A بسازید؛ مثلاً n8n.ornek.com ← آدرس IP سرور VPS. انتشار رکورد ممکن است چند دقیقه طول بکشد.

۲. Docker Engine را نصب کنید

بسته docker.io در مخازن Ubuntu هم کار می‌کند، اما برای نسخه به‌روز و افزونه docker compose بهتر است از مخزن خود Docker استفاده کنید:

sudo apt install -y 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
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

نصب را بررسی کنید:

sudo docker run --rm hello-world
docker compose version

اگر کانتینر hello-world یک پیام خوشامد چاپ کند و بسته شود، Docker آماده است.

برای اجرای دستورها بدون sudo می‌توانید کاربر خود را به گروه docker اضافه کنید (sudo usermod -aG docker $USER). اما این گروه در عمل برابر با دسترسی root است؛ در این راهنما با sudo ادامه می‌دهیم.

۳. فایل docker compose را بنویسید

برای n8n یک پوشه بسازید و فایل compose را در آن بنویسید:

sudo mkdir -p /opt/n8n
cd /opt/n8n
sudo nano compose.yaml

محتوای آن (دامنه را با دامنه خودتان جایگزین کنید):

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    container_name: n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_HOST=n8n.ornek.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.ornek.com/
      - N8N_PROXY_HOPS=1
      - GENERIC_TIMEZONE=Europe/Istanbul
      - TZ=Europe/Istanbul
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:

معنای تنظیمات:

  • 127.0.0.1:5678:5678: n8n فقط از داخل خود سرور در دسترس است. این نکته مهم است، چون پورت‌هایی که Docker منتشر می‌کند ممکن است قواعد UFW را دور بزنند؛ اگر 5678:5678 می‌نوشتید، n8n با وجود فایروال ممکن بود به روی اینترنت باز شود.
  • N8N_HOST و N8N_PROTOCOL: لازم‌اند تا n8n نشانی خودش را درست بسازد.
  • WEBHOOK_URL: نشانی‌ای که گره‌های webhook و فرم به بیرون نشان می‌دهند. اگر پشت پراکسی معکوس آن را تنظیم نکنید، نشانی وب‌هوک‌ها با مقداری بی‌فایده مثل http://localhost:5678 نمایش داده می‌شود.
  • N8N_PROXY_HOPS=1: به n8n می‌گوید جلوی آن یک پراکسی معکوس قرار دارد؛ در نتیجه IP بازدیدکننده از هدر X-Forwarded-For خوانده می‌شود.
  • GENERIC_TIMEZONE: منطقه زمانی گره‌های زمان‌بندی (Schedule) را تعیین می‌کند. اگر آن را تنظیم نکنید، گردش کارها بر اساس منطقه زمانی پیش‌فرض اجرا می‌شوند نه به وقت ترکیه.
  • حجم n8n_data: گردش کارها، اطلاعات ورود (credentials)، پایگاه داده SQLite و کلید رمزنگاری در /home/node/.n8n نگهداری می‌شوند. اگر این حجم از بین برود، همه چیز از بین می‌رود.

درباره N8N_SECURE_COOKIE

n8n به طور پیش‌فرض کوکی نشست را فقط از طریق HTTPS می‌فرستد. به همین دلیل اگر بخواهید از نشانی رمزنگاری‌نشده‌ای مثل http://IP:5678 وارد n8n شوید، هشدار «secure cookie» می‌گیرید و نمی‌توانید وارد شوید. برخی راهنماها افزودن N8N_SECURE_COOKIE=false را پیشنهاد می‌کنند؛ این کار باعث می‌شود رمز عبور و نشست شما به صورت متن ساده در شبکه جابه‌جا شود. راه درست، راه‌اندازی HTTPS با مراحل زیر است. این متغیر را فقط برای یک آزمایش کوتاه محلی به کار ببرید و بعد آن را برگردانید.

n8n را اجرا کنید:

sudo docker compose up -d
sudo docker compose logs -f

وقتی در لاگ‌ها سطری دیدید که آماده بودن n8n را اعلام می‌کند، با Ctrl+C از دنبال کردن لاگ خارج شوید؛ کانتینر به کار خود ادامه می‌دهد. دستور curl -I http://127.0.0.1:5678 باید یک پاسخ HTTP برگرداند.

۴. پراکسی معکوس را با Nginx راه‌اندازی کنید

sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/n8n
server {
    listen 80;
    server_name n8n.ornek.com;

    client_max_body_size 50M;

    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-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_read_timeout 3600s;
    }
}

هدرهای Upgrade و Connection برای اتصال websocket هستند. ویرایشگر n8n هنگام اجرای گردش کار، نتایج را از طریق این اتصال به مرورگر می‌فرستد؛ اگر این سطرها نباشند، ویرایشگر هشدار «Connection lost» می‌دهد و خروجی گردش کار در حال اجرا روی صفحه نمی‌آید. proxy_read_timeout از قطع شدن درخواست‌های طولانی جلوگیری می‌کند.

سایت را فعال کنید:

sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

۵. فایروال و SSL

اگر از UFW استفاده می‌کنید، فقط به ترافیک SSH و وب اجازه دهید. نیازی به باز کردن پورت 5678 نیست:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

گواهی Let's Encrypt را دریافت کنید:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d n8n.ornek.com

Certbot تنظیمات HTTPS را به فایل Nginx اضافه می‌کند و تمدید خودکار را هم راه می‌اندازد. اکنون می‌توانید به https://n8n.ornek.com بروید و نخستین حساب مدیر را بسازید. این کار را فوراً انجام دهید: تا وقتی صفحه راه‌اندازی باز است، هر کسی که نشانی را بداند ممکن است پیش از شما حساب مالک را بسازد.

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

n8n نسخه‌های جدید را زیاد منتشر می‌کند. برای به‌روزرسانی، این دستورها را در پوشه compose اجرا کنید:

cd /opt/n8n
sudo docker compose pull
sudo docker compose up -d
sudo docker image prune -f

چون داده‌ها در حجم (volume) نگهداری می‌شوند، ساختن دوباره کانتینر گردش کارهای شما را پاک نمی‌کند. با این حال پیش از ارتقای نسخه‌های اصلی پشتیبان بگیرید و بخش تغییرات ناسازگار (breaking changes) را در یادداشت‌های انتشار n8n بخوانید. اگر می‌خواهید روی نسخه مشخصی بمانید، می‌توانید به نام ایمیج برچسب اضافه کنید؛ مثلاً docker.n8n.io/n8nio/n8n:1.x.y.

پشتیبان‌گیری

مهم‌ترین بخش، حجم n8n_data است. Docker compose نام پوشه را به ابتدای نام حجم اضافه می‌کند؛ برای دیدن نام واقعی:

sudo docker volume ls

اگر پوشه /opt/n8n باشد، نام به احتمال زیاد n8n_n8n_data خواهد بود. برای یک پشتیبان سازگار، n8n را برای مدت کوتاهی متوقف کنید و حجم را بایگانی کنید:

cd /opt/n8n
sudo docker compose stop
sudo docker run --rm -v n8n_n8n_data:/data -v /opt/n8n:/backup alpine tar czf /backup/n8n-yedek-$(date +%F).tar.gz -C /data .
sudo docker compose start

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

اگر می‌خواهید گردش کارها را جداگانه به صورت JSON هم خروجی بگیرید:

sudo docker exec n8n n8n export:workflow --all --output=/home/node/.n8n/workflows.json

چه مقدار RAM لازم است؟

برای تعداد کمی گردش کار ساده، n8n با دست‌کم ۱ گیگابایت RAM کار می‌کند، اما این مقدار در مرز است؛ به‌ویژه هنگام پردازش داده‌های JSON بزرگ یا اجرای هم‌زمان چند گردش کار، ممکن است حافظه کم بیاید. ۲ گیگابایت و بیشتر شروع راحتی است. اگر با فایل‌های بزرگ، اجراهای هم‌زمان زیاد یا سرویس‌های اضافی روی همان سرور (مثل یک مدل هوش مصنوعی محلی) سروکار دارید، مقدار بیشتری در نظر بگیرید. اگر نمی‌خواهید منابع را با دیگران به اشتراک بگذارید، پکیج‌های VDS عملکرد قابل پیش‌بینی‌تری دارند.

اگر نمی‌خواهید درگیر نصب شوید، به پکیج‌های n8n & AI VPS هم نگاهی بیندازید: پس از پرداخت، تیم ما بنا به انتخاب شما n8n، OpenWebUI، AI Agent یا Cloudron را روی سرور نصب می‌کند و سرور را آماده استفاده تحویل می‌دهد. اگر ترجیح می‌دهید خودتان نصب کنید، مراحل این راهنما روی هر VPS شرکت TürkiyeVPS با دسترسی root بدون تغییر کار می‌کند.

سوالات متداول

آیا می‌توانم n8n را بدون Docker نصب کنم؟

بله، می‌توانید Node.js را نصب کنید و n8n را با npm install -g n8n اجرا کنید. اما در این صورت سازگاری نسخه Node.js، به‌روزرسانی و مدیریت سرویس بر عهده خودتان است. با Docker به‌روزرسانی فقط دو دستور است و خود n8n هم نصب با Docker را توصیه می‌کند.

ویرایشگر هشدار «Connection lost» می‌دهد؛ چرا؟

معمولاً هدرهای websocket در Nginx جا افتاده‌اند. بررسی کنید که سطرهای proxy_http_version 1.1، Upgrade و Connection "upgrade" در بلوک location وجود داشته باشند، سپس sudo nginx -t و sudo systemctl reload nginx را اجرا کنید.

نشانی وب‌هوک‌ها به صورت localhost نمایش داده می‌شود؛ چطور درستش کنم؟

مقدار WEBHOOK_URL را در فایل compose برابر دامنه خودتان قرار دهید، به طوری که در انتها / داشته باشد، و کانتینر را با sudo docker compose up -d دوباره بسازید.

آیا SQLite کافی است یا باید از PostgreSQL استفاده کنم؟

برای استفاده شخصی و تیم‌های کوچک، SQLite پیش‌فرض معمولاً کافی است. اگر تاریخچه اجرای زیادی نگه می‌دارید یا قصد دارید n8n را با چند فرایند (queue mode) اجرا کنید، PostgreSQL گزینه مناسب‌تری است.

آیا n8n پس از راه‌اندازی مجدد سرور خودبه‌خود اجرا می‌شود؟

بله. سرویس Docker هنگام بوت اجرا می‌شود و به لطف تنظیم restart: unless-stopped در فایل compose، کانتینر n8n هم به طور خودکار دوباره اجرا می‌شود.