Healthchecks: เตือนทันทีเมื่อ Cron Backup ไม่ทำงานตามเวลา

ใช้ Healthchecks เฝ้างาน cron และ systemd timer แบบ Dead man's switch ส่ง ping เมื่องานเริ่มและจบพร้อม Log เตือนเมื่อ Backup ไม่ทำงาน หรือติดตั้งเองด้วย Docker

โดย ทีมงาน THAI DATA CLOUD อ่าน 14 นาที

แชร์FacebookXLINELinkedIn
Healthchecks — Healthchecks: เตือนทันทีเมื่อ Cron Backup ไม่ทำงานตามเวลา
Healthchecks: เตือนทันทีเมื่อ Cron Backup ไม่ทำงานตามเวลา

คำตอบสั้น ๆ: ใช้ Healthchecks เฝ้างาน cron และ systemd timer แบบ Dead man's switch ส่ง ping เมื่องานเริ่มและจบพร้อม Log เตือนเมื่อ Backup ไม่ทำงาน หรือติดตั้งเองด้วย Docker

คู่มือนี้อธิบาย Healthchecks ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Healthchecks คือระบบเฝ้างานตั้งเวลาแบบ Dead man's switch หลักการคือให้งาน cron หรือ systemd timer ส่งสัญญาณ (ping) ไปหา Healthchecks ทุกครั้งที่ทำงานเสร็จ ถ้าสัญญาณไม่มาภายในรอบที่กำหนดรวมกับเวลาผ่อนผัน (Grace Time) ระบบจะส่งอีเมลเตือน ต่างจากการดู Log ที่ต้องมีคนเปิดดู เพราะความผิดปกติที่อันตรายที่สุดของงาน Backup คือการไม่ทำงานเลยโดยไม่มี Error ให้เห็น Healthchecks เป็นโอเพนซอร์ส ใช้ได้ทั้งบริการ Healthchecks.io และติดตั้งเองด้วย Docker

คู่มือนี้เหมาะกับผู้ดูแล Linux Server ที่มีงาน Backup, งานซิงก์ไฟล์ หรือสคริปต์รายคืนที่ต้องรู้ทันทีเมื่อไม่ทำงาน เมื่อทำครบ คุณจะมี Check หนึ่งตัวต่อหนึ่งงาน ตั้งรอบเวลาตรงกับ crontab ส่งสัญญาณเริ่มงาน สำเร็จ และล้มเหลวพร้อม Log ท้ายงาน ใช้ได้กับทั้ง cron และ systemd timer รับอีเมลเตือนที่ทดสอบแล้ว และถ้าต้องการ ติดตั้ง Healthchecks ไว้บนเซิร์ฟเวอร์ของตัวเอง

สิ่งที่ต้องเตรียม

  • Linux Server ที่มีงานตั้งเวลาอยู่แล้ว เช่น สคริปต์สำรองข้อมูลด้วย restic และสิทธิ์ sudo
  • curl และเซิร์ฟเวอร์ออกอินเทอร์เน็ตทาง HTTPS (พอร์ต 443) ได้
  • บัญชี Healthchecks.io แพ็กเกจ Hobbyist ไม่มีค่าใช้จ่าย เฝ้าได้ 20 งานตามหน้า Pricing ของผู้ให้บริการ หรือเซิร์ฟเวอร์อีกเครื่องที่ติดตั้ง Docker ถ้าจะใช้ Healthchecks แบบติดตั้งเอง
  • เวลารันของแต่ละงานและเวลาที่งานใช้ตามปกติ เช่น Backup เริ่ม 02:30 ใช้เวลาราว 40 นาที
  • อีเมลหรือช่องทางแจ้งเตือนที่มีคนเปิดอ่านจริงทุกวัน
ลำดับการทำงานของ Healthchecks แบบ Dead man's switch ตั้งแต่งาน cron ส่งสัญญาณเริ่ม ส่งผลลัพธ์พร้อม Log จนถึงแจ้งเตือนเมื่อสัญญาณไม่มา
งานที่ไม่ทำงานเลยไม่มี Error ให้เห็น แต่จะไม่มีสัญญาณมาถึง Healthchecks และถูกแจ้งเตือน

ขั้นตอนที่ 1: สร้าง Check ใน Healthchecks ให้ตรงกับรอบงาน

