문서를 작성할 무렵에는 CentOS 용 gitlab 설치 패키지가 없었으나 현재는 gitlab 에서 공식 제공하고 있으니 패키지로 설치하는 방법도 고려해 볼 만하다. 바이너리 설치는 RHEL/CentOS 6 에 gitlab 바이너리 설치를 참고하자.

 

개요

giblab 은 ruby on rail framework 기반으로 개발된 github 와 비슷한 Web Base git repository management system이다.

github 와 달리 community edition이 있고 라이선스는 MIT이므로 기업내에서 상업적 용도로 사용가능하다.

github Enterprise 가 고가라 사기 버거운 스타트업이나 소규모 기업에서 좋은 솔루션이 될 수 있다.

gitlab 아키텍처

gitlab 구성

    |-- home

        | |-- git
              | |-- .ssh
              | |-- gitlab
              | |-- gitlab-satellites
              | |-- gitlab-shell
              | |-- repositories

  • .ssh - openssh 가 사용하는 개인키와 공개키, 그리고 신뢰하는 호스트의 공개키 목록이 담긴 authorized_keys 이 있는 디렉터리이다. authorized_keys  은 gitlab-shell 이 사용한다.
  • gitlab - gitlab 의 핵심 소프트웨어가 존재한다.
  • gitlab-satellites - Web UI 에서 파일 편집과 Merge request 처리를 위해 저장소를 체크아웃한다. 작업은 임시 파일 디렉터리에서 이루어 진다.
  • gitlab-shell - gitlab 의 핵심 컴포넌트로 SSH 기반의 git 복제와 다른 git 명령어를 처리한다.
  • repositories - 네임스페이스로 구조화된 실제 git 저장소가 존재하는 디렉터리이다. 저장소에 push/pull 이 발생할때 이 디렉터리에서 이루어 진다. git의 모든 이력을 담고 있는 가장 민감한 데이타이므로 반드시 백업해야 한다.

 

 

환경

github에 있는 설치 문서와 다르게 DB는 MySQL만 사용하고 Web Server는 apache httpd 만 사용하게 문서 수정함

OSCentOS 6.x 
ruby2.0.0p451 
gitlab6.7-stable 
gitlab-shell1.9.4 
DBMSMySQL 5.1 
Web Serverapache httpd 2.2.15(CentOS 내장) 

 

사전 준비 사항

Red Hat Enterprise Linux 6 / CentOS 6 이 설치되어 있어야 한다.

EPEL repository 등록

fedora 의 repository 인 EPEL 이 등록되어 있어야 한다. 다음 명령어로 등록하자.

sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

 자세한 내용은 RHEL/CentOS 5,6 에 EPEL 과 Remi/WebTatic Repository 설치하기 을 참고

Git 1.8

 git 1.8 이 필요하나 CentOS6 에는 1.7 이 탑재되어 있다. 다음 명령어로 1.7 이 설치되었다면 삭제하고 1.8을 설치하자.

yum -y remove git
wget http://springdale.math.ias.edu/data/puias/computational/6/x86_64/git-1.8.3.1-1.sdl6.x86_64.rpm
wget http://springdale.math.ias.edu/data/puias/computational/6/x86_64/perl-Git-1.8.3.1-1.sdl6.noarch.rpm
yum localinstall git-*.rpm perl-Git-*.noarch.rpm

 

설치

필요 패키지 설치

  1. gitlab 을 설치하는 데 필요한 컴파일러와 라이브러리를 설치한다. 먼저 시스템을 업데이트 하자.

    yum -y update

     

  2. 컴파일러와 링커등의 개발 패키지 그룹을 설치한다.

    yum -y groupinstall 'Development Tools'

     

  3. redis와 에디터, compile 에 필요한 library 를 설치한다.

    yum -y install vim-enhanced readline readline-devel ncurses-devel gdbm-devel glibc-devel tcl-devel openssl-devel curl-devel expat-devel db4-devel byacc sqlite-devel gcc-c++ libyaml libyaml-devel libffi libffi-devel libxml2 libxml2-devel libxslt libxslt-devel libicu libicu-devel system-config-firewall-tui redis sudo crontabs logwatch logrotate perl-Time-HiRes patch

Configure redis

Key/Value store 인 redis 를 설정해야 한다. OS 부팅시 redis 도 구동되게 run level 을 조정한다.

chkconfig redis on
service redis restart

Mail server 설치

gitlab 사용시 이메일로 공지를 받으려면 메일 서버를 설치해야 한다. RHEL 6 부터는 postfix 가 기본 smtp 서버이다

yum -y install postfix

Ruby 설치

