Lewati ke isi

Server & Infrastruktur

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.

Terbit 6 menit baca

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
  1. Langkah memasang alert Telegram
  2. 1. Buat bot lewat @BotFather
  3. 2. Dapatkan chat ID tujuan
  4. 3. Simpan token dengan aman
  5. 4. Buat perintah pengirim pesan
  6. 5. Buat skrip pemeriksaan yang tidak berisik
  7. 6. Jadwalkan setiap 5 menit
  8. 7. Beri tahu saat layanan systemd gagal
  9. 8. Sambungkan Netdata bila sudah terpasang
  10. Pilih cara yang mana?
  11. Pertanyaan yang sering diajukan
  12. 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?

CaraCocok untukKelebihanKekurangan
Skrip bash + cronPemeriksaan sederhana dan spesifikRingan, mudah dipahamiHarus ditulis dan dirawat sendiri
systemd OnFailureTugas terjadwal dan layanan pentingLangsung saat gagalHanya mendeteksi unit yang gagal
NetdataMetrik sistem lengkapBanyak alert bawaanAgen 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.

Sumber & referensi

Baca juga