نصب n8n روی VPS با Docker Compose؛ دستور به دستور تا HTTPS، فایروال و بکآپ

خلاصه تصمیم: برای ربات تلگرام و وبهوک پرداخت، n8n باید روی VPS لینوکسی با دامنه، HTTPS، volume پایدار، فایروال و بکآپ بالا باشد — نه روی لپتاپ. این راهنما مسیر Docker Compose + nginx + Let’s Encrypt را با دستور واقعی میدهد؛ همین مسیری که در پروژههای کوچک بارها جواب داده.
بخشی از خوشهی اتوماسیون با n8n. اگر هنوز بین n8n و Make مرددید، اول ماتریس تصمیم را ببینید.
ترفند: همهی دستورها را روی یک سابدامین اختصاصی مثل
n8n.yourdomain.comاجرا کنید. n8n را روی دامنهی اصلی سایت فروشگاهی نگذارید — جداسازی، دیباگ و SSL را سادهتر میکند.
پیشنیازها و فرضها
| مورد | مقدار پیشنهادی شروع | چرا |
|---|---|---|
| OS | Ubuntu 22.04/24.04 LTS | مستند زیاد، Docker پایدار |
| RAM | حداقل ۲GB (۴GB راحتتر) | Node + صف اجرا حافظه میخورد |
| CPU | ۱–۲ vCPU | برای SME کافی است |
| دیسک | ۲۰GB+ SSD | لاگ و بکآپ جا میخواهد |
| دسترسی | SSH با کاربر sudo | root مستقیم توصیه نمیشود |
| دامنه | A record → IP سرور | برای SSL ضروری |
| پورتها | ۲۲، ۸۰، ۴۴۳ | بقیه را ببندید |
فرض این راهنما: دامنه را دارید، DNS به IP سرور پوینت شده، و روی سرور خارج از ایران یا دیتاسنتری با دسترسی پایدار به Docker Hub کار میکنید. اگر pull ایمیج از داخل ایران کند/قطع است، بخش «ایران و دانلود ایمیج» را جدی بگیرید.
گام ۰ — آمادهسازی سرور
بهعنوان کاربر با sudo:
sudo apt update && sudo apt -y upgrade
sudo apt -y install ca-certificates curl gnupg ufw fail2banکاربر غیرroot (اگر ندارید):
sudo adduser n8nadmin
sudo usermod -aG sudo n8nadminاز این به بعد با n8nadmin کار کنید.
گام ۱ — نصب Docker و Compose
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USERاز SSH خارج شوید و دوباره وارد شوید تا گروه docker اعمال شود. تست:
docker version
docker compose versionعیبیابی: اگر
permission deniedروی ساکت داکر دیدید، یا relogin نکردهاید یا کاربر در گروه docker نیست:groupsرا چک کنید.
گام ۲ — فایروال (UFW) قبل از باز کردن سرویس
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verboseپورت ۵۶۷۸ n8n را به اینترنت باز نکنید. فقط nginx از localhost به آن وصل میشود.
ترفند امنیتی: اگر IP ثابت اداری دارید، SSH را با
sudo ufw allow from YOUR.IP.TO.IP to any port 22محدود کنید و قانون عمومی OpenSSH را حذف کنید.
گام ۳ — پوشه پروژه، کلید رمزنگاری، فایلهای env
sudo mkdir -p /opt/n8n
sudo chown $USER:$USER /opt/n8n
cd /opt/n8n
mkdir -p n8n_data local-filesکلید رمزنگاری credential بسازید و نگه دارید — اگر عوض شود بدون بکآپ، credentialهای ذخیرهشده میمیرند:
openssl rand -hex 32خروجی را در جای امن تیم ذخیره کنید. سپس:
nano /opt/n8n/.envمحتوای نمونه (مقادیر را عوض کنید):
# دامنه عمومی شما
N8N_HOST=n8n.example.com
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.example.com/
# منطقه زمانی گزارش تیم
GENERIC_TIMEZONE=Asia/Tehran
TZ=Asia/Tehran
# کلید رمزنگاری — همان خروجی openssl
N8N_ENCRYPTION_KEY=REPLACE_WITH_OPENSSL_HEX
# امنیت پایه UI
N8N_BASIC_AUTH_ACTIVE=false
N8N_USER_MANAGEMENT_DISABLED=false
# محدودیتهای عملی
N8N_PAYLOAD_SIZE_MAX=16
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168نکته تصمیم:
WEBHOOK_URLباید دقیقاً همان آدرس HTTPS عمومی باشد که تلگرام و درگاه میبینند. اشتباه رایج: گذاشتنhttp://IP:5678.
مجوز:
chmod 600 /opt/n8n/.envگام ۴ — Docker Compose برای n8n
nano /opt/n8n/docker-compose.ymlservices:
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678"
env_file:
- .env
environment:
- NODE_ENV=production
- N8N_SECURE_COOKIE=true
volumes:
- ./n8n_data:/home/node/.n8n
- ./local-files:/files
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/healthz || exit 1"]
interval: 30s
timeout: 10s
retries: 5بالا آوردن:
cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f --tail=100با Ctrl+C از لاگ خارج شوید (کانتینر میماند). تست لوکال:
curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:5678/healthzباید 200 ببینید.
ایران و دانلود ایمیج: اگر
docker compose pullتایماوت شد: (۱) از VPS با دسترسی پایدار به رجیستری استفاده کنید، (۲) ایمیج را روی ماشین دیگر pull وdocker saveکنید و باscpبفرستید، (۳) آینهی مجاز ارائهدهنده را اگر دارد به کار بگیرید. این راهنما مسیر دور زدن فیلتر نیست — مسیر عملی انتقال ایمیج است.
پین کردن نسخه (پیشنهادی بعد از پایدار شدن):
docker images | grep n8n
# سپس در compose بهجای latest بگذارید مثلاً n8n:1.XX.Xگام ۵ — nginx بهعنوان reverse proxy
sudo apt -y install nginx
sudo nano /etc/nginx/sites-available/n8nserver {
listen 80;
listen [::]:80;
server_name n8n.example.com;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600;
proxy_buffering off;
}
}فعالسازی:
sudo ln -sf /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/n8n
sudo nginx -t
sudo systemctl reload nginxDNS را چک کنید:
dig +short n8n.example.com
curl -I http://n8n.example.comگام ۶ — SSL با Certbot (Let’s Encrypt)
sudo apt -y install certbot python3-certbot-nginx
sudo certbot --nginx -d n8n.example.comپیشنهادهای certbot را برای redirect HTTP→HTTPS بپذیرید. تمدید خودکار معمولاً با systemd timer میآید؛ تست dry-run:
sudo certbot renew --dry-runبعد از SSL، در مرورگر بروید به https://n8n.example.com و کاربر ادمین بسازید.
ترفند: بلافاصله بعد از ساخت ادمین، اگر نسخه گزینهی دعوت/ثبتنام عمومی دارد، آن را قفل کنید. یک پنل n8n باز روی اینترنت = سطح حمله رایگان.
گام ۷ — سختسازی سریع بعد از بالا آمدن
- پسورد ادمین قوی + ذخیره در پسوردمنیجر تیم
- ۲FA را اگر در نسخهتان هست فعال کنید
- توکنها فقط داخل Credentials
fail2banرا برای ssh فعال نگه دارید:
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd- مالکیت volume:
# اگر خطای permission روی /home/node/.n8n دیدید:
docker compose down
sudo chown -R 1000:1000 /opt/n8n/n8n_data
docker compose up -dگام ۸ — تست وبهوک (قبل از تلگرام)
در n8n یک workflow موقت:
- نود Webhook (Method: POST، path مثلاً
hook-test) - نود Respond to Webhook با body
{"ok":true} - Active کنید
از بیرون:
curl -X POST https://n8n.example.com/webhook/hook-test \
-H "Content-Type: application/json" \
-d '{"ping":1}'باید {"ok":true} بگیرید. اگر ۴۰۴/۵۰۲: بخش عیبیابی پایین.
گام ۹ — بکآپ که واقعاً کار میکند
۹.۱ اسکریپت بکآپ روزانه
nano /opt/n8n/backup.sh#!/usr/bin/env bash
set -euo pipefail
STAMP=$(date +%Y%m%d-%H%M)
DEST=/opt/n8n/backups/$STAMP
mkdir -p "$DEST"
cp /opt/n8n/.env "$DEST/env.gpg.tmp"
# بهتر: قبل از کپی، .env را با gpg رمز کنید؛ اینجا ساده نگه داشتیم
cp /opt/n8n/.env "$DEST/.env"
cp /opt/n8n/docker-compose.yml "$DEST/"
tar -C /opt/n8n -czf "$DEST/n8n_data.tgz" n8n_data
# نگهداری ۱۴ روز
find /opt/n8n/backups -mindepth 1 -maxdepth 1 -type d -mtime +14 -exec rm -rf {} \;
echo "Backup done: $DEST"chmod 700 /opt/n8n/backup.sh
mkdir -p /opt/n8n/backups
/opt/n8n/backup.shCron:
crontab -e
# هر روز ۰۳:۱۵ به وقت سرور
15 3 * * * /opt/n8n/backup.sh >> /var/log/n8n-backup.log 2>&1۹.۲ Export ورکفلو از UI
Settings → Workflows → Download؛ فایل JSON را در ریپوی خصوصی یا درایو امن تیم بگذارید.
۹.۳ اسنپشات VPS
قبل از هر آپدیت بزرگ ایمیج، از پنل ارائهدهنده اسنپشات بگیرید.
ضدالگو: بکآپی که هرگز restore نشده. ماهی یکبار روی VPS تست،
tarرا باز کنید و ببینیدn8n_dataسالم است.
گام ۱۰ — آپدیت بدون غافلگیری
cd /opt/n8n
/opt/n8n/backup.sh
docker compose pull
docker compose up -d
docker compose logs --tail=50
curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:5678/healthzبعد از آپدیت، webhook تست و یک workflow حیاتی را دستی Run کنید.
عیبیابی رایج (جدول جنگی)
| علامت | احتمال اول | فرمان / کار اول |
|---|---|---|
| UI از بیرون باز نمیشود | DNS یا UFW یا nginx | dig +short ... ، sudo ufw status ، sudo nginx -t |
| ۵۰۲ Bad Gateway | n8n پایین است | docker compose ps ، docker compose logs --tail=200 |
| healthz لوکال نیست | کانتینر کرش / پرمیشن volume | لاگ + chown 1000:1000 n8n_data |
| SSL نمیگیرد | پورت ۸۰ بسته / DNS اشتباه | UFW ۸۰ باز باشد؛ A record درست |
| webhook تلگرام set نمیشود | URL غیر HTTPS یا self-signed بد | فقط Let’s Encrypt معتبر |
| workflow بعد از restart رفته | volume ماونت نشده | docker compose config و مسیر ./n8n_data |
| credential ناخوانا | N8N_ENCRYPTION_KEY عوض شده |
کلید قدیم را برگردانید؛ کلید را در بکآپ نگه دارید |
| کشیدن ایمیج شکست | رجیستری از شبکهی سرور | save/load ایمیج یا زمانبندی مجدد pull |
| CPU بالا | حلقهی اجرا / webhook اسپم | executions prune؛ rate limit در ورکفلو |
لاگ nginx:
sudo tail -n 100 /var/log/nginx/error.logوضعیت کانتینر:
docker compose -f /opt/n8n/docker-compose.yml logs -f n8nنکات وبهوک تلگرام مخصوص ایران (سطح عملی)
- مسیر ترافیک تلگرام → سرور شما است؛ کیفیت دیتاسنتر و SSL مهمتر از ترفند کلاینت است.
setWebhookرا فقط رویhttps://n8n.example.com/webhook/...بزنید (مسیر واقعی نود).- اگر گاهی Telegram API از سرور timeout میدهد، روی نودها Retry بگذارید و شکست را به گروه ادمین بفرستید.
- توکن BotFather را در چت گروهی و اسکرینشات نگذارید.
ادامهی پروژه: ربات پشتیبانی تلگرام با n8n.
چکلیست نهایی «آمادهی تولید»
- [ ]
https://n8n.example.comبا قفل SSL باز میشود - [ ] پورت ۵۶۷۸ از اینترنت بسته است (فقط 127.0.0.1)
- [ ] UFW فقط ۲۲/۸۰/۴۴۳
- [ ]
.envمجوز ۶۰۰ و کلید encryption بکآپ شده - [ ] volume
n8n_dataبعد ازcompose down/upداده را نگه میدارد - [ ] webhook تست از بیرون ۲۰۰ میدهد
- [ ]
backup.shحداقل یکبار خروجی داده - [ ] کاربر ادمین ساخته شده و ثبتنام عمومی قفل است
جمعبندی و مسیر بعدی
نصب موفق = آدرس پایدار + HTTPS + داده پایدار + فایروال + بکآپ. زیبایی UI اولویت چهارم است.
- تصویر بزرگ خوشه: اتوماسیون با n8n
- پروژه اول: ربات تلگرام
- هنوز مردد؟ n8n یا Make
اگر میخواهید همین مسیر را با یک پروژهی واقعی و قدمبهقدم جلو ببرید، دورهی n8n همیار از راهاندازی سرور تا ساخت ورکفلو تولید را پوشش میدهد.




ثبت دیدگاه