Memasang Alert Server ke Telegram Saat Ada Masalah
Cara membuat bot Telegram, mengirim alert dari server Linux dengan skrip bash dan cron, memberi tahu saat layanan systemd gagal, dan menyambungkan Netdata.
Jawaban singkat
Buat bot lewat @BotFather, ambil chat ID dari getUpdates, lalu kirim pesan dengan curl ke Bot API. Bungkus dalam skrip yang memeriksa disk, layanan, dan website secara berkala, hanya mengirim saat status berubah, dan sambungkan juga ke systemd dan Netdata.
Daftar isi
- Langkah memasang alert Telegram
- 1. Buat bot lewat @BotFather
- 2. Dapatkan chat ID tujuan
- 3. Simpan token dengan aman
- 4. Buat perintah pengirim pesan
- 5. Buat skrip pemeriksaan yang tidak berisik
- 6. Jadwalkan setiap 5 menit
- 7. Beri tahu saat layanan systemd gagal
- 8. Sambungkan Netdata bila sudah terpasang
- Pilih cara yang mana?
- Pertanyaan yang sering diajukan
- Checklist singkat
Seberapa cepat kamu tahu kalau disk server penuh atau Nginx berhenti? Kalau jawabannya "saat pelanggan komplain", alert ke Telegram adalah perbaikan paling murah yang bisa kamu pasang hari ini. Pesan langsung masuk ke HP, bisa ke grup tim, dan tidak butuh layanan berbayar.
Caranya: buat bot Telegram, kirim pesan lewat Bot API dengan curl, lalu panggil perintah itu dari skrip pemeriksaan yang berjalan berkala. Berikut langkah lengkapnya untuk server Linux mana pun.
Langkah memasang alert Telegram
1. Buat bot lewat @BotFather
Buka Telegram, cari akun resmi @BotFather, kirim /newbot, lalu ikuti pertanyaannya (nama bot dan username yang diakhiri bot). Di akhir, BotFather memberikan token berbentuk angka, titik dua, dan deretan huruf. Token ini seperti kata sandi: siapa pun yang memegangnya bisa mengendalikan bot.
2. Dapatkan chat ID tujuan
Kirim pesan apa saja ke bot barumu (atau tambahkan bot ke grup tim, lalu kirim pesan di grup). Setelah itu buka alamat berikut dari server atau browser, ganti TOKEN dengan token bot:
curl -s "https://api.telegram.org/botTOKEN/getUpdates"
Cari bagian "chat":{"id":...} pada hasilnya. Chat pribadi berupa angka positif, sedangkan ID grup diawali tanda minus, dan supergroup diawali -100. Kalau hasilnya kosong, kirim pesan sekali lagi lalu ulangi. Di grup, bot dengan privacy mode bawaan tetap menerima perintah yang diawali /, jadi kirim misalnya /start bila pesan biasa tidak muncul.
3. Simpan token dengan aman
Buat file /etc/tg-alert.env:
TG_TOKEN="123456789:ISI-TOKEN-DARI-BOTFATHER"
TG_CHAT_ID="-1001234567890"
Lalu kunci izinnya:
sudo chmod 600 /etc/tg-alert.env
Jangan menaruh token langsung di crontab atau skrip yang bisa dibaca user lain.
4. Buat perintah pengirim pesan
Simpan sebagai /usr/local/bin/tg-alert:
#!/bin/bash
set -u
. /etc/tg-alert.env
PESAN="[$(hostname)] $*"
curl -sS --max-time 10 -X POST \
"https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
--data-urlencode "chat_id=${TG_CHAT_ID}" \
--data-urlencode "text=${PESAN}" > /dev/null
Beri izin eksekusi dengan sudo chmod 700 /usr/local/bin/tg-alert, lalu uji:
sudo tg-alert "Uji alert dari server"
Kalau pesan masuk ke Telegram, jalur kirim sudah beres. Nama server ikut tercantum di depan pesan, sehingga mudah dibedakan bila kamu mengelola beberapa server.
5. Buat skrip pemeriksaan yang tidak berisik
Kesalahan umum adalah mengirim pesan setiap kali pemeriksaan berjalan. Dalam satu jam grup bisa dibanjiri pesan yang sama, dan akhirnya diabaikan. Skrip berikut menyimpan status di folder kecil dan hanya mengirim pesan saat kondisi berubah: sekali saat bermasalah, sekali saat pulih.
Simpan sebagai /usr/local/bin/cek-server.sh:
#!/bin/bash
STATE=/var/lib/cek-server
mkdir -p "$STATE"
lapor() { # $1 kunci, $2 = 1 bila bermasalah, $3 pesan
if [ "$2" = 1 ]; then
if [ ! -e "$STATE/$1" ]; then
/usr/local/bin/tg-alert "MASALAH: $3" && touch "$STATE/$1"
fi
elif [ -e "$STATE/$1" ]; then
/usr/local/bin/tg-alert "PULIH: $3" && rm -f "$STATE/$1"
fi
}
# Disk root di atas 85%
PAKAI=$(df --output=pcent / | tail -1 | tr -dc '0-9')
[ "$PAKAI" -ge 85 ] && m=1 || m=0
lapor disk-root "$m" "Disk / terpakai ${PAKAI}%"
# Load 1 menit di atas 2x jumlah core
LOAD=$(cut -d' ' -f1 /proc/loadavg)
awk -v l="$LOAD" -v c="$(nproc)" 'BEGIN{exit !(l > c*2)}' && m=1 || m=0
lapor load "$m" "Load average ${LOAD}"
# Layanan penting
for svc in nginx mysql; do
systemctl is-active --quiet "$svc" && m=0 || m=1
lapor "svc-$svc" "$m" "Layanan $svc"
done
# Website merespons 200
KODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 https://domainmu.com/)
[ "$KODE" = 200 ] && m=0 || m=1
lapor web "$m" "Website domainmu.com kode HTTP $KODE"
Sesuaikan nama layanan (misalnya mariadb atau php8.3-fpm), alamat website, dan ambang batasnya. Ambang yang wajar per metrik dibahas di metrik server yang wajib dipantau. Beri izin eksekusi dengan chmod 700.
6. Jadwalkan setiap 5 menit
Buat file /etc/cron.d/cek-server:
*/5 * * * * root /usr/local/bin/cek-server.sh
Penjelasan format jadwal cron ada di cara membuat cron job di Linux. Untuk menguji, isi sementara ambang disk dengan angka rendah, misalnya 1, lalu jalankan skrip manual. Pesan MASALAH harus masuk sekali saja, dan PULIH setelah ambangnya dikembalikan.
7. Beri tahu saat layanan systemd gagal
Systemd bisa memanggil unit lain saat sebuah layanan gagal. Buat /etc/systemd/system/tg-gagal@.service:
[Unit]
Description=Kirim alert Telegram untuk %i
[Service]
Type=oneshot
ExecStart=/usr/local/bin/tg-alert "Unit %i gagal"
Lalu tambahkan ke layanan yang ingin dipantau, misalnya tugas backup, dengan sudo systemctl edit backup.service dan isi:
[Unit]
OnFailure=tg-gagal@%n.service
Jalankan sudo systemctl daemon-reload. Sekarang setiap kali backup.service berakhir dengan status gagal, pesan langsung terkirim. Cara ini sangat berguna untuk tugas yang berjalan diam-diam tengah malam.
8. Sambungkan Netdata bila sudah terpasang
Kalau server memakai Netdata, kamu tidak perlu menulis pemeriksaan sendiri untuk metrik sistem. Buka sudo /etc/netdata/edit-config health_alarm_notify.conf lalu isi:
SEND_TELEGRAM="YES"
TELEGRAM_BOT_TOKEN="123456789:ISI-TOKEN-DARI-BOTFATHER"
DEFAULT_RECIPIENT_TELEGRAM="-1001234567890"
Uji dengan perintah dari dokumentasi Netdata:
sudo su -s /bin/bash netdata
export NETDATA_ALARM_NOTIFY_DEBUG=1
/usr/libexec/netdata/plugins.d/alarm-notify.sh test
Pemasangan dan pengamanan Netdata dibahas di cara memantau server Linux dengan Netdata.
Pilih cara yang mana?
| Cara | Cocok untuk | Kelebihan | Kekurangan |
|---|---|---|---|
| Skrip bash + cron | Pemeriksaan sederhana dan spesifik | Ringan, mudah dipahami | Harus ditulis dan dirawat sendiri |
| systemd OnFailure | Tugas terjadwal dan layanan penting | Langsung saat gagal | Hanya mendeteksi unit yang gagal |
| Netdata | Metrik sistem lengkap | Banyak alert bawaan | Agen tambahan di server |
Ketiganya bisa dipakai bersamaan. Satu catatan penting: semua cara di atas berjalan di server itu sendiri. Kalau server mati total atau jaringannya putus, tidak akan ada pesan yang terkirim. Untuk kasus itu, tambahkan pemeriksa dari luar, misalnya server lain yang mengecek website-mu secara berkala.
Pertanyaan yang sering diajukan
Apakah ada batas jumlah pesan yang bisa dikirim bot?
Ada. Telegram membatasi laju pengiriman pesan bot, terutama ke grup yang sama. Skrip yang hanya mengirim saat status berubah jauh dari batas itu.
Bagaimana kalau token bot bocor?
Buka @BotFather, pilih bot, lalu buat ulang token. Token lama langsung tidak berlaku, dan perbarui file /etc/tg-alert.env di semua server.
Bisakah alert dikirim ke topik tertentu di grup?
Bisa. Bot API menerima parameter message_thread_id pada sendMessage untuk grup yang memakai topik.
Apakah bisa memakai n8n alih-alih skrip?
Bisa, misalnya server mengirim webhook ke n8n lalu n8n meneruskan ke Telegram. Contoh alur Telegram di n8n ada di notifikasi pesanan baru ke grup Telegram.
Checklist singkat
- Bot dibuat lewat @BotFather dan token disimpan dengan izin 600.
- Chat ID didapat dari getUpdates dan pesan uji berhasil masuk.
- Skrip pemeriksaan hanya mengirim saat status berubah.
- Cron berjalan setiap beberapa menit.
- Tugas penting memakai OnFailure systemd.
- Ada pemeriksa dari luar untuk kasus server mati total.


