نصب n8n روی سرور اوبونتو با تنظیمات کامل و امن
راهاندازی n8n روی سرور اوبونتو بهشکلی که همیشه بالا بماند: داکر کامپوز، پستگرس، دامنه و گواهی SSL، فایروال و پشتیبانگیری خودکار. با فایلهای آماده و توضیح اینکه هر تنظیم چه کاری میکند.
فرق این راهنما با نصب ساده در سه چیز است: بعد از ریاستارت سرور خودش بالا میآید، دادهها در پستگرس مینشینند نه در یک فایل، و از بیرون فقط با HTTPS در دسترس است.
چه چیزی لازم دارید
- سروری با اوبونتو ۲۲.۰۴ یا ۲۴.۰۴ — حداقل ۲ گیگ رم
- یک دامنه یا زیردامنه که رکورد
Aآن به آیپی سرور اشاره کند - دسترسی
sudo
اگر رکورد DNS را همین حالا ست کنید، تا وقتی به گام گواهی برسید منتشر شده است.
معماریای که میسازیم

گام ۱ — آمادهسازی سرور
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 اصلاً به چه دردتان میخورد، این مقاله جوابش را دارد.