외부에서 NAS 에 접속해 필요한 파일을 봐야하는 상황이 있었다. 근데 하필 접속이 되지 않아 난감했었다. 미리 발급 받아놓은 증명서 였는데 다시 발급을 받아서 해결했다. 집에 돌아와보니 NAS 와 연결된 멀티탭이 빠져있어서 전원연결이 되지 않았던 것이였다.
이 때 든 생각이 "전원 연결이 안되어 있으면 나한테 알람이 오면 좋겠다" 였다.
EMS나 NMS 를 공부하면서 항상 소비자(고객)에게 신뢰성과 신속성을 제공해야 한다는 생각을 가져야 한다고 스스로를 세뇌시키고 있었는데, 마침 집에 있는 기기가 떨어지면( 전원이 안들어오면) 알람이 오도록 만들어 보는 실습을 바로 해야겠다고 생각했다.
알아보니 SMS 서비스는 test 용으로 몇 번의 문자를 보내보는 것으로 끝나고, 이후 비용이 청구되기 시작하고, 카카오톡 같은 경우도 개인적으로 사용하기에는 부담됐다. 그래서 현재 웹 후크 기능을 쉽게 이용할 수 있는 Discord 알람 기능을 우선적으로 이용해서, 내가 구현해보고 싶은 기능을 빨리 만들어 보도록 하자.
1. 기본 알고리즘 설계
누구의 도움없이, 혼자 생각하고, 운동하면서 생각하고, 운전하면서 생각했던 알고리즘을 정리해보자.
- 나의 VPN 엔드포인트 이자, 항상 전원이 연결되어 동작하고 있는, RaspberryPi 가, "감시자" 가 된다. 즉 NAS 가 죽었는지 살았는지 1시간에 1번씩 Ping 을 보내서 응답이 오는지 확인한다. ( 구축 단계에서는 빠른 피드백을 위해 1분으로 설정하고, 제대로 구현되면 1시간으로 설정하여 저장한다.)
- Ping 응답이 오면 아무 동작도 수행하지 않는다.
- Ping 응답이 오지 않으면(제한시간을 둔다), 특정 경로에 로그 파일을 하나 생성한다. (NAS 가 죽었을 것으로 가정하기 때문에, DB 를 사용할 수 없다)
- 잠깐의 에러이거나, 다시 전원이 연결되었다면 Ping test 에 성공할 테니, 특정 경로에 있는 로그 파일을 1개 지운다.
- 특정 경로의 파일이 없어지면 별 다른 이상 없이 NAS 가 살아 있다는 것으로 간주되고 아무런 동작도 하지 않는다.
- 만약 전원이 꺼진 상태로 연속 3번의 ping test 가 실패한다면 ( 실제로는 3시간 동안 ) 3개의 로그파일이 특정 경로에 생기고, 3개의 파일이 생기는 것을 감지하면 Discord 알람이 전송된다.
- 알람을 보내고도 Ping test 는 계속 되는데, 마지막 로그파일을 지우고 최신 로그 파일을 생성하면서 3개의 로그파일을 유지한다.
- 로그 파일은 3개를 유지하고 있기 때문에 Discord 알람이 또 전송된다.
- 사용자가 알람을 확인하고 전원을 연결하면 다음 주기에 ping test 에 성공하고 로그파일이 차례대로 지워져 나가면서 없어지게 된다.
두서 없이 아이디어를 정리한 것이지만, 분명 알고리즘을 시각화 하면 깔끔하게 정리가 될 것이다. 하지만 누가 보려고 작성한 것도 아니기 때문에 그냥 놔두기로 한다.
=> 이렇게 하여 DB 없이 Raspberry PI 만 이용해서 간단하게 NAS 의 Health Check 가능 할 것 같다!
2. 디렉터리 구조 설계 및 스크립트 파일 생성
2-1. RaspberryPi 안에 생성할 디렉터리 구조
/home/kang/Documents/nas_health_check/
│
├── ping_test.sh # ping 상태 체크 → 실패 시 log 생성
├── log_manage.sh # log 수 3개 초과 → 알림 전송
├── send_message.sh # 디스코드 Webhook 전송
└── log/
├── nas_down_20250626_1130.log
├── ...
2-2. 자동화 스크립트
- ping_test.sh
역할 : ping 실패 시 시간 기반 로그 생성, 성공 시 로그 하나 삭제 + 복구 메시지 전송 하기
#!/bin/bash
TARGET="192.168.0.20"
LOG_DIR="/home/kang/Documents/nas_health_check/log"
RECOVERY_MSG_SENT=0
# Ping 체크 (1회, 타임아웃 1초)
ping -c 1 -W 1 $TARGET > /dev/null
if [ $? -ne 0 ]; then
# Ping 실패 → 로그 생성
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="${LOG_DIR}/nas_down_${TIMESTAMP}.log"
touch "$LOG_FILE"
echo "[FAIL] $TIMESTAMP - NAS unreachable" > "$LOG_FILE"
else
# Ping 성공 → 복구 처리
COUNT=$(ls "$LOG_DIR" | wc -l)
if [ $COUNT -gt 0 ]; then
# 맨 먼저 생성된 파일 1개 삭제
OLDEST=$(ls -tr "$LOG_DIR" | head -n 1)
rm "$LOG_DIR/$OLDEST"
# 복구 메시지 전송
/home/kang/Documents/nas_health_check/send_message.sh "✅ NAS Power On. 정상 이용 가능."
fi
fi
- log_manage.sh
역할 : 로그가 3개가 되면 알림 전송, 이후 최신 로그만 남기고 오래된 건 삭제
#!/bin/bash
LOG_DIR="/home/kang/Documents/nas_health_check/log"
MAX_LOGS=3
LOG_COUNT=$(ls "$LOG_DIR" | wc -l)
if [ $LOG_COUNT -ge $MAX_LOGS ]; then
# 알림 전송
/home/kang/Documents/nas_health_check/send_message.sh "🚨 NAS Power Down. 확인이 필요."
# 로그가 3개 초과되면 오래된 것 삭제 (스택 구조 유지)
TO_DELETE=$((LOG_COUNT - MAX_LOGS + 1))
ls -tr "$LOG_DIR" | head -n $TO_DELETE | while read f; do
rm "$LOG_DIR/$f"
done
fi
- - send_message.sh
역할: Discord Webhook으로 메시지 전송
#!/bin/bash
WEBHOOK_URL="https://discord.com/api/webhooks/여기에_붙여넣기"
MESSAGE="$1"
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"$MESSAGE\"}" \
$WEBHOOK_URL
3. Discord Webhook URL 생성
3-1. 디스코드 실행 후 좌측 서버 목록에서 [서버 추가하기] 를 클릭하여 새로운 서버를 생성한다. (기존 서버에서 알림을 받고 싶으면 기존 서버 설정에서 여러 후크를 만들어서 사용 가능하다.)


