SameOS ~/tools/server-webhook-monitoring.md

셸 스크립트로 서버 상태를 웹훅 알림으로 받기

서버 한두 대를 운영할 때 Prometheus 같은 모니터링 스택은 과합니다. 필요한 건 "지금 CPU, 메모리, 디스크가 괜찮은가"를 주기적으로 메신저에서 확인하는 것 정도인데, 이건 리눅스 기본 명령어와 웹훅(메신저 채널로 메시지를 보낼 수 있게 해 주는 전용 주소) 하나로 충분합니다. 실제로 개인 서버에서 1시간마다 돌고 있는 스크립트를 일반화해서 정리했습니다.

수집할 값과 명령어

CPU 사용률은 top -bn1의 요약 줄에서, 메모리는 free -m에서, 디스크는 df -h에서 뽑습니다. 모두 어느 리눅스에나 기본으로 들어 있는 명령이라 별도 에이전트(상태를 수집해 서버 밖으로 보내 주는 상주 프로그램) 설치가 필요 없습니다. Discord, Slack, Mattermost 등 대부분의 메신저는 JSON을 POST로 받는 수신 웹훅(incoming webhook)을 지원하므로 curl 명령 한 번으로 전송이 끝납니다.

아래 스크립트는 한 시간마다 상태 요약을 웹훅으로 보냅니다. 웹훅 URL은 절대 스크립트 안에 직접 적어(하드코딩) 저장소에 올리지 말고, 읽기 권한을 제한한 별도 환경 파일에서 읽어 오세요.

#!/bin/bash
# /etc/server-report.env 에 WEBHOOK_URL="https://..." 형태로 저장 (chmod 600)
source /etc/server-report.env

CPU=$(top -bn1 | awk '/Cpu\(s\)/{print $2}' | cut -d'%' -f1)
RAM_USED=$(free -m | awk '/^Mem:/{print $3}')
RAM_TOTAL=$(free -m | awk '/^Mem:/{print $2}')
RAM_PCT=$(awk "BEGIN {printf \"%.1f\", ($RAM_USED/$RAM_TOTAL)*100}")
DISK=$(df -h / | awk 'NR==2{print $3" / "$2" ("$5")"}')
UP=$(uptime -p | sed 's/up //')

MSG="서버 상태 보고
CPU: ${CPU}%
RAM: ${RAM_USED}MB / ${RAM_TOTAL}MB (${RAM_PCT}%)
DISK: ${DISK}
UPTIME: ${UP}"

curl -s -H "Content-Type: application/json" \
     -d "{\"content\": \"${MSG}\"}" \
     "$WEBHOOK_URL" > /dev/null

운영 팁

이 방식의 맹점은 서버가 완전히 죽으면 알림도 함께 멈춘다는 점입니다. 그래서 "정기 보고"로 쓰는 게 맞고, 매시 오던 알림이 안 오면 그것 자체가 장애 신호가 됩니다. 더 확실하게 하려면 외부 무료 업타임 서비스(사이트가 응답하는지 밖에서 주기적으로 확인해 주는 서비스)로 HTTP 응답을 함께 감시하세요.

반복 실행은 while·sleep 무한 루프보다 cron(리눅스에 내장된 예약 실행 기능)이나 systemd timer에 맡기는 편이 안전합니다. 루프 방식은 스크립트가 조용히 죽으면 그대로 끝이지만, cron은 매번 새로 실행하므로 한 번의 실패가 다음 실행에 영향을 주지 않습니다. 디스크 사용률이 90%를 넘을 때만 보내는 식의 임계값 알림을 추가하면 소음도 줄일 수 있습니다.

전체 스크립트 받기 (GitHub) crontab 표현식 해석기 열기 운영 점검 노트 보기