×

نصب n&n روی VPS با Docker، SSL، بکاپ و تنظیمات امنیتی پرینت


نصب n8n روی VPS با Docker، SSL، بکاپ و تنظیمات امنیتی

مقدمه:

برای نصب n8n روی VPS با Docker، SSL، بکاپ و تنظیمات امنیتی به چیزی بیشتر از اجرای یک کانتینر ساده نیاز داریم. یک استقرار قابل‌اعتماد باید شامل دیتابیس پایدار، دامنه، HTTPS، فضای ذخیره‌سازی دائمی، کلید رمزنگاری و برنامه بکاپ باشد. در این آموزش، n8n را با Docker Compose، PostgreSQL و Caddy راه‌اندازی می‌کنیم تا پنل و Webhookها از طریق یک دامنه امن در دسترس باشند.

فهرست مطالب پیشنهادی

  • معماری پیشنهادی نصب n8n
  • پیش‌نیازهای سرور مجازی
  • تنظیم دامنه و آماده‌سازی VPS
  • نصب Docker
  • ساخت فایل‌های n8n
  • اجرای سرویس‌ها با Docker Compose
  • فعال‌سازی SSL
  • تنظیمات امنیتی
  • بکاپ و بازیابی
  • به‌ روزرسانی n8n
  • عیب‌ یابی خطاهای متداول
  • چک‌ لیست نهایی

معماری پیشنهادی برای نصب n8n روی VPS

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

  • n8n برای ساخت و اجرای گردش‌های کاری
  • PostgreSQL برای نگهداری داده‌های برنامه
  • Caddy برای Reverse Proxy و فعال‌سازی HTTPS

فقط Caddy روی پورت‌های عمومی وب در دسترس قرار می‌گیرد. پورت داخلی n8n و پورت PostgreSQL مستقیماً روی اینترنت منتشر نمی‌شوند.

Docker Compose امکان تعریف سرویس‌ها، شبکه‌ها و Volumeهای یک برنامه چندکانتینری را در یک فایل YAML فراهم می‌کند. به این ترتیب، اجرای مجدد یا انتقال تنظیمات ساده‌تر می‌شود. docs.docker.com

مستندات رسمی n8n نیز Docker Compose را به‌عنوان یکی از روش‌های Self-hosting معرفی می‌کنند. برای محیط عملیاتی، استفاده از PostgreSQL به‌جای تکیه بر دیتابیس داخلی SQLite انتخاب مناسب‌تری است. docs.n8n.io

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

پیش‌ نیازهای نصب

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

  • VPS لینوکسی با دسترسی مدیریتی
  • دامنه یا زیردامنه مانند automation.example.com
  • امکان مدیریت DNS دامنه
  • دسترسی SSH امن
  • Docker Engine و Docker Compose نسخه ۲
  • فضای کافی برای دیتابیس، فایل‌ها و بکاپ
  • یک فضای جداگانه برای نگهداری نسخه پشتیبان

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

مطالعه بیشتر: راهنمای انتخاب RAM و CPU سرور مجازی

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

تنظیم رکورد DNS

یک رکورد A برای زیردامنه ایجاد کنید:

نوع رکورد نام مقدار
A automation IP عمومی VPS

پس از انتشار رکورد، نتیجه را بررسی کنید:

dig +short automation.example.com

دامنه باید IP عمومی سرور را نمایش دهد. عبارت automation.example.com را در تمام فایل‌های این آموزش با دامنه واقعی خود جایگزین کنید.

مطالعه بیشتر: آموزش تنظیم DNS دامنه

به‌ روزرسانی و ایجاد کاربر

سیستم را به‌ روزرسانی کنید:

sudo apt update
sudo apt upgrade

برای مدیریت روزمره از کاربر غیر Root استفاده کنید:

sudo adduser deploy
sudo usermod -aG sudo deploy

پیش از محدودکردن ورود Root، حتماً ورود کاربر جدید با SSH Key را در پنجره دیگری آزمایش کنید. تغییر اشتباه SSH ممکن است دسترسی شما به سرور را قطع کند.

مطالعه بیشتر: کارهای ضروری بعد از خرید VPS اوبونتو

نصب Docker و Docker Compose

Docker را از مخزن رسمی متناسب با نسخه Ubuntu نصب کنید. پس از نصب، وضعیت آن را بررسی کنید:

docker --version
docker compose version
sudo systemctl status docker

برای آزمایش:

sudo docker run --rm hello-world

مستندات Docker هشدار می‌دهند که انتشار پورت‌های کانتینر ممکن است برخی قواعد UFW یا Firewalld را دور بزند. بنابراین فقط فعال‌کردن UFW برای امنیت کانتینرهای دارای پورت عمومی کافی نیست. Docker Docs

