نصب 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
برای ارتقا این ترتیب را رعایت کنید:
- Release Notes نسخه مقصد را بخوانید.
- از دیتابیس، Volume و تنظیمات بکاپ بگیرید.
- نسخه را در محیط آزمایشی بررسی کنید.
- مقدار
N8N_VERSIONرا تغییر دهید. - Image جدید را دریافت کنید.
- 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 سرویس را ارتقا دهید.