ล็อกอิน Healthchecks.io แล้วคลิก Add Check ตั้งชื่อที่บอกเครื่องและงาน เช่น web-01 restic nightly ใส่ Tag ตามเครื่องหรือระบบเพื่อกรองดูภายหลัง จากนั้นตั้งตารางเวลาได้สองแบบ

  • Simple: กำหนด Period เป็นระยะห่างระหว่างสัญญาณ เช่น 1 day และ Grace Time คือเวลาที่ยอมให้สายก่อนแจ้งเตือน
  • Cron: ใส่ Cron Expression ตัวเดียวกับใน crontab เช่น 30 2 * * * และเลือก Server's Time Zone ให้ตรงกับเวลาของเครื่อง ถ้าเครื่องตั้งเป็นเวลาไทยให้เลือก Asia/Bangkok ตรวจได้ด้วย timedatectl

ตั้ง Grace Time ให้ยาวกว่าเวลาที่งานใช้ตามปกติพอสมควร เช่น งานใช้ 40 นาที ตั้ง 2 ชั่วโมง จะได้ไม่แจ้งเตือนผิดในคืนที่ข้อมูลเยอะ หลังบันทึก Healthchecks จะแสดง Ping URL รูปแบบ https://hc-ping.com/<uuid> คัดลอกเก็บไว้ URL นี้เป็นความลับระดับหนึ่ง ใครมี URL ก็ส่งสัญญาณแทนงานจริงได้ ความหมายของ Period และ Grace Time ดูได้ใน เอกสาร Configuring checks

ขั้นตอนที่ 2: เพิ่มสัญญาณ Healthchecks ในงาน cron

แบบง่ายที่สุดคือต่อท้ายคำสั่งใน crontab ด้วย && สัญญาณจะส่งเฉพาะเมื่องานจบด้วยสถานะสำเร็จ ถ้างานล้มหรือไม่ได้รัน Healthchecks จะไม่ได้รับสัญญาณและแจ้งเตือนเมื่อพ้น Grace Time (พื้นฐาน crontab ดูใน คู่มือตั้ง Cronjob)

30 2 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/your-uuid-here

ตัวเลือก -m 10 จำกัดเวลาต่อครั้ง 10 วินาที --retry 5 ลองใหม่เมื่อเครือข่ายสะดุด และ -fsS ให้ curl เงียบยกเว้นเมื่อมี Error ตามคำแนะนำใน เอกสาร Healthchecks สำหรับ Shell

สำหรับงานสำคัญ แนะนำสคริปต์ครอบที่ส่งสัญญาณเริ่มงาน ส่งรหัสผลลัพธ์ และแนบ Log ท้ายงานไปด้วย Healthchecks จะคำนวณเวลาที่งานใช้ แจ้งเตือนทันทีเมื่องานจบด้วยรหัสที่ไม่ใช่ 0 และแสดง Log ให้ดูในหน้า Check โดยไม่ต้อง SSH เข้าเครื่อง

#!/bin/bash
# /usr/local/bin/backup-with-ping.sh
URL="https://hc-ping.com/your-uuid-here"
LOG=/var/log/backup-last.log

curl -fsS -m 10 --retry 5 -o /dev/null "$URL/start"
/usr/local/bin/backup.sh > "$LOG" 2>&1
rc=$?
tail -c 10000 "$LOG" | curl -fsS -m 10 --retry 5 -o /dev/null --data-binary @- "$URL/$rc"
exit $rc
sudo chmod 700 /usr/local/bin/backup-with-ping.sh
sudo crontab -e
# แทนบรรทัดเดิมด้วย
30 2 * * * /usr/local/bin/backup-with-ping.sh

ปลายทาง /start บอกว่างานเริ่มแล้ว ส่วน /$rc ส่งรหัสออกของงาน Healthchecks ถือว่า 0 คือสำเร็จ ค่าอื่นคือล้มเหลว ถ้าสคริปต์ Backup ใช้ไปป์ ให้ใส่ set -o pipefail ไว้ใน backup.sh ด้วย ไม่เช่นนั้นรหัสออกจะมาจากคำสั่งสุดท้ายในไปป์เท่านั้น

ผลคำสั่งตรวจ Time zone ของเครื่อง และส่งสัญญาณ fail กับสัญญาณสำเร็จไปที่ Healthchecks เพื่อทดสอบอีเมลแจ้งเตือน
ส่ง /fail ให้เห็นอีเมลเตือนจริงหนึ่งครั้ง แล้วส่งสัญญาณปกติให้สถานะกลับเป็น up

ขั้นตอนที่ 3: ใช้ Healthchecks กับ systemd timer

ถ้างานรันด้วย systemd timer ตาม คู่มือ systemd Timer ให้ส่งสัญญาณเริ่มด้วย ExecStartPre และรายงานผลด้วย ExecStopPost ซึ่ง systemd ส่งตัวแปร $SERVICE_RESULT ให้ (ค่าเป็น success เมื่องานสำเร็จ) วิธีนี้ครอบคลุมกรณีงานถูก kill หรือหมดเวลาด้วย ซึ่งการต่อท้ายด้วย && จับไม่ได้