کاربری که عضو گروه docker باشد، عملاً اختیارات گسترده‌ای روی میزبان دارد. فقط کاربران مورداعتماد را به این گروه اضافه کنید.

ساخت پوشه پروژه

پوشه نصب را ایجاد کنید:

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

ساختار پروژه به شکل زیر خواهد بود:

/opt/n8n/
├── .env
├── compose.yml
└── Caddyfile

فایل .env شامل اطلاعات محرمانه است و نباید در مخزن Git، فضای عمومی یا پیام‌رسان ذخیره شود.

ایجاد رمزها و فایل محیطی

دو مقدار تصادفی قوی تولید کنید:

openssl rand -hex 32
openssl rand -base64 36

فایل .env را ایجاد کنید:

N8N_VERSION=YOUR_TESTED_N8N_VERSION

DOMAIN=automation.example.com
GENERIC_TIMEZONE=Asia/Tehran

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=CHANGE_TO_A_RANDOM_PASSWORD

N8N_ENCRYPTION_KEY=CHANGE_TO_A_RANDOM_ENCRYPTION_KEY

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

دسترسی فایل را محدود کنید:

chmod 600 .env

کلید N8N_ENCRYPTION_KEY را در محل امن دیگری نیز نگهداری کنید. بازیابی دیتابیس بدون این کلید ممکن است باعث غیرقابل‌استفاده‌ شدن Credentialهای ذخیره‌شده شود.

ساخت فایل Docker Compose

فایل compose.yml را با محتوای زیر بسازید:

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: 10s
      timeout: 5s
      retries: 10
    networks:
      - backend

  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: ${DOMAIN}
      N8N_PORT: 5678
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${DOMAIN}
      WEBHOOK_URL: https://${DOMAIN}/
      N8N_PROXY_HOPS: 1

      NODE_ENV: production
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}

      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_DIAGNOSTICS_ENABLED: "false"
      N8N_PERSONALIZATION_ENABLED: "false"
    expose:
      - "5678"
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - backend
      - frontend

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

networks:
  frontend:
  backend:
    internal: true

volumes:
  postgres_data:
  n8n_data:
  caddy_data:
  caddy_config:

در این تنظیمات، دیتابیس فقط در شبکه داخلی Docker قرار دارد. پورت 5678 نیز روی IP عمومی VPS منتشر نمی‌شود و Caddy از طریق شبکه داخلی به n8n دسترسی دارد.

فعال‌سازی SSL با Caddy

فایل Caddyfile را ایجاد کنید:

{$DOMAIN} {
    encode zstd gzip

    reverse_proxy n8n:5678

    header {
        Strict-Transport-Security "max-age=31536000"
        X-Content-Type-Options "nosniff"
        Referrer-Policy "strict-origin-when-cross-origin"
        -Server
    }
}

Caddy در صورت صحیح‌بودن DNS و بازبودن پورت‌های 80 و 443، گواهی SSL را دریافت و مدیریت می‌کند. اگر سرویس دیگری مانند Nginx یا Apache این پورت‌ها را اشغال کرده باشد، ابتدا باید معماری Reverse Proxy مشخص شود.

اجرای n8n

پیش از اجرا، فایل Compose را اعتبارسنجی کنید:

docker compose config

سپس سرویس‌ها را اجرا کنید:

docker compose up -d
docker compose ps

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

docker compose logs --tail=100 postgres
docker compose logs --tail=100 n8n
docker compose logs --tail=100 caddy

حالا آدرس زیر را باز کنید:

https://automation.example.com

در ورود اول حساب مالک را بسازید. از رمز قوی استفاده کنید و حساب مالک را بین چند نفر به اشتراک نگذارید.

جدول اجزای زیرساخت

جزء وظیفه اطلاعات پایدار دسترسی عمومی
n8n ساخت و اجرای Workflow Volume برنامه فقط از طریق Caddy
PostgreSQL ذخیره داده‌های اصلی Volume دیتابیس ندارد
Caddy Reverse Proxy و SSL گواهی‌ها و تنظیمات پورت 80 و 443
فایل .env رمزها و کلید رمزنگاری فایل محلی نباید عمومی باشد
فضای بکاپ نگهداری نسخه‌های بازیابی دیتابیس و فایل‌ها نباید عمومی باشد

برای Workflowهای پرتعداد، پردازش سنگین یا معماری Queue Mode ممکن است به منابع بیشتر، Redis، Worker و مانیتورینگ جداگانه نیاز داشته باشید.

