[DevOps – AWS] – “AWS LightSail 에 gitea 저장소 구축하기” 

[DevOps – AWS] – “AWS LightSail 에 gitea 저장소 구축하기” 

7월 8, 2024

Gitea – Private, Fast, Reliable DevOps Platform

저는 주로 작성하는 코드의 버전 관리를 위해 Git 을 애용합니다. 그리고, 그 코드들의 저장소로서 Github 을 사용하고 있었죠. 하지만 Github 에 사내용 코드를 만드려면 private 저장소를 만들어야 했고, 현재 private 저장소를 만드는 것은 무료이지만 조금 더 폐쇄적인 코드 저장 환경을 만들고 싶었습니다.

  1. 개인 리포지토리에 제 개인 작업과 관련없는 저장소가 늘어나는 것이 싫었습니다.
  2. 코드를 개인 리포지토리에 저장하면 현재 작업하고 있는 프리랜서 업무의 특성상 인수인계가 복잡해집니다.
  3. 2. 의 해결책으로, Github 조직을 만들면 되지만, 비공개 저장소는 Github Actions 시간에 제한이 있습니다.

그래서, 작은 서버에 사내용 Git 코드 저장소를 호스팅하여, 비밀 저장소와 Git Actions 를 거의 무제한으로 사용할 수 있는 환경을 구축해 두어야겠다고 마음먹었습니다. 이렇게 하면, 제 개인 Github 계정과 회사용 Git 작업을 분리된 채로 유지할 수 있으며, 인수인계도 계정만 만들어주면 되고 추후 작업을 그만두었을 때에도 코드는 그대로 사내용 Git 서버에 유지됩니다.

그래서 생각해 본 대안은 아래와 같았습니다.

  • AWS CodeCommit 은 편리합니다만, 저의 AWS 사용 능숙함이 떨어져 AWS IAM 설정, 자동 빌드 및 배포를 위한 CodeBuild – CodeDeploy – CodePipeline 설정에 많은 시간이 걸립니다. 빠르게 인프라를 구축하고 개발을 시작해야 하는 현재 상황상 쓰기 어려웠습니다.
  • GitLab 은 기능이 상당히 많고 여러 회사에서 사용 중이라는 것을 들었지만, 무거워서 서버의 인스턴스를 좋은 사양으로 써야 한다는 것을 알게 되었습니다. 현재는 서버에 많은 비용을 투자하기는 어려운 상황입니다.
  • Gitea 는 비교적 작은 사양으로도 서버를 돌릴 수 있고, Github Actions 와 호환되는 Gitea Actions 를 제공합니다. AWS LightSail 에서 작은 사양으로 돌릴 수 있는지 테스트해 보고, 구축을 결정해 보기로 했습니다.

그래요, 문제 상황을 인식하고 몇 가지 대안을 찾아보았고 장단점을 파악했습니다. 다음 단계는 제 결정이 타당한지 파악하기 위해 실행에 옮겨볼 차례입니다.

AWS LightSail 인스턴스 만들기

간단한 인스턴스를 만들어 실행에 옮겨 봅시다. 라이트세일에서 플랫폼과 운영 체제를 선택합니다.

저는 Ubuntu 22.04 를 기반으로 인스턴스를 생성하겠습니다.

저는 위와 같은 사양을 선택하였고, 인스턴스 이름을 입력하고 Create Instance 버튼을 누릅시다. 이제, 생성한 인스턴스에 ssh 로 접속하여 아래의 과정을 수행합시다.

Gitea 설치하기

바이너리로 Gitea 설치하기

Gitea 는 바이너리를 설치하는 방법, 패키지 관리자를 이용해 설치하는 방법, 소스코드를 직접 컴파일하여 설치하는 방법을 제공합니다. 이번 포스팅에서는 Gitea 홈페이지에서 제공하는 바이너리를 이용해 설치해 보겠습니다.

https://docs.gitea.com/installation/install-from-binary
저자 객체는 여기 있는 내용을 블로그에 옮긴 것임을 밝힙니다.

만약 글이 거지 같거나, 공신력이 부족하다고 느낀다면 이 공식 문서를 확인해 설치해 보세요.

먼저, 작업을 하기 위한 linux 사용자와 디렉토리를 만들겠습니다. 아래의 명령어를 입력하세요.

adduser \
   --system \
   --shell /bin/bash \
   --gecos 'Git Version Control' \
   --group \
   --disabled-password \
   --home /home/git \
   git
   
