آموزش سرور

راه‌اندازی n8n با Docker روی سرور مجازی؛ از Compose تا دامنه، HTTPS و پشتیبان

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۷ دقیقه

n8nDockerComposeآموزش سرورراه‌اندازی n8n با Docker رویسرور مجازی؛ از Compose تادامنه، HTTPS و پشتیبانمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

برای راه‌اندازی n8n روی سرور، داکر را نصب کنید، یک فایل Compose با سرویس n8n و PostgreSQL بسازید و پورت n8n را فقط روی 127.0.0.1 منتشر کنید. متغیرهای N8N_HOST، WEBHOOK_URL و N8N_ENCRYPTION_KEY را تنظیم کنید، سپس Nginx را با پشتیبانی WebSocket جلوی آن قرار دهید و با Certbot گواهی بگیرید. از volumeها و کلید رمزنگاری به‌طور منظم پشتیبان بگیرید و پیش از به‌روزرسانی نسخهٔ image را مشخص کنید.

n8n چیست و چرا روی سرور خودتان؟

n8n یک ابزار اتوماسیون گردش کار است که با رابط گرافیکی، سرویس‌های مختلف را به هم وصل می‌کند: دریافت فرم و ارسال به تلگرام، ذخیرهٔ ایمیل‌ها در شیت، همگام‌سازی سفارش‌های فروشگاه با حسابداری، یا فراخوانی مدل‌های هوش مصنوعی در یک زنجیره. هر گردش کار از چند «نود» تشکیل می‌شود که خروجی یکی ورودی بعدی است.

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

معماری n8n روی سرور
HTTPSproxy_passشبکهٔ داخلیکاربر یا Webhookn8n.example.comNginxHTTPS و WebSocketکانتینر n8n127.0.0.1:5678PostgreSQLگردش کارها و اجراهاHTTPSproxy_passشبکهٔ داخلیکاربر یا Webhookn8n.example.comNginxHTTPS و WebSocketکانتینر n8n127.0.0.1:5678PostgreSQLگردش کارها و اجراها
شکل ۱ فقط Nginx از اینترنت در دسترس است؛ n8n و دیتابیس پشت آن و در شبکهٔ داخلی داکر قرار دارند.

پیش‌نیازها

  • یک سرور مجازی با اوبونتو؛ برای استفادهٔ شخصی یا تیم کوچک، منابع متوسط کافی است و با بیشتر شدن گردش کارها می‌توانید ارتقا دهید. راهنمای انتخاب منابع در مقالهٔ چقدر رم و CPU لازم دارم آمده است.
  • داکر و Docker Compose نصب‌شده طبق آموزش نصب داکر روی اوبونتو.
  • یک زیردامنه مثل n8n.example.com که رکورد A آن به آی‌پی سرور اشاره می‌کند.
  • Nginx روی سرور برای HTTPS.

گام ۱: پوشه و فایل تنظیمات

یک پوشه برای پروژه بسازید و فایل .env را برای مقادیر حساس ایجاد کنید:

mkdir -p ~/n8n && cd ~/n8n
openssl rand -hex 32

خروجی دستور دوم را به‌عنوان کلید رمزنگاری استفاده کنید. فایل .env:

N8N_HOST=n8n.example.com
N8N_ENCRYPTION_KEY=PASTE-THE-RANDOM-KEY
POSTGRES_PASSWORD=ANOTHER-LONG-RANDOM-PASSWORD
GENERIC_TIMEZONE=Asia/Tehran

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

chmod 600 .env

گام ۲: فایل Docker Compose

فایل docker-compose.yml را با دو سرویس n8n و PostgreSQL بسازید. n8n به‌طور پیش‌فرض از SQLite استفاده می‌کند که برای آزمایش کافی است، اما PostgreSQL برای استفادهٔ جدی پایدارتر است:

services:
  postgres:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - pg-data:/var/lib/postgresql/data

  n8n:
    image: docker.n8n.io/n8nio/n8n:1.80.0
    restart: unless-stopped
    depends_on:
      - postgres
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_HOST: ${N8N_HOST}
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://${N8N_HOST}/
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
    volumes:
      - n8n-data:/home/node/.n8n