3-2. 서버 프로필을 우 클릭하여 [서버 설정] 앱 탭에 있는 [연동] 메뉴를 클릭하면 웹후크 목록이 나타난다.

3-3. [새 웹후크] 를 눌러 웹 후크를 생성하고 이름과 이미지를 설정해준 뒤 웹 후크 URL 을 복사한다.

3-4. 복사한 URL 을 웹후크에 이용할 설정 파일, API 문서 등에 붙여넣으면 된다.

4. 갈무리
스크립트 파일에서 개행문자들을 정리해준다.

5. 권한 설정 및 작업등록
5-1. 스크립트 파일들을 사용할 수 있도록 권한을 부여해준다.
chmod 750 *.sh
5-2. 스크립트 파일들이 정해진 작업을 하도록 corntab 에 작업을 등록해준다.
* test 는 1분마다 실시하도록 하고, 테스트 성공 시 1시간 마다 동작하도록 변경해준다.
crontab -e
* * * * * /home/kang/Documents/nas_health_check/ping_test.sh
* * * * * /home/kang/Documents/nas_health_check/log_manage.sh

6. 동작확인
- NAS가 살아 있다면 동작을 하지 않을 기능이기 때문에 NAS 의 전원을 분리하도록 한다.

- 기다리면서 로그 디렉터리에 로그가 생성되는지 확인한다.

- 3개의 로그가 쌓였기 때문에 다음 22시28분에 로그 체크 후 디스코드 알람이 와야 한다.

- 알람이 성공적으로 오고 있는 것을 확인했다. 이제 전원을 다시 연결해서 로그가 사라지고, 정상 작동 알람이 오는지 확인한다.
NAS 는 전원이 들어고나서도 부팅 될 때까지 시간이 좀 걸리기 때문에 5분정도 여유를 두고 기다려 보기로 한다.


- 정상적으로 메시지 전송이 동작하는 것을 확인하였다. 로그 파일 또한 하나씩 사라지는 것을 확인할 수 있다.
7. 마무리

테스트에 성공했기 때문에 자동화 작업 간격을 설정해준다. 물론 1분마다 체크하고 전원이 떨어질 시 4분 이내에 알게 된다면 좋겠지만, 그리 중요한 파일이 많은 것도 아니고, 특히 라즈베리파이 성능이 그리 좋지 않기 때문에 적절히 간격을 타협하기로 한다.
Ping test 는 20분 간격으로 매일 실시하고, 로그 파일 감지는 1시간에 1번씩 실시하도록 해서, 전원이 떨어졌다면, 최소 1시간 20분에서 최대 2시간 이내로 알림을 받을 수 있도록 셋팅하였다.
자동화 기능을 생각하고 구현할 때마다 아주 재미있고 유익하다. 게다가 레퍼런스들도 많고 미리 시도한 기록들을 찾아보며 어렵지 않게 구현해 낼 수 있어서 좋았다. 이렇게 네트워크의 기능을 이용해서 NAS 의 현재 상태를 알 수 있도록 했으니 다른 기기들에 응용하거나, 또 다른 자동화 기능을 고안해서 만들어보도록 하자!
'네트워크 공부 & 실습 > 네트워크 실습' 카테고리의 다른 글
| [Network] Linux Netplan 설정으로 네트워크 설정하기 (1) | 2025.07.08 |
|---|---|
| [Network] Kafka 클러스터를 두 대의 PC에 나눠 설치해보기 (0) | 2025.06.27 |
| [Network] static ip 를 셋팅하여 기기간 통신하기. (2) | 2025.06.19 |
| [Network] DNS 구축으로 IP 주소 대신 문자열 사용하기 (2) | 2025.06.02 |
| [Network] AWS 탈퇴 및 Blog 스크랩 자동화 스크립트 셋팅하기 (to 라즈베리파이) (2) | 2025.05.28 |