ASRIN

بیایید حرف بزنیم

ثبت سفارش
۲۰۲۶/۰۹/۰۱

نصب n8n روی سرور اوبونتو با تنظیمات کامل و امن

راه‌اندازی n8n روی سرور اوبونتو به‌شکلی که همیشه بالا بماند: داکر کامپوز، پستگرس، دامنه و گواهی SSL، فایروال و پشتیبان‌گیری خودکار. با فایل‌های آماده و توضیح اینکه هر تنظیم چه کاری می‌کند.

نمودار چهار لایه نصب n8n روی اوبونتو شامل Nginx، داکر، PostgreSQL و پشتیبان‌گیری

فرق این راهنما با نصب ساده در سه چیز است: بعد از ری‌استارت سرور خودش بالا می‌آید، داده‌ها در پستگرس می‌نشینند نه در یک فایل، و از بیرون فقط با HTTPS در دسترس است.

چه چیزی لازم دارید

  • سروری با اوبونتو ۲۲.۰۴ یا ۲۴.۰۴ — حداقل ۲ گیگ رم
  • یک دامنه یا زیردامنه که رکورد A آن به آی‌پی سرور اشاره کند
  • دسترسی sudo

اگر رکورد DNS را همین حالا ست کنید، تا وقتی به گام گواهی برسید منتشر شده است.

معماری‌ای که می‌سازیم

نمودار چهار لایه نصب n8n روی اوبونتو شامل Nginx، داکر، PostgreSQL و پشتیبان‌گیری
چهار لایه با مرز مشخص. وقتی چیزی خراب شد، می‌دانید کجا را نگاه کنید.

گام ۱ — آماده‌سازی سرور

sudo apt update && sudo apt upgrade -y
sudo timedatectl set-timezone Asia/Tehran

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

فایروال

sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

دقت کنید پورت 5678 را باز نمی‌کنیم. n8n فقط از پشت Nginx در دسترس است. اگر آن پورت را باز بگذارید، پنل شما بدون HTTPS روی اینترنت است.

گام ۲ — نصب داکر

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

بعد از دستور دوم یک بار خارج شوید و دوباره وارد شوید، وگرنه هر دستور داکری sudo می‌خواهد.

گام ۳ — فایل کامپوز

mkdir -p ~/n8n && cd ~/n8n
nano docker-compose.yml

این را بگذارید (به‌جای n8n.example.com دامنه‌ی خودتان):

services:
  db:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${DB_PASS}
      POSTGRES_DB: n8n
    volumes:
      - db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 10s
      retries: 5

  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: db
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${DB_PASS}
      N8N_HOST: n8n.example.com
      N8N_PROTOCOL: https
      WEBHOOK_URL: https://n8n.example.com/
      GENERIC_TIMEZONE: Asia/Tehran
      TZ: Asia/Tehran
      N8N_ENCRYPTION_KEY: ${ENC_KEY}
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  db_data:
  n8n_data:

چند تصمیم در این فایل که ارزش توضیح دارند:

ports: "127.0.0.1:5678:5678" — آن 127.0.0.1 جلویی حیاتی است. یعنی پورت فقط روی خود سرور شنیده می‌شود، نه روی اینترنت. بدون آن، فایروال هم نجاتتان نمی‌دهد چون داکر قوانین خودش را بالاتر می‌نویسد.

N8N_ENCRYPTION_KEY — کلیدی که اعتبارنامه‌ها با آن رمز می‌شوند. اگر گمش کنید، همه‌ی اعتبارنامه‌های ذخیره‌شده غیرقابل بازیابی می‌شوند. جای امنی نگهش دارید.

depends_on ... service_healthy — n8n صبر می‌کند تا پستگرس واقعاً آماده شود. بدون این، در ری‌استارت سرور، n8n زودتر بالا می‌آید و با خطای اتصال می‌افتد.

فایل رمزها

cd ~/n8n
echo "DB_PASS=$(openssl rand -hex 16)" > .env
echo "ENC_KEY=$(openssl rand -hex 24)" >> .env
chmod 600 .env
cat .env   # یک نسخه جای امن نگه دارید

بالا آوردن

docker compose up -d
docker compose ps

گام ۴ — دامنه و گواهی

sudo apt install -y nginx certbot python3-certbot-nginx
sudo nano /etc/nginx/sites-available/n8n
server {
    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 3600;
    }
}

دو خط Upgrade و Connection را حذف نکنید. n8n برای به‌روزرسانی زنده‌ی صفحه از وب‌سوکت استفاده می‌کند؛ بدون این‌ها ظاهراً کار می‌کند ولی رابط کاربری‌اش مدام قطع می‌شود.

proxy_read_timeout 3600 هم برای فلوهای طولانی است، وگرنه بعد از یک دقیقه قطع می‌شوند.

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

سرتیفیکات خودش هر سه ماه تمدید می‌شود.

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

این تنها بخشی است که همه از رویش رد می‌شوند و بعداً پشیمان می‌شوند.

mkdir -p ~/backups
nano ~/n8n/backup.sh
#!/bin/bash
set -e
D=$(date +%F)
cd ~/n8n
docker compose exec -T db pg_dump -U n8n n8n | gzip > ~/backups/n8n-$D.sql.gz
find ~/backups -name "n8n-*.sql.gz" -mtime +14 -delete
chmod +x ~/n8n/backup.sh
crontab -e
# این خط را اضافه کنید:
0 3 * * * /bin/bash ~/n8n/backup.sh

هر شب ساعت ۳ پشتیبان می‌گیرد و نسخه‌های قدیمی‌تر از دو هفته را پاک می‌کند.

یک بار بازیابی را امتحان کنید. پشتیبانی که تستش نکرده‌اید، پشتیبان نیست:

gunzip -c ~/backups/n8n-2026-08-31.sql.gz | \
  docker compose exec -T db psql -U n8n n8n

چند نکته‌ی امنیتی

  • ورود با کلید SSH، و بستن ورود با رمز
  • به‌روزرسانی امنیتی خودکار: sudo apt install unattended-upgrades
  • اگر جز خودتان کسی لازم ندارد، در Nginx محدودیت آی‌پی بگذارید
  • در تنظیمات n8n، احراز هویت دومرحله‌ای را روشن کنید

وقتی چیزی کار نمی‌کند

502 Bad Gateway — Nginx بالاست ولی n8n نه. docker compose logs n8n

وب‌هوک کار نمی‌کندWEBHOOK_URL باید دقیقاً دامنه‌ی واقعی با https:// و اسلش آخر باشد.

بعد از ری‌استارت بالا نمی‌آیدrestart: unless-stopped را جا انداخته‌اید.

بعدش چه؟

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

و اگر می‌خواهید ابتدا بفهمید n8n اصلاً به چه دردتان می‌خورد، این مقاله جوابش را دارد.

دیدگاه شما

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *