Saas 방식의 https://gitlab.com 을 사용하거나 설치형은 도커로 깃랩 설치하는 것을 권장합니다.


gitlab 은 ruby on rails 프레임웍 기반으로 개발된 web 기반 git 어플리케이션이다.

github 와 비슷한 웹 기반의 편리한 UI 를 제공하고 있으며 코드 조각(code snippet) 공유, 자체 이슈 관리 시스템 내장, 위키 시스템을 내장하고 있으므로 gitlab 만으로도 통합 프로젝트 관리를 수행할 수 있을 정도이다.

gitlab 은 최근 버전의 루비 인터프리터와 서드 파티 라이브러리와 어플리케이션을 필요로 하나 RHEL/CentOS 의 패키지 정책은 굉장히  보수적이라 탑재되는 패키지는 오랫동안 안정성이 검증된 버전 위주로 탑재된다.

이때문에 기본 사양의 RHEL/CentOS 로는 gitlab 을 설치할 수 없고 루비를 비롯한  패키지를 외부 yum 저장소를 통해 설치하거나 직접 소스를 빌드해서 설치해야 한다.

이런 작업은 시스템의 안정성을 깨트릴 수 있으므로 몇 가지 원칙을 세워서 주의해서 작업해야 한다.

필자는 다음과 같은 원칙을 세워서 작업을 하였다.

  1. 소스에서 빌드해서 바로 설치하지 않고 rpm 패키지를 만들거나 외부에서 미리 만든 rpm 패키지를 구해서 yum 을 이용하여 설치한다. yum 으로 설치하면 히스토리 관리와 트랜잭션 처리가 가능하므로 시스템을 손쉽게 롤백할 수 있다.
  2. SELinux 를 enforce 모드로 구동되는 환경에서 작업한다. SELinux 는 서비스 데몬이 구동되는 서버에서 가장 중요한 보안 요소중 하나이다. 불편하더라도 SELinux 를 켜 놓은 상태에서 작업해야 실제 운영환경에서도 보안 위협을 줄이고 서비스할 수 있다.


gitlab 은 일반 사용자의 계정으로 설치하여 구동이 가능하며 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의 모든 이력을 담고 있는 가장 민감한 데이타이므로 반드시 백업해야 한다.


사전 작업


 

fedora 저장소 추가

먼저 fedora 리눅스의  EPEL(Extra Packages for Enterprise Linux) 저장소에 필요한 패키지가 있으므로 저장소를 추가해야 한다.

 

ruby 설치

루비 인터프리터를 설치해야 하며 CentOS 에 탑재된 버전은 지원하지 않으므로 외부에서 구해야 한다. 아쉽게도 fedora project 의 저장소인 epel 에서도 최신 버전의 루비는 제공하지 않는다. 출판사의 github 에 RHEL 6 에 빌드한 버전 2.0 루비를 rpm 으로 올려 놓았으니 다운받아서 설치하자.

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

     


git 설치

Git 1.8 이상이 필요하며 전절에서 설치했으므로 건너뛴다.


개발 도구 설치

루비용 DB Adaptor 는 C 언어로 구현된 native library 를 사용하므로 C 컴파일러와 개발용 도구가 필요하다. 

yum -y groupinstall 'Development Tools'

    


라이브러리와 유틸리티 설치 

gitlab 은 key-value store 인 redis 를 사용한다. redis 와 유틸리티, 컴파일에 필요한 라이브러리를 설치하자.

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   

DB, 메일 서버와 Redis 설정

DBMS 와 Email 서버


  1. 프로젝트가 추가되거나 권한 설정이 변경되는 등  이벤트가 발생할 경우 이메일로 통보하기 위해서는 메일 서버가 설치되어야 한다. 전장에서 postfix 를 설치했으므로 이 부분은 건너뛴다.
  2. DBMS 는 MySQL 이나 Postgres 가 설치되어 있어야 한다. 이미 MySQL 을 설치했으므로 MySQL 을 사용하여 설치를 진행한다.


Redis 설정
시스템 부팅시 자동으로 redis 가 구동되게 하기 위해 service 명령에 등록해 놓는다. 


chkconfig redis on
service redis restart

     

사용자 계정 생성

gitlab 서비스를 구동할 사용자의 계정을 생성한다. 보안을 위해 ssh login 은 막아 놓는다.

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

gitlab-shell 설치

gitlab-shell 은 ssh 접근 및 git 저장소 관리를 하는 유틸리티이다.  설치는 gitlab 의 저장소에서 git clone 명령어로 설치한다.

  1. git 홈 디렉터리로 이동한다.

    cd /home/git

  2. gitlab 사이트에서 프로젝트를 복제한다. 버전은 1.9.1 이다

    sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-shell.git -b v1.9.1 
  3. gitlab-shell 의 설정 파일을 생성한다.

    cd gitlab-shell

    sudo -u git -H cp config.yml.example config.yml
  4. config.yml 을 열어서 URL 과 포트를 설치하려는 URL 과 포트에 맞게 수정한다. 기본 포트는 8080 이지만 8080 은 톰캣이 기본 사용하는 경우가 많으므로 우리는 8085 포트를 지정하도록 하자.

    gitlab_url: "http://localhost:8085/" 
    http_settings:
    	self_signed_cert: false
    CODE

    gitlab-shell 은 gitlab과 REST API 로 통신하며 gitlab_url 설정은 이때 API 호출시 사용하는 URL이다. 둘 다 동일한 서버에 설치되어 있으므로 URL은 전체 주소 도메인 네임(FQDN) 대신 로컬 호스트와 포트(유니콘이 구동되어 있는)를 바로 지정하는 게 좋다.

    왜냐하면 FQDN 으로 지정하면 웹 서버를 통하게 되며 웹서버는 URL redirect 설정이 있으면 HTTP 302 Found 응답 코드와 새로운 Location 을 전송하는데 gitlab-shell 은 이를 처리하지 않으므로 push 가 실패하게 된다.

  5. gitlab-shell 설치 스크립트를 실행하면 설정에 필요한 명령어를 자동으로 실행하고 결과를 출력한다.

    sudo -u git -H ruby ./bin/install

    mkdir -p /home/git/repositories: OK
    mkdir -p /home/git/.ssh: OK
    chmod 700 /home/git/.ssh: OK
    touch /home/git/.ssh/authorized_keys: OK
    chmod 600 /home/git/.ssh/authorized_keys: OK
    chmod -R ug+rwX,o-rwx /home/git/repositories: OK
    find /home/git/repositories -type d -exec chmod g+s {} ;: OK

  6. gitlab-shell 이 생성한 .ssh 는 SELinux 의 context 가 부여되지 않는다. 이럴 경우 sshd 가 git 홈디렉터리 밑의 .ssh 를 읽지 못해서 외부에서 clone 이나 pull/push 작업이 에러가 발생한다. SELinux context 를 설정하여 문제를 해결하자.

    restorecon -Rv /home/git/.ssh

MySQL DB 설정


 

gitlab은 MySQL 과 PostgreSQL 을 지원한다. 본서에서는 모든 application 의 DBMS 를 MySQL 로 구성할 예정이므로 MySQL 기준으로 설명하고자 한다. gitlab 설치중에 ruby db 아답터를 컴파일하여 설치하는 과정이 있는데 정상적으로 진행되려면 전장에서 설치한 mysql 개발용 패키지가 필요하다.

  1. mysql 클라이언트로 root 계정으로 DBMS 에 연결한다.

    mysql -u root -p

  2. gitlab 이 사용할 Database 와 사용자의 계정을 생성하고 Database 에 권한을 부여한다.

    CREATE DATABASE IF NOT EXISTS gitlabhq_production CHARACTER SET utf8 COLLATE utf8_bin;
    GRANT ALL PRIVILEGES ON gitlabhq_production.* TO 'gitlab'@'localhost' IDENTIFIED BY 'secure_password';
    SQL
  3. 정상적으로 설정되었는지 mysql client 로 연결해 본다. 다음과 같은 mysql> 프롬프트가 뜨면 정상 설정된 것이다.

    mysql -u gitlab -psecure_password -D gitlabhq_production

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql>

GitLab 설치


gitlab 소스 복제

  1. gitlab 홈 디렉터리로 이동한후 저장소에서 gitlab 소스를 복제한다.

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

gitlab config 설정

  1. gitlab 소스를 복제한  경로로 이동한후 gitlab 의 예제 설정 파일을 복사한다.

    cd /home/git/gitlab
    sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

  2. 이제 선호하는 에디터로 config/gitlab.yml 을 편집하여 환경을 구성할 수 있다. 수정해야할 항목은 많지 않으며 gitlab 이 사용하는 ruby 로 구현된 Unicorn 이라는 웹서버의 포트(기본값 8080)와 이메일 전송시 주소 정도만 수정하면 된다. 유니콘  웹서버의 포트는 특별한 이유가 없다면 기본 설정을 사용하는걸 권장한다. 우리는 apache httpd 의 mod_proxy 를 이용하여 gitlab 을 사용할 예정이므로 host 명은 localhost 로 설정되어 있어도 사용에 지장이 없다.

    gitlab:
        ## Web server settings
        host: gitlab.example.com
        port: 443
        https: true
    	email_from: gitlab@example.com
    CODE

    host: gitlab 의 도메인명이다. 전체 주소 도메인 네임(FQDN - Fully Qualified Domain Name) 형식으로 작성해야 하며 http:// 나 https:// 는 제외해야 한다. 
    port: git 이 사용하는 포트이다. HTTP 를 사용할 경우 80 으로 설정한다. gitlab 에서 배포하는 아파치 연계용 설정은 클라이언트가 HTTP 로 연결할 경우 mod_rewrite 의 URL 재전송을 통해 HTTPS 로 전환시키게 설정되어 있으므로 이 부분도 수정해야 한다.
    https: gitlab 이 HTTPS 를 사용하는지 여부이다. HTTP 를 사용할 경우 false 로 설정한다.
    email_from :  gitlab 이 공지용 이메일을 보낼때 사용할 주소. 환경에 맞게 수정한다.
    support_email: 지원용 이메일 주소. email_from  과 동일하게 설정한다. 


    host 와 port 는 gitlab 에서 저장소를  생성하면 어떻게 연결하는지에 대한 작업 흐름을 보여줄 때 표시되는 URL 과 포트이므로 실제 서비스 URL과 동일하게 설정해야 하며 gitlab-shell 에서 설정한 gitlab_url 과 동일해야 한다.

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


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


    sudo -u git -H mkdir /home/git/gitlab-satellites

  5. sockets과 pids 기록을 위한 디렉터리를 만들고 gitlab 이 쓸수 있게 권한을 부여한다.


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


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

    sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb

  8. 선호하는 에디터로 config/unicorn.rb 파일을 편집한다. 수정해야 할 부분은 다음과 같다.

    worker_processes 2
    listen "127.0.0.1:8085", :tcp_nopush => true

    worker_processes :  서비스를 처리할 유니콘 워커의 갯수를 지정한다. 기본 워커는 2 지만 많은 부하가 걸리는 서버라면 3 또는 4로 지정한다. worker 를 3으로 지정시 최소  2GB 이상의 RAM 이 있어야 한다. 4GB 이상일 경우 worker 를 4로 지정한다.

    listen  : unicorn 웹서버가 바인딩할 IP 와 포트를 지정한다. 기본 설정은  "127.0.0.1:8080" 이지만 8080 을 사용하는 서비스가 많으므로 우리는 8085로 지정해 보자.  
     

  9. Web 을 통한 외부 공격을 막기 위한 프레임워크인 Rack attack 을 설정한다. 


    sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb

  10. git user를 위한 git  전역 설정을 한다.


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

초기 설정



DB 설정

  1. MySQL 용 설정 파일을 복사한다.

    sudo -u git -H cp config/database.yml.mysql config/database.yml

  2. 편집기로 database.yml 을 열어서 database, db username,  password 항목을 생성한 계정에 맞게 편집한다. 

    production:
      adapter: mysql2
      encoding: utf8
      reconnect: false
      database: gitlabhq_production
      pool: 10
      username: gitlab
      password: "secure_password"
    CODE


Install Gems

루비의 의존성 관리자인 bundle 명령어로 구동에 필요한 Gem 파일을 설치한다. 아래의 명령어는 불필요한 모듈(gitlab 개발/테스트 인스턴스, postgres , 아마존 웹 서비스)를 제외하고 필요한 패키지를 설치한다.

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


Database 초기화 및 advanced 기능 활성화

이제 데이타베이스의 스키마와 테이블을 만들고 초기 데이타를 입력할 차례이다. 다음 명령어가 정상적으로 수행되면 'Administrator account created:' 메시지와 초기 로그인 id/pwd를 볼 수 있다.

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

Install Init Script

시스템 부팅시 gitlab 을 자동으로 구동하기 위한 구동 스크립트를 생성한다. 먼저 wget 으로 gitlab 사이트에서 이미 작성한 스크립트를 다운 받아서 service 명령어로 구동할 수 있게 /etc/init.d/gitlab 으로 저장하자.

curl -k -o /etc/init.d/gitlab https://gist.githubusercontent.com/lesstif/6e64f782b77ce0daad60/raw/e9637a47ca9ab92134217bb66efa08833f9ad3cf/gitlab

실행 속성을 부여하고 부팅시 자동으로 구동되게 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

이제 설치가 마무리 되었다. 다음 명령어로 현재 설치된 app 의 상태를 확인해 볼 수 있다.

sudo -u git -H bundle install --deployment --without development test postgres awsCheck Application Status 

이제 service 명령어로 gitlab 을 구동할 수 있다.

service gitlab start

서버의 구동이 끝났으면 gitlab 이 사용하는 asset 파일을 컴파일한다. 시간이 꽤 오래 걸리므로 차를 한 잔 마시면서 기다려 보자.

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


SELinux 설정


