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

> آموزش نصب n8n روی سرور مجازی با Docker Compose، PostgreSQL و Caddy روی دامنهٔ اختصاصی؛ با تنظیمات مهم، اولین ورک‌فلو، بکاپ، به‌روزرسانی و عیب‌یابی.

- صفحه: https://hakanserver.com/install-n8n-on-vps/
- تاریخ انتشار: ۱۱ آبان ۱۴۰۵ (2026-11-02)
- دسته: سرور
- زمان مطالعه: حدود 23 دقیقه

![گره‌های ورک‌فلو n8n که از یک سرور مجازی به آیکون‌های پیام، ایمیل و جدول وصل شده‌اند](https://hakanserver.com/wp-content/uploads/2026/11/install-n8n-on-vps.jpg)

برای نصب 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 روی سرور در ۶ گام:
> 
> 
> 
> 1. سرور Ubuntu 24.04 یا 26.04 با دست‌کم ۲ گیگابایت رم؛ برای تلگرام، OpenAI و گوگل، خارج از ایران.
> 2. رکورد A مثل `n8n.example.com` به IP سرور.
> 3. نصب Docker Engine و Compose از مخزن رسمی Docker.
> 4. ساخت `.env`، `compose.yaml` و `Caddyfile` و اجرای `docker compose up -d`.
> 5. ساخت حساب مالک (Owner) و روشن کردن ورود دومرحله‌ای.
> 6. بکاپ خودکار از روز اول و ثابت نگه داشتن (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](https://docs.n8n.io/n8n-community-license) آمده است.

### خودمیزبان یا 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 ثبت‌شده را بپذیرند؛ مستندات همان سرویس را بخوانید. اگر همهٔ سرویس‌هایتان داخلی‌اند، [سرور مجازی ایران](https://hakanserver.com/vps-iran/) هم شدنی است، به شرط آنکه نصب Docker و دریافت ایمیج‌ها را جداگانه حل کنید. برای بیشتر کاربردهای n8n یک [سرور مجازی خارجی](https://hakanserver.com/buy-a-virtual-server/buying-a-foreign-virtual-server/) انتخاب عملی‌تر است.

### منابع پیشنهادی سرور

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](https://hakanserver.com/connect-to-linux-server-via-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  **هشدار:** طبق مستندات 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  **هشدار:** کلید را بعد از اولین اجرا عوض نکنید. اگر 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](https://caddyserver.com/docs/automatic-https)). هدرهای `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](https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables) است. پس از هر تغییر در `.env` یا `compose.yaml`، `sudo docker compose up -d` بزنید؛ دستور `restart` متغیرهای جدید را اعمال نمی‌کند.

## ساخت حساب مالک و اولین ورک‌فلو

### حساب مالک و ورود دومرحله‌ای

1. آدرس `https://n8n.example.com` را باز کنید و در فرم **Set up owner account** ایمیل، نام و رمزی با دست‌کم ۸ کاراکتر، یک عدد و یک حرف بزرگ وارد کنید.
2. برای ورود دومرحله‌ای به **Settings ← Personal** بروید و **Enable 2FA** را بزنید، QR را با برنامهٔ Authenticator اسکن کنید، کد را وارد کنید و کدهای بازیابی را ذخیره کنید.
3. اختیاری: در **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 وجود دارد، اما همهٔ حساب‌های کاربری را حذف می‌کند.

### ورک‌فلو نمونه: پیام تلگرام برای هر فرم جدید

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

1. در تلگرام به `@BotFather` پیام دهید، `/newbot` را بفرستید، نام و نام کاربری ربات (با پایان `bot`) را وارد و توکن را کپی کنید.
2. به ربات خودتان `/start` بفرستید و روی سرور شناسهٔ چت را بگیرید؛ عدد جلوی `"chat":{"id":` همان Chat ID است:

```
curl -s "https://api.telegram.org/bot/getUpdates"
# ... "chat":{"id":123456789,"first_name":"Ali","type":"private"} ...
```
3. در n8n روی **Create workflow** و سپس **Add first step…** بزنید، Form را جست‌وجو و **On form submission** را انتخاب کنید.
4. در **Form Title** بنویسید «تماس با ما» و با **Add Form Element** سه فیلد بسازید: «نام» (Text Input)، «ایمیل» (Email) و «پیام» (Textarea). برای هر فیلد از **Add Attributes** مقدار **Custom Field Name** را به ترتیب `name`، `email` و `message` بگذارید.
5. روی + بعد از تریگر بزنید، Telegram را جست‌وجو و **Send a text message** را انتخاب کنید. در Credential گزینهٔ **Create new credential** را بزنید و توکن را در Access Token بگذارید.
6. در **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 }}
```
7. **Execute workflow** را بزنید، فرم آزمایشی را پر کنید و رسیدن پیام را ببینید.
8. روی **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](https://docs.n8n.io/deploy/host-n8n/keep-n8n-running/backup-and-restore)، بکاپ کامل یعنی دیتابیس به‌همراه پوشهٔ `.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 روی کامپیوتر خودتان یا یک [هاست بکاپ خارج](https://hakanserver.com/buy-hosting-and-domain/%D9%87%D8%A7%D8%B3%D8%AA-%D8%A8%DA%A9%D8%A7%D9%BE-%D8%AE%D8%A7%D8%B1%D8%AC/).

### بازگردانی روی همین سرور یا سرور جدید

روی سرور جدید، اول 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` شما را بی‌خبر یک نسخهٔ اصلی جلو می‌برند. روال امن:

1. یادداشت انتشار را در [صفحهٔ Releases در گیت‌هاب n8n](https://github.com/n8n-io/n8n/releases) بخوانید.
2. بکاپ بگیرید و `N8N_VERSION` را در `.env` عوض کنید.
3. ایمیج‌ها را بگیرید، کانتینرها را بازسازی کنید، لاگ را ببینید و یک ورک‌فلو مهم را دستی اجرا کنید.

```
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](https://docs.n8n.io/changelog/v30-breaking-changes) را بخوانید؛ از جمله: سقف پیش‌فرض زمان اجرای کد در 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 در سرور مجازی](https://hakanserver.com/bad-gateway-502-in-vps/) را ببینید. 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](https://github.com/n8n-io/n8n-hosting/tree/main/docker-compose/withPostgres)، برای n8n یک کاربر جداگانهٔ غیر superuser در PostgreSQL بسازید.

## سرور n8n در هاکان سرور

اگر تصمیم گرفتید n8n را روی سرور خودتان اجرا کنید، هاکان سرور در ۵۲ لوکیشن سرور مجازی ارائه می‌کند. برای n8n که با تلگرام، هوش مصنوعی یا گوگل کار می‌کند، یک [سرور لینوکس](https://hakanserver.com/buy-a-virtual-server/linux-server/) در لوکیشن خارجی مثل [سرور مجازی آلمان](https://hakanserver.com/vps-germany/) مناسب است و طبق جدول منابع بالا، برای شروع لازم نیست سرور بزرگی بگیرید. ارتقای منابع سرویس با ثبت تیکت انجام می‌شود. تحویل سرویس خودکار و کمتر از یک ساعت است. 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 برای گزارش روزانه بسازید و هر وقت سراغ ایجنت‌های هوش مصنوعی رفتید، مصرف رم سرور را زیر نظر بگیرید.

- مطلب قبلی: [وردپرس چیست؟ کاربردها، مزایا و معایب و شروع کار با وردپرس](https://hakanserver.com/what-is-wordpress/index.md)
- مطلب بعدی: [سرور ابری چیست؟ تفاوت با سرور مجازی و اختصاصی + چک‌لیست خرید](https://hakanserver.com/what-is-cloud-server/index.md)

## مقاله‌های مرتبط

- [نصب داکر روی اوبونتو 24.04 و 26.04 + Docker Compose و میرور ایران](https://hakanserver.com/install-docker-ubuntu/index.md)
- [چگونه از سرور ابری ایران استفاده کنیم؟ کاربرد، محدودیت و راه‌اندازی](https://hakanserver.com/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A7%D8%B2-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A7%D8%A8%D8%B1%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85%D8%9F/index.md)
- [سرور ابری چیست؟ تفاوت با سرور مجازی و اختصاصی + چک‌لیست خرید](https://hakanserver.com/what-is-cloud-server/index.md)

## سرویس‌های مرتبط هاکان سرور

- [سرور مجازی](https://hakanserver.com/buy-a-virtual-server/index.md): ۵۲ لوکیشن در ایران و خارج
- [سرور اختصاصی](https://hakanserver.com/dedicatedserver/index.md): ایران و ۸ کشور دیگر
- [هاست و دامنه](https://hakanserver.com/buy-hosting-and-domain/index.md): هاست سی‌پنل ایران و اروپا

فهرست همهٔ مقاله‌ها: https://hakanserver.com/blog/index.md
فهرست همهٔ صفحه‌ها و راهنمای سایت: https://hakanserver.com/llms.txt