gitlab 은 ruby on rails 프레임웍 기반이므로 ruby 는 가장 중요한 요소중 하나이다. .CentOS6 에 기본 탑재된 ruby 는 1.8.x 대이므로 gitlab 을 구동하지 못하므로 삭제해야 한다. gitlab 은 rvm, rbenvchruby 같은 ruby manager 를 권장하지 않는다. gcc 로 ruby 를 소스에서 빌드해서 사용하거나 나 rpm 으로 만든후에 설치할 수 있다. (rpm 설치 추천)

rpm 으로 빌드후 설치

  1. ruby 2.0, 2.1 을 rpmbuild 해서 yum 으로 설치하기 을 참고하여 rpm 을 빌드

 

패키지로 설치

 미리 빌드된 rpm 을 다운받아 설치한다.

wget https://github.com/lesstif/ruby-rpm/releases/download/v0.1/ruby-2.0.0p451-1.el6.x86_64.rpm
yum localinstall ruby*

 

Source 에서 빌드해서 설치

  1. 먼저 기본 탑재된 ruby 가 있다면 삭제한다.

    yum remove ruby
  2. ruby 를 소스에서 빌드한다

    wget http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p451.tar.gz
    tar zxvf ruby-2.0.0-p451.tar.gz
    cd ruby-2.0.0-p451
    CFLAGS=-O ./configure --disable-install-rdoc
    make install
  3. gem 으로 Ruby Dependency Management 인 bundler 설치

    gem install bundler --no-ri --no-rdoc

System User 생성

git 사용자 생성. 서비스 구동용 전용이며 보안때문에 login 은 안 되게 설정한다.

adduser --system --shell /sbin/nologin --comment 'GitLab' --create-home --home-dir /home/git/ git
usermod -s /bin/bash git

ruby 및 기타 유틸이 /usr/loca/bin 에 있으면 PATH 에 추가해야 한다. git 계정은 로그인 불가이므로 /etc/sudoers 파일을 찾아서 secure_path 에 /usr/local/bin 을 추가하자.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

 

gitlab shell