#!/bin/sh
# /usr/local/bin/hc-report.sh
URL="https://hc-ping.com/your-uuid-here"
if [ "$SERVICE_RESULT" = "success" ]; then
  curl -fsS -m 10 --retry 5 -o /dev/null "$URL"
else
  curl -fsS -m 10 --retry 5 -o /dev/null "$URL/fail"
fi
# /etc/systemd/system/offsite-backup.service (เพิ่มสองบรรทัดใต้ [Service])
[Service]
Type=oneshot
ExecStartPre=-/usr/bin/curl -fsS -m 10 --retry 5 -o /dev/null https://hc-ping.com/your-uuid-here/start
ExecStart=/usr/local/bin/offsite-backup.sh
ExecStopPost=/usr/local/bin/hc-report.sh
sudo chmod 755 /usr/local/bin/hc-report.sh
sudo systemctl daemon-reload
sudo systemctl start offsite-backup.service

เครื่องหมาย - หน้า /usr/bin/curl ทำให้งานหลักยังรันต่อแม้ส่งสัญญาณเริ่มไม่สำเร็จ เพราะการ Backup สำคัญกว่าสัญญาณ

ขั้นตอนที่ 4: ตั้งช่องทางแจ้งเตือนและทดสอบว่าถึงคน

บัญชี Healthchecks.io ส่งอีเมลเตือนไปที่อีเมลของบัญชีอยู่แล้ว เพิ่มคนหรือช่องทางอื่นได้ในหน้า Integrations ของโปรเจกต์ เช่น อีเมลกลุ่มของทีม Slack หรือ Telegram แล้วเปิดใช้กับ Check ที่ต้องการ

ทดสอบด้วยการส่งสัญญาณล้มเหลวด้วยมือ ภายในไม่กี่นาทีสถานะ Check ต้องเปลี่ยนเป็น down และมีอีเมลเข้า จากนั้นส่งสัญญาณสำเร็จเพื่อให้กลับเป็นปกติ

curl -fsS -m 10 https://hc-ping.com/your-uuid-here/fail
curl -fsS -m 10 https://hc-ping.com/your-uuid-here

ถ้าอีเมลไม่มา ให้ตรวจโฟลเดอร์ Junk Email และเพิ่มผู้ส่งเป็น Safe Sender การแจ้งเตือนที่ไปตกใน Junk ทุกครั้งเท่ากับไม่มีการแจ้งเตือน

ขั้นตอนที่ 5: ติดตั้ง Healthchecks เองด้วย Docker (ทางเลือก)

องค์กรที่ไม่ต้องการส่งข้อมูลออกนอกหรือมีงานเกิน 20 งาน ติดตั้ง Healthchecks บนเซิร์ฟเวอร์ของตัวเองได้ ข้อสำคัญคือต้องติดตั้งบน เครื่องอื่น ที่ไม่ใช่เครื่องที่ถูกเฝ้า เพราะถ้าเครื่องนั้นล่ม ตัวเฝ้าก็ล่มด้วยและไม่มีใครแจ้งเตือน ตัวอย่างนี้ใช้อิมเมจทางการ healthchecks/healthchecks รุ่น v5.0.3 กับ PostgreSQL บนเครื่องที่ติดตั้ง Docker Compose แล้ว

# /opt/healthchecks/.env
DB=postgres
DB_HOST=db
DB_NAME=hc
DB_USER=postgres
DB_PASSWORD=change-this-long-random-password
SECRET_KEY=change-this-random-value
ALLOWED_HOSTS=hc.example.com
SITE_ROOT=https://hc.example.com
PING_ENDPOINT=https://hc.example.com/ping/
[email protected]
EMAIL_HOST=smtp.example.com
EMAIL_PORT=587
[email protected]
EMAIL_HOST_PASSWORD=change-this
EMAIL_USE_TLS=True
REGISTRATION_OPEN=False
DEBUG=False
# /opt/healthchecks/docker-compose.yml
services:
  db:
    image: postgres:16
    restart: unless-stopped
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=$DB_NAME
      - POSTGRES_PASSWORD=$DB_PASSWORD
  web:
    image: healthchecks/healthchecks:v5.0.3
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - "127.0.0.1:8000:8000"
    depends_on:
      - db
    command: bash -c 'while !</dev/tcp/db/5432; do sleep 1; done; /opt/healthchecks/run.sh'
volumes:
  db-data:
cd /opt/healthchecks
openssl rand -base64 48        # ใช้เป็นค่า SECRET_KEY และรหัสฐานข้อมูล
sudo docker compose up -d
sudo docker compose run --rm web /opt/healthchecks/manage.py createsuperuser

พอร์ต 8000 ผูกไว้ที่ 127.0.0.1 เท่านั้น ให้ตั้ง Nginx หรือ Caddy เป็น Reverse Proxy พร้อม HTTPS ที่ hc.example.com Ping URL ของระบบที่ติดตั้งเองจะเป็น https://hc.example.com/ping/<uuid> ค่าตัวแปรอื่นดูได้จาก เอกสาร Self-hosted configuration และอย่าลืมสำรองฐานข้อมูลของ Healthchecks เองด้วย

ตารางเปรียบเทียบการใช้บริการ Healthchecks.io กับการติดตั้ง Healthchecks เองด้วย Docker ในเรื่องค่าใช้จ่าย การดูแล และการส่งอีเมล
ติดตั้งเองได้ควบคุมเต็มที่ แต่ต้องดูแลเอง และต้องอยู่คนละเครื่องกับงานที่ถูกเฝ้า

ขั้นตอนที่ 6: ดูแล Healthchecks ให้ตรงกับงานจริงเสมอ

  • เพิ่ม Check ทุกครั้งที่สร้างงานตั้งเวลาใหม่ หนึ่งงานหนึ่ง Check จะรู้ทันทีว่างานไหนหยุด
  • ดูคอลัมน์เวลาที่งานใช้เดือนละครั้ง ถ้า Backup ใช้เวลานานขึ้นเรื่อย ๆ แปลว่าข้อมูลโตหรือดิสก์ปลายทางช้าลง ต้องปรับ Grace Time และวางแผนล่วงหน้า
  • เมื่อปลดงานหรือย้ายเครื่อง ให้ Pause หรือลบ Check ด้วย ไม่เช่นนั้นจะได้แจ้งเตือนผิดจนทีมเริ่มไม่สนใจอีเมลจาก Healthchecks
เช็กลิสต์ตรวจการตั้ง Healthchecks ให้แจ้งเตือนได้จริง เช่น หนึ่งงานหนึ่ง Check, Time zone ตรงเครื่อง และทดสอบอีเมลแล้ว
ระบบเฝ้างานที่ไม่เคยทดสอบการแจ้งเตือน อาจเงียบในคืนที่ Backup หยุดจริง

ปัญหาที่พบบ่อยเกี่ยวกับ Healthchecks

งานยังรันอยู่แต่ Healthchecks แจ้งว่า down ทำไม?

เมื่อส่งสัญญาณ /start แล้ว Healthchecks จะรอสัญญาณจบภายใน Grace Time ถ้างานใช้เวลานานกว่า Grace Time ระบบจะถือว่าล้มเหลว ให้ตั้ง Grace Time ให้ยาวกว่างานที่ช้าที่สุดที่เคยเกิด

curl ส่งสัญญาณไม่ออก ทั้งที่งาน Backup สำเร็จ แก้อย่างไร?

ทดสอบจากเครื่องด้วย curl -v https://hc-ping.com/your-uuid-here ถ้าเชื่อมต่อไม่ได้ ให้ตรวจไฟร์วอลล์ขาออกพอร์ต 443 DNS ของเครื่อง และ Proxy ขององค์กร ถ้าเครื่องต้องผ่าน Proxy ให้ใส่ -x http://proxy.example.com:3128 ในคำสั่ง curl

Healthchecks ต่างจาก Uptime Kuma อย่างไร?

Uptime Kuma เด่นที่การเข้าไปตรวจเว็บหรือพอร์ตเป็นระยะ (ตรวจเชิงรุก) ส่วน Healthchecks รอให้งานส่งสัญญาณมาหา (ตรวจเชิงรับ) จึงเหมาะกับงานที่ไม่มีหน้าเว็บให้ตรวจ เช่น Backup ทั้งสองแบบใช้คู่กันได้ และ Uptime Kuma เองก็มี Monitor แบบ Push ที่ทำงานคล้ายกันสำหรับงานจำนวนไม่มาก

ควรสร้าง Check เดียวสำหรับทุกงานบนเครื่องได้ไหม?

ไม่ควร ถ้างานหนึ่งส่งสัญญาณแต่อีกงานหยุด Check เดียวจะยังดูปกติ ให้แยก Check ตามงาน และใช้ Tag ตามชื่อเครื่องเพื่อจัดกลุ่มในหน้า Dashboard

ถ้าต้องการให้ทีมช่วยวางระบบเฝ้างานสำรองข้อมูลและการแจ้งเตือนของเซิร์ฟเวอร์ทั้งหมด ติดต่อทีมงาน THAI DATA CLOUD หรือดูรายละเอียดบริการ Cloud Linux Server

อ่านเพิ่มเติมเกี่ยวกับ Healthchecks

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน