FreeBSD + fcgiwrap + cgit로 Git 웹 프런트엔드와 Git 서버 구축하기
안녕하세요, 무능입니다.
얼마 전까지 GItea로 구축했었는데, 너무 리치해서 불필요한 서버 리소스를 차지하는 점을 개선하고 싶었습니다.
또한, 기본 저장소 생성도 가능한 한 CLI에서 하고 싶었고, GitHub에는 gh 명령어도 있지만 이러한 플랫폼 의존적인 명령어를 개인적으로 채택하고 싶지 않아 도입하지 않았습니다.
그 이유는 플랫폼 의존적인 바이너리는 저수준 학습에 큰 도움이 되지 않기 때문입니다.
그래서 별도로 git의 웹 프런트엔드로 cgit을 채택하고 git은 SSH를 통해 원격지에 보관함으로써 원하는 대로 구축할 수 있었습니다.
git을 푸시할 수 있도록 하기
즉, 베어 저장소를 Git 서버 측에 생성하고 그곳으로 push할 수 있으면 됩니다.
이미 SSH로 원격지, 이번에는 Git 서버 측으로 SSH 접속이 가능하다고 가정합니다.
git 사용자 생성
FreeBSD의 경우 "adduser" 명령어로 대화식으로 생성이 가능합니다.
adduser
여기서 생성하는 git 사용자에게 전환한 후, .ssh/authorized_keys에 클라이언트 측의 공개 키를 추가합니다.
su - git
mkdir .ssh
chmod 700 .ssh
vim .ssh/authorized_keys
# 또는
echo "클라이언트 측의 공개 키" > ".ssh/authorized_keys"
chmod 600 .ssh/authorized_keys
이것으로 ssh 접속이 가능한지 확인합니다.
추가로, 이 git 사용자의 홈 디렉토리 아래에 저장소를 보관할 디렉토리를 생성합니다.
mkdir repos
그리고 git config로 기본 사용 브랜치를 설정해 둡니다.
git config --global init.defaultBranch main
클라이언트 측에서 서버 측으로 저장소를 생성할 수 있도록 하기
이대로라면 매번 git 서버 측에 로그인하여 저장소를 생성하고 클라이언트 측에서 git push를 해야 하는데 너무 번거로우므로 클라이언트 측에서 일련의 작업을 수행할 수 있도록 합니다.
아래 내용을 .bashrc에 추가했습니다.
mkr() {
ssh git@bsd "git init --bare repos/$1.git"
ssh git@bsd "cd repos/$1.git; git branch -m main"
echo "remote add origin git@bsd:~/repos/$1.git"
}
이것으로 인수로 주어진 저장소 이름으로 클라이언트 측에서 저장소를 생성할 수 있게 되었습니다.
마지막으로 원격 URL을 실행하는 명령어를 표준 출력시킴으로써 쉽게 원격 URL을 설정할 수 있습니다.
cgit 설치
cgit을 사용하려면 cgi가 필요하므로 필요한 패키지를 설치합니다. 이미 Nginx는 설치되어 있다고 가정합니다.
pkg install cgit fcgiwrap
Nginx가 UNIX 소켓을 통해 www:www 사용자 및 그룹 권한으로 접근할 수 있도록 하고, 서비스를 활성화해야 합니다.
sysrc fcgiwrap_enable=YES
sysrc fcgiwrap_user=www
sysrc fcgiwrap_group=www
sysrc fcgiwrap_socket_owner=www
sysrc fcgiwrap_socket_group=www
service fcgiwrap start
cgit 설정
cgit 설정을 해야 합니다.
이번에는 기본 설정과 약간 다르게 커스터마이징했으므로 다음과 같습니다.
$ cat /usr/local/etc/cgitrc
root-title=Git
root-desc=public repositories
virtual-root=/
scan-path=/home/git/repos/
css=/style.css
logo=/top.png
head-include=/usr/local/www/cgit/head.html
readme=:README.md
readme=:README.rst
enable-commit-graph=1
배포할 파일들은 패키지 설치 시점에 /usr/local/www/cgit/ 아래에 생성되어 있었습니다.
Nginx 설정
자, 이제 Nginx입니다.
server {
if ($host = git.soulminingrig.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name git.soulminingrig.com;
listen 80;
}
server {
server_name git.soulminingrig.com;
listen 443 ssl;
root /usr/local/www/cgit;
location / {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/www/cgit/cgit.cgi;
fastcgi_param PATH_INFO $uri;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap.sock;
}
location ~* \.(css|png|ico)$ {
root /usr/local/www/cgit;
}
ssl_certificate /usr/local/etc/letsencrypt/live/git.soulminingrig.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /usr/local/etc/letsencrypt/live/git.soulminingrig.com/privkey.pem; # managed by Certbot
}
위 conf 파일 생성 후, nginx -t로 구문 검사 후에 재시작합니다.
nginx -t
service nginx restart
참고로 이미 인증서는 certbot으로 취득했습니다.
certbot --nginx -d git.soulminingrig.com
이것으로 접근할 수 있게 되었습니다.
마치며
이것으로 매우 가볍게 Git 웹 프런트엔드를 구축할 수 있었습니다.
매우 적은 리소스로 구축할 수 있어서 상당히 만족하고 있습니다.
그럼 다음에 또 뵙겠습니다. 잘 부탁드립니다.