gitlab 이 사용하는 웹서버인 유니콘은 기본적으로 8080 포트를 사용하고 있지만 위에서 8085 로 변경 하였다.

이 포트는 아파치가 연결하도록 허용된 포트가 아니므로 현재 상태에서 mod_proxy 를 설정해도 "Permission Denied" 에러가 발생하며  gitlab의 유니콘 서버에 연결할 수 없다.

이에 대한 해결책중 하나는 아파치가 모든 네트워크 포트에 연결할 수 있게 하는 boolean 인 httpd_can_network_connect  를 1로 설정하는 것이지만 이는 보안상 권장하지 않는다.

대신 아파치가 구동할 때 부여되는 컨텍스트인 http_port_t 에 8085 포트를 등록해 주는게 가장 적절한 해결책이므로 이 방법으로 해결해 보자. 

semanage port -a -t http_port_t -p tcp 8085

웹서버와 방화벽 설정

이제 기나긴 설치 여정의 마지막 단계이다. 




 

apache httpd 설정

미리 설정된 apache 용 gitlab 설정 파일을 다운 받아서 사용하는게 간단하다. 다음 명령어로 설정을 다운받고 기존 설정을 백업한다.

curl -k -o /etc/httpd/conf.d/gitlab.conf https://gist.githubusercontent.com/lesstif/1a977e5fed63394d4dda/raw/ba1eedc089d2e9f76a1f1a450356c81bc3d52f2d/gitlab.conf

위 설정 파일은 다음과 같은 환경으로 설정되어 있다.

  1. gitlab 이 8085 포트로 구동
  2. HTTP 는 HTTPS 로 강제 전환
  3. HTTPS 사용시 인증서와 개인키는 mod_ssl 패키지에 기본 포함된 localhost.crt 와 localhost.key 파일 사용


8085 외 다른 포트를 사용한다면 에디터의 일괄 변경 기능을 이용하여 변경하자. HTTPS 대신 HTTP 를 사용하겠다면 /etc/httpd/conf.d/gitlab.conf 의 mod_rewrite의 RewriteEngine 을 off 로 설정한다.

RewriteEngine off
CODE

그 후에 /home/git/gitlab/config/gitlab.yml 파일의 host, port, https 를 다음과 같이 설정해야 한다. 

 gitlab:
    ## Web server settings (note: host is the FQDN, do not include http://)
    host: gitlab.example.com
    port: 80
    https: false
CODE


HTTPS 를 사용할 경우 베리사인(VeriSign)이나 쏘트(Thawte) 같은 회사에서 발급 받은 SSL 인증서를 쓰지 않을 경우 브라우저에서 경고가 발생하며 경고의 강도는 브라우저 종류에 따라 다르다. Internet Explorer 는 경고창을 표시하고 무시하면 다음으로 진행하지만 크롬의 경우 아예 연결을 하지 못한다.

이 문제는 비용을 들여서  인증 기관에서 SSL 인증서를 발급받거나 아니면 자체적으로 루트 인증기관 인증서를 생성하고 이 인증서를 사용자 브라우저마다 신뢰하는 인증 기관으로 설정해 주는 수 밖에는 없다. (openssl 을 활용한 루트 인증서 생성 방법은 http://lesstif.com/x/HoBq 를 참고하자.) 


이제 /etc/httpd/conf.d/gitlab.conf 파일 설정을 마쳤으면 httpd 를 재구동하여 설정을 반영해 보자.

service httpd restart


방화벽 설정

apache httpd 설정시  http와 https 포트를 iptables 에서 열었지만 gitlab 을 git+ssh 로 사용할 경우 ssh 서비스도 방화벽을 오픈해야 한다.

lokkit 명령어로 /etc/sysconfig/iptables 를 수정하지 않고 정책을 변경할 수 있다.

lokkit -s http -s https -s ssh 


이제 서비스 명령어로 변경 내역을 반영하면 된다.

service iptables restart

이제 기나긴 gitlab 의 설치가 모두 완료됐다. 브라우저로 연결을 확인하기 전에 정상 설치 여부를 명령어로 확인할 수 있다.

cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production

메시지를 통해 정상적으로 설치 여부를 확인할 수 있다. 

 Checking Environment ...
           Git configured for git user? ... yes
           Checking Environment ... Finished
           Checking GitLab Shell ...
           GitLab Shell version >= 1.9.1 ? ... OK (1.9.1)
           Repo base directory exists? ... yes
CODE


이제 gitlab 에 최초 로그인할 시간이다. 브라우저를 구동하고 주소창에 우리가 설치한 gitlab(예: gitlab.example.com) 의 주소를 입력하자. 로그인창이 어려운 설치 과정을 헤치고 온 우리를 반겨줄 것이다.