우분투 Git 서버 구축


우분투 Git 서버 구축
우분투 서버 환경에서 Git Server를 구축하는 방법에 대해 설명드립니다. Git Repository 만들고 사용자를 생성하여, HTTP(S) 또는 SSH 를 통해서 소스코드를 관리 할 수 있도록 환경을 설정해 보도록 하겠습니다.

Git 패키지 설치

우분투 18.04 서버 환경을 기준으로 설명드리지만, 다른 환경에서도 크게 차이는 없습니다. 먼저 아래의 명령어로 Git 서버 구축에 필요한 패키지를 설치해 주시기 바랍니다.

$ sudo apt install git

Git Repository 만들기

이글에서는 /data/git 디렉터리에 Git Repository 파일들이 저장되도록 설정하도록 하겠습니다. /data/git 디렉터리를 만들어주시고, 테스트 목적으로 /data/git/test.git 이라는 Repository 를 만들도록 하겠습니다.

$ mkdir -p /data/git
$ git init --bare --shared /data/git/test.git
Initialized empty shared Git repository in /data/git/test.git/

위의 명령어로 간단히 Repository를 생성할 수 있습니다. 서버 내에서만 사용할 경우 다음명령어로 소스코드를 복사 하실 수 있습니다.

$ git clone /data/git/test.git

Git 서버 구축 (SSH)

SSH 를 이용하여 서버에 접속 할 수 있는 환경이면 다음 명령어로 소스코드를 다운 받으 실수 있으며, commit, push 등을 함께 사용하실 수 있습니다.
ubuntu 계정명으로 git.hiseon.me 라는 서버의 소스코드를 git 명령어로 다운 받기 위해서는 아래의 명령어로 다운 받으 실 수 있습니다.

$ git clone ubuntu@git.hiseon.me:/data/git/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.

SSH 프로토콜을 이용하기 떄문에 서버에 접속 할 수 있는 사용자 권한이 필요합니다. 매번 패스워드를 입력하지 않고 키 값을 저장하여 사용하기 위해서는 아래의 글 내용을 참고해 주시기 바랍니다.

ssh 자동 로그인 인증 설정

Git 서버 구축 (웹)

HTTP 또는 HTTPS를 이용하여 Git 서버에 접속 할 수 있도록 설정하는 방법을 함께 알려드립니다.

다음 명령어를 이용하여 웹 서버등의 환경 구축에 필요한 패키지를 설치해 주시기 바랍니다.

$ sudo apt install gitweb apache2 libapache2-mod-fcgid libcgi-session-perl

그리고 다음 명령어를 이용하여 필요한 모듈들을 활성화하고, 아파치 데몬을 재실행합니다.

$ sudo a2enmod env alias fcgid
$ sudo service apache2 restart

그리고 웹 서버로 실행 중인 계정으로 Git Repository 파일들을 수정할 수 있도록 권한을 부여합니다. 이글에서는 간단히 소유권과 그룹을 변경하도록 하겠습니다.

$ sudo chown www-data:www-data /data/git/test.git -R

gitweb 설정
gitweb은 웹 인터페이스를 이용하여 Git의 push, clone 등의 명령어를 처리할 수 있는 패키지입니다. /etc/gitweb.conf 파일의 내용을 아래와 같이 수정합니다.

$projectroot = "/data/git";
$git_temp = "/tmp";
$projects_list = $projectroot;

사용자 계정 설정
다음 명령어를 이용하여 Git Repository를 사용할 수 있는 사용자 계정을 생성합니다.

$ htpasswd -c /data/git/.htpasswd user1
New password: 
Re-type new password: 
Adding password for user user1

첫 사용자를 등록할 때에는 사용자 정보가 저장되는 파일이 없기 때문에 -c 옵션을 추가하여 신규로 생성합니다. 하지만 아래처럼 기존 파일에 추가할 경우에는 -c 옵션을 생략하여 사용자를 추가해 주시기 바랍니다.

$ htpasswd /data/git/.htpasswd user2
New password: 
Re-type new password: 
Adding password for user user2

Apache 설정
위에서 생성한 사용자 정보 파일과 gitweb 등을 이용하여 아래와 같이 아파치 설정 파일을 생성합니다. 환경에 맞게 수정해 주셔야하는 내용은 서버의 이름인 ServerName 값과 Git Repository 디렉토리를 지정해 주는 GIT_PROJECT_ROOT 값 등이 될 수 있습니다. HTTPS 를 함께 적용 하실 수도 있는데 이와 관련해서는 다음 글을 참고해 주시기 바랍니다.

SSL인증서를 Apache 서버에 설정하는 방법

<VirtualHost *:80>
	ServerName  git.hiseon.me
	DocumentRoot /usr/share/gitweb

    <Directory /usr/share/gitweb>
        Options +FollowSymLinks +ExecCGI
        AddHandler cgi-script .cgi
        DirectoryIndex gitweb.cgi
    </Directory>

    ScriptAliasMatch "(?x)^/(.*/(HEAD | \
        info/refs | \
        objects/(info/[^/]+ | \
                [0-9a-f]{2}/[0-9a-f]{38} | \
                pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
        git-(upload|receive)-pack))$" /usr/lib/git-core/git-http-backend/$1

    SetEnv GIT_PROJECT_ROOT /data/git
    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER

    <Location />
	AllowOverride All
	Options All 

	AuthType Basic
	AuthName "Restricted Content"
	AuthUserFile /data/git/.htpasswd
	Require valid-user
    </Location>
</VirtualHost>

그리고 다음의 추가 아피치 모듈을 활성화합니다.

$ sudo a2enmod cgi

만약 cgi 모듈을 활성화 하는 과정에서 Your MPM seems to be threaded. Selecting cgid instead of cgi 라는 오류가 발생했을 경우 다음과 같이 모듈을 설정합니다. 그리고 다시 cgi 모듈을 활성화 합니다.

$ sudo a2dismod mpm_event
$ sudo a2enmod mpm_prefork

$ sudo a2enmod cgi
Enabling module cgi.
To activate the new configuration, you need to run:
  service apache2 restart

그리고 마지막으로 다음 명령어로 Apache 데몬을 재실행 합니다.

$ sudo service apache2 restart

테스트

테스트는 SSH 으로 할수도 있지만, HTTP(S)를 기반으로 테스트 하여 자동으로 로그인 하는 방법까지 추가적으로 설명드리도록 하겠습니다.
위에서는 git.hiseon.me 도메인으로 설정하였기에 다음 명령어로 소스코드를 다운 받고 commit, push 까지 하실 수 있습니다.

$ git clone http://git.hiseon.me/test.git && cd test
Cloning into 'test'...
Username for 'http://git.hiseon.me': user1
Password for 'http://user1@git.hiseon.me': 
warning: You appear to have cloned an empty repository.

$ touch README.txt
$ git add README.txt 

$ git commit -m "first commit"
[master (root-commit) 92521c4] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.txt

$ git push origin master
Username for 'http://git.hiseon.me': user1
Password for 'http://user1@git.hiseon.me': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes | 213.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://git.hiseon.me/test.git
 * [new branch]      master -> master

소스코드를 다운 받고 push 하는 과정에서 사용자 정보를 묻습니다. 자동으로 로그인되도록 하기 위해서는 ~/.netrc 라는 파일을 생성하여 다음과 같은 내용을 작성하면 됩니다.

machine git.hiseon.me
login 사용자명
password 패스워드
본문 내용 인용시에는 출처를 밝혀 주시기 바랍니다.