# 결과 ...
# Adding system user `git' (UID 115) ...
# Adding new group `git' (GID 122) ...
# Adding new user `git' (UID 115) with group `git' ...
# Creating home directory `/home/git' ...

필요한 디렉토리도 만들어야 합니다.

sudo mkdir -p /var/lib/gitea/{custom,data,log}
sudo chown -R git:git /var/lib/gitea/
sudo chmod -R 750 /var/lib/gitea/
sudo mkdir /etc/gitea
sudo chown root:git /etc/gitea
sudo chmod 770 /etc/gitea

이제, 다운로드 페이지 로 이동합니다. 글을 쓰는 현 시점, 최신 버전은 아래와 같네요.

최신 버전은 1.22.1 입니다. 해당 버전을 클릭해 들어갑니다.

뭐가 되게 많아 보이지만, 상여자 상남자는 그런 것에 쫄지 않습니다. LightSail 인스턴스에서 아래의 명령어를 입력합니다.

dpkg -s libc6 | grep Arch

# Architecture: amd64
# Multi-Arch: same

아키텍쳐가 amd64 라고 하네요. 위에서 linux-amd64 다운로드 링크를 찾아 복사합니다. 친절한 저자 객체는 아래와 같이 링크를 남겨 두겠습니다.

https://dl.gitea.com/gitea/1.22.1/gitea-1.22.1-linux-amd64

그리고, 아래의 명령어를 입력합니다.

wget -O gitea https://dl.gitea.com/gitea/1.22.1/gitea-1.22.1-linux-amd64

chmod +x gitea

홈 디렉토리에서 위의 명령어를 입력했으면, ls ~/ 를 입력했을 때 아래의 결과가 보일 겁니다.

ls ~/

# gitea

다운로드 받은 gitea 를 옮겨줍니다.

sudo mv gitea /usr/local/bin/gitea

이제, 이것을 리눅스 시스템으로 등록하여 장애 및 재부팅 시에 자동 시작되도록 합시다. sudo vim /etc/systemd/system/gitea.service 를 입력하여, 아래의 내용을 가지는 파일을 만듭니다.

[Unit]
Description=Gitea (Git with a cup of tea)
After=network.target

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target

그리고 아래의 명령어를 입력해서, 시스템을 활성화하고 상태를 확인합니다.

sudo systemctl daemon-reload
sudo systemctl enable gitea.service
sudo systemctl start gitea.service
sudo systemctl status gitea.service