volumes:
  pg-data:
  n8n-data:

چند نکته:

  • پورت روی 127.0.0.1: n8n فقط از روی خود سرور در دسترس است و Nginx آن را با HTTPS منتشر می‌کند. انتشار بدون آی‌پی ممکن است فایروال را دور بزند.
  • نسخهٔ مشخص image: به‌جای latest نسخهٔ مشخص بنویسید تا به‌روزرسانی‌ها کنترل‌شده باشند. نسخهٔ پایدار فعلی را از صفحهٔ انتشارهای n8n بردارید؛ عدد بالا فقط مثال است.
  • WEBHOOK_URL: آدرسی است که n8n برای ساختن لینک Webhookها استفاده می‌کند. اگر درست تنظیم نشود، لینک‌ها با localhost:5678 ساخته می‌شوند و سرویس‌های بیرونی نمی‌توانند به آن برسند.

اجرا:

docker compose up -d
docker compose logs -f n8n

وقتی در لاگ پیامی مبنی بر آماده بودن editor دیدید، با curl -I http://127.0.0.1:5678 از سرور تست کنید. اگر با Compose آشنا نیستید، آموزش Docker Compose را ببینید.

گام ۳: Nginx و HTTPS

یک فایل پیکربندی برای زیردامنه بسازید. n8n برای به‌روزرسانی زندهٔ رابط کاربری از WebSocket استفاده می‌کند، پس هدرهای Upgrade لازم‌اند:

server {
    listen 80;
    server_name n8n.example.com;

    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 3600s;
        client_max_body_size 50m;
    }
}

فعال‌سازی و گرفتن گواهی:

sudo ln -s /etc/nginx/sites-available/n8n.example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d n8n.example.com

توضیح کامل این الگو در آموزش Nginx به‌عنوان Reverse Proxy برای داکر آمده است. حالا https://n8n.example.com را باز کنید؛ اولین بار از شما می‌خواهد حساب مالک را بسازید. این کار را فوراً انجام دهید، چون تا وقتی حساب مالک ساخته نشده، هر کسی که آدرس را باز کند می‌تواند مالک شود.

root@server: ~/n8n
$ docker compose psNAME            IMAGE                              STATUSn8n-n8n-1       docker.n8n.io/n8nio/n8n:1.80.0     Up 2 minutesn8n-postgres-1  postgres:16                        Up 2 minutes$ curl -sI https://n8n.example.com | head -n 1HTTP/2 200$ 
شکل ۲ هر دو کانتینر بالا هستند و n8n از طریق دامنه و HTTPS پاسخ می‌دهد.

گام ۴: امنیت

  • رمز قوی و احراز هویت دومرحله‌ای برای حساب مالک فعال کنید.
  • فایروال: فقط پورت‌های ۲۲، ۸۰ و ۴۴۳ باز باشند. راهنما در آموزش UFW.
  • Webhookها: آدرس Webhookهای تولیدی شامل شناسهٔ تصادفی است، اما برای Webhookهای حساس احراز هویت هدر یا پایه را در نود Webhook فعال کنید.
  • نود Execute Command: این نود دستورات را داخل کانتینر اجرا می‌کند. اگر کاربران دیگری به n8n دسترسی دارند، استفاده از آن را محدود کنید.

گام ۵: پشتیبان‌گیری

دو چیز باید پشتیبان‌گیری شود: دیتابیس PostgreSQL که گردش کارها، Credentialها و تاریخچهٔ اجراها را نگه می‌دارد، و کلید رمزنگاری. یک پشتیبان منطقی از دیتابیس:

docker compose exec -T postgres pg_dump -U n8n n8n | gzip > ~/backups/n8n-$(date +%F).sql.gz

این دستور را با Cron روزانه اجرا کنید و فایل‌ها را به سرور یا فضای دیگری منتقل کنید؛ روش انتقال خودکار در آموزش پشتیبان‌گیری با rsync آمده است. علاوه بر این، می‌توانید گردش کارها را از خود رابط n8n یا با دستور CLI آن به فایل JSON صادر کنید که برای نگهداری در مخزن گیت هم مناسب است.

همچنین تاریخچهٔ اجراها به مرور دیتابیس را بزرگ می‌کند. با متغیرهای EXECUTIONS_DATA_PRUNE=true و EXECUTIONS_DATA_MAX_AGE تعیین کنید اجراهای قدیمی پس از چند ساعت حذف شوند.

چه چیزی را پشتیبان بگیریم
  1. کلید رمزنگاری

    N8N_ENCRYPTION_KEY در جای امن و جدا از سرور؛ بدون آن Credentialها قابل‌بازیابی نیستند.

  2. دیتابیس PostgreSQL

    pg_dump روزانه با cron و انتقال به مکان دیگر.

  3. خروجی گردش کارها

    صادر کردن JSON برای نسخه‌بندی در گیت.

  4. فایل‌های Compose و .env

    برای بازسازی سریع روی سرور جدید.

شکل ۳ با این چهار مورد، n8n را روی هر سرور دیگری در چند دقیقه بازسازی می‌کنید.

گام ۶: به‌روزرسانی

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

docker compose pull
docker compose up -d
docker compose logs -f n8n

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

اولین گردش کار: یک آزمایش ساده

برای اطمینان از اینکه همه‌چیز از جمله Webhook و دسترسی بیرونی درست کار می‌کند، یک گردش کار کوچک بسازید. یک نود Webhook اضافه کنید و روش آن را روی POST بگذارید. n8n دو آدرس نشان می‌دهد: آدرس تست که فقط هنگام باز بودن ویرایشگر و زدن دکمهٔ گوش دادن فعال است، و آدرس تولیدی که پس از فعال کردن گردش کار همیشه کار می‌کند. هر دو باید با دامنهٔ شما و HTTPS شروع شوند؛ اگر localhost می‌بینید، به بخش مشکلات رایج بروید.

پس از نود Webhook، یک نود Set یا Code اضافه کنید که داده‌های ورودی را تغییر دهد و در انتها نودی که نتیجه را جایی بفرستد؛ مثلاً یک پیام تلگرام یا یک ردیف در شیت. سپس از لپ‌تاپ خود درخواست آزمایشی بفرستید:

curl -X POST https://n8n.example.com/webhook-test/your-path -H "Content-Type: application/json" -d '{"name":"test"}'

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

مشکلات رایج

  • لینک Webhook با localhost ساخته می‌شود: WEBHOOK_URL تنظیم نشده یا پس از تغییر، کانتینر دوباره ساخته نشده است.
  • رابط کاربری مدام قطع و وصل می‌شود: هدرهای WebSocket در Nginx نیست.
  • خطای Credentials could not be decrypted: کلید رمزنگاری با کلیدی که داده‌ها با آن ذخیره شده‌اند یکی نیست؛ کلید اصلی را برگردانید.
  • کانتینر n8n بالا نمی‌آید: با docker compose logs n8n پیام را ببینید؛ معمولاً دیتابیس هنوز آماده نیست یا رمز اشتباه است.

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

n8n روی سرور چقدر منابع لازم دارد؟

برای استفادهٔ شخصی و گردش کارهای سبک، یک سرور کوچک با رم متوسط کافی است. گردش کارهای سنگین با داده‌های حجیم یا اجراهای هم‌زمان زیاد رم بیشتری لازم دارند؛ مصرف را با docker stats زیر نظر بگیرید و در صورت نیاز ارتقا دهید.

SQLite کافی است یا PostgreSQL لازم است؟

برای آزمایش و استفادهٔ سبک، SQLite پیش‌فرض کار می‌کند. برای استفادهٔ جدی و طولانی‌مدت، PostgreSQL پایدارتر است، پشتیبان‌گیری استانداردتری دارد و با بزرگ شدن تاریخچهٔ اجراها بهتر کنار می‌آید.

اگر کلید رمزنگاری را گم کنم چه می‌شود؟

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

چطور n8n را بدون دامنه تست کنم؟

می‌توانید با تونل SSH، یعنی ssh -L 5678:127.0.0.1:5678 user@server، از مرورگر لپ‌تاپ به آدرس localhost:5678 دسترسی پیدا کنید. اما Webhookهای بیرونی بدون دامنه و HTTPS کار نمی‌کنند.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.