개요 — 무엇을 하나
복구 & 검증(Recovery & Validation) 은 백업이 실제로 되돌려지는지를 책임지는 화면입니다. 백업을 만드는 것과 그 백업으로 복원할 수 있음을 증명하는 것은 별개의 문제입니다 — 이 화면은 후자를 담당합니다.
세 가지 일을 합니다.
- 복구지점 인출 — 성공한 백업 실행(
infr_backup_run) 중 아티팩트를 가진 것을 최근 90일 범위로 목록화합니다. 각 카드는 되돌릴 수 있는 하나의 스냅샷(파일·용량·체크섬·생성 시각)입니다. - 복원 명령 안내 — 선택한 복구지점의 백업 유형(db/web/volume/custom)에 맞는 복원 명령을 조립해 CodeMirror 로 보여줍니다. SE 는 이 명령을 복사해 대상 호스트에서 직접 실행합니다.
- 무결성 검증 · 이력 — 복원본의 체크섬을 저장된 체크섬과 대조해 손상·변조가 없는지 확인하고, 그 결과(통과/실패)를
infr_restore_run에 남겨 복구 가능성을 지속 추적합니다.
앱은 원격 파일시스템에 접근하지 않습니다. InfraGuard 는 리포트 콜백 모델을 따릅니다 — 실제 복원·검증은 SE 가 대상 호스트에서 실행하고, 그 결과만 이 화면에 기록합니다. 화면에서 원격 명령을 대신 실행하거나 아티팩트를 브라우저로 다운로드하지 않습니다(웹 유출 방지).
언제 쓰나
- 정기 복구 리허설 — "백업이 돌고 있습니다"에서 "백업으로 복원됩니다"로 넘어가려면 주기적으로 격리 환경에 복원해 보고 검증 결과를 남깁니다.
- 재해·랜섬웨어 대응 — 가장 최근의 무결성 통과 복구지점을 찾아 되돌릴 때.
- 마이그레이션·감사 — 특정 시점 스냅샷을 임시 스키마로 복원해 데이터를 확인할 때.
- 백업 품질 점검 — 체크섬 불일치가 반복되면 백업 스크립트나 저장 매체에 문제가 있다는 신호입니다.
화면 구성
2단 레이아웃입니다.
| 영역 | 내용 |
|---|---|
| 복구지점(좌 · 메인) | 성공 아티팩트 카드 그리드. 유형 아이콘, 작업 이름, 아티팩트 파일명, 용량, 체크섬(앞 10자), 서버 IP, 생성 시각. 카드마다 [복원 명령]·[검증 기록] 버튼. |
| 복원·검증 이력(우 · 전체 높이) | 최근 50건의 infr_restore_run 3줄 카드. 유형(복원/검증/리허설)·무결성 판정 배지·작업 이름·대상·시각. 쓰기 권한이 있으면 각 카드에 삭제(×). |
복원 명령 모달
[복원 명령] 을 누르면 읽기 전용 모달이 열립니다. 복원 대상(경로/DB) 입력란에 값을 넣으면 명령이 즉시 다시 조립되고(/backup/recovery/plan), CodeMirror 에 유형별 언어(db=SQL, 그 외=bash)로 표시됩니다. 복사 버튼으로 대상 호스트에 붙여넣으세요.
복구 검증 모달 (문제해결 내러티브)
[검증 기록] 은 5단계 절차를 좌측 세로 스텝으로, 우측에는 이 복구지점의 검증 로그를 보여줍니다.
| # | 단계 | 하는 일 |
|---|---|---|
| 1 | 복구지점 확인 | 되돌릴 아티팩트·용량·체크섬·생성 시각 확인 |
| 2 | 격리 대상 준비 | 운영과 분리된 복원 위치(빈 DB·임시 경로) 지정 — 운영에 바로 덮어쓰지 않음 |
| 3 | 복원 실행 | [복원 명령] 말풍선의 명령을 대상 호스트에서 실행 |
| 4 | 무결성 검증 | 복원본 sha256 을 저장 체크섬과 대조(일치/불일치 배지) |
| 5 | 결과 기록 | 유형(검증/리허설)·결과(성공/실패)·메모를 남겨 기록 |
우측 명령 말풍선(overlay)은 복원 명령과 검증명령(sha256 산출) 두 가지를 토글로 보여줍니다.
사용법
1. 복원 명령 받기
- 복구지점 카드에서
[복원 명령]클릭. - 복원 대상에 격리된 위치를 입력(예: 빈 DB
restore_tmp, 임시 경로/data/restore). - 조립된 명령을 복사해 대상 호스트에서 실행.
백업 유형별로 조립되는 명령:
-- db: mysqldump 산출물을 되돌림 (자격증명은 defaults-file 로 은닉)
mysql --defaults-extra-file=/etc/infr/YOUR_IDENT.cnf restore_tmp < /data/bk/app_202608130200.sql
# web: 증분 rsync 백업을 대상 경로로 복원
rsync -az /data/bk/web_20260813/ /data/restore/
# volume: tar 아카이브를 대상 디렉터리에 풀기 (대상 경로가 존재해야 함)
tar xzf /data/bk/vol_202608130200.tar.gz -C /data/restore
# custom: 복원 절차를 직접 정의 (아티팩트 경로만 주석으로 안내)
# 커스텀 아티팩트 복원 절차를 여기에 작성하세요: /data/bk/custom_...
- db 복원 전 대상 DB 를 비우거나 새 스키마로 복원하세요. 운영 DB 에 바로 덮어쓰지 마세요.
- web 복원 시
--delete는 대상을 삭제하므로 신중히 사용하세요.- 위 예시의 파일명·경로·IDENT 는 자리표시자입니다. 실제 값은 복구지점 아티팩트와 작업 params 에서 채워집니다.
2. 무결성 검증하기
복원이 손상 없이 이뤄졌는지는 sha256 으로 확인합니다.
[검증 기록]을 열고 격리 대상을 지정.- 4단계에서
[검증명령]말풍선을 열어 산출 명령을 복사, 대상 호스트에서 실행. - 출력된 해시를 관측 체크섬 입력란에 붙여넣기 — 저장된 체크섬과 자동 대조되어 일치/불일치 배지가 뜹니다.
- 5단계에서 유형·결과·메모를 정하고
[검증 기록]저장.
산출 명령(백업 유형별):
# db·volume·custom (단일 파일): 파일의 sha256 한 줄
sha256sum "/data/bk/app_202608130200.sql" | cut -d' ' -f1
# web (디렉터리): 파일별 sha256 을 정렬해 한 번 더 해시
find "/data/bk/web_20260813" -type f -exec sha256sum {} \; | sort | sha256sum
화면의 일치 배지는 편의용 클라이언트 표시일 뿐이며, 권위 있는 판정은 서버의 서버측 대조 입니다. 검증 유형(
validate) + 관측 체크섬이 함께 기록되면 서버가verified를 자동 산정합니다. 저장 체크섬이나 관측값이 비어 있으면 검증은 통과로 처리되지 않습니다.
3. 이력 관리
- 기록된 결과는 우측 이력과 검증 모달 로그에 즉시 반영됩니다.
- 잘못 남긴 항목은 이력 카드의 × 로 삭제할 수 있습니다(쓰기 권한 필요, 감사 기록됨).
- 화면은 30초마다 자동 폴링합니다(모달이 열려 있거나 탭이 백그라운드면 일시 정지).
데이터 소스
| 테이블 / 엔드포인트 | 역할 |
|---|---|
infr_backup_run |
복구지점 원천. 조건: artifact_path IS NOT NULL · status='done' · 최근 90일 · 최신순 최대 300건. |
infr_backup_job |
복구지점·이력에 작업 이름(job_name)을 붙임. |
infr_restore_run |
복원/검증/리허설 이력(마이그레이션 000406). kind·status·verified·target·message 등. |
GET /backup/recovery/live |
30초 폴링 — 복구지점 + 이력 갱신. |
GET /backup/recovery/plan |
run_id·target 로 복원 명령 조립(RestoreService::restorePlan). |
POST /backup/recovery/record |
검증/복원 결과 기록(level≥2 + 감사). |
POST /backup/recovery/delete |
이력 삭제(level≥2 + 감사). |
infr_restore_run 주요 컬럼
| 컬럼 | 의미 |
|---|---|
source_run_id |
어느 복구지점(infr_backup_run.id)에서 왔는지 |
job_id / target |
백업 작업 · 복원 대상(경로/DB) |
kind |
restore(실복원) · validate(체크섬 무결성 대조) · rehearsal(격리 복원 리허설) |
status |
running · done · failed |
verified |
무결성(체크섬) 통과 여부 — 검증의 핵심 지표 |
message / created_by / created_at |
메모 · 행위자 · 기록 시각 |
infr_restore_run은$timestamps=false이며created_at을 직접 채웁니다. 백업을 만드는 파이프라인은 백업 스케줄 보드·백업 스크립트·스크립트 빌더를, 실행 결과 적재는 리포트 콜백을 참고하세요.
권한
| 작업 | 필요 레벨 |
|---|---|
| 복구지점·이력 조회, 복원 명령 안내 조회 | 로그인(demo=1 이상) |
검증/복원 결과 기록(record) |
staff 이상 (level ≥ 2) + 감사(backup.restore) |
이력 삭제(delete) |
staff 이상 (level ≥ 2) + 감사(backup.restore.delete) |
쓰기 권한이 없으면 검증 모달 5단계에 잠금 안내가 표시되고 기록 버튼이 나타나지 않습니다. 파괴적·기록성 작업은 모두 infr_audit_log 에 남으며 감사 로그에서 조회할 수 있습니다.
문제해결 · FAQ
Q. 복구지점이 하나도 안 보입니다.
아티팩트를 가진 성공 실행이 최근 90일 내에 없다는 뜻입니다. 백업이 실제로 완료되고 report 콜백이 artifact_path·status=done 을 남기는지 리포트 콜백에서 확인하세요. 90일보다 오래된 실행은 목록에서 제외됩니다.
Q. 체크섬이 계속 불일치합니다.
- 저장 체크섬 자체가 비어 있으면(백업 스크립트가 체크섬을 남기지 않음) 검증은 통과로 판정되지 않습니다.
- 산출 방식이 다를 수 있습니다 — 단일 파일은
sha256sum ... | cut, 디렉터리(web)는find ... | sort | sha256sum규약을 사용하세요. - 복원 대상 경로가 원본과 다르면(압축·개행 변환 등) 해시가 달라질 수 있습니다.
Q. 명령을 화면에서 바로 실행할 수 없나요? 없습니다. 설계상 앱은 원격을 실행하지 않습니다 — 명령을 복사해 SE 가 대상 호스트에서 실행하고 결과만 기록합니다. 이는 감사 가능성과 최소 권한 원칙을 위한 의도적 결정입니다.
Q. 아티팩트를 다운로드하고 싶습니다. 지원하지 않습니다(백업 파일 웹 유출 방지). 아티팩트는 백업/보관 호스트에 있으며, 복원 명령이 그 경로를 참조합니다.
Q. 기록이 폴링 후 사라졌습니다. 30초 폴링은 서버 이력으로 화면을 덮어씁니다. 삭제하지 않았는데 사라졌다면 다른 사용자가 삭제했거나 50건 표시 한도를 벗어난 것입니다.
로드맵 (복원력 확장)
infr_restore_run 은 아래 확장을 염두에 둔 설계입니다(현재 화면은 인출·안내·검증까지).
- 불변/WORM · 에어갭 보관 — 변조 불가 저장으로 복구지점 자체를 보호.
- 탐지 연동 복원점 잠금 — 랜섬웨어 이상탐지 시 "마지막 정상 복원점"을 자동 잠금(보안 탐지 파이프라인과 연계).
- 자동 격리 복원 리허설 — 정기적으로 임시 환경에 복원·검증하고 결과를 자동 기록.
관련 항목
- 백업 스케줄 보드 — 무엇을·언제·어디에 백업하는지 한눈에
- 백업 스크립트 — 등록된 백업 스크립트 그리드
- 스크립트 빌더 — 백업 스크립트·crontab 생성
- 백업 보관소 — 보관소·3-2-1 오프사이트
- 리포트 콜백 — 실행 결과를 infr_backup_run 에 적재
- 감사 로그 — 복원·삭제 기록 조회
