나만의 Git: Forgejo 또는 Gitea
웹 인터페이스, SSH 접근, 빌드 실행 기능을 갖춘 개인 저장소 서버를 설정하는 방법과 코드를 잃지 않기 위해 복사해야 할 것을 알아봐요.
업데이트 2026년 8월 23일
코드가 다른 사람의 플랫폼으로 나가면 안 되거나, 비공개 저장소와 빌드 시간에 제한을 두고 싶지 않을 때는 자체 Git이 필요해요. Forgejo와 Gitea는 밀접하게 관련된 두 프로젝트예요(Forgejo는 Gitea에서 갈라져 나왔어요). 둘 다 컨테이너 하나에 설치되고 적당한 사양의 머신에서 실행돼요.
무엇을 고르고 리소스는 얼마나 필요한가
일상적인 작업에서는 차이가 거의 없어요. 인터페이스, 이슈, 풀 리퀘스트, 미러, 빌드용 Actions 모두 마찬가지예요. Forgejo는 커뮤니티가, Gitea는 회사가 개발해요. 프로젝트의 독립성이 중요하다면 Forgejo를 고르세요.
두세 명이라면 VDS-1이면 충분해요. 빌드용 러너를 추가하는 순간 VDS-3 이상으로 가세요. 빌드는 CPU와 디스크를 많이 잡아먹고, 디스크 속도는 티어에 따라 제한돼요.
Compose로 설치하기
services:
forgejo:
image: codeberg.org/forgejo/forgejo:11
container_name: forgejo
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
ports:
- "3000:3000"
- "2222:22"
docker compose up -d
docker compose logs -f forgejo
http://<machine-address>:3000을 열고 초기 설정을 진행하세요. 처음 생성한 사용자가 관리자가 돼요.
포트 3000을 외부에 열어 둘 필요는 없어요. 닫고 인증서가 있는 웹 서버를 서비스 앞에 두세요. 그러면 HTTPS를 쓸 수 있고 설정 패널을 외부인에게 보여주지 않아도 돼요. 설정이 끝나기 전에는 주소를 연 사람 누구나 먼저 관리자를 만들 수 있어요.
SSH 접속
컨테이너 내부의 포트 22는 2222로 포워딩돼요. 22는 시스템 SSH가 쓰고 있기 때문이에요. 저장소 설정에서 주소는 이렇게 보여요.
git clone ssh://git@example.com:2222/user/repo.git
포트 없이 익숙한 git@example.com:user/repo.git 형태를 쓰고 싶다면 2222를 컨테이너에 남겨 두고 호스트에서 시스템 SSH를 통해 포워딩을 설정하거나, 관리용 SSH를 다른 포트로 옮기세요(접속 보호 참고).
빌드
Actions는 별도의 러너가 실행해요. 관리자 설정에서 받은 토큰으로 등록하는 forgejo-runner 컨테이너예요. Docker 소켓에 대한 접근 권한은 신중하게 주세요. 머신의 root 권한과 같아요. 빌드용으로는 러너를 메모리와 CPU로 제한하는 게 좋아요. 리소스 제한을 참고하세요.
무엇을 백업할까
모든 상태는 ./data 볼륨에 저장돼요. 저장소, 데이터베이스, 첨부 파일, 설정 모두요. 백업은 이렇게 해요.
docker compose stop forgejo
restic -r <repository> backup ./data
docker compose start forgejo
SQLite를 쓴다면 서비스를 중지해야 해요. 그렇지 않으면 데이터베이스 스냅샷이 일관되지 않을 수 있어요. PostgreSQL이라면 중지 없이 pg_dump만으로 충분해요. 자세한 내용은 무엇을 정확히 백업할까와 Restic을 참고하세요.