آموزش راه‌اندازی ربات تلگرام برای مانیتورینگ سرور

راه‌اندازی ربات تلگرام برای مانیتورینگ سرور

اگر مسئولیت مدیریت یک سرور را بر عهده دارید، می‌دانید که نظارت بر رویدادها و تغییرات سیستم به اندازه‌ راه‌اندازی اولیه اهمیت دارد. عملکرد سرور تنها به نصب و پیکربندی اولیه محدود نمی‌شود، بخش اصلی کار زمانی آغاز می‌شود که سرور در حال اجراست و باید از هر اتفاق غیرمنتظره‌ای در آن آگاه باشید.
بدون داشتن سیستم هشداردهی مناسب، احتمالا تا زمانی که آسیب یا اختلالی جدی رخ ندهد، از این اتفاق مطلع نخواهید شد. در چنین شرایطی، هشدارهای لحظه‌ای (Real-Time Alerts) مانند راه‌اندازی ربات تلگرام برای مانیتورینگ سرور نقش حیاتی پیدا می‌کنند. این هشدارها به مدیران سیستم کمک می‌کنند تا در کوتاهترین زمان ممکن از وقوع رویدادهای مهم مطلع شده و بتوانند سریع‌تر واکنش نشان دهند. هرچه فاصله‌ بین وقوع رویداد و اطلاع مدیر کمتر باشد، احتمال جلوگیری از خسارت یا اختلال بیشتر خواهد بود.در نگاه اول شاید تنظیم هشدار از طریق ایمیل راه‌حلی ساده و منطقی به نظر برسد، اما در عمل، این روش اغلب ناکارآمد و پر دردسر است. پیکربندی صحیح سرور ایمیل به تنهایی کاری پیچیده است، از تنظیم رکوردهای SPF و DKIM گرفته تا راه‌اندازی سرویس‌هایی مانند Postfix یا Exim . علاوه بر این، ارسال ایمیل ممکن است با تاخیر انجام شود، در پوشه‌ اسپم قرار گیرد یا اصلا به مقصد نرسد.

ربات تلگرام برای مانیتورینگ سرور

به بیان دیگر، برای اطلاع از ورود مشکوک به سرور یا خطایی در سیستم، اتکا به ایمیل شبیه به آن است که بخواهید با ایمیل از وقوع حادثه‌ای فوری مطلع شوید. به همین دلیل، بسیاری از مدیران حرفه‌ای ترجیح می‌دهند از روش‌های سریع‌تر و مطمئن‌تر برای دریافت هشدارها استفاده کنند، مانند پیام‌رسان‌ها ، اعلان‌های سیستمی (Push Notifications) یا حتی یکپارچه‌سازی هشدارها با ابزارهای مانیتورینگ و اتوماسیون.

از طرف دیگر، تلگرام برای این کار عالی است:

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

بنابراین، تلگرام تقریبا ابزار ایده‌آلی برای ارسال هشدارهای سرور به خودتان است. من چند سال گذشته روزانه از آن استفاده می‌کردم. به راحتی کار می‌کند!

پیش نیازها

قبل از اینکه وارد بحث راه‌اندازی ربات تلگرام برای مانیتورینگ سرور شویم، بیایید مطمئن شویم که مواد لازم را داشته‌ باشید:

  • یک VPS با سیستم عامل اوبونتو (۲۰.۰۴، ۲۲.۰۴ یا مشابه).
  • دانش پایه لینوکس، در استفاده از ترمینال، ویرایش فایل‌های پیکربندی و اجرای اسکریپت‌ها
  • بسته‌های ضروری (ما از این بسته‌ها برای تعامل با API تلگرام استفاده خواهیم کرد):
sudo apt update && sudo apt install -y curl jq
    • curl: برای ارسال درخواست‌های HTTP به API تلگرام استفاده می‌شود.
    • jq: برای تجزیه خروجی JSON هنگام دیباگ مفید است.
  • برنامه تلگرام روی تلفن یا دسکتاپ شما نصب شده است. این برنامه هم در اپ استور و هم در پلی استور رایگان است.

مرحله ۱ – راه‌اندازی ربات تلگرام

اینجا جایی است که ما واسط را تنظیم می‌کنیم که اعلان‌ها را از سرور به حساب تلگرام شما ارسال ‌کند.

یک ربات ایجاد و توکن آن را دریافت کنید

تلگرام را باز و BotFather@ را جستجو کنید.

با آن چت و اجرا کنید:

/newbot

BotFather موارد زیر را از شما می‌پرسد:

  • نام (Name) مانند MyServerNotifier
  • نام کاربری (username ) که باید با bot_ تمام شود

پس از ایجاد، چیزی شبیه به این دریافت خواهید کرد:

Use this token to access the HTTP API: 111111111:ABC-YourSuperSecretToken

از این توکن برای دسترسی به HTTP API استفاده کنید:

آن توکن را ذخیره کنید. کمی بعد به آن نیاز خواهیم داشت.

شناسه چت (chat ID) خود را دریافت کنید

ربات شما باید بداند که به کجا پیام ارسال کند. چند راه برای دریافت شناسه چت با استفاده از ربات‌های شخص ثالث وجود دارد، اما به شما نشان می‌دهم که چگونه می‌توانید شناسه خود را به صورت دستی دریافت کنید. برای دریافت شناسه چت خود، این مراحل را دنبال کنید:

با ربات جدید خود چت کنید و برای مثال Hello from admin-01 را ارسال کنید!

این URL را در مرورگر خود باز کنید (TOKEN را با توکن واقعی ربات خود جایگزین کنید):

https://api.telegram.org/botTOKEN/getUpdates

برای مثال، به این شکل خواهد بود:

https://api.telegram.org/bot111111111:ABC-YourSuperSecretToken/getUpdates

یک پاسخ JSON دریافت خواهید کرد. به دنبال “chat”:{“id”:22222222,…} بگردید. این شماره شناسه چت (chat ID) شماست.

نکته: اگر می‌خواهید چندین مدیر هشدار دریافت کنند، همین فرآیند را برای هر مدیر تکرار کنید تا شناسه‌های چت را دریافت کنید! ما این شناسه‌های چت را در اسکریپت مدیریت خواهیم کرد.

مرحله ۲ – نوشتن اسکریپت اعلان تلگرام

حالا که ربات را آماده کرده‌ایم، بیایید سرور خود را برای ارتباط با آن متصل کنیم.

ذخیره توکن ربات و شناسه‌های چت

ما نمی‌خواهیم رمزها را در اسکریپت‌ها وارد کنیم، بنابراین بیایید آنها را در یک فایل محیطی نگه داریم:

ایجاد فایل

sudo mkdir -p /etc/telegram

ایجاد و باز کردن فایل telegram.env:

sudo nano /etc/telegram/telegram.env

موارد زیر را در telegram.env اضافه کنید:

TELEGRAM_BOT_TOKEN="111111111:ABC-YourSuperSecretToken"
TELEGRAM_CHAT_IDS="222222222,333333333"
  • فراموش نکنید که این متغیرها را با مقادیر واقعی خود جایگزین کنید.
  • اگر چندین شناسه چت دارید، آنها را با کاما و بدون فاصله از هم جدا کنید.

فایل را قفل کنید تا فقط کاربر root بتواند آن را بخواند:

sudo chmod 600 /etc/telegram/telegram.env

ایجاد اسکریپت اعلان

یک اسکریپت ایجاد کنیم که یک پیام را بپذیرد و آن را به تلگرام ارسال کند.

ایجاد و باز کردن فایل telegram-notify:

sudo nano /usr/local/bin/telegram-notify

این اسکریپت را جایگذاری کنید:

#!/bin/bash
set -euo pipefail

source /etc/telegram/telegram.env

MESSAGE="$1"

for CHAT_ID in $(echo "$TELEGRAM_CHAT_IDS" | tr "," "\n"); do
curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE" \
-d parse_mode="Markdown" > /dev/null
done

اسکریپت را قابل اجرا کنید:

sudo chmod +x /usr/local/bin/telegram-notify

توضیح گام‌به‌گام بخش‌های اصلی اسکریپت ارسال اعلان تلگرام

در این بخش، اجزای کلیدی یک اسکریپت ساده برای ارسال اعلان (Notification) از طریق ربات تلگرام (Telegram Bot) بررسی می‌شود. هدف از این اسکریپت، ارسال سریع پیام‌های هشدار از سرور به مدیر سیستم است تا در صورت بروز هرگونه خطا یا رویداد مهم، اطلاع‌رسانی لحظه‌ای انجام شود.

در ادامه، به توضیح خط‌به‌خط این اسکریپت می‌پردازیم:

set -euo pipefail

این خط سه گزینه‌ی مهم Bash را فعال می‌کند تا اسکریپت با اطمینان بیشتری اجرا شود:

  • e- باعث می‌شود اگر هر دستور در اسکریپت با خطا مواجه شود، اجرای کل اسکریپت فورا متوقف گردد.
  • u- اگر متغیری استفاده شود که مقداردهی نشده، Bash خطا می‌دهد و از ادامه کار جلوگیری می‌کند.
  • o pipefail- اطمینان می‌دهد اگر یکی از دستورات در یک زنجیره‌ pipe شکست بخورد، خروجی کل pipe به عنوان خطا در نظر گرفته شود.

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

source /etc/telegram/telegram.env

این خط، فایل telegram.env را که در مسیر /etc/telegram/ قرار دارد بارگذاری می‌کند. این فایل معمولا شامل متغیرهای محیطی (Environment Variables) مهمی است، مانند:

  • توکن ربات تلگرام (BOT_TOKEN)
  • شناسه چت یا گروه مقصد (CHAT_IDs)

با استفاده از دستور source، مقادیر داخل فایل به محیط جاری Bash اضافه شده تا در ادامه اسکریپت بتوان از آنها استفاده کرد.

MESSAGE=”$1″

