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 를 이용해서 복구를 하자
'Etc' 카테고리의 다른 글
| 2026 월드컵 한국 32강 실패? 진출? (1) | 2026.06.26 |
|---|---|
| 코스피 역대 일간 하락률 순위 (0) | 2026.06.24 |
| JTBC 법원 회생절차 개시 신청 (1) | 2026.06.16 |
| 지니어트 포인트 사용 방법 변경 (1) | 2026.06.15 |
| 명예훼손 게시물(댓글) 삭제 요청 리쿼드 스테킹관련 + 복원 신청 (0) | 2026.06.14 |