برای انتخاب VPS متناسب با تعداد Workflowها، حجم اجرا و سرویس‌های جانبی می‌توانید پلن‌های سرور مجازی شرکت تجارت الکترونیک نوژن را بررسی کرده و پیش از سفارش نیازهای فنی خود را ارزیابی کنید.

خرید سرور مجازی برای n8n» ← صفحه خدمات سرور مجازی]

تنظیمات امنیتی ضروری n8n

محدودکردن پورت‌ها

برای ساختار این آموزش فقط SSH و پورت‌های وب باید عمومی باشند:

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

با توجه به نحوه مدیریت شبکه در Docker، علاوه بر UFW باید فایل Compose و پورت‌های منتشرشده را نیز بررسی کنید.

استفاده از SSH Key

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

محافظت از Credentialها

کلیدهای API و رمزها را در بخش Credentialهای n8n ذخیره کنید. اطلاعات حساس را داخل نام Node، توضیحات Workflow یا کدهای عمومی قرار ندهید.

برای هر سرویس، حساب یا Token جداگانه با کمترین سطح دسترسی بسازید. اگر Workflow فقط اطلاعات را می‌خواند، کلید آن نباید مجوز حذف یا ویرایش داشته باشد.

مدیریت کاربران

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

پایش سرویس

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

docker compose ps
docker stats
df -h
docker compose logs --tail=100 n8n

مصرف دیسک اهمیت زیادی دارد؛ تاریخچه اجرا، فایل‌های باینری و بکاپ‌های قدیمی می‌توانند فضای سرور را پر کنند.

تهیه بکاپ از n8n

یک بکاپ کامل باید شامل موارد زیر باشد:

  • دیتابیس PostgreSQL
  • Volume مربوط به n8n
  • فایل .env
  • فایل compose.yml
  • فایل Caddyfile
  • کلید N8N_ENCRYPTION_KEY

ساخت مسیر بکاپ

sudo mkdir -p /var/backups/n8n
sudo chown $USER:$USER /var/backups/n8n
chmod 700 /var/backups/n8n

بکاپ دیتابیس

cd /opt/n8n

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

اگر نام دیتابیس یا کاربر را تغییر داده‌اید، مقادیر واقعی خود را در دستور قرار دهید.

بکاپ Volume برنامه

docker run --rm \
  --volumes-from "$(docker compose ps -q n8n)" \
  -v /var/backups/n8n:/backup \
  alpine \
  tar czf /backup/n8n-data-$(date +%F-%H%M).tar.gz /home/node/.n8n

بکاپ تنظیمات

sudo tar czf \
  /var/backups/n8n/n8n-config-$(date +%F-%H%M).tar.gz \
  /opt/n8n/.env \
  /opt/n8n/compose.yml \
  /opt/n8n/Caddyfile

حداقل یک نسخه رمزگذاری‌ شده از بکاپ را خارج از VPS نگهداری کنید. بکاپ موجود روی همان دیسک در برابر خرابی کامل سرور محافظتی ایجاد نمی‌کند.

راهنمای بکاپ‌گیری از سرور» ← مقاله پشتیبان‌گیری و بازیابی اطلاعات]

بازیابی دیتابیس

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

gunzip -c /path/to/postgres-backup.sql.gz \
  | docker compose exec -T postgres \
  psql -U n8n -d n8n

پس از بازیابی، سرویس را ری‌استارت و لاگ‌ها را بررسی کنید:

docker compose restart n8n
docker compose logs --tail=100 n8n

فایل .env و کلید رمزنگاری باید متعلق به همان بکاپ باشند. در غیر این صورت Credentialهای بازیابی‌شده ممکن است قابل‌استفاده نباشند.

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

برای ارتقا این ترتیب را رعایت کنید:

  1. Release Notes نسخه مقصد را بخوانید.
  2. از دیتابیس، Volume و تنظیمات بکاپ بگیرید.
  3. نسخه را در محیط آزمایشی بررسی کنید.
  4. مقدار N8N_VERSION را تغییر دهید.
  5. Image جدید را دریافت کنید.
  6. Workflowهای مهم را پس از ارتقا آزمایش کنید.
docker compose pull
docker compose up -d
docker compose logs --tail=100 n8n

بازگرداندن تگ قبلی همیشه برای Downgrade کافی نیست؛ زیرا نسخه جدید ممکن است ساختار دیتابیس را تغییر داده باشد. برنامه بازگشت باید شامل بازیابی دیتابیس سازگار نیز باشد.

خطاهای متداول

SSL فعال نمی‌شود

