--- categories: web git title: Howto GitLab ... * Documentation : [GitLab](https://about.gitlab.com/) est un logiciel libre de gestion de développement de logiciels (appelé souvent une *forge*) permettant de créer des projets avec un dépôt Git pour le code source, la demande de fusion (*merge/pull requests*), un outil de tickets, un wiki, etc. GitLab ressemble sous certains aspects au logiciel propriétaire Github. # Installation Nous installons la version **8.14.X** sous **Debian 8** (Jessie) avec une approche multi-instances. GitLab s'appuye sur Git, Ruby, Go, PostgreSQL et Redis. > **Note** : dans les exemples ci-dessous, on va créer une instance nommée *foo* ## Dépendances GitLab nécessite des version très récentes de Git, Ruby et Go. On utilise pour l'instant des versions de Jessie Backports et Stretch via un « pinning » APT : ~~~ Package: * Pin: release n=jessie-backports Pin-Priority: 50 Package: * Pin: release n=stretch Pin-Priority: 50 Package: golang golang-doc golang-src golang-go Pin: release n=jessie-backports Pin-Priority: 999 Package: git git-man ruby ruby2.3 ruby-dev ruby2.3-dev libruby2.3 rake ruby-test-unit libncurses5 libreadline7 libtinfo5 libncursesw5 libncurses5-dev libtinfo-dev ncurses-bin Pin: release n=stretch Pin-Priority: 999 ~~~ On peut ainsi installer toutes les dépendances pour Gitlab : ~~~ # apt install build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev \ libffi-dev curl openssh-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate \ python-docutils pkg-config cmake nodejs bundler ruby2.3 git golang ~~~ ## Compte UNIX Créer un compte UNIX *foo* : ~~~ # adduser --disabled-login --gecos 'GitLab instance foo' foo ~~~ > **Note** : Assurez-vous d'avoir `DIR_MODE=0755` dans `/etc/adduser.conf` (nécessaire pour Nginx) ## PostgreSQL GitLab recommande [PostgreSQL](HowtoPostgreSQL). On utilise donc la version 9.4 de Debian Jessie : ~~~ # apt install postgresql postgresql-client libpq-dev postgresql-contrib ~~~ Création de l'utilisateur PostgreSQL : ~~~ # sudo -u postgres createuser foo -P -D -A -R # sudo -u postgres psql -d template1 -c 'ALTER ROLE "foo" CREATEDB;' ~~~ > **Note** : On donne les droits CREATEDB car GitLab doit faire un DROP DATABASE puis CREATE DATABASE lors de l'installation… > **Note** : Pensez à conserver le mot de passe pour le mettre par la suite pour [GitLab CE](#gitlab-ce). Création de l'extension `pg_trgm` : ~~~ # sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" ~~~ Création de la base pour GitLab : ~~~ # sudo -u postgres createdb -O foo -E UNICODE foo ~~~ Tester la connexion et si l'extension `pg_trgm` est bien activée : ~~~ # sudo -u foo -H psql --password -d foo psql> SELECT true AS enabled FROM pg_available_extensions WHERE name = 'pg_trgm' AND installed_version IS NOT NULL; enabled --------- t (1 row) ~~~ ## Redis On utilise une instance Redis dédiée à chaque instance GitLab : ~~~ # apt install redis-server # systemctl stop redis-server # systemctl disable redis-server ~~~ Créer et activer le template d'unité systemd `/etc/systemd/system/redis@.service` : ~~~ [Unit] Description=Advanced key-value store instance %i After=network.target [Service] Type=forking ExecStart=/usr/bin/redis-server /etc/redis/%i.conf ExecStartPost=/bin/chgrp %i /var/run/redis/%i.sock ExecStop=/usr/bin/redis-cli shutdown Restart=always User=redis Group=%i [Install] WantedBy=multi-user.target ~~~ Puis : ~~~ # systemctl daemon-reload ~~~ Configuration spéciale pour l'instance : ~~~ # cat /etc/redis/foo.conf daemonize yes pidfile /var/run/redis/foo.pid port 0 unixsocket /var/run/redis/foo.sock unixsocketperm 770 timeout 0 loglevel notice logfile /var/log/redis/foo.log databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename foo.rdb dir /var/lib/redis # chmod 644 /etc/redis/foo.conf # systemctl enable redis@foo # systemctl start redis@foo ~~~ ## GitLag CE ~~~ # sudo -iu foo $ umask 002 $ git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 8-14-stable gitlab $ cd gitlab $ cp config/gitlab.yml.example config/gitlab.yml $ sed -i 's@/home/git@/home/foo@g' config/gitlab.yml ~~~ Éditer `config/gitlab.yml` : ~~~ host: foo.gitlab.example.com port: 443 https: true user: foo email_from: gitlab@example.com email_display_name: GitLab foo email_reply_to: gitlab@example.com ~~~ Mettre le mot de passe PostgreSQL : ~~~ $ cp config/secrets.yml.example config/secrets.yml $ sed -i "s@^# db_key_base:@db_key_base: PASSWORD@" config/secrets.yml $ chmod 600 config/secrets.yml $ cp config/database.yml.postgresql config/database.yml $ sed -i -e 's/database: gitlabhq_production/database: foo/' \ -e 's/# username: git/username: foo/' \ -e 's/# password:/password: PASSWORD/' config/database.yml $ chmod o-rwx config/database.yml ~~~ Puis on crée la base de données avec l'identifiant (une adresse email) et un mot de passe pour l'utilisateur *root* sur l'interface web de GitLab : ~~~ $ bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=yourpassword GITLAB_ROOT_EMAIL=admingitlab@example.com ~~~ > **Note** : Conservez l'espace devant le sed pour ne pas enregistrer le mot de passe dans l'historique BASH. Ajuster les droits de certains répertoires : ~~~ $ chmod -R u+rwX,go-w log/ $ chmod -R u+rwX tmp/ $ chmod -R u+rwX tmp/pids/ $ chmod -R u+rwX tmp/sockets/ $ install -d -m 700 public/uploads/ $ chmod -R u+rwX builds/ $ chmod -R u+rwX shared/artifacts/ ~~~ ## Unicorn Configuration de base d'Unicorn : ~~~ $ cp config/unicorn.rb.example config/unicorn.rb $ sed -i -e \ -e 's@/home/git@/home/foo@g' \ -e 's/listen "127.0.0.1:8080", :tcp_nopush => true/#listen "127.0.0.1:8080", :tcp_nopush => true/' \ config/unicorn.rb ~~~ ## Rack attack Initialisation de la configuration de Rack::Attack (qui permet du filtrage / rate-limiting) : ~~~ $ cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb ~~~ ## Git Configuration : ~~~ $ git config --global core.autocrlf input $ git config --global gc.auto 0 $ git config --global repack.writeBitmaps true ~~~ ## Resque Configuration : ~~~ $ cp config/resque.yml.example config/resque.yml $ sed -i 's/redis.sock/foo.sock/' config/resque.yml ~~~ ## Gems > **Important**: Votre partition `/home` ne doit pas être montée avec l'option `noexec`. On installe quelques Gems : ~~~ $ umask 002 $ bundle install -j$(nproc) --deployment --without development test mysql aws kerberos ~~~ ## GitLab Shell Installation : ~~~ $ umask 002 $ bundle exec rake gitlab:shell:install REDIS_URL=unix:/var/run/redis/foo.sock RAILS_ENV=production SKIP_STORAGE_VALIDATION=true $ chmod -R ug+rwX,o-rwx ~/repositories/ $ chmod -R ug-s ~/repositories/ $ chmod g+s ~/repositories/ ~~~ ## gitlab-workhorse Installation : ~~~ $ umask 002 $ cd $ git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git $ cd gitlab-workhorse $ git checkout v$(cat ~/gitlab/GITLAB_WORKHORSE_VERSION) $ make ~~~ ## Script d'init Attention, GitLab ne supporte pas officiellement systemd ! On doit donc encore passer pas un script d'init classique : ~~~ # sudo -iu foo $ cd gitlab $ sed -i -e 's/app_user="git"/app_user="foo"/' \ -e 's/# Provides: .*gitlab/# Provides: foo/' \ lib/support/init.d/gitlab $ sed -i 's@script_path = "/etc/init.d/gitlab"@script_path = "/etc/init.d/gitlab-foo"@g' lib/tasks/gitlab/check.rake $ git commit -a -m 'change default user' # install -m 755 /home/foo/gitlab/lib/support/init.d/gitlab /etc/init.d/gitlab-foo # systemctl enable gitlab-foo ~~~ ## Logrotate ~~~ # install -m 644 /home/foo/gitlab/lib/support/logrotate/gitlab /etc/logrotate.d/gitlab-foo # sed -i 's@/home/git@/home/foo@g' /etc/logrotate.d/gitlab-foo ~~~ ## Nginx On utilise Nginx, c'est le seul serveur web supporté officiellement par GitLab : ~~~ # apt install nginx # install -m 644 /home/foo/gitlab/lib/support/nginx/gitlab-ssl /etc/nginx/sites-available/foo # sed -i -e 's@/home/git@/home/foo@g' \ -e 's/YOUR_SERVER_FQDN/foo.gitlab.example.com/g' \ -e 's@/var/log/nginx/gitlab@/var/log/nginx/foo@g' \ -e 's/upstream gitlab-workhorse/upstream gitlab-foo-workhorse/' \ -e 's@http://gitlab-workhorse@http://gitlab-foo-workhorse@' \ /etc/nginx/sites-available/foo # ln -s /etc/nginx/sites-available/foo /etc/nginx/sites-enabled/ # /etc/init.d/nginx restart ~~~ > **Note** : La partie SSL/TLS n'est pas évoquée. À vous de faire le nécessaire avec un certificat Let's Encrypt par exemple. N'oubliez donc pas de modifier les directives `ssl_` dans le vhost. ## Finalisation de l'installation Vérification de l'état de l'installation : ~~~ # sudo -iu foo $ cd gitlab $ bundle exec rake gitlab:env:info RAILS_ENV=production ~~~ Compilation des assets : ~~~ $ bundle exec rake assets:precompile RAILS_ENV=production ~~~ Démarrage de l'instance : ~~~ # /etc/init.d/gitlab-foo start ~~~ Vérifier le statut : ~~~ # sudo -iu foo $ cd gitlab $ bundle exec rake gitlab:check RAILS_ENV=production ~~~ Si tout est au vert, c'est bon ! On pourra aller sur l'instance via http://foo.gitlab.example.com # Sauvegarde On peut réaliser des sauvegardes grâce à la commande `bundle exec rake gitlab:backup:create RAILS_ENV=production` On peut ainsi mettre un cron pour l'utilisateur foo : ~~~ # Create a full backup of the GitLab repositories and SQL database every day at 4am 0 4 * * * cd ~/gitlab && bundle exec rake gitlab:backup:create RAILS_ENV=production CRON=1 ~~~ Dans `~/gitlab/config/gitlab.yml` on pourra indiquer un temps de rétention. Par exemple pour garder 5j de backups `keep_time: 432000` > **Note** : Par défaut, les sauvegardes sont stockées dans ~/gitlab/tmp/backups. Il est évidemment conseillé de les sauvegarder ailleurs et sur une machine distante. Attention, le fichier `secrets.yml` contient les clés de chiffrements pour les sessions et les variables. Il n'est pas inclus dans les sauvegardes GitLab. Vous devez le copier au moins une fois dans un endroit sécurisé. # Mises à jour Le principe des mises à jour est basé sur un `git pull` et un `git checkout`. ## Mise à jour mineure 8.14.0 vers 8.14.1 ### Sauvegarde ~~~ # sudo -iu foo $ cd gitlab $ bundle exec rake gitlab:backup:create RAILS_ENV=production ~~~ ### Mise à jour de GitLab ~~~ # sudo -iu foo $ cd gitlab $ git fetch --all $ git checkout -- Gemfile.lock db/schema.rb $ git checkout v8.14.1 -b v8.14.1 $ sed -i -e s'/app_user="git"/app_user="foo"/' \ -e 's/# Provides: .*gitlab$/# Provides: foo/' \ lib/support/init.d/gitlab $ sed -i 's#script_path = "/etc/init.d/gitlab"#script_path = "/etc/init.d/gitlab-foo"#g' lib/tasks/gitlab/check.rake $ git commit -a -m 'change default user' ~~~ ### Mise à jour base de données, Gems et assets ~~~ $ cd ~/gitlab $ bundle install --without development test mysql aws kerberos --deployment $ bundle clean $ bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production $ git commit -a -m 'upgraded to 8.14.1' ~~~ ### Redémarrer GitLab ~~~ # /etc/init.d/gitlab-foo restart ~~~ ### Vérifier le status ~~~ # sudo -iu foo $ cd gitlab $ bundle exec rake gitlab:env:info RAILS_ENV=production $ bundle exec rake gitlab:check RAILS_ENV=production ~~~ Si tout est au vert, la migration s'est bien passée ! ## Mineure 8.14.1 vers 8.14.2 ### Sauvegarde ~~~ # sudo -iu foo $ cd #gitlab $ bundle exec rake gitlab:backup:create RAILS_ENV=production ~~~ Cela va créer une archive TAR dans `~/gitlab/tmp/backups/`. ### Mise à jour de GitLab ~~~ # sudo -iu foo $ umask 002 $ cd gitlab $ git fetch --all $ git checkout -- Gemfile.lock db/schema.rb $ git checkout v8.14.2 -b v8.14.2 $ sed -i -e s'/app_user="git"/app_user="foo"/' \ -e 's/# Provides: .*gitlab$/# Provides: foo/' \ lib/support/init.d/gitlab $ sed -i 's@script_path = "/etc/init.d/gitlab"@script_path = "/etc/init.d/foo"@g' lib/tasks/gitlab/check.rake $ git commit -a -m 'change default user' ~~~ ### Mise à jour de gitlab-workhorse ~~~ $ cd ~/gitlab-workhorse $ git fetch $ git checkout v$(cat ~/gitlab/GITLAB_WORKHORSE_VERSION) -b v$(cat ~/gitlab/GITLAB_WORKHORSE_VERSION) $ make ~~~ ### Mise à jour BDD, gems et assets ~~~ $ cd ~/gitlab $ bundle install --without development test mysql aws kerberos --deployment $ bundle clean $ bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production $ git commit -a -m 'upgraded to 8.14.2' ~~~ ### Redémarrer GitLab ~~~ # /etc/init.d/gitlab-foo restart Shutting down GitLab Unicorn Shutting down GitLab Sidekiq Shutting down GitLab Workhorse . GitLab is not running. Starting GitLab Unicorn Starting GitLab Sidekiq Starting GitLab Workhorse The GitLab Unicorn web server with pid 8120 is running. The GitLab Sidekiq job dispatcher with pid 8221 is running. The GitLab Workhorse with pid 8202 is running. GitLab and all its components are up and running. ~~~ ### Vérifier le status ~~ # sudo -iu foo $ cd gitlab $ bundle exec rake gitlab:env:info RAILS_ENV=production $ bundle exec rake gitlab:check RAILS_ENV=production ~~~ Si tout est au vert, la migration s'est bien passée ! ## Mise à jour majeure En attente d'une nouvelle release majeure :)