친구들과 대회 참여를 위해 비공개 git repository가 필요했다.
원본 소스코드가 따로 있었고, git commit log를 보존할 필요가 있었다.
github는 비공개 repository 사용에 제약이 있었기 때문에 이참에 개인용 git 서버를 하나 구축하기로 했다.
처음에는 이전에 사용해본 GitLab을 구축하려고 했다.
GitLab
웹 기반의 Git 저장소 관리 및 협업 플랫폼으로
개발자들이 소스 코드를 버전 관리하고 프로젝트를 협업하여 개발하는 데에 사용되는 도구이다. GitLab은 GitHub와 유사한 기능을 제공하지만, GitHub과는 달리 오픈 소스 버전과 기업용의 유료 버전 모두를 제공한다.
하지만 문제가 있었다.
바로 사용하려던 서버가 매우 낮은 스펙을 가지고 있었다는 것이다.
GitLab을 이때까지 사용한 경험과, 공식 문서를 기반한다면, 최소 4GB의 메모리를 확보해야 하는데 사용가능한 서버가 1GB 메모리의 서버였기 때문이다.
또한, 우리 프로젝트에서 별도의 CI/CD 파이프라인은 필요 없었기 때문에 경량화된 git Server를 찾아보니 Gitea라는 것을 찾았다.
Gitea
Git을 기반으로 한 오픈 소스 웹 기반 자체 호스팅 Git 서비스
경량화된 Git 호스팅 플랫폼으로, GitLab과 유사한 기능을 제공하지만 더 가볍고 빠른 솔루션을 제공한다.
그래서 필자는 Gitea를 이용하여 임시로 사용할 개인 비공개 git Repository를 구축하기로 했다.
필자는 1 vcpu 1GB의 Ubuntu 22.04 LTS 서버, ARM 기반 64bit 시스템을 사용했다.
서버 준비는 이미 완료되어 있다 가정한다.
또한, 본 포스팅에서는 Gitea를 리눅스 서비스로 등록하여 사용할 것이다.
이에 따라 별도의 리눅스 계정을 생성하고 workDir을 생성할 것이다.
Gitea 서비스의 경로는 /gitea 이며, 실행파일 및 기타 설정파일또한 전부 이 경로 내부에 존재한다.
마지막으로, 리눅스 명령 실행 시, 적절한 권한이 부여되어 있다 가정하기에 sudo 명령 등은 생략한다.
우선, /gitea 디렉토리를 생성한다.
서버 구성 당시 최신 버전인 1.20.2 버전을 사용했다.
시스템에 알맞은 gitea-1.20.2-linux-amd64 로 다운로드 했다.
wget https://dl.gitea.com/gitea/1.20.2/gitea-1.20.2-linux-amd64
다운로드 완료 후, 이 실행 바이너리를 /gitea 디렉토리에 gitea라는 이름으로 옮긴다.
mv gitea-1.20.2-linux-amd64 /gitea/gitea

여담으로, Linux 뿐 아니라 다양한 OS에 대한 버전을 지원하기 때문에 본인 시스템 OS에 따라 적절히 선택할 수 있는것이 장점인 듯 하다.
Gitea는 바이너리 파일을 실행만 하더라도 바로 서비스를 구축할 수 있다.
하지만, 필자는 리눅스 서비스로 등록하여 서버 재부팅이나 오류 상황에서 자동으로 재부팅 하기 위해서 리눅스 서비스로 이를 등록할 것이다.
따라서, 서비스 등록을 위해 gitea 서비스 전용 계정을 하나 만들고 별도의 디렉토리를 사용할 것이다.
우선 계정을 하나 생성해준다. 이 계정의 전제 조건은 다음과 같다.
- 계정명은 gitea
- 로그인 불가능 하도록 기본 쉘을 /bin/false로 설정한다.
- 계정의 홈 디렉토리는 /gitea 로 설정한다.
이를 위해 다음과 같은 명령을 통해 계정을 생성한다.
useradd -d /gitea -s /bin/false gitea
/gitea 경로 및 그 하위의 모든 파일에 대해서는 gitea 유저의 권한으로 제어 가능해야 하기 때문에 소유자를 gitea로 변경한다.
또한, gitea 실행 바이너리에 대해서는 실행 권한을 추가해야 한다.
chown gitea:gitea -R /gitea
chmod +x /gitea/gitea

git 같은 서비스는 장애가 생기거나 서버를 재시작하여도 항상 다시 시작되어야 한다.
그렇기 때문에 systemd가 관리하는 서비스로 등록하여 관리할 것이다.
vi /etc/systemd/system/gitea.service
#아래 내용을 파일에 작성
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
[Service]
RestartSec=3s
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/gitea
ExecStart=/gitea/gitea web
Restart=always
Environment=USER=gitea
HOME=/gitea
[Install]
WantedBy=multi-user.target

서비스 설정 파일 작성이 완료되었다면 서비스를 실제로 구동해야 한다.
다음과 같은 명령으로 서비스 목록을 갱신한 뒤 실행 목록에 등록하고 실행한다.
systemctl daemon-reload
systemctl enable gitea.service
systemctl start gitea.service
#서비스 상태 확인 : active 뜨면 정상
systemctl status gitea.service

gitea는 웹 GUI로 초기 설정을 지원한다.
서비스가 정상 실행 되었다면 3000번 포트에 웹 서버 하나가 실행되었을 것이다.
거기에 접속한다.
http://<domain>:3000

필자는 임시로 구축하는 것이기 때문에 데이터베이스 유형은 SQLite3으로 설정한다.
그 외의 값들은 본인 편의에 따라 변경하면 된다.
본 포스트에서는 추가설정 -> 서버 및 기타 서비스 설정, 관리자 계정 설정만 제외하고 기본값으로 둔다.

관리자 계정은 본인이 원하는 계정을 입력한 뒤 하단의 Gitea 설치하기 버튼을 누른다.

설치 완료.
이 대로 gitea를 사용해도 되지만, SSL/TLS 인증서가 적용되어 있지 않기에 보안상 취약하다.
그렇기 때문에 인증서를 발급받은 뒤 적용하는것을 추천한다.
인증서 발급 방법은 다른 블로그나 포스트에 좋은글들이 매우 많으니 찾아보는 것을 추천한다.
본 포스트에서는 인증서 적용을 위해 인증서 파일인 cert.pem, 그리고 개인키 파일인 key.pem이 준비되었다고 가정한다.
두 파일들을 /gitea/custom 디렉토리 하위에 배치한 뒤 소유자를 gitea로 변경한다.

이후, 설정을 변경하기 위해 /gitea/custom/config/app.ini 파일의 server 설정을 다음과 같은 내용을 추가한다.
vi /gitea/custom/conf/app.ini
[server]
SSH_DOMAIN = ***.***
DOMAIN = ***.***
HTTP_PORT = 3000 # 수정
ROOT_URL = https://***.***:3000/ # https로 수정
APP_DATA_PATH = /gitea/data
DISABLE_SSH = false
SSH_PORT = 22
LFS_START_SERVER = true
LFS_JWT_SECRET = t5cclt9SVsjtJK4RQeSXylTkXCIl3eKM01aAAv1ggeI
OFFLINE_MODE = false
PROTOCOL = https # 추가
CERT_FILE = cert.pem # 추가
KEY_FILE = key.pem # 추가
이후, gitea 서비스를 재시작한다.
systemctl restart gitea.service
#서비스 상태 확인 : active 뜨면 정상
systemctl status gitea.service

설정을 완료하면 HTTPS가 정상 적용 된 것을 확인할 수 있다.
좋은 정보 감사합니다