«

ubuntu에 GitLab 설치하여 git 호스팅 서비스 구축하기 (ubuntu + gitlab + RVM + Apache + Passenger)

서론

이제 연구소와 개발팀에서 git는 없어서는 안되는 매우 중요한 버전관리 시스템으로 자리잡고 있다. github나 google code 에서 git 호스팅 서비스를 이용하면 되지만 무료로 사용할 경우 저장소(repository)의 공간이 적을 뿐만 아니라 private repository 운영을 하지 못한다는 제한이 있다. 그래서 연구소에서 연구원들에게 git 호스팅 서비스를 할 수 있도록 자체적으로 git 서버를 구축하였다. 올해 초부터 꾸준히 gitorious.org에서 배포하고 있는 오픈소스로 gitorious를 기반 git 호스팅 서비스를 구축하였는데, 커뮤니티가 좀 더 활발하고 국내 유저들이 많은 gitlab 기반으로 git 서버를 이전하기로 결심을 했다.

gitorious와 마찬가지로 gitlab은 Ruby on Rails 기반으로 만들어진 것이라 서버측 프로그램을 루비 기반으로 많이 사용하고 있는 연구소의 시스템에 무리 없이 설치가 가능할것 이라고 판단했다. 참고로 gitorious는 마찬가지로 Ruby on Rails 기반이지만 gitlab 보다 설치가 좀 까다로운 편이라고 생각하면된다. gitlab 공식 wiki install에서는 ruby 1.9.2를 시스템에 교체 설치하고 nginx로 서버를 설정하는 문서로 되어 있다. 하지만 우리가 사용하는 시스템은 이미 여러버전의 Ruby 프로그램이 운영되고 있고 RVM을 사용하고 있고 RoR 서비스를 Passenger 기반으로 서비스하고 있기 때문에 RVM과 Apache2 + Passenger 로 설정하는 방법을 소개하기로 한다.

GitLab 요구사항

기본적으로 gitlab을 설치하기 위한 요구사항은 다음과 같다.

설치순서는 gitlabhq 의 wiki 중에서 install for stable version(recommended) 를 그대로 진행하도록 한다. 이 포스팅에서는 변경된 몇가지 변경되어 있기 때문에 원래 설치 메뉴을 문서를 반드시 확인하길 바란다.

우선 ubuntu에서 sudo 권한을 가진 사용자만 root 권한으로 시스템 전체적으로 파일을 생성하거나 관련된 작업을 할 수 있다. 편의상 완전히 root로 변경해서 작업을 해보자.

sudo -i

Install Packages

gitlab을 설치하기 이전에 시스템 라이브러리 패지지를 업데이트하고 업그레이드 한다.

apt-get update && upgrade

다음은 gitlab에서 필요로 하는 패키지를 설치한다.

apt-get install -y wget curl gcc checkinstall libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline6-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev libicu-dev redis-server openssh-server git-core python-dev python-pip libyaml-dev postfix

혹시 MySQL이 설치되지 않았다면 MySQL 패키지를 설치한다.

apt-get install -y mysql-server mysql-client libmysqlclient-dev

git 계정 생성

git 계정은 gitolite를 이용해서 사용자들의 코드들을 git repository에 저장하고 gitlab에 접근할 수 있는 계정으로 일반 시스템 계정과 달리 로그인을 하지 않는 계정이다. root의 경우 su - 명령어를 이용해서 이 계정으로 변환이 가능하다.

adduser \  
--system \  
--shell /bin/sh \  
--gecos 'git version control' \  
--group \  
--disabled-password \  
--home /home/git \  
git

gitlab 계정 생성

gitlab 계정은 gitlab 서비스를 관리하는 계정으로 RoR로 되어 있는 gitlab을 관리하기 위한 계정이다. 그리고 git 그룹에 이 계정을 포함 시킨다.

adduser --disabled-login --gecos 'gitlab system' gitlab
usermod -a -G git gitlab

ssh key 생성

git는 ssh의 public key로 동작하기 때문에 ssh key를 생성한다.

sudo -H -u gitlab ssh-keygen -q -N '' -t rsa -f /home/gitlab/.ssh/id_rsa

gitolite 소스 복제

gitlab은 gitolite를 이용해서 호스팅 서비스를 하기 때문에 gitolite 를 git를 이용해서 git 계정 디렉토리에 복제한다.

cd /home/git && sudo -H -u git git clone git://github.com/gitlabhq/gitolite /home/git/gitolite

환경설정

git 계정의 홈 디렉토리에 있는 .profile을 파일을 열어서 다음 코드를 추가하고 저장한다. 존재하지 않을 경우 저장하고 파일을 닫는다.

sudo -u git -H vi .profile
PATH=$PATH:/home/git/bin
export PATH

git 계정의 디렉토리에 복제해 놓은 gitolite의 gl-system-install 명령어를 실행한다

sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; /home/git/gitolite/src/gl-system-install"

gitlab에서 사용할 ssh key 를 복사한다.

sudo cp /home/gitlab/.ssh/id_rsa.pub /home/git/gitlab.pub && sudo chmod 0444 /home/git/gitlab.pub

gitolite의 설정을 변경한다. 그리고 g-setup -q 를 이용해서 ssh key 사용해서 gitolite를 설정한다.

