VPS 셸 스크립팅 자동화 완벽 가이드 2026: 매일 점검·백업을 한 번에

이 글에는 제휴 링크(affiliate link)가 포함되어 있습니다. 서버 가입 링크로 가입하시면 추가 비용 없이 크레딧 혜택을 받으실 수 있으며, 블로그 운영에 도움이 됩니다.

매일 서버 점검하는 것은 사람이 할 일이 아니다

VPS를 운영하면 매일 확인해야 할 것들이 있습니다: 디스크가 꽉 찼는지, 메모리가 충분한지, 백업이 정상적으로 돌았는지, 보안 로그에 이상은 없는지. 이걸 매일 손으로 확인하면 잊게 되고, 잊으면 사고가 납니다. 셸 스크립트로 점검·백업·알림을 자동화하면 더 이상 걱정할 필요가 없습니다.

이 튜토리얼은 VPS 데브옵스 시리즈의 피날레편으로, 지금까지 다룬 모든 기술(방화벽, 백업, 모니터링, 서비스 관리)을 하나의 자동화 스크립트로 통합합니다.

1. 자동화가 필요한 VPS 일일 점검 항목

  • 디스크 사용량: 90% 초과 시 경고
  • 메모리: 가용 RAM 부족 시 알림
  • CPU 로드: 코어 수 대비 과부하 확인
  • 백업 성공 여부: restic/pg_dump 백업 파일 존재 및 최신성
  • 주요 서비스 상태: nginx, postgresql, docker 등 실행 중인지
  • 보안 로그: SSH 실패 로그인 급증 감지

2. 일일 점검 스크립트

#!/bin/bash
# daily-check.sh — VPS 일일 점검 스크립트
set -euo pipefail

LOG="/var/log/daily-check.log"
ALERT_EMAIL="your@email.com"
THRESHOLD_DISK=90
THRESHOLD_MEM=90

echo "===== $(date) =====" | tee -a "$LOG"

# 디스크 사용량
DISK_USE=$(df / | awk 'NR==2 {print int($5)}')
if [ "$DISK_USE" -gt "$THRESHOLD_DISK" ]; then
    echo "WARNING: Disk usage at ${DISK_USE}%" | tee -a "$LOG"
fi

# 메모리 사용량
MEM_USE=$(free | awk '/Mem:/ {printf "%d", $3/$2*100}')
if [ "$MEM_USE" -gt "$THRESHOLD_MEM" ]; then
    echo "WARNING: Memory usage at ${MEM_USE}%" | tee -a "$LOG"
fi

# 로드 평균
LOAD=$(uptime | awk -F'load average:' '{print $2}')
echo "Load average:$LOAD" | tee -a "$LOG"

# 주요 서비스 상태
for svc in nginx postgresql docker sshd; do
    if systemctl is-active --quiet "$svc"; then
        echo "OK: $svc running" >> "$LOG"
    else
        echo "ALERT: $svc NOT running" | tee -a "$LOG"
    fi
done

# 최근 SSH 실패 로그인 (지난 24시간)
FAIL_COUNT=$(journalctl -u sshd --since "24 hours ago" 2>/dev/null | grep -c "Failed password" || true)
echo "SSH failed logins (24h): $FAIL_COUNT" | tee -a "$LOG"

echo "Check complete." | tee -a "$LOG"

3. 백업 자동화 통합

점검 스크립트에 백업을 통합합니다. 여기서는 restic 증분 백업을 예로 듭니다:

#!/bin/bash
# nightly-backup.sh — 매일 백업 + 검증
set -euo pipefail

export RESTIC_REPOSITORY="/mnt/backup/restic"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"

# 백업 실행
restic backup /var/www /etc /home --tag daily

# 오래된 스냅샷 정리 (30일 보관)
restic forget --keep-daily 30 --prune

# 백업 검증
restic check --read-data-subset=10%

echo "Backup OK: $(date)" >> /var/log/backup.log

PostgreSQL을 운영 중이라면 pg_dump 백업도 함께 추가하세요:

pg_dump -Fc mydb | gzip > /mnt/backup/db/mydb-$(date +%Y%m%d).sql.gz
find /mnt/backup/db/ -name "*.sql.gz" -mtime +14 -delete

4. cron으로 매일 자동 실행

스크립트를 매일 새벽에 실행되도록 cron에 등록합니다:

# crontab -e (root)

# 매일 새벽 3시 점검
0 3 * * * /usr/local/bin/daily-check.sh

# 매일 새벽 4시 백업
0 4 * * * /usr/local/bin/nightly-backup.sh

주의: 점검(3시)과 백업(4시) 사이에 시간 간격을 두어 디스크 I/O 경합을 피합니다.

5. Discord/Slack 알림 연동

이상 발생 시 메신저로 알림을 받습니다:

#!/bin/bash
# alert.sh — webhook 알림
send_alert() {
    local msg="$1"
    local webhook="https://discord.com/api/webhooks/YOUR_WEBHOOK"
    curl -s -X POST "$webhook" \
        -H "Content-Type: application/json" \
        -d "{\"content\": \"[VPS Alert] $msg\"}"
}

# daily-check.sh 끝에 추가
if grep -q "WARNING\|ALERT" "$LOG"; then
    send_alert "$(hostname): $(grep -E 'WARNING|ALERT' "$LOG" | tail -5)"
fi

6. systemd timer로 더 정밀하게 (cron 대체)

cron보다 정밀한 제어가 필요하면 systemd timer를 사용합니다:

# /etc/systemd/system/vps-daily-check.service
[Unit]
Description=VPS Daily Check

[Service]
Type=oneshot
ExecStart=/usr/local/bin/daily-check.sh

# /etc/systemd/system/vps-daily-check.timer
[Unit]
Description=Run daily check at 3 AM

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

# 활성화
sudo systemctl enable --now vps-daily-check.timer

systemd timer는 journalctl로 실행 이력을 확인할 수 있고, 실패 시 재시도 옵션도 설정할 수 있어 cron보다 강력합니다.

전체 자동화 파이프라인 요약

매일 03:00 → daily-check.sh (디스크/메모리/서비스/보안 점검)
매일 04:00 → nightly-backup.sh (restic 백업 + 보관 정책)
이상 감지 시 → Discord/Slack webhook 알림

이 파이프라인을 구축하면 서버를 방치해도 문제가 생기면 알림이 오고, 백업은 매일 자동으로 돌아갑니다. 1인 운영의 핵심은 반복 작업을 스크립트로 만들고 cron/timer에 맡기는 것입니다.

추천 VPS: 이 튜토리얼은 Vultr, DigitalOcean, Hetzner VPS에서 그대로 적용됩니다. 한국 사용자 기준 Vultr 서울 리전이 가장 빠릅니다.

시리즈 전체 흐름

이 튜토리얼은 VPS 데브옵스 시리즈의 마지막 편입니다. 앞선 단계들을 순서대로 따라했다면 이미 다음이 구축되어 있을 것입니다:

이제 서버는 스스로 점검하고, 스스로 백업하고, 문제가 생기면 알려줍니다. 축하합니다 — 1인 VPS 데브옵스 파이프라인 완성입니다.

관련 글

📎 이 영상의 발표 자료

누구나 무료로 다운로드할 수 있습니다.