رکورد DNS، دسترسی پورت‌های 80 و 443 و لاگ Caddy را بررسی کنید:

docker compose logs --tail=100 caddy

Webhook آدرس اشتباه دارد

مقادیر N8N_HOST، N8N_PROTOCOL، WEBHOOK_URL و N8N_PROXY_HOPS را بررسی کنید. پس از تغییر، کانتینر n8n را بازسازی کنید:

docker compose up -d --force-recreate n8n

اتصال دیتابیس برقرار نمی‌شود

ابتدا وضعیت PostgreSQL و رمزهای فایل .env را بررسی کنید:

docker compose ps
docker compose logs --tail=100 postgres

کانتینر مرتب ری‌استارت می‌شود

لاگ n8n، حافظه و فضای دیسک را کنترل کنید:

docker compose logs --tail=200 n8n
free -h
df -h

کمبود منابع، تنظیمات اشتباه دیتابیس یا ناسازگاری نسخه از دلایل احتمالی هستند.

چک‌ لیست نهایی

  • DNS دامنه به IP صحیح متصل است.
  • Docker و Compose از منبع رسمی نصب شده‌اند.
  • نسخه n8n به‌صورت مشخص تعریف شده است.
  • رمز PostgreSQL تصادفی و قوی است.
  • کلید رمزنگاری در محل امن ذخیره شده است.
  • دسترسی فایل .env محدود است.
  • پورت n8n مستقیماً منتشر نشده است.
  • PostgreSQL از اینترنت قابل‌دسترسی نیست.
  • پنل فقط با HTTPS باز می‌شود.
  • دسترسی SSH ایمن شده است.
  • بکاپ دیتابیس و Volume تهیه می‌شود.
  • نسخه‌ای از بکاپ خارج از VPS نگهداری می‌شود.
  • فرایند بازیابی آزمایش شده است.
  • مصرف RAM، CPU و دیسک پایش می‌شود.
  • به‌ روزرسانی‌ها قبل از اجرا آزمایش می‌شوند.

جمع‌ بندی

برای نصب n8n روی VPS با Docker، SSL، بکاپ و تنظیمات امنیتی، اجرای یک کانتینر تنها کافی نیست. محیط عملیاتی به PostgreSQL، Reverse Proxy، HTTPS، Volume پایدار و کلید رمزنگاری نیاز دارد.

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

تهیه بکاپ منظم از دیتابیس، Volume، فایل‌های تنظیمات و کلید رمزنگاری ضروری است. پیش از هر ارتقا نیز باید امکان بازگشت و بازیابی اطلاعات بررسی شود.

برای تهیه VPS، نصب اصولی n8n یا دریافت پشتیبانی فنی در زمینه امنیت، بکاپ و نگهداری سرویس می‌توانید با کارشناسان شرکت تجارت الکترونیک نوژن در ارتباط باشید.

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

نام صحیح ابزار n&n است یا n8n؟

نام صحیح ابزار n8n است. عبارت n&n معمولاً به‌دلیل اشتباه تایپی یا شنیدن تلفظ نام جستجو می‌شود.

آیا n8n بدون دامنه قابل‌اجراست؟

برای آزمایش داخلی بله، اما در محیط عملیاتی دامنه و HTTPS برای پنل، Webhookها و اتصال‌های OAuth اهمیت دارند.

آیا باید پورت 5678 را باز کنیم؟

در معماری Reverse Proxy خیر. Caddy از طریق شبکه داخلی Docker به n8n متصل می‌شود و کاربران از پورت HTTPS وارد می‌شوند.

آیا SQLite برای n8n کافی است؟

برای آزمایش و استفاده محدود ممکن است کافی باشد. برای محیط عملیاتی و Workflowهای دائمی، PostgreSQL انتخاب مناسب‌تری است.

از چه اطلاعاتی باید بکاپ بگیریم؟

از دیتابیس، Volume برنامه، فایل .env، فایل Compose، تنظیمات Reverse Proxy و کلید N8N_ENCRYPTION_KEY بکاپ بگیرید.

چرا Webhookهای n8n آدرس اشتباه دارند؟

این مشکل معمولاً به تنظیم نبودن دامنه، پروتکل، WEBHOOK_URL یا تعداد Proxyهای مورداعتماد مربوط است.

چگونه n8n را به‌روزرسانی کنیم؟

ابتدا بکاپ بگیرید و Release Notes را بررسی کنید. سپس نسخه Image را تغییر دهید و با docker compose pull و docker compose up -d سرویس را ارتقا دهید.


آیا این پاسخ به شما کمک کرد؟

  • نصب n&n روی VPS با Docker، SSL
  • 0
« برگشت