백업과 복원 훈련
별도 대상에서 백업본의 데이터와 포인터를 대조한다
무엇을 하게 되나
Compose 설치의 DB와 checkpoint object를 백업하고 별도 project·새 빈 bucket에서 포인터 version을 대조한다. API와 실제 세션 재개 확인을 별도 증거로 남긴다.
준비물
정상 설치, 최근 release와 비밀키의 별도 보관, 충분한 백업 공간, writer를 중지할 유지보수 시간이 필요하다. 백업에는 DB 전체와 API key hash가 있으므로 접근 권한 0700과 전송·보관 암호화를 적용한다. 운영 bucket에 복원하지 않는다. backup·reseed·restore-drill은 릴리스 번들에서 거부하므로 설치 commit의 checkout에서 실행한다.
단계
1. 백업
scripts/test-ops.sh backup명령은 api·scheduler·reconciler·worker를 멈춰 DB와 object를 상태 디렉터리의 backups/backup-<시각>에 묶은 뒤 서비스를 다시 연다. 진행 중 turn은 끊기고 이후 회수 대상이 될 수 있으므로 시작 전에 확인한다. 실패본 .failed, 미완성 .partial은 성공본으로 사용하지 않는다. 백업이 끝나도 서비스를 다시 열지 못하면 명령은 실패한다.
매일 사용이 적은 시간과 매 업그레이드 직전에 실행한다. 예시 보존 정책은 호스트 14일·암호화한 외부 보관소 90일이다. 새 성공본이 26시간 없거나 명령이 non-zero거나 서비스 재개 실패면 알림을 보낸다.
2. 별도 대상 복원
S3는 매번 새 빈 훈련 bucket을 준비한다. 원본 bucket, object version이나 delete marker가 있는 대상은 거부된다.
# Restore a backup into a throwaway project and a new, empty bucket, then verify it
scripts/test-ops.sh restore-drill /var/lib/werft/test-ops/backups/backup-<timestamp> --bucket <drill-bucket> --port-base 25432--port-base는 훈련 서비스의 별도 시작 포트이며 다른 설치와 겹치지 않게 고른다. LocalStack 시험에서는 --bucket을 주지 않는다. 훈련은 postgres와 object store를 복원하고 모든 checkpoint pointer를 version 단위로 대조한다. API는 띄우지 않는다. 월 1회와 업그레이드 뒤 첫 백업마다 수행한다.
3. checkpoint GC
백업과 겹치지 않는 주간 일정에 먼저 dry-run을 실행한다.
API_CONTAINER='<api-container-id-from-this-installation>'
docker exec -e CHECKPOINT_GC_DRY_RUN=1 "$API_CONTAINER" \
bun run apps/control-host/src/api/checkpoint-gc.tsAPI_CONTAINER를 이 설치의 status와 project label로 확인한다. 출력의 보존·삭제 대상을 검토한 뒤 dry-run 환경 변수를 빼고 실행한다. 기본 compose project의 다른 설치를 선택하지 않는다. Kubernetes는 chart의 checkpointGc.schedule을 사용한다.
확인
백업 종료 코드와 status를 확인한다. 훈련 로그의 실제 대조한 checkpoint 수·version 수·checksum 결과를 보관한다. nothing was compared는 빈 대조이며 데이터 복원의 증거가 아니다. 기존 LocalStack 실행은 object 0개·checkpoint 0행이었고, AWS S3 복원과 API를 띄운 실제 세션 재개는 확인하지 않았다. 복원한 API·worker로 세션이 이어지는 확인을 별도 격리 환경에서 수행해야 한다.
자주 막히는 곳
훈련 대상이 원본이거나 비어 있지 않으면 멈춘다. legal hold와 retention 때문에 version 삭제가 실패하면 보호를 임의로 풀지 말고 대상과 보존 계약을 조사한다. 훈련 출력은 restore-drills/와 history에 남는다.
되돌리기
훈련 도구는 종료 시 이번 훈련 project를 정리한다. 조사용 --keep을 썼다면 확인 뒤 그 project만 down하고 volume은 별도 보존 정책으로 처리한다. 훈련 bucket은 운영 bucket과 구분하여 재사용할 데이터가 없음을 확인한 뒤, 각 object version의 legal hold 해제 → version과 delete marker 삭제 → 빈 bucket 삭제 순서로 정리한다. retention이 남으면 우회하지 않고 만료를 기다린다. 운영 백업본은 시험을 위해 지우지 않는다.
다음에 읽을 곳
Compose 업그레이드, 저장소와 상한. Kubernetes DB·S3 복원은 운영자 백업 계약을 따른다.