사내 Git 포지(Forgejo) 서버 재구성
사내 Git 포지 서버 재구성 개발을 완료했습니다. 서버 2대의 역할 분리와 저장·인증·백업의 설계 판단을 정리했습니다.
작업 요약
개발 완료 · 서버 2대 구성과 10개 설계 항목 검토
서버 2대를 독립적으로 운영하기로 했습니다
git 서버 2대로 HA를 구성하는 방안을 검토했지만, Forgejo에는 네이티브 샤딩이 없고 공유 스토리지와 외부 DB 클러스터, Redis가 추가로 필요했습니다. 로컬 RAID를 사용하는 서버 2대라는 조건에 맞춰, 팀별로 repo를 나눠 저장하는 독립 2포지를 선택했습니다.
설계 당시에는 결정이 필요한 항목을 별점 비교표로 만들고 기각 사유를 남겼습니다. CacheVault 유무처럼 확인이 필요한 항목은 결정 표에 "확인"으로 표시해 회의에서 확인하도록 했습니다.
배경
IDC의 git 미러 서버 2대에 8TB HDD를 서버당 8개씩 증설하면서, 기존 구성을 Forgejo 기반 사내 git 포지로 재구성하게 됐습니다. 원본 repo가 이 포지에만 존재하게 되므로 저장·백업 설계가 핵심이었습니다.
- 서버당 EPYC 64코어 · 128GB RAM · 8TB HDD ×8 · 10GbE ×2(LACP)
- 확정 전제: 하드웨어 RAID, 사내 전용(외부 미공개), 업스트림 자동 pull-mirror, SSO 없이 built-in 계정
설계 판단
- 독립 2포지 — Forgejo/Gitea는 하나의 포지가 자기 DB에 모든 repo·계정을 갖는 구조라 서버 간 repo 샤딩이 없습니다. HA(공유 RWX 스토리지 + 외부 DB 클러스터 + Redis + LB)는 로컬 RAID 2대와 맞지 않아, 팀 단위로 repo를 나눠 담는 독립 2포지를 택했습니다.
- RAID10 유력, RAID5·ZFS 기각 — DB를 SSD에 두지 못하는 전제에서 랜덤 쓰기에 유리한 RAID10(서버당 가용 32TB)을 유력안으로. 8TB 디스크의 RAID5는 리빌드 중 URE로 어레이 전체의 데이터를 잃을 위험이 있어 기각, ZFS는 하드웨어 RAID 위에 얹으면 자가치유가 무력화되는 안티패턴이라 기각했습니다. 컨트롤러 캐시(CacheVault)가 확인되면 RAID6(48TB)도 후보로 남겼습니다.
- 백업은 원본만 — 미러 repo는 업스트림에서 재-fetch로 복구되므로 제외하고, 원본 repo만
forgejo dump+ 상대 서버 push-mirror(라이브 DR)로 다중 사본을 만듭니다. RAID는 디스크 고장만 막고 오삭제·파일시스템 손상은 못 막는다는 전제를 문서에 명시했습니다. - 인증은 built-in 계정 — 사내 전용 + 미러 소비 중심이라 SSO는 과한 선택지로 판단해 기각했습니다.
결과
사내 Git 포지 서버 재구성 개발을 완료했습니다. 아래에는 개발에 앞서 검토한 구성과 선택 기준을 정리했습니다.
역할
하드웨어 사양 검토부터 배포 모델·스토리지·백업 정책 비교, 설치 체크리스트 작성까지 설계를 직접 진행했습니다. CacheVault 장착 여부처럼 결정에 직결되는 미확인 항목은 확인 목록으로 분리했고, 최종 채택은 팀 회의로 확정하도록 문서에 명시했습니다.
Git 저장 영역을 분리하는 검토에서 이어진 서버 재구성 작업으로, 개발을 완료했습니다. SeaweedFS RAW 저장소 프로젝트는 별도로 Deprecated됐습니다.