RVM + GitLab on Debian

I needed to install my own GitLab on my server for my personal projects, so I don’t have to use GitHub and pay for it. This will require some work, but in the end you will save some money.

Before proceeding lets install some prerequisites.

apt-get install nginx pwgen openssh-server openssh-client sudo git-core build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate python-docutils libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev

Lets install RVM first before proceeding with installation of GitLab. I always install RVM as a global installation as I can use it with other users in the systems if necessary.

curl -sSL https://get.rvm.io | sudo bash -s stable

At the time of writing this article the latest version of GitLab is version 7. And the required version of ruby is 2.1.2 according to the requirements, so let’s install ruby

rvm install ruby-2.1.2
gem install bundler

Before continuing we need to set up SSH to allow for user environments, because if we don’t we will get the following message whenever we try to do something with git.

/usr/bin/env: ruby: no such file or directory

This is because there is no user environment when doing operations with git.

Let’s edit /etc/ssh/sshd_config and add the following to the end of the file.

PermitUserEnvironment yes

Execute the following commands with root

adduser --disabled-login --gecos 'GitLab' git

I prefer MySQL over PostgreSQL for GitLab so lets install MySQL for use with GitLab

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

Lets generate a password to use with the system.

pwgen 10 1
iePhee2lae

And then execute the following SQL

CREATE USER 'git'@'localhost' IDENTIFIED BY 'iePhee2lae'; 
SET storage_engine=INNODB;
CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'git'@'localhost';
FLUSH PRIVILEGES;

Before we proceed lets add Git user temporarily to sudoers (/etc/sudoers)

git     ALL=(ALL) NOPASSWD: ALL

Now we need to checkout GitLab, for more up to date installation instructions

su - git
git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 7-0-stable gitlab
cd /home/git/gitlab
cp config/gitlab.yml.example config/gitlab.yml
cp config/unicorn.rb.example config/unicorn.rb
cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
cp config/database.yml.mysql config/database.yml
sudo chown -R git log/
sudo chown -R git tmp/
sudo chmod -R u+rwX log/
sudo chmod -R u+rwX tmp/
sudo mkdir /home/git/gitlab-satellites
sudo chmod u+rwx,g=rx,o-rwx /home/git/gitlab-satellites
sudo chmod -R u+rwX tmp/pids/
sudo chmod -R u+rwX tmp/sockets/
sudo chmod -R u+rwX  public/uploads
git config --global user.name "GitLab"
git config --global user.email "[email protected]"
git config --global core.autocrlf input
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab
sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab
sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab
sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab
sudo update-rc.d gitlab defaults 21

Now lets edit the configuration files and modify them according to our needs.

Make sure to change “localhost” to the fully-qualified domain name of your host serving GitLab where necessary

editor config/gitlab.yml

Change YOUR_SERVER_FQDN to the fully-qualified domain name of your host serving GitLab.

sudo editor /etc/nginx/sites-available/gitlab

Update username/password in config/database.yml. You only need to adapt the production settings (first part).

editor config/database.yml
chmod o-rwx config/database.yml

Enable cluster mode if you expect to have a high load instance. Ex. change amount of workers to 3 for 2GB RAM server.

editor config/unicorn.rb

Now lets install gitlab shell

cd /home/git/gitlab
bundle install --deployment --without development test postgres aws
bundle exec rake gitlab:shell:install[v1.9.6] REDIS_URL=redis://localhost:6379 RAILS_ENV=production
bundle exec rake gitlab:setup RAILS_ENV=production
bundle exec rake assets:precompile RAILS_ENV=production

Now let’s check if everything was installed correctly

bundle exec rake gitlab:env:info RAILS_ENV=production
bundle exec rake gitlab:check RAILS_ENV=production

Now lets start everything up

sudo service gitlab restart
sudo service nginx restart