RHEL/CentOS 6에 gitlab 설치
오래된 문서이니 대신 도커로 깃랩 설치하기(install gitlab using docker) 를 참고하세요.
개요
giblab 은 ruby on rail framework 기반으로 개발된 github 와 비슷한 Web Base git repository management system이다.
github 와 달리 community edition이 있고 라이선스는 MIT이므로 기업내에서 상업적 용도로 사용가능하다.
github Enterprise 가 고가라 사기 버거운 스타트업이나 소규모 기업에서 좋은 솔루션이 될 수 있다.
|-- 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 만 사용하게 문서 수정함
OS | CentOS 6.x | |
---|---|---|
ruby | 2.0.0p451 | |
gitlab | 6.7-stable | |
gitlab-shell | 1.9.4 | |
DBMS | MySQL 5.1 | |
Web Server | apache 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
설치
필요 패키지 설치
gitlab 을 설치하는 데 필요한 컴파일러와 라이브러리를 설치한다. 먼저 시스템을 업데이트 하자.
yum -y update
컴파일러와 링커등의 개발 패키지 그룹을 설치한다.
yum -y groupinstall 'Development Tools'
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, rbenv, chruby 같은 ruby manager 를 권장하지 않는다. gcc 로 ruby 를 소스에서 빌드해서 사용하거나 나 rpm 으로 만든후에 설치할 수 있다. (rpm 설치 추천)
rpm 으로 빌드후 설치
- 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 에서 빌드해서 설치
먼저 기본 탑재된 ruby 가 있다면 삭제한다.
yum remove ruby
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
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 해서 설치하면 된다.
Go to home directory
cd /home/git
clone gitlab shell
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-shell.git -b v1.9.4
gitlab shell 설정
cd gitlab-shell sudo -u git -H cp config.yml.example config.yml
에디터로 config.yml 을 열어서 url을 설정해 준다. gitlab의 API 호출 URL 로 gitlab 기본 설정이 http 로 들어온 경우 https 로 포워딩하므로 https 로 설정하는게 좋다.
gitlab_url: "https://gitlab.example.com/"
HTTPS 를 사용할 경우 신뢰하는 인증기관에서 발급받은 SSL 인증서가 아니라면 self_signed_cert : 설정을 true 로 해야 검증 에러가 발생하지 않는다.
gitlab-shell 설치를 진행한다
sudo -u git -H ruby ./bin/install
외부에서 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
먼저 MySQL이 설치되어 있고 구동되어 있어야 한다. 설치되어 있지 않다면 yum 으로 설치해 준다. gitlab 설치중 ruby 용 mysql driver 를 compile 하는 단계가 있으므로 mysql-devel 을 같이 설치해야 한다.
yum install mysql mysql-server mysql-libs mysql-devel -y
/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
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';
정상적으로 생성되었는지 확인한다.
mysql -u git -psupersecret -D gitlabhq_production
GitLab 설치
Source Clone
git home directory 로 이동
cd /home/git
Clone GitLab repository
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 6-7-stable gitlab
gitlab 설정
- cd /home/git/gitlab
gitlab 의 예제 설정 파일을 복사하여 설정을 수정할 수 있게 준비한다.
sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml
이제 선호하는 에디터로 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 프로젝트를 생성하면 표시하는 워크플로우에도 출력되므로 잘 설정해야 한다.
gitlab 계정으로 로그와 임시 디렉터리에 쓸 수 있게 권한을 부여한다.
chown -R git log/ tmp chmod -R u+rwX log/ tmp
satellites 모듈을 위한 디렉터리를 생성한다.
sudo -u git -H mkdir /home/git/gitlab-satellites
sockets과 pids 기록을 위한 디렉터리를 만들고 gitlab 이 쓸수 있게 권한을 부여한다.
sudo -u git -H mkdir tmp/{pids,sockets} sudo chmod -R u+rwX tmp/{pids,sockets}
백업을 위한 public/uploads 디렉터리를 생성한다.
sudo -u git -H mkdir public/uploads sudo chmod -R u+rwX public/uploads
유니콘 웹서버 설정을 위해 기본 설정 파일을 복사한다.
sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb
선호하는 에디터로 config/unicorn.rb 파일을 편집한다. 수정해야 할 부분은 다음과 같다.
worker_processes 2 -> 기본 worker 는 2 지만 많은 부하가 걸리는 서버라면 3 또는 4로 지정한다. worker 를 3으로 지정시 최소 2GB 이상의 RAM 이 있어야 한다. 4GB 이상일 경우 worker 를 4로 지정한다.
- listen "127.0.0.1:8080" -> unicorn 웹서버가 사용할 포트를 지정한다. 8080이 아닌 다른 포트를 사용할 경우 SELinux 설정과 apache httpd(gitlab-ssl.conf) 설정도 같이 변경해야 한다.
Web 을 통한 외부 공격을 막기 위한 프레임워크인 Rack attack 을 설정한다.
sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
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 설정
설정 파일 복사(MySQL)
sudo -u git -H cp config/database.yml.mysql config/database.yml
- 에디터로 database.yml 을 열어서 DB 명, id, pwd 를 환경에 맞게 편집한다.
Install Gems
cd /home/git/gitlab
ruby 용 패키지 의존성 관리자인 bundle 을 설치한다.
gem install bundle
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
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
실행 속성을 부여하고 부팅시 자동으로 구동되게 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 설정
apache httpd 와 SSL용 모듈인 mod_ssl 을 설치한다.
yum -y install httpd mod_ssl chkconfig httpd on
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
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
gitlab-ssl.conf 파일내 ServerName 을 웹서버의 FQDN 으로 변경하고 unicorn 이 8080 이 아닌 포트를 사용할 경우 아래처럼 ProxyPass,ProxyPassReverse 를 수정한다.
gitlab-ssl.confServerName gitlab.example.com ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/
아파치 웹서버를 재구동한다.
service httpd restart
iptable 방화벽 오픈
80, 443 방화벽이 열리지 않았다면 iptable 설정을 변경한다.
lokkit -s http -s https -s ssh service iptables restart
SELinux 문제 해결
- gitlib 에는 unicorn 이라는 Web 서버가 내장되어 있는데 기본 포트가 8080 임
- 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 에 추가
- su - gitlab
- cd gitlab
- vi config/unicorn.rb
- listen "127.0.0.1:8080" 을 찾아서 적당한 포트 번호(Ex: 10000 으로 변경)
SELinux context 추가
semanage port -a -p tcp -t http_port_t 10000
- gitlab.conf 의 포트 수정
- vi /etc/httpd/conf.d/gitlab.conf
- 8080 을 위에서 변경한 포트(10000 으로 변경)
- service httpd restart
최초 로그인 및 동작 확인
웹브라우저로 설정한 사이트에 연결하여 정상 설치 여부를 테스트한다. 로그인 id/pwd 는 다음 값을 사용하고 로그인후 바로 변경하자.
admin@local.host
5iveL!fe
See Also
Ref
- https://github.com/gitlabhq/gitlab-recipes/tree/master/install/centos
- http://tecadmin.net/how-to-install-ruby-2-0-0-on-centos-6-using-rvm/
- http://stackoverflow.com/questions/5507489/git-server-like-github