Etc

GitLab 프로젝트 삭제 복구 방법

Naan 2026. 6. 23. 00:43
반응형

GitLab 프로젝트 삭제 복구 방법

 ▎ GitLab CE 17.4.1은 soft delete(휴지통)가 없어서 삭제 즉시 영구 삭제됩니다. 백업만이 유일한 복구 수단입니다.

  ---
  방법 1. 서버 관리자(Admin)가 직접 복구하는 경우

  언제: Admin이 실수로 삭제했거나, 관리 작업 중 삭제된 경우

  # 1. 백업에서 삭제된 프로젝트 ID 확인
  tar -xf /var/opt/gitlab/backups/<backup>.tar db/database.sql.gz -O | \
    zcat | grep -A 10000 'COPY public.projects' | awk -F'\t' '$3=="삭제한 프로젝트이름"'
  # → 프로젝트 ID 확인 (예: 73)

  # 2. 해당 ID의 hashed 경로 계산
  HASH=$(echo -n "73" | sha256sum | cut -d" " -f1)
  echo "${HASH:0:2}/${HASH:2:2}/$HASH"

  # 3. 백업에서 git 데이터 추출
  mkdir -p /tmp/restore
  tar -xf <backup>.tar --wildcards "repositories/default/@hashed/${HASH:0:2}/${HASH:2:2}/${HASH}*" -C /tmp/restore

  # 4. GitLab UI에서 새 프로젝트 생성 (같은 경로로)

  # 5. 새 프로젝트 ID 확인 후 mirror push
  NEW_ID=<새 ID>
  NEW_HASH=$(echo -n "$NEW_ID" | sha256sum | cut -d" " -f1)
  NEW_REPO="/var/opt/gitlab/git-data/repositories/@hashed/${NEW_HASH:0:2}/${NEW_HASH:2:2}/${NEW_HASH}.git"
  cd /tmp/restore/repositories/default/@hashed/.../....bundle
  git clone --mirror <bundle> /tmp/push_work
  cd /tmp/push_work && git push --mirror "file://$NEW_REPO"

  # ★ 핵심: 소유권 반드시 수정 (이번에 놓쳤던 부분)
  chown -R git:git "$NEW_REPO"

  # 6. 캐시 갱신
  gitlab-rails runner "p = Project.find($NEW_ID); p.repository.expire_all_method_caches; p.statistics.refresh!"

  ---
  방법 2. 개인 사용자가 실수로 삭제했을 때

  언제: 개발자가 본인 프로젝트나 그룹 프로젝트를 실수로 삭제한 경우

  ▎ 사용자 스스로는 복구 불가 — 관리자에게 즉시 연락해야 합니다.

  사용자가 해야 할 일:
  - 삭제한 프로젝트 경로 와 삭제 시각을 관리자에게 알림
  - 백업은 하루 2회(02:00, 13:00) 생성되므로 빠를수록 복구 가능성이 높음

  관리자 복구 절차:
  위 방법 1과 동일하게 진행하되, 추가로 멤버 권한도 복원 필요:

  # 백업 DB에서 원래 멤버 목록 추출 (project_id = 삭제된 ID)
  tar -xf <backup>.tar db/database.sql.gz -O | zcat | \
    grep -A 10000 'COPY public.members' | grep -B 10000 '^\.' | \
    awk 'NR>1' | awk -F'\t' '$3=="<삭제된프로젝트ID>" && $4=="Project"'
  # → user_id, access_level 확인 후 Admin UI에서 멤버 재추가

  ---
  체크리스트 (복구 후 반드시 확인)

  ┌─────────────────┬─────────────────────────────────────────────┐
  │      항목       │                  확인 방법                  │
  ├─────────────────┼─────────────────────────────────────────────┤
  │ git 파일 소유권 │ find <repo.git> -not -user git → 0이어야 함 │
  ├─────────────────┼─────────────────────────────────────────────┤
  │ 멤버 권한       │ Admin → Project → Members 확인              │
  ├─────────────────┼─────────────────────────────────────────────┤
  │ 브랜치/커밋     │ GitLab UI에서 브랜치 목록 확인              │
  ├─────────────────┼─────────────────────────────────────────────┤
  │ 캐시 갱신       │ p.repository.expire_all_method_caches       │
  └─────────────────┴─────────────────────────────────────────────┘

뭐... 대충 이렇게 복구 하는데 괜히 문제 발생 할 수 있으니 claude 를 이용해서 복구를 하자

728x90
반응형