نود SSH در N8N
نود SSH در n8n برای زمانی است که میخواهید از داخل یک ورکفلو، مستقیم به یک سرور لینوکسی/یونیکسی وصل شوید و فرمان اجرا کنید؛ مثل بررسی وضعیت سرویسها، اجرای اسکریپتهای دیپلوی، خواندن لاگها، یا حتی انجام کارهای نگهداری مثل پاکسازی فایلهای موقت. اگر با پنلهای مدیریت سرور یا ترمینال آشنا باشید، این نود همان کارها را بهصورت اتوماتیک و قابل تکرار داخل n8n انجام میدهد.
معرفی نود در N8N
نود SSH یک نود برای اجرای فرمان (Command) روی سیستمهای ریموت از طریق پروتکل SSH است. شما مشخصات اتصال (هاست، پورت، کاربر، کلید/پسورد) را میدهید و سپس دستور(ها) را اجرا میکنید و خروجی آن را بهعنوان داده به مرحلههای بعدی ورکفلو میفرستید.
- کارکرد اصلی: اجرای دستورهای شل (Shell) روی سرور ریموت و دریافت خروجی (stdout/stderr) و کد خروج.
- دستهبندی نود: Integration / Action (عملیاتی که روی سیستم خارجی انجام میدهد)
- اهمیت در ورکفلوها: بسیاری از عملیات DevOps و نگهداری سیستم (Deployment، مانیتورینگ ساده، بکاپ، ریاستارت سرویسها) بدون نیاز به ساخت API اختصاصی قابل اتوماسیون میشوند.
موارد استفاده
۱) دیپلوی اتوماتیک بعد از Push یا Release
مثال: با یک Trigger مثل GitHub Trigger یا Webhook، بعد از انتشار نسخه جدید، روی سرور دستورهای زیر را اجرا کنید:
- pull کردن تغییرات:
git pull - نصب وابستگیها:
npm ciیاcomposer install - ریاستارت سرویس:
systemctl restart myapp
۲) مانیتورینگ سبک و ارسال هشدار
سناریو: هر ۵ دقیقه با Cron Trigger وضعیت دیسک و RAM را بررسی کنید و اگر از حدی بالاتر رفت، در Slack/Telegram پیام بدهید.
- بررسی فضای دیسک:
df -h - بررسی مصرف RAM:
free -m
ترکیب پیشنهادی: SSH → Code/Function (برای پارس خروجی) → IF → Slack/Telegram Node
۳) جمعآوری لاگ و ذخیرهسازی
مثال: آخرین ۲۰۰ خط از لاگ Nginx را بگیرید و در یک فایل Google Drive یا S3 ذخیره کنید:
tail -n 200 /var/log/nginx/error.log
ترکیب پیشنهادی: SSH → Move Binary Data / Convert → Google Drive / S3
۴) اجرای بکاپ و انتقال خروجی
مثال: از دیتابیس بکاپ بگیرید، فایل را فشرده کنید و سپس لینک یا خروجی را گزارش کنید:
pg_dump mydb | gzip > /tmp/mydb_$(date +%F).sql.gz
۵) مدیریت سرویسها و عملیات نگهداری (Maintenance)
نمونهها:
- ریاستارت سرویس:
systemctl restart nginx - چک وضعیت:
systemctl is-active nginx - پاکسازی فایلهای قدیمی:
find /tmp -type f -mtime +7 -delete
پارامترها و تنظیمات
در n8n ممکن است نام دقیق بعضی گزینهها با نسخههای مختلف کمی تفاوت داشته باشد، اما منطق تنظیمات نود SSH معمولاً ثابت است: ابتدا Credential اتصال، سپس دستور اجرا و تنظیمات خروجی/زمانبندی.
فهرست پارامترها (بههمراه مثال)
- Credentials (SSH) / نوع داده: Credential
کاربرد: اطلاعات اتصال امن به سرور شامل Host، Port، Username و روش احراز هویت (Password یا Private Key).
مثال عملی: ساخت Credential با Host=203.0.113.10، Port=22، Username=deploy و ورود با Private Key.
- Host / نوع داده: String
کاربرد: IP یا دامنه سرور مقصد.
مثال:
example.comیا203.0.113.10نکته: بهتر است بهجای IP خام، از DNS استفاده کنید تا در صورت تغییر IP نیاز به تغییر ورکفلو نباشد.
- Port / نوع داده: Number
کاربرد: پورت SSH (پیشفرض 22).
مثال:
22یا2222 - Username / نوع داده: String
کاربرد: کاربر لینوکسی که فرمانها با آن اجرا میشوند.
مثال:
root(ترجیحاً استفاده نشود) یاdeployنکته: برای امنیت، یک کاربر محدود بسازید و فقط دسترسیهای لازم را با sudo تعریف کنید.
- Authentication Method / نوع داده: Option (Password/Private Key)
کاربرد: روش احراز هویت.
مثال: Private Key برای سرورهای Production.
نکته: در محیطهای واقعی، Private Key (ترجیحاً با Passphrase) امنتر از Password است.
- Password / نوع داده: String (Secret)
کاربرد: رمز عبور کاربر SSH در صورت انتخاب Password.
مثال:
MyStrongPasswordنکته: اگر از پسورد استفاده میکنید، محدودسازی IP و فعال بودن Fail2ban توصیه میشود.
- Private Key / نوع داده: String (Multiline Secret)
کاربرد: کلید خصوصی (PEM/OpenSSH) برای ورود.
مثال: محتوای فایل
~/.ssh/id_rsaیا کلید ed25519.نکته مهم: کلید را دقیقاً با خطوط BEGIN/END وارد کنید و فاصله/کاراکتر اضافی نگذارید.
- Passphrase / نوع داده: String (Secret)
کاربرد: اگر Private Key رمزگذاری شده باشد، Passphrase لازم است.
مثال:
myKeyPassphrase - Command / نوع داده: String
کاربرد: دستور یا اسکریپتی که روی سرور اجرا میشود.
مثال:
uptimeمثال داینامیک:
tail -n {{$json.lines || 100}} /var/log/syslogنکته: اگر خروجی را برای پردازش ماشینی میخواهید، بهتر است خروجی را JSON-friendly کنید (مثلاً با
echoیا استفاده از ابزارهایی مثلjq). - Working Directory (cwd) / نوع داده: String
کاربرد: مسیر پیشفرض اجرای دستور (در برخی پیادهسازیها/نسخهها موجود است).
مثال:
/var/www/myappنکته: اگر چنین گزینهای نبود، میتوانید در Command بنویسید:
cd /var/www/myapp && git pull - Timeout / نوع داده: Number
کاربرد: حداکثر زمان انتظار برای پایان دستور.
مثال:
60000میلیثانیه یا120</code ثانیه (بسته به UI نسخه)نکته: برای بکاپ/دیپلوی زمان بیشتری بگذارید، اما بینهایت نکنید تا ورکفلو گیر نکند.
- Return All Output / Output Format / نوع داده: Option
کاربرد: تعیین نحوه بازگرداندن خروجی (مثلاً کامل یا خلاصه) و اینکه stdout/stderr چگونه در خروجی نود قرار بگیرد.
مثال: بازگرداندن stdout برای پارس کردن و ارسال در پیام هشدار.
- Continue On Fail / نوع داده: Boolean (تنظیم عمومی نودها)
کاربرد: اگر دستور خطا داد، ورکفلو متوقف نشود و بتوانید خطا را هندل کنید.
مثال عملی: در مانیتورینگ، اگر اتصال قطع شد، بهجای توقف کل سناریو، یک پیام هشدار ارسال شود.
نکات مهم هنگام پیکربندی
- امنیت: تا حد ممکن از کلید SSH استفاده کنید، دسترسی کاربر را محدود کنید و اجازه اجرای فرمانهای خطرناک را کنترل کنید.
- sud o و مجوزها: اگر نیاز به
sudoدارید، بهتر است در فایل sudoers برای همان کاربر، دستورات مشخص را بدون پسورد مجاز کنید؛ در غیر این صورت دستور در حالت غیرتعاملی ممکن است منتظر پسورد بماند. - محیط اجرا: فرمانها معمولاً در یک شل غیرتعاملی اجرا میشوند؛ بنابراین ممکن است PATH یا پروفایلها مثل
.bashrcلود نشوند. مسیر کامل باینریها را بنویسید (مثلاً/usr/bin/node). - خروجی قابل پردازش: برای استفاده در IF/Code Node، خروجی را کوتاه، مشخص و ترجیحاً ساختارمند تولید کنید.
ورودیها و خروجیها
ورودی (Input)
نود SSH میتواند ورودی از نود قبلی بگیرد و در Command از Expression استفاده کند. معمولاً ورودی شامل فیلدهایی مثل نام سرویس، مسیر پروژه، تعداد خطوط لاگ یا هر پارامتر کنترلی دیگر است.
نمونه ورودی JSON:
{ "host": "example.com", "service": "nginx", "lines": 200, "path": "/var/www/myapp"}خروجی (Output)
خروجی معمولاً شامل متن stdout، متن stderr و کد خروج (exit code) است. ساختار دقیق ممکن است بسته به نسخه n8n متفاوت باشد، اما معمولاً چیزی شبیه نمونه زیر در آیتم خروجی دیده میشود:
{ "stdout": "activen", "stderr": "", "exitCode": 0}- stdout: خروجی عادی فرمان (برای پارس و تصمیمگیری مناسب)
- stderr: پیامهای خطا یا هشدار
- exitCode: اگر 0 باشد یعنی موفق؛ مقادیر غیر صفر معمولاً خطا یا وضعیت خاص را نشان میدهد.
نکات پیشرفته و ترفندها
۱) خروجی را JSON تولید کنید تا پارس ساده شود
به جای خروجیهای متنی طولانی، خروجی را ساختارمند کنید:
echo "{"service":"nginx","active":"$(systemctl is-active nginx)","time":"$(date -Iseconds)"}"سپس با یک Code Node آن را به JSON تبدیل و تصمیمگیری کنید.
۲) اجرای چند دستور بهصورت امن و قابل خواندن
بهجای زنجیره طولانی، از set -e و && استفاده کنید تا در صورت خطا ادامه ندهد:
set -ecd /var/www/myapp && git pullnpm cipm2 reload ecosystem.config.js
اگر UI نود فقط یک خط Command میپذیرد:
bash -lc "set -e; cd /var/www/myapp && git pull; npm ci; pm2 reload ecosystem.config.js"
۳) کنترل همزمانی و جلوگیری از تداخل دیپلوی
اگر ممکن است دو اجرا همزمان شوند (مثلاً دو Push پشت سر هم)، از فایل lock استفاده کنید:
bash -lc "flock -n /tmp/deploy.lock -c 'cd /var/www/myapp && git pull && npm ci && systemctl restart myapp'"
۴) استفاده از Exit Code برای تصمیمگیری در IF Node
در بسیاری از سناریوها، بهجای بررسی متن خروجی، بررسی exitCode دقیقتر است:
- اگر
exitCode == 0→ موفق - اگر غیر 0 → ارسال هشدار یا اجرای مسیر جایگزین
۵) بهینهسازی: کاهش خروجی و زمان اجرا
- خروجی را محدود کنید: به جای
catازtailاستفاده کنید. - از دستورات سبکتر استفاده کنید: برای وضعیت سرویس
systemctl is-activeبهجایstatus. - اگر نیاز دارید چند کار پشت سر هم انجام دهید، آنها را در یک اسکریپت روی سرور قرار دهید و فقط همان اسکریپت را صدا بزنید؛ این کار هم امنتر است هم نگهداری راحتتر.
محدودیتها و خطاها
محدودیتها
- عدم تعامل (Interactive): این نود برای کارهای تعاملی مثل وارد کردن پسورد در میانه اجرای دستور یا پاسخ به Promptها مناسب نیست، مگر اینکه از روشهای غیرتعاملی استفاده کنید.
- وابستگی به محیط سرور: اگر ابزار لازم روی سرور نصب نباشد (مثلاً git، node، pm2)، دستور شکست میخورد.
- مدیریت فایل: نود SSH بیشتر برای اجرای فرمان است؛ برای انتقال فایل ممکن است نیاز به روشهای دیگر (مثل SFTP/HTTP/S3) یا نصب ابزارهایی مثل rsync و اجرای آن از طریق SSH داشته باشید.
خطاهای رایج و راهحلها
- Authentication failed / Permission denied (publickey)
- کلید خصوصی اشتباه است یا فرمتش درست وارد نشده است.
- کلید عمومی در
~/.ssh/authorized_keysکاربر مقصد وجود ندارد. - دسترسی فایلها روی سرور درست نیست (برای SSH حساس است): پوشه
.sshمعمولاً 700 و فایلauthorized_keysمعمولاً 600.
- Timeout / Connection timed out
- فایروال یا Security Group پورت SSH را بسته است.
- IP سرور اشتباه است یا DNS درست resolve نمیشود.
- Timeout نود کم تنظیم شده و دستور طولانی است؛ مقدار را افزایش دهید.
- command not found
- PATH در شل غیرتعاملی کامل نیست؛ مسیر کامل باینری را استفاده کنید.
- دستور روی سرور نصب نیست؛ نصب کنید یا جایگزین مناسب بگذارید.
- sudo: a terminal is required / sudo password prompt
- فرمان نیاز به sudo دارد اما محیط تعاملی نیست.
- راهحل: تنظیم sudoers برای اجرای همان دستورها بدون پسورد (بهصورت محدود و امن) یا اجرای فرمانها با کاربری که مجوز کافی دارد.
- Exit code غیر صفر بدون پیام واضح
- هم stdout و هم stderr را در خروجی بررسی کنید.
- برای دیباگ، اول دستور را در ترمینال همان کاربر اجرا کنید و سپس دقیقاً همان را در n8n قرار دهید.
ایده ها
- ساخت ورکفلو «Self-healing»: اگر سرویس از کار افتاد، با SSH ریاستارت شود و نتیجه در یک کانال گزارش شود.
- اتوماسیون صدور گزارش روزانه سرور: خروجیهای
uptime،df -hوjournalctl --sinceجمعآوری و ایمیل شود. - پاکسازی خودکار فایلهای قدیمی بکاپ: هر هفته فایلهای قدیمیتر از N روز حذف و نتیجه لاگ شود.
- مدیریت ساده چند سرور: با Split In Batches روی لیست سرورها حلقه بزنید و یک دستور مشترک (مثل آپدیت پکیجها) اجرا کنید.
- دیپلوی Blue/Green سبک: تگ/برنچ را از ورودی بگیرید، روی سرور checkout کنید، healthcheck بزنید و در صورت موفقیت سوییچ کنید.