sudo -u git -H sed -i 's/0077/0007/g' /home/git/share/gitolite/conf/example.gitolite.rc
sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gl-setup -q /home/git/gitlab.pub"

git를 이용해서 관리할 repository리 저장될 디렉토리의 권한을 설정한다.

sudo chmod -R g+rwX /home/git/repositories/
sudo chown -R git:git /home/git/repositories/

이제 다음 명령어로 gitolite를 이용해서 코드를 복제할 수 있는지 테스트를 해본다.

sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin

지금까지의 설정이 바르게 되었다면 다음과 같이 출력 될 것이다.

gitlab 설치

이제 git 호스팅 서비스를 하기 위해서 gitlab을 설치해보자. gitlab 계정으로 변형하여 진행하겠다.

su - gitlab

이 포스팅에서는 RVM을 이용해서 gitlab을 운영하기 때문에 RVM으로 Ruby 버전을 변경하고 실행한다.

rvm 1.9.2-head

gitlab에 필요한 패키지를 gem을 이용해서 설치한다.

gem install charlock_holmes --version '0.6.8'
pip install pygments
gem install bundler

다음은 gitlab 소스를 복제하고 필요한 tmp 디렉토리와 gitalb.yml을 샘플에서 복사를 한다.

git clone -b stable git://github.com/gitlabhq/gitlabhq.git gitlab
cd gitlab && mkdir tmp
cp config/gitlab.yml.example config/gitlab.yml

gitlab에서 사용할 데이터베이스 설정 파일을 복사한다.

cp config/database.yml.mysql config/database.yml
cp config/database.yml.example config/database.yml

mysql에 들어가서 gitlab에 필요한 데이터베이스와 계정을 만든다. 데이터베이스 이름은 gitlabhq_production 으로 만든다.

mysql -u root -p
CREATE USER 'gitlab'@'localhost' IDENTIFIED BY '비밀번호';
CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';

그리고 database.yml을 열어서 설정한 것에 맞게 수정을 한다.

#
# PRODUCTION
#
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: gitlabhq_production
  pool: 5
  username: gitlab
  password: 비밀번호
  # socket: /tmp/mysql.sock


#
# Development specific
#
#
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: gitlabhq_development
  pool: 5
  username: gitlab
  password: 비밀번호
  # socket: /tmp/mysql.sock

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test: &test
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: gitlabhq_test
  pool: 5
  username: gitlab
  password: 비밀번호
  # socket: /tmp/mysql.sock

cucumber:
  <<:

gitlab에 필요한 gems 을 이용해서 설정되어진 패키지를 설치한다.

bundle install --without development test --deployment

gems 설치가 마치면 gitlab 어플리케이션에 필요한 셋업을 진행한다. 이 때 필요한 테이블들이 생성된다.

bundle exec rake gitlab:app:setup RAILS_ENV=production

마지막으로 gitlab이 hook 할 수 있는 설정을 한다.

cp /home/gitlab/gitlab/lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive
chown git:git /home/git/share/gitolite/hooks/common/post-receive

Passenger 설치

Passenger는 Apache에서 RoR 어플리케이션을 운영하게 해주는 모듈이다. 만약 Passenger가 설치되어 있지 않으면 passenger를 먼저 설치한다.

rvm 1.9.2-head
gem install passenger
rvmsudo passenger-install-apache2-module

passegner 모듈 설치과 완료되면 apache2 모듈에 추가를 한다. 아래 내용을 passenger.load 파일에 저장한다.

vi /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /usr/local/rvm/gems/ruby-1.9.2-head/gems/passenger-3.0.15/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.2-head/gems/passenger-3.0.15
PassengerRuby /usr/local/rvm/wrappers/ruby-1.9.2-head/ruby

추가한 모듈을 apache에 추가한다

a2enmod passenger

Apache Vhost 설정

이제 마지막으로 apache의 vhost를 설정한다. 예제 도메인 이름으로 gitlab.saltfactory.net으로 하겠다.

vi /etc/apache2/sites-available/gitlab.saltfactory.net
<VirtualHost *:80>
    <Directory /home/gitlab/gitlab/public>
        AllowOverride All
        Options -MultiViews
    </Directory>

	RackBaseURI /
	RackEnv production

    DocumentRoot /home/gitlab/gitlab/public
    ServerName gitlab.saltfactory.net

	LogLevel warn
	ErrorLog ${APACHE_LOG_DIR}/gitlab.saltfactory.net-error.log
	CustomLog ${APACHE_LOG_DIR}/gitlab.saltfactory.net-access.log combined

    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css application/x-javascript
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

    # Far future expires date
    <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
        ExpiresActive On
        ExpiresDefault "access plus 1 year"
    </FilesMatch>

    # No Etags
    FileETag None

    RewriteEngine On

    # Check for maintenance file and redirect all requests
    RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
    RewriteCond %{SCRIPT_FILENAME} !maintenance.html
    RewriteRule ^.*$ /system/maintenance.html [L]
</VirtualHost>

apache vhost 설정을 마치고나면 apache2에 설정한 vhost 정보를 추가한다.

a2ensite gitlab.saltfactory.net

이제 apache2를 재시작하면 gitlab.saltfactory.net(예제 도메인으로 실제 도메인으로 접근해보길 바란다.) 으로 접근하면 gitlab 을 사용할 수 있게 된다.

참고

  1. https://github.com/gitlabhq/gitlabhq/blob/stable/doc/installation.md