در این خط، اولین آرگومانی که هنگام اجرای اسکریپت وارد می‌شود (یعنی$۱ ) به عنوان محتوای پیام (Notification Text) در متغیر MESSAGE ذخیره می‌شود.

برای مثال:

sudo telegram-notify "Hello from Parsdev Blog!"

در این حالت، متن “Hello from Parsdev Blog!” به عنوان پیام ارسال خواهد شد.

حلقه for

در بخش بعدی اسکریپت، از یک حلقه‌ی for استفاده می‌شود تا پیام به همه‌ شناسه‌های چت (Chat IDs) موجود در فایل env ارسال گردد. این ویژگی زمانی کاربرد دارد که بخواهید اعلان را به چند نفر یا چند گروه مختلف بفرستید.

به عنوان نمونه:

for CHAT_ID in $CHAT_IDS; do
...
done

در این ساختار، پیام برای هر CHAT_ID در فهرست به‌صورت جداگانه ارسال می‌شود.

curl

قلب اصلی این اسکریپت، دستور curl است. این ابزار وظیفه دارد با استفاده از API رسمی تلگرام، پیام را ارسال کند.
در عمل، این دستور یک درخواست HTTP POST به آدرس زیر ارسال می‌کند:

https://api.telegram.org/bot${BOT_TOKEN}/sendMessage

و پارامترهای اصلی مانند chat_id و text را به آن می‌فرستد. به این ترتیب، پیام شما از طریق ربات تلگرام به مقصد تعیین‌شده ارسال می‌شود.

نمونه ساده:

curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE" \
> /dev/null

dev/null/
در انتهای دستور curl از مسیر خاصی به نام dev/null/ استفاده می‌شود. این مسیر مانند یک سطل زباله‌ی مجازی در لینوکس عمل می‌کند و هر خروجی‌ای که به آن ارسال شود، نادیده گرفته می‌شود.
هدف از این کار، تمیز نگه داشتن خروجی ترمینال است، به این معنا که هنگام اجرای اسکریپت، پیام‌های اضافی یا خروجی خام HTTP در صفحه نمایش داده نمی‌شود.

حالا ادامه دهید و آن را آزمایش کنید:

sudo telegram-notify "Hello from Parsdev Blog!"

شما باید فوری یک پیام در تلگرام دریافت کنید.

برای پروژه‌های مهم خود به دنبال سرور مطمئن هستید؟ خرید سرور مجازی با IP ثابت و سرعت بالا در پارسدو، گزینه‌ای ایده‌آل است.

مرحله ۳ – ربات خود را به کار بیندازید

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

crontab خود را یا با دسترسی root یا با مجوزهای sudo باز کنید:

sudo crontab -e

سپس مثال‌های زیر را اضافه کنید:

ضربان قلب روزانه (سرور زنده است )

اگر می‌خواهید خیالتان راحت باشد که سرور شما روشن است، روزانه یک پیام «من زنده هستم» برای خود ارسال کنید:

۰ ۹ * * * /usr/local/bin/telegram-notify ":white_check_mark: $(hostname) is alive as of $(date)"

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

هشدار خرابی سرویس

اگر وب سرور (nginx) از کار بیفتد، در ۵ دقیقه متوجه خواهید شد:

*/۵ * * * * ! systemctl is-active --quiet nginx && /usr/local/bin/telegram-notify ":rotating_light: $(hostname): nginx is NOT running at $(date)"

هشدار پر شدن فضای دیسک

وقتی فضای دیسک (مثلا در پارتیشن root یا یک پارتیشن مهم) از یک سطح آستانه مانند ۹۰٪ عبور کند، اسکریپت تلگرام یک پیام هشدار بفرستد.

*/۱۰ * * * * [ $(df / | awk '{print $5}' | tail -1 | sed 's/%//') -ge 90 ] && /usr/local/bin/telegram-notify ":warning: $(hostname): Disk usage is at $(df / | awk '{print $5}' | tail -1)"

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

هشدار افزایش شدید مصرف CPU یا حافظه

اگر مصرف CPU یا RAM به‌طور ناگهانی بالا برود (مصرف CPU بیش از ۸۰٪ یا حافظه آزاد کمتر از ۱۰٪) برای مدت معینی، می‌توانید اطلاع بگیرید.
مثال برای CPU:

*/۵ * * * * [ $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}') -ge 80 ] && /usr/local/bin/telegram-notify ":rotating_light: $(hostname): High CPU usage detected at $(date)"

هشدار قطع شدن اینترنت یا پینگ ناموفق

اگر سرور نتواند یک هاست پایدار مانند ۸.۸.۸.۸ یا DNS داخلی را برای چند بار متوالی پینگ کند، یعنی احتمالا ارتباط اینترنت یا شبکه قطع شده است.

*/۵ * * * * ping -c 3 8.8.8.8 > /dev/null || /usr/local/bin/telegram-notify ":warning: $(hostname): Network connectivity issue detected at $(date)"

جمع‌بندی

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

نوشتن نظر

نوشتن دیدگاه

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