gitlab shell 은 ssh 접근 및 저장소 관리를 하는 유틸리티이다. gitlab 에서 소스를 clone 해서 설치하면 된다.

  1. Go to home directory

    cd /home/git
  2. clone gitlab shell 

    sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-shell.git -b v1.9.4
  3. gitlab shell 설정

    cd gitlab-shell
    sudo -u git -H cp config.yml.example config.yml
  4. 에디터로 config.yml 을 열어서 url을 설정해 준다. gitlab의 API 호출 URL 로 gitlab 기본 설정이 http 로 들어온 경우 https 로 포워딩하므로 https 로 설정하는게 좋다.

    gitlab_url: "https://gitlab.example.com/"

    HTTPS 를 사용할 경우 신뢰하는 인증기관에서 발급받은 SSL 인증서가 아니라면 self_signed_cert : 설정을 true 로 해야 검증 에러가 발생하지 않는다.

  5. gitlab-shell 설치를 진행한다

    sudo -u git -H ruby ./bin/install
  6. 외부에서 git 작업시(clone/push/[ull 등) ssh 를 사용하므로 홈디렉터리의 .ssh 폴더를 ssh 데몬 프로세스가 읽을 수 있게 SELinux context 를 설정한다.

    SELinux context 가 부여되지 않을 경우 ssh 데몬이 /home/git/.ssh 를 읽지 못해서 아래 명령이 실행되지 않을 경우 "'repository/project.git' does not appear to be a git repository" 에러가 발생하게 된다.

    restorecon -Rv /home/git/.ssh

    정상 설정 여부는 ls -lZ /home/git/.ssh 를 실행하여 ssh_home_t 가 보이면 된다.

DataBase 설정

gitlab은 MySQL 과 PostreSQL 을 지원한다.

MySQL 

  1. 먼저 MySQL이 설치되어 있고 구동되어 있어야 한다. 설치되어 있지 않다면 yum 으로 설치해 준다. gitlab 설치중 ruby 용 mysql driver 를 compile 하는 단계가 있으므로 mysql-devel 을 같이 설치해야 한다.

    yum install mysql mysql-server mysql-libs mysql-devel -y
  2. /etc/my.cnf 에 character 을 utf-8로 설정해 주고 재구동한다. (MySQL 기본 캐릭터 셋 설정하기 - RHEL/CentOS 6 참고)

    [mysqld]
    max_allowed_packet     = 32M
    default-character-set=utf8
     
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
  3. MySQL root 로 연결후에 DB 와 계정을 생성한다.

    # Create a user for GitLab. (change supersecret to a real password)
    CREATE USER 'git'@'localhost' IDENTIFIED BY 'supersecret';
    
    # Create the GitLab production database
    CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
    # Grant the GitLab user necessary permissions on the table.
    GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'git'@'localhost';
    
  4. 정상적으로 생성되었는지 확인한다.

    mysql -u git -psupersecret -D gitlabhq_production

GitLab 설치

Source Clone

  1. git home directory 로 이동

    cd /home/git
  2. Clone GitLab repository
    sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 6-7-stable gitlab

 

gitlab 설정

  1. cd /home/git/gitlab
  2. gitlab 의 예제 설정 파일을 복사하여 설정을 수정할 수 있게 준비한다.

    sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml
  3. 이제 선호하는 에디터로 config/gitlab.yml 을 편집하여 환경을 구성할 수 있다. 수정해야할 항목은 많지 않으며 gitlab 이 사용하는 ruby 로 구현된 Unicorn 이라는 웹서버의 포트(기본값 8080)와 이메일 전송시 주소 정도만 수정하면 된다. 유니콘  웹서버의 포트는 특별한 이유가 없다면 기본 설정을 사용하는걸 권장한다. 

    sudo -u git -H vim config/gitlab.yml
    gitlab:
      ## 도메인 명으로 수정 (repository 생성시 git clone URL 에 사용될 주소이니 FQDN 으로 지정해야 한다)
      host: gitlab.exampl.ecom
      port: 443
      https: true
      ## gitlab 이 공지용 이메일을 보낼때 From  에 들어갈 주소
      email_from : gitlab@example.com
      ## true 로 설정하면 사용자가 직접 계정을 등록할 수 있다. 기본값은 false 이며 관리자가 계정을 등록해야 한다.
      signup_enabled: true

    gitlab의 기본 설정이 https 를 사용하게 되어 있으므로 port 는 443, https 는 true 로 설정해야 한다. 이 설정 값은 git 프로젝트를 생성하면 표시하는 워크플로우에도 출력되므로 잘 설정해야 한다.

     

     

  4. gitlab 계정으로 로그와 임시 디렉터리에 쓸 수 있게 권한을 부여한다.

    chown -R git log/ tmp
    chmod -R u+rwX  log/ tmp
  5. satellites 모듈을 위한 디렉터리를 생성한다.

    sudo -u git -H mkdir /home/git/gitlab-satellites
  6. sockets과 pids 기록을 위한 디렉터리를 만들고 gitlab 이 쓸수 있게 권한을 부여한다.

    sudo -u git -H mkdir tmp/{pids,sockets}
    sudo chmod -R u+rwX  tmp/{pids,sockets}
  7. 백업을 위한 public/uploads 디렉터리를 생성한다.

    sudo -u git -H mkdir public/uploads
    sudo chmod -R u+rwX  public/uploads
  8. 유니콘 웹서버 설정을 위해 기본 설정 파일을 복사한다.

    sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb
  9. 선호하는 에디터로 config/unicorn.rb 파일을 편집한다. 수정해야 할 부분은 다음과 같다.

    1. worker_processes 2 -> 기본 worker 는 2 지만 많은 부하가 걸리는 서버라면 3 또는 4로 지정한다. worker 를 3으로 지정시 최소  2GB 이상의 RAM 이 있어야 한다. 4GB 이상일 경우 worker 를 4로 지정한다.

    2. listen "127.0.0.1:8080" -> unicorn 웹서버가 사용할 포트를 지정한다. 8080이 아닌 다른 포트를 사용할 경우 SELinux 설정과 apache httpd(gitlab-ssl.conf) 설정도 같이 변경해야 한다.
  10. Web 을 통한 외부 공격을 막기 위한 프레임워크인 Rack attack 을 설정한다. 

    sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
  11. git user를 위한 git  전역 설정을 한다.

    sudo -u git -H git config --global user.name "GitLab"
    sudo -u git -H git config --global user.email "gitlab@localhost"
    sudo -u git -H git config --global core.autocrlf input

gitlab DB 설정

  1. 설정 파일 복사(MySQL)

    sudo -u git -H cp config/database.yml.mysql config/database.yml
  2. 에디터로 database.yml 을 열어서 DB 명, id, pwd 를 환경에 맞게 편집한다.

 

Install Gems

  1. cd /home/git/gitlab
  2. ruby 용 패키지 의존성 관리자인 bundle 을 설치한다.

     

    gem install bundle
  3. MySQL 일 경우 실행(without postgres)

    sudo -u git -H bundle install --deployment --without development test postgres aws

 

Database 초기화 및 advanced 기능 활성화

다음 명령어 입력후 yes 를 입력하면 database table 이 생성된다.

sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production

정상적으로 완료되면 'Administrator account created:' 메시지와 초기 로그인 id/pwd를 볼 수 있다.

 

Install Init Script

  1. init script 를 다운로드한다. (/etc/init.d/gitlab 으로 저장된다)

    wget -O /etc/init.d/gitlab https://gitlab.com/gitlab-org/gitlab-recipes/raw/master/init/sysvinit/centos/gitlab-unicorn
  2. 실행 속성을 부여하고 부팅시 자동으로 구동되게 run level 을 조정한다.

    chmod +x /etc/init.d/gitlab
    chkconfig --add gitlab
    chkconfig gitlab on

Set up logrotate

gitlab 이 쌓는 로그를 주기적으로 자르기 위해 logrotate 를 설정한다.

cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab

Check Application Status

sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production

Start your GitLab instance:

service gitlab start

Compile assets

asset 을 미리 컴파일하지 않고 gitlab 에 최초 로그인시 asset 컴파일에 시간이 오래 걸려서 timeout exception 이 발생해 로그인이 불가능할 수 있다.

sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production

 

Apache httpd 설정

  1. apache httpd 와 SSL용 모듈인 mod_ssl 을 설치한다.

    yum -y install httpd mod_ssl
    chkconfig httpd on
  2. apache httpd 용 gitlab 설정파일을 다운로드 한다.

    wget -O /etc/httpd/conf.d/gitlab.conf https://gitlab.com/gitlab-org/gitlab-recipes/raw/master/web-server/apache/gitlab-ssl.conf
  3. gitlab 설정 파일은 모든 linux 용이라 RHEL/CentOS 의 표준 디렉터리 구조를 따르지 않으므로 약간의 수정이 필요하다.

    ## log directory
    mkdir /var/log/httpd/logs/
    mkdir /etc/httpd/{ssl.crt,ssl.key}
    ## SSL 설정. 이미 개인키와 인증서가 있다면 그걸 사용하고 없을 경우에만 아래 명령어 실행
    cp /etc/pki/tls/certs/localhost.crt /etc/httpd/ssl.crt/gitlab.example.com.crt
    cp /etc/pki/tls/private/localhost.key /etc/httpd/ssl.key/gitlab.example.com.key
    cp /etc/pki/tls/certs/ca-bundle.crt /etc/httpd/ssl.crt/your-ca.crt
  4. gitlab-ssl.conf 파일내 ServerName 을 웹서버의 FQDN 으로 변경하고 unicorn 이 8080 이 아닌 포트를 사용할 경우 아래처럼 ProxyPass,ProxyPassReverse 를 수정한다.
    gitlab-ssl.conf
    ServerName gitlab.example.com
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  5. 아파치 웹서버를 재구동한다.

    service httpd restart

 

iptable 방화벽 오픈

80, 443 방화벽이 열리지 않았다면 iptable 설정을 변경한다.

lokkit -s http -s https -s ssh
service iptables restart

 

 

SELinux 문제 해결

  1. gitlib 에는 unicorn 이라는 Web 서버가 내장되어 있는데 기본 포트가 8080 임
  2. SELinux 에서 8080 은 http_cache_port_t context 에 할당되어 있고 이 포트는 http_port_t 와 다르므로 apache 가 연결 불가

해결책1(추천)

8080에 할당된 OBJECT RECORD Name 을 http_port_t 로 변경

semanage port -m -t http_port_t -p tcp 8080

 

해결책2

apache httpd 가 모든 네트웍 포트에 연결 가능하도록 sebool 설정 (추천하지 않음)

setsebool -P httpd_can_network_connect 1

해결책3

unicorn 이 사용하는 포트를 변경하고 변경된 포트 번호를 SELinux 의 http_port_t 에 추가

  1. su - gitlab
  2. cd gitlab
  3. vi config/unicorn.rb
    1. listen "127.0.0.1:8080" 을 찾아서 적당한 포트 번호(Ex: 10000 으로 변경)
  4. SELinux context 추가

    semanage port -a  -p tcp -t http_port_t 10000
  5. gitlab.conf 의 포트 수정
    1. vi /etc/httpd/conf.d/gitlab.conf
    2. 8080 을 위에서 변경한 포트(10000 으로 변경)
  6. service httpd restart

최초 로그인 및 동작 확인

웹브라우저로 설정한 사이트에 연결하여 정상 설치 여부를 테스트한다.  로그인 id/pwd 는 다음 값을 사용하고 로그인후 바로 변경하자.

admin@local.host
5iveL!fe

See Also

Ref