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

فهرست مطالب
- n8n چیست و به چه کاری میآید؟
- مفاهیم پایهٔ n8n
- کاربردهای واقعی n8n
- مجوز fair-code: رایگان، با یک شرط
- خودمیزبان یا n8n Cloud؟
- سرور مناسب n8n: ایران یا خارج؟
- منابع پیشنهادی سرور
- آمادهسازی سرور: دامنه، Docker و فایروال
- ساخت رکورد DNS برای زیردامنه
- نصب Docker Engine و Docker Compose
- فایروال و نکتهٔ مهم Docker
- نصب n8n با Docker Compose، PostgreSQL و Caddy
- مرحلهٔ ۱: پوشهٔ پروژه و فایل .env
- مرحلهٔ ۲: فایل compose.yaml
- مرحلهٔ ۳: فایل Caddyfile
- مرحلهٔ ۴: اجرا و بررسی سلامت
- اگر از قبل Nginx دارید
- متغیرهای محیطی مهم n8n
- ساخت حساب مالک و اولین ورکفلو
- حساب مالک و ورود دومرحلهای
- ورکفلو نمونه: پیام تلگرام برای هر فرم جدید
- آدرس تست و آدرس Production
- بکاپ و بازگردانی n8n
- اسکریپت بکاپ روزانه
- بازگردانی روی همین سرور یا سرور جدید
- بهروزرسانی امن n8n
- عیبیابی رایج n8n روی سرور
- چکلیست امنیت n8n
- سرور n8n در هاکان سرور
- پرسشهای متداول
- آیا n8n رایگان است؟
- برای نصب n8n چقدر رم لازم است؟
- آیا میتوان n8n را روی هاست اشتراکی cPanel یا با npm نصب کرد؟
- آیا n8n روی سرور ایران کار میکند؟
- آیا میتوانم با n8n برای مشتری ورکفلو بسازم و هزینه بگیرم؟
- آیا بدون دامنه و HTTPS میشود از n8n استفاده کرد؟
- جمعبندی
برای نصب 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 روی سرور در ۶ گام:
- سرور Ubuntu 24.04 یا 26.04 با دستکم ۲ گیگابایت رم؛ برای تلگرام، OpenAI و گوگل، خارج از ایران.
- رکورد A مثل
n8n.example.comبه IP سرور.- نصب Docker Engine و Compose از مخزن رسمی Docker.
- ساخت
.env،compose.yamlوCaddyfileو اجرایdocker compose up -d.- ساخت حساب مالک (Owner) و روشن کردن ورود دومرحلهای.
- بکاپ خودکار از روز اول و ثابت نگه داشتن (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 متغیرهای جدید را اعمال نمیکند.
ساخت حساب مالک و اولین ورکفلو
حساب مالک و ورود دومرحلهای
- آدرس
https://n8n.example.comرا باز کنید و در فرم Set up owner account ایمیل، نام و رمزی با دستکم ۸ کاراکتر، یک عدد و یک حرف بزرگ وارد کنید. - برای ورود دومرحلهای به Settings ← Personal بروید و Enable 2FA را بزنید، QR را با برنامهٔ Authenticator اسکن کنید، کد را وارد کنید و کدهای بازیابی را ذخیره کنید.
- اختیاری: در 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 وجود دارد، اما همهٔ حسابهای کاربری را حذف میکند.
ورکفلو نمونه: پیام تلگرام برای هر فرم جدید
این مثال هر پاسخ فرم تماس را به تلگرام شما میفرستد و فقط روی سرور خارج از ایران کار میکند.
- در تلگرام به
@BotFatherپیام دهید،/newbotرا بفرستید، نام و نام کاربری ربات (با پایانbot) را وارد و توکن را کپی کنید. - به ربات خودتان
/startبفرستید و روی سرور شناسهٔ چت را بگیرید؛ عدد جلوی"chat":{"id":همان Chat ID است:curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates" # ... "chat":{"id":123456789,"first_name":"Ali","type":"private"} ... - در n8n روی Create workflow و سپس Add first step… بزنید، Form را جستوجو و On form submission را انتخاب کنید.
- در Form Title بنویسید «تماس با ما» و با Add Form Element سه فیلد بسازید: «نام» (Text Input)، «ایمیل» (Email) و «پیام» (Textarea). برای هر فیلد از Add Attributes مقدار Custom Field Name را به ترتیب
name،emailوmessageبگذارید. - روی + بعد از تریگر بزنید، Telegram را جستوجو و Send a text message را انتخاب کنید. در Credential گزینهٔ Create new credential را بزنید و توکن را در Access Token بگذارید.
- در 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 }} - Execute workflow را بزنید، فرم آزمایشی را پر کنید و رسیدن پیام را ببینید.
- روی 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 شما را بیخبر یک نسخهٔ اصلی جلو میبرند. روال امن:
- یادداشت انتشار را در صفحهٔ Releases در گیتهاب n8n بخوانید.
- بکاپ بگیرید و
N8N_VERSIONرا در.envعوض کنید. - ایمیجها را بگیرید، کانتینرها را بازسازی کنید، لاگ را ببینید و یک ورکفلو مهم را دستی اجرا کنید.
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 برای گزارش روزانه بسازید و هر وقت سراغ ایجنتهای هوش مصنوعی رفتید، مصرف رم سرور را زیر نظر بگیرید.


