Gitlab Installation
This blog is to document the steps install Gitlab on a Centos 6.4 x88_64 Server. It will discuss some of the issues we encountered and provide some puppet code to automated the build. We used this wiki as a reference for the installation https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md.Overview
Gitlab using several subsystems
- Postgres database
- nginx
- unicorn
- ruby / rails
- redis
- sidekiq
Gitlab will run as local user Centos account git.
Setup
Install and Configure Postgres
Reference for this postgres installation : http://tecadmin.net/install-postgresql-on-centos-rhel-and-fedora/Install postgres yum repo
rpm -Uhv http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm
There was an issue with postgres requiring a new version of openss 10 so we installed a 6.5 package instead. Note this openssl is from updates repo which includes the fix for heartbleed vulnerability.
rpm -Uhv http://mirror.centos.org/centos/6/updates/x86_64/Packages/openssl-1.0.1e-16.el6_5.14.x86_64.rpm yum -y install postgresql93-server-9.3.4-1PGDG.rhel6.x86_64 postgresql93-9.3.4-1PGDG.rhel6.x86_64 postgresql93-libs-9.3.4-1PGDG.rhel6.x86_64
Edit pg_hba.conf
vi /var/lib/pgsql/9.3/data/pg_hba.conf #local all all peer local all postgres trust local all all trust
Initial database and start postgres daemon
service postgresql-9.3 initdb
service postgresql-9.3 start
For some reason the gitlab configuration script is missing some instructions so we pre-config the db. Note postgres has no password to log in locally.
sudo -u postgres psql
CREATE DATABASE gitlab_production;
\c gitlab_production CREATE USER gitlab WITH PASSWORD 'my_git_passwd1'; GRANT ALL PRIVILEGES ON DATABASE gitlab_production to gitlab;
\list \qCheck gitlab database login
psql -U gitlab -W -d gitlab_production
Install and Configure Gitlab
The download instruction for Centos can be found here : https://about.gitlab.com/downloads/Select Centos 6.
Download Gitlab
wget https://downloads-packages.s3.amazonaws.com/centos-6.5/gitlab-7.1.1_omnibus-1.el6.x86_64.rpm yum install openssh-server yum install postfix
rpm -i gitlab-7.1.1_omnibus-1.el6.x86_64.rpm
Configure gitlab
vi /etc/gitlab/gitlab.rb
# Change the external_url to the address your users will type in their browser git_data_dir "/home/git" external_url 'http://[your_hostname]' #custom postgres install postgresql['enable'] = false # Fill in the values for database.yml gitlab_rails['db_adapter'] = 'postgresql' gitlab_rails['db_encoding'] = 'utf8' gitlab_rails['db_database'] = 'gitlab_production' gitlab_rails['db_username'] = 'gitlab' gitlab_rails['db_password'] = 'dsu-8cq-c5r-poz' gitlab_rails['db_socket'] = '/tmp/.s.PGSQL.5432'
Since we where using our own postgres install we need to add addition entries by adding
postgresql['enable'] = false
Run gitlab reconfiguration
gitlab-ctl reconfigure gitlab-rake gitlab:setup RAILS_ENV=production
Login to gitlab
In a browser, type http://[your_hostname]
username : admin@local.host passwd : 5iveL!fe
Debugging
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"UTF-8", "database"=>"gitlab_production", "pool"=>10, "username"=>"gitlab", "password"=>"dsu-8cq-c5r-poz", "host"=>"127.0.0.1", "port"=>5432, "socket"=>"/tmp/.s.PGSQL.5432"} -- enable_extension("plpgsql") rake aborted! PG::Error: FATAL: Ident authentication failed for user "gitlab"We had to run numerous time to figure out what was going on.
vi /etc/gitlab/gitlab.rb
gitlab-ctl reconfigure
gitlab-rake gitlab:setup RAILS_ENV=production
Instead we run the following before editing the final gitlab.rb
vi /var/opt/gitlab/gitlab-rails/etc/database.yml
gitlab:setup RAILS_ENV=production
Bonus Puppet code
Git Node definition/etc/puppet/manifest/git.pp
node /[your_git_server]/
{
class { "postgres": version => "9.3", } class { "gitlab": version => "7.0.0", require => Class["postgres"], }
}
Postgres module
/etc/puppet/modules/postgres/manifests/init.pp
class postgres ( $version = "9.3" ) { case $version { "9.3" : { $package_version = "93" } default : { $package_version = "93" } } package { [ "postgresql${package_version}-server", "postgresql${package_version}" , "postgresql${package_version}-libs" ]: ensure => latest, require => Package["pgdg-redhat93-9.3-1"];
"pgdg-redhat93-9.3-1":
ensure => latest,
#Add this to a local repo : http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm
#TODO centos 6.4 requires openssl-1.0.1e-16.el6_5.14.x86_64.rpm for centos 6.5
} service { "postgresql-${version}": ensure => "running", enable => "true", require => [Package["postgresql${package_version}-server"], Exec["init_postgres"]], } exec { "init_postgres": command => "service postgresql-${version} initdb", path => "/usr/local/bin/:/bin/:/usr/bin/:/usr/sbin/:/sbin", onlyif => "ls /var/lib/pgsql/${version}/data", require => Package["postgresql${package_version}-server"], } }
Gitlab Module
/etc/puppet/modules/gitlab/manifests/init.pp
class gitlab( $version = '7.0.0' ) { class { "gitlab::user": } file { "/home/git": ensure => directory, require => Class["gitlab::user"]; "/etc/gitlab/gitlab.rb": ensure => "present", owner => $::git, group => $::git, mode => 0655, notify => Service["gitlab-ctl"], content => template("gitlab/gitlab.rb.erb"), require => Package["gitlab-${version}_omnibus"]; } package { "git": ensure => latest, require => Class["gitlab::user"]; "gitlab-7.0.0_omnibus": ensure => latest, require => Package["git"]; } service { "gitlab-ctl": ensure => "running", hasrestart => true, restart => "/usr/bin/gitlab-ctl reconfigure && chsh -s /bin/bash ${::git_user}", hasstatus => true, status => "/usr/bin/gitlab-ctl status", start => "/usr/bin/gitlab-ctl start", stop => "/usr/bin/gitlab-ctl stop", require => File["/etc/gitlab/gitlab.rb"], } } class gitlab::user {
# base::generic_user is a custom "define" create user. There are many definitions to create users. We made it into a class so we can "require" it
# git user account information was define on the top level scope e.g. = $::git
base::generic_user { "${git_user}": user => "$git_user", uid => "${git_user_uid}", base_home => "/var/opt", home_name => "gitlab", password => "${git_user_pass}", comment => "${git_user_comment}", bash_profile_path => "/opt/gitlab:/opt/gitlab/bin:/opt/gitlab/embedded/bin:/usr/sbin:/sbin:/apps/bin:\$PATH", bash_rubylib => "/opt/gitlab/embedded/lib" } }
/etc/puppet/modules/gitlab/templates/gitlab.rb.erb
# Autconfigured by Puppet. Do not edit # Change the external_url to the address your users will type in their browser git_data_dir "/home/git" external_url 'http://<%=fqdn%>' #need to install postgres postgresql['enable'] = false # Fill in the values for database.yml gitlab_rails['db_adapter'] = 'postgresql' gitlab_rails['db_encoding'] = 'utf8' gitlab_rails['db_database'] = 'gitlab_production' gitlab_rails['db_username'] = 'gitlab' gitlab_rails['db_password'] = 'your_git_user_dbpasswd' gitlab_rails['db_socket'] = '/tmp/.s.PGSQL.5432'