Gitea 업데이트 후 저장소 데이터 읽기 실패 해결법
최근 Gitea 관련 취약점 CVE-2026-27771 를 해결하기 위해 Gitea 버전을 업그레이드한 컨테이너를 생성했는데 "The Git data underlying this repository cannot be read. Contact the administrator of this instance or delete this repository." 혹은 "이 리포지토리의 기본 Git 데이터를 읽을 수 없습니다. 이 인스턴스의 관리자에게 문의하거나 이 저장소를 삭제하십시오." 에러 메시지가 발생하는 이슈를 겪었다. 해당 메시지는 Gitea 가 저장소 데이터를 정상적으로 읽지 못해 발생하는 것으로, 그 이유는 아주 다양하지만 이 글에서는 일반 Gitea 이미지와 rootless 이미지 사이의 볼륨 마운팅 경로 차이로 인해 발생하는 이슈에 대해 설명하겠다.

1. 문제
문제가 발생한 원인은 일반 Gitea 이미지와 rootless 한 Gitea 이미지 사이의 볼륨 마운팅 경로 차이에 있다. Gitea 공식 문서에서는 rootless 이미지에 대해 다음과 같은 특징을 설명하고 있다.
- Rootless image doesn't require "root" privilege on the host, while it may have stricter UID/GID requirement.
- Rootless image must use its bulitin SSH server, while the rootful one must its managed standalone OpenSSH server.
- The volume mapping and directory layout is different between them.
핵심적인 내용은 3번째 구문이다. 조사해보니 일반 Gitea 이미지는 저장소 데이터를 /data 경로에 저장하는 반면, rootless 이미지는 /var/lib/gitea 경로에 저장한다는 것을 확인할 수 있었다. 그외의 볼륨은 두 이미지 모두 동일한 경로에 마운팅한다.
다음은 공식 문서에서 제시한 일반 이미지의 docker-compose.yml 예시다. 저장소 데이터를 컨테이너 내 /data 경로에 마운팅하고 있다.
networks:
gitea:
external: false
services:
server:
image: docker.gitea.com/gitea:1.26.2
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"
다음은 공식 문서에서 제시한 rootless 이미지의 docker-compose.yml 예시다. 저장소 데이터를 컨테이너 내 /var/lib/gitea 경로에 마운팅하고 있다.
services:
server:
image: docker.gitea.com/gitea:1.26.2-rootless
restart: always
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"
필자는 이 차이를 모른 채 rootless 이미지를 사용하고, 저장소 데이터를 일반 이미지에서 사용하는 /data 경로에 마운팅했다. 당연하게도 마운팅된 경로에는 아무런 데이터도 없었고, 이 상태로 버전업된 새로운 이미지를 생성, 볼륨 마운팅을 하니 저장소 데이터를 찾지 못해 "The Git data underlying this repository cannot be read" 에러 메시지가 발생한 것이다.
2. 해결책
필자처럼 rootless 이미지를 일반 Gitea 설정으로 생성했다면 Gitea 컨테이너 내 /var/lib/gitea/ 경로에 저장소 데이터가 있을 것이다. 컨테이너에 접속해 해당 데이터를 마운팅한 /data 경로에 복사해 백업한다.
$ cp -R /var/lib/gitea/* /data
실수로 컨테이너를 삭제했어도 볼륨 데이터를 지우지 않았다면 호스트의 /var/lib/docker/volumes 경로에 이전에 마운팅된 저장소 데이터 정보가 남아 있을 수 있다. 정상적으로 운영 중인 Gitea 컨테이너라면 /var/lib/gitea 경로에 다음과 같이 저장소 데이터가 있을 것이다.

/var/lib/gitea 경로 데이터저장소 데이터가 정확히 어느 볼륨에 마운팅됐었는지 알 수 없으니 찾아야 한다. 다음 명령어는 Gitea 저장소 데이터 중 하나인 repo-archive 디렉토리를 가지는 볼륨 디렉토리 경로를 출력한다.
$ sudo find /var/lib/docker/volumes -type d -name repo-archive -exec dirname {} \;
저장소 데이터를 찾았다면 적절한 위치에 데이터를 백업한 후, 앞서 설명한 대로 올바른 경로에 마운팅하면 된다.