# 결과 ...
 gitea.service - Gitea (Git with a cup of tea)
     Loaded: loaded (/etc/systemd/system/gitea.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2024-07-07 10:44:14 UTC; 9min ago
   Main PID: 4668 (gitea)
      Tasks: 8 (limit: 516)
     Memory: 84.6M
        CPU: 771ms
     CGroup: /system.slice/gitea.service
             └─4668 /usr/local/bin/gitea web --config /etc/gitea/app.ini

위와 같이, Active: active 상태가 뜨면 성공입니다.

LightSail 은 기본적으로 HTTP 80 포트, SSH 22 포트만 열려 있습니다. 방화벽에서 추가로 3000번 포트를 열어줍니다.

열어준 후, http://{ip주소}:3000/ 에 접근하면, 초기 화면이 보여집니다!

하지만 지금은 3000번 포트와 함께 http 프로토콜로만 동작합니다. 제가 하고 싶은 것은, 회사의 도메인과 함께 https 로 접속하는 것입니다. 아직 아무런 작업도 하지 않고, 다음 단계로 넘어갑시다.

Nginx 와 함께 도메인 연결하기

이 시점에서, 저자 객체는 독자 객체들이 모두 도메인을 준비한 것으로 가정합니다. 아래는 도메인을 구입하고, 해당 도메인의 서브도메인과 Nginx 프록시를 수행하는 방법을 배웁니다. 아래의 내용이 필요하지 않다면, 거침없이 뒤로가기 버튼을 누르시거나 컴퓨터를 던지셔도 됩니다.

아래의 명령어를 입력해, nginx 웹 서버를 설치합니다.

sudo apt update
sudo apt install nginx

설치되었다면, 아이피 주소를 브라우저에 입력했을 때에 아래와 같은 화면이 보여져야 합니다.

이제, 도메인 연결을 위해서 아래와 같이 Route53 에서 서브도메인을 추가합니다. 저는 gitea.회사도메인.com 으로 서브 도메인을 생성하겠습니다.

아래의 “값” 은 여러분 서버의 ip 주소로 채워주세요.

시간이 조금 지난 후, 위처럼 서브도메인을 입력하면 nginx 서버가 여러분을 반겨 줄 겁니다.

이제 80번 포트로 들어간 요청을, 인스턴스 내부의 3000번 포트로 연결해주면 됩니다. 아래의 명령어를 입력하여, 새로운 nginx 설정 파일을 만듭니다.

sudo vim /etc/nginx/sites-available/여러분_도메인

# 저의 경우, sudo vim /etc/nginx/sites-available/gitea.reawork.com
server {
    listen 80;
    server_name gitea.여러분_도메인.com

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
 

내용은 위와 같이 작성해주면 됩니다.

sudo ln -s /etc/nginx/sites-available/gitea.reawork.com /etc/nginx/sites-enabled/gitea.reawork.com

이제, 위의 명령어를 입력해 심볼릭 링크를 만듭니다. 이후, sudo systemctl restart nginx 를 터미널에 입력해 웹 서버를 재시작한 후, 도메인으로 들어가 보세요, 아래와 같이 잘 연결이 되었을 겁니다.

중요한 것은, 여기서 위의 서버 도메인을 설정 후 저장을 해 주어야 합니다. 위에서 필요한 과정을 수행한 후, Gitea 설치하기 버튼을 눌러 Gitea 를 설치해 주세요.

HTTPS 적용하기

인증서 발급을 위해, 우리는 Let's Encrypt 를 사용하겠습니다. 아래의 명령어를 입력해 필요한 certbot 을 설치합니다.

sudo apt install certbot python3-certbot-nginx

그리고, 아래의 명령어를 입력해 certbot 을 세팅합니다. 명령어를 입력하면 이메일 주소 등을 입력해 주시면 됩니다.

sudo certbot --nginx -d 서브.여러분_도메인.com

이런 화면이 나온다면, 성공한 것입니다!

이제, 라이트세일의 HTTPS 포트를 허용합니다. 우리는 더 이상 3000번 포트로 들어가지 않을 것이기 때문에, 3000번 포트에 대한 규칙은 삭제해 주면 됩니다.

그러면, 이렇게 우리가 원했던 서브 도메인과 함께 HTTPS 를 사용해 우리만의 private git 저장소에 접근할 수 있습니다.

관리자 계정 세팅하기

LightSail 인스턴스에 접속해, 아래의 명령어를 입력합니다.

sudo -u git gitea --config /etc/gitea/app.ini admin user create --username 님들이_원하는_유저네임 --password 님들이_원하는_비밀번호 --email 님들이_원하는_이메일 --admin

# New user '님들이_원하는_유저네임' has been successfully created!

이후, 만들어진 계정으로 로그인을 수행할 수 있습니다.

이제 git 저장소를 만들었으니, 리포지토리를 하나 만들어봅시다.

Gitea 와 로컬 Git 저장소 연동하기

명색이 “사내용 Git 저장소” 인데 저장소 한 번은 만들어 봐야죠. 우측 상단의 “새 저장소” 를 클릭합니다.

몇 가지 설정을 하고, “저장소 만들기” 버튼을 클릭합니다.

여기서부턴 익숙하지요? 로컬 환경 에서 아래의 명령어를 입력해 봅시다.

mkdir Behold-My-First-Repository-Has-Come
cd Behold-My-First-Repository-Has-Come

git init
git checkout -b main
git add README.md
git commit -m "first commit"
git remote add origin https://gitea.reawork.com/tgoddessana/Behold-My-First-Repository-Has-Come.git
git push -u origin main

gitea 의 username 과 password 를 입력하면, push 완료입니다!

요약

이렇게, 사내용 Git 저장소를 만들었습니다. 사실, 위는 기본적인 세팅일 뿐이고 더더욱 해야 할 작업은 남아 있습니다. 예컨대, 지금 gitea 웹 사이트는 사용자들에게 모두 공개되어 있으므로 회원가입을 막는 등의 작업을 해야 하죠.

당분간은 만들어둔 gitea 저장소에서 작업을 하며, 장단점을 파악해 볼 계획입니다. 가장 걱정했던 서버 사양을 중심으로 모니터링해 볼 예정인데, 관리자 페이지에서는 아래와 같이 RAM 사용량도 보여주네요.

별 것 아니지만 새로운 인프라를 구축하고, 또 그 때문에 생기는 문제들과 싸워갈 생각에 설렙니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.