Skip to content

백업 현황·휴면 사이트 점검 개발 스펙 - #12

Draft
eondcom wants to merge 1 commit into
mainfrom
plan-upkeep
Draft

백업 현황·휴면 사이트 점검 개발 스펙#12
eondcom wants to merge 1 commit into
mainfrom
plan-upkeep

Conversation

@eondcom

@eondcom eondcom commented Jul 30, 2026

Copy link
Copy Markdown
Owner

백업이 실제로 돌고 있는지, 오래 방치된 사이트가 있는지 점검하는 기능. 문서만, 코드 없음.

📄 .claude/plans/2026-07-31-upkeep-SPEC.md

디스크 감시와 같은 문제 구조입니다 — 조용히 실패하고, 안 보면 모릅니다.

7-A 백업 현황

HestiaCP 자동 백업은 cron 으로 돌고 세대 수만큼 자동 정리되지만, 특정 계정만 조용히 빠져도 아무도 모릅니다. 정작 필요할 때 없으면 끝입니다.

  • 자동 백업 cron 등록 여부 · 보관 세대 수 · 총 용량
  • 백업이 아예 없는 계정 목록 ← 핵심
  • 계정별 세대 수와 경과일, 가장 밀린 계정
  • 마지막 백업이 3일 이상 전이면 경고

7-B 휴면 사이트

신호 판정
접근 로그가 90일 이상 없거나 아예 없음 +1
웹루트에 180일 내 수정된 파일 없음 +1

신호 2개 이상일 때만 후보로 올립니다. 캐시·로그·업로드는 자동 갱신되므로 파일 검사에서 제외합니다.

핵심 판단 — 오판 방향을 한쪽으로 고정

살아있는 사이트를 "휴면"이라고 하면 안 되고, 놓치는 건 괜찮습니다. 계절성 사이트(연 1회 행사)·내부용·봇만 오는 사이트가 섞이기 때문입니다. 그래서:

  • 신호 1개로는 올리지 않음
  • 로그 로테이션으로 mtime 이 최근이 되면 "살아있다"로 판정되게 둠
  • 문구는 정리 후보 가 아니라 확인 권장
  • 계정 삭제 기능(PR 계정/도메인 서버 완전 삭제 구현 #8)으로 가는 동선을 만들지 않음 — 한 번 더 사람이 판단해야 합니다

검증

가짜 환경(계정 3개·사이트 4개)을 만들어 실제로 실행했습니다.

대상 결과
백업 3세대(1일 전) / 1세대(40일 전) / 없음 각각 정확히 분류, 없는 계정 목록화
활성 사이트 후보 아님
200일 접근 없음 + 파일 300일 후보
로그 없음 + 파일 400일 후보
로그 없음 + 파일 최신 (신호 1개) 후보 아님 ← 오판 방지 확인

검증 중 잡은 결함 2건

  1. -newermt "-180 days" 는 이식성이 없음 — 일부 find 구현(bfs 등)이 상대시간 표기를 거부합니다. POSIX -mtime 으로 교체했습니다.
  2. -not -path '*/tmp/*' 가 상위 경로까지 걸러냄 — 웹루트 위에 tmp 가 있으면 모든 파일이 제외되어 살아있는 사이트가 휴면으로 오판됐습니다. 제외 경로를 "$WR" 기준 절대경로로 고정했습니다.

둘 다 "되돌리지 말 것"으로 함정에 적었습니다.

용량은 이미 scan_cache 에 있으므로 서버에서 다시 재지 않고 UI 에서 조인합니다. SSH 는 1회입니다.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WxEiSzFMdeAzvohAQ39nyJ

디스크 감시와 같은 문제 구조다 — 조용히 실패하고, 안 보면 모른다.

7-A 백업 현황
  HestiaCP 자동 백업은 cron 으로 돌고 세대 수만큼 자동 정리되지만, 특정 계정만
  조용히 빠져도 아무도 모른다. 계정별 세대 수·경과일과 '백업이 아예 없는 계정'
  목록을 낸다. 전체가 도는 것처럼 보여도 일부가 빠진 경우를 잡는 게 핵심이다.

7-B 휴면 사이트
  접근 로그 90일 없음 + 파일 180일 변경 없음 → 신호 2개일 때만 후보로 올린다.
  캐시·로그·업로드는 자동 갱신되므로 파일 검사에서 제외한다.

핵심 판단 — 오판 방향을 한쪽으로 고정한다
  살아있는 사이트를 '휴면' 이라고 하면 안 되고, 놓치는 건 괜찮다. 계절성·내부용·
  봇만 오는 사이트가 섞이기 때문이다. 그래서 신호 1개로는 올리지 않고, 로그
  로테이션으로 mtime 이 최근이 되면 '살아있다' 쪽으로 판정되게 뒀다.
  문구도 '정리 후보' 가 아니라 '확인 권장' 이고, 삭제 기능(PR #8)으로 가는
  동선을 만들지 말라고 명시했다. 한 번 더 사람이 판단해야 한다.

검증 — 가짜 환경(계정 3개·사이트 4개)으로 실제 실행
  백업 3세대/1세대40일전/없음 계정을 각각 정확히 분류
  활성 · 200일방치 · 로그없고파일오래됨 · 로그없지만파일최신 4가지 중
  마지막(신호 1개)이 후보에서 제외되는 것까지 확인

검증 중 결함 2건을 잡아 고쳤다
  1) -newermt "-180 days" 는 이식성이 없다(bfs 등이 상대시간을 거부).
     POSIX -mtime 으로 교체.
  2) -not -path '*/tmp/*' 가 상위 경로까지 걸러 살아있는 사이트를 휴면으로
     오판했다. 제외 경로를 "$WR" 기준 절대경로로 고정.
  둘 다 되돌리지 말라고 함정에 적었다.

용량은 이미 scan_cache 에 있으므로 서버에서 다시 재지 않고 UI 에서 조인한다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxEiSzFMdeAzvohAQ39nyJ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant