InfraGuard

복구 & 검증

성공한 백업 실행을 복구지점으로 목록화하고, 유형별 복원 명령을 안내하며, sha256 무결성 검증 결과를 infr_restore_run 에 기록합니다.

개요 — 무엇을 하나

복구 & 검증(Recovery & Validation) 은 백업이 실제로 되돌려지는지를 책임지는 화면입니다. 백업을 만드는 것과 그 백업으로 복원할 수 있음을 증명하는 것은 별개의 문제입니다 — 이 화면은 후자를 담당합니다.

세 가지 일을 합니다.

  1. 복구지점 인출 — 성공한 백업 실행(infr_backup_run) 중 아티팩트를 가진 것을 최근 90일 범위로 목록화합니다. 각 카드는 되돌릴 수 있는 하나의 스냅샷(파일·용량·체크섬·생성 시각)입니다.
  2. 복원 명령 안내 — 선택한 복구지점의 백업 유형(db/web/volume/custom)에 맞는 복원 명령을 조립해 CodeMirror 로 보여줍니다. SE 는 이 명령을 복사해 대상 호스트에서 직접 실행합니다.
  3. 무결성 검증 · 이력 — 복원본의 체크섬을 저장된 체크섬과 대조해 손상·변조가 없는지 확인하고, 그 결과(통과/실패)를 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. 복원 명령 받기

  1. 복구지점 카드에서 [복원 명령] 클릭.
  2. 복원 대상에 격리된 위치를 입력(예: 빈 DB restore_tmp, 임시 경로 /data/restore).
  3. 조립된 명령을 복사해 대상 호스트에서 실행.

백업 유형별로 조립되는 명령:

-- 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 으로 확인합니다.

  1. [검증 기록] 을 열고 격리 대상을 지정.
  2. 4단계에서 [검증명령] 말풍선을 열어 산출 명령을 복사, 대상 호스트에서 실행.
  3. 출력된 해시를 관측 체크섬 입력란에 붙여넣기 — 저장된 체크섬과 자동 대조되어 일치/불일치 배지가 뜹니다.
  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. 이력 관리

데이터 소스

테이블 / 엔드포인트 역할
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. 체크섬이 계속 불일치합니다.

Q. 명령을 화면에서 바로 실행할 수 없나요? 없습니다. 설계상 앱은 원격을 실행하지 않습니다 — 명령을 복사해 SE 가 대상 호스트에서 실행하고 결과만 기록합니다. 이는 감사 가능성과 최소 권한 원칙을 위한 의도적 결정입니다.

Q. 아티팩트를 다운로드하고 싶습니다. 지원하지 않습니다(백업 파일 웹 유출 방지). 아티팩트는 백업/보관 호스트에 있으며, 복원 명령이 그 경로를 참조합니다.

Q. 기록이 폴링 후 사라졌습니다. 30초 폴링은 서버 이력으로 화면을 덮어씁니다. 삭제하지 않았는데 사라졌다면 다른 사용자가 삭제했거나 50건 표시 한도를 벗어난 것입니다.

로드맵 (복원력 확장)

infr_restore_run 은 아래 확장을 염두에 둔 설계입니다(현재 화면은 인출·안내·검증까지).

관련 항목

복구지점과 복원 명령
복구지점과 복원 명령