464 lines
12 KiB
Markdown
464 lines
12 KiB
Markdown
---
|
||
categories: web
|
||
title: Howto GitLab
|
||
...
|
||
|
||
Ce Howto concerne l'installation d'une version **8.13.X** sous **Debian 8** (Jessie). Il est basé sur la documentation officielle : <https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md>
|
||
Sa particularité est de décrire comment installer GitLab avec une approche multi-instances avec la création d'une instance nommée « demo00 ».
|
||
|
||
> **Note** : Vous pouvez bien entendu changer « demo00 » par le nom d'instance de votre choix.
|
||
|
||
# Outils nécessaire
|
||
|
||
La brique de composants (stack) est composé de :
|
||
|
||
- GIT ;
|
||
- Ruby ;
|
||
- Go ;
|
||
- PostgreSQL ;
|
||
- Redis ;
|
||
|
||
|
||
# Installation
|
||
|
||
## Packages
|
||
|
||
GitLab a besoin d'une version récente de GIT, Ruby et Go. On utilisera les versions de Debian Stretch et Jessie Backports via un « pinning » apt.
|
||
|
||
```
|
||
Package: *
|
||
Pin: release n=stretch
|
||
Pin-Priority: 1
|
||
|
||
Package: *
|
||
Pin: release n=jessie-backports
|
||
Pin-Priority: 1
|
||
|
||
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
|
||
|
||
Package: golang golang-doc golang-src golang-go
|
||
Pin: release n=jessie-backports
|
||
Pin-Priority: 999
|
||
```
|
||
|
||
```
|
||
# 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 « gitlab-demo00 ».
|
||
|
||
# adduser --disabled-login --gecos 'GitLab instance demo00' gitlab-demo00
|
||
|
||
## Base de données
|
||
|
||
GitLab recommande fortement PostgreSQL. On utilisera donc la version 9.4 de Debian Jessie.
|
||
|
||
Installation de PostgreSQL :
|
||
|
||
```
|
||
# apt install postgresql postgresql-client libpq-dev postgresql-contrib
|
||
```
|
||
|
||
> **Note** : Nous conseillons de désactiver le mode « peer » et d'utiliser des mots de passe.
|
||
|
||
Création de l'utilisateur :
|
||
|
||
```
|
||
# sudo -u postgres createuser gitlab-demo00 -P -D -A -R
|
||
# sudo -u postgres psql -d template1 -c 'ALTER ROLE "gitlab-demo00" CREATEDB;'
|
||
```
|
||
|
||
> **Note** : On lui 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 dans la configuration GitLab.
|
||
|
||
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 gitlab-demo00 -E UNICODE gitlab-demo00
|
||
```
|
||
|
||
Tester la connexion :
|
||
|
||
```
|
||
# sudo -u gitlab-demo00 -H psql --password -d gitlab-demo00
|
||
```
|
||
|
||
Tester si l'extension `pg_trgm` est bien activée :
|
||
|
||
```
|
||
SELECT true AS enabled
|
||
FROM pg_available_extensions
|
||
WHERE name = 'pg_trgm'
|
||
AND installed_version IS NOT NULL;
|
||
```
|
||
|
||
Cela doit retourner (« 1 row ») :
|
||
|
||
```
|
||
enabled
|
||
---------
|
||
t
|
||
(1 row)
|
||
```
|
||
|
||
## Redis
|
||
|
||
On utilisera redis en mode multi instances grâce à systemd et les templates d'unités.
|
||
|
||
# apt install redis-server
|
||
|
||
```
|
||
# systemctl stop redis-server
|
||
# systemctl disable redis-server
|
||
```
|
||
|
||
Créer et activer le template d'unité `/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
|
||
|
||
```
|
||
# systemctl daemon-reload
|
||
|
||
|
||
Créer une config spéciale pour l'instance :
|
||
```
|
||
# vim /etc/redis/gitlab-demo00.conf
|
||
|
||
daemonize yes
|
||
pidfile /var/run/redis/gitlab-demo00.pid
|
||
port 0
|
||
unixsocket /var/run/redis/gitlab-demo00.sock
|
||
unixsocketperm 770
|
||
timeout 0
|
||
loglevel notice
|
||
logfile /var/log/redis/gitlab-demo00.log
|
||
databases 16
|
||
save 900 1
|
||
save 300 10
|
||
save 60 10000
|
||
stop-writes-on-bgsave-error yes
|
||
rdbcompression yes
|
||
rdbchecksum yes
|
||
dbfilename gitlab-demo00.rdb
|
||
dir /var/lib/redis
|
||
|
||
# chmod 644 /etc/redis/gitlab-demo00.conf
|
||
|
||
```
|
||
|
||
|
||
```
|
||
# systemctl enable redis@gitlab-demo00
|
||
# systemctl start redis@gitlab-demo00
|
||
|
||
```
|
||
|
||
|
||
## GitLab
|
||
|
||
### Configuration du cœur
|
||
|
||
```
|
||
# sudo -iu gitlab-demo00
|
||
$ umask 002
|
||
$ git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 8-13-stable gitlab
|
||
$ cd gitlab
|
||
$ cp config/gitlab.yml{.example,}
|
||
$ sed -i 's#/home/git#/home/gitlab-demo00#g' config/gitlab.yml
|
||
```
|
||
|
||
Éditer manuellement config/gitlab.yml sur cette base :
|
||
|
||
```
|
||
host: demo00.gitlab.example.com
|
||
port: 443
|
||
https: true
|
||
user: gitlab-demo00
|
||
email_from: demo00@gitlab.example.com
|
||
email_display_name: GitLab demo00
|
||
email_reply_to: demo00@gitlab.example.com
|
||
```
|
||
|
||
```
|
||
$ cp config/secrets.yml{.example,}
|
||
$ sed -i "s/# db_key_base:/db_key_base: $(apg -m30 -n1)/" config/secrets.yml
|
||
$ chmod 0600 config/secrets.yml
|
||
```
|
||
|
||
```
|
||
$ 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/
|
||
```
|
||
|
||
### Configuration Unicorn
|
||
```
|
||
$ cp config/unicorn.rb{.example,}
|
||
$ sed -i -e "s/worker_processes 3/worker_processes $(nproc)/" \
|
||
-e 's#/home/git#/home/gitlab-demo00#g' config/unicorn.rb
|
||
|
||
```
|
||
### Configuration de Rack attack
|
||
```
|
||
$ cp config/initializers/rack_attack.rb{.example,}
|
||
```
|
||
### Configuration de GIT
|
||
```
|
||
$ git config --global core.autocrlf input
|
||
$ git config --global gc.auto 0
|
||
$ git config --global repack.writeBitmaps true
|
||
```
|
||
### Configuration de Resque/Redis
|
||
```
|
||
$ cp config/resque.yml{.example,}
|
||
$ sed -i 's/redis.sock/gitlab-demo00.sock/' config/resque.yml
|
||
|
||
```
|
||
|
||
### Configuration des paramètres de connexion à la base
|
||
|
||
```
|
||
$cp config/database.yml{.postgresql,}
|
||
$ sed -i -e 's/database: gitlabhq_production/database: gitlab-demo00/' \
|
||
-e 's/# username: git/username: gitlab-demo00/' \
|
||
-e 's/# password:/password: VotreMDP/' config/database.yml
|
||
$ chmod o-rwx config/database.yml
|
||
```
|
||
### Installation des Gems
|
||
|
||
> **Important**: Votre `/home` ne doit pas être monté avec l'option `noexec`.
|
||
|
||
```
|
||
$ bundle install -j$(nproc) --deployment --without development test mysql aws kerberos
|
||
```
|
||
|
||
### Installation de GitLab Shell
|
||
|
||
```
|
||
$ bundle exec rake gitlab:shell:install REDIS_URL=unix:/var/run/redis/gitlab-demo00.sock RAILS_ENV=production SKIP_STORAGE_VALIDATION=true
|
||
$ sed ca_file?
|
||
$ chmod -R ug+rwX,o-rwx /home/gitlab-demo00/repositories/
|
||
$ chmod -R ug-s /home/gitlab-demo00/repositories/
|
||
$ chmod g+s /home/gitlab-demo00/repositories/
|
||
```
|
||
|
||
### Install gitlab-workhorse
|
||
|
||
```
|
||
$ cd
|
||
$ git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git
|
||
$ cd gitlab-workhorse
|
||
$ git checkout v0.8.5
|
||
$ make
|
||
```
|
||
|
||
TODO: Config mode multi instance ?
|
||
|
||
### Création de la BDD
|
||
|
||
```
|
||
$ cd /home/gitlab-demo00/gitlab
|
||
$ bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=yourpassword GITLAB_ROOT_EMAIL=youremail
|
||
```
|
||
|
||
> **Note :** `GITLAB_ROOT_PASSWORD` concerne le mot de passe de l'utilisateur admin nommé root sur l'interface web de GitLab et `GITLAB_ROOT_EMAIL` le mail associé. Conservez un espace avant la commande pour qu'elle ne se retrouve pas dans l'historique bash.
|
||
|
||
### Sauvegarder secrets.yml
|
||
|
||
Le fichier `secrets.yml` contient les clés de chiffrements pour les sessions et les variables. On pourra le copier dans `/root` par exemple, à vous de choisir l'endroit approprié.
|
||
```
|
||
# install -m 600 -o root -g root /home/gitlab-demo00/gitlab/config/secrets.yml /root/gitlab-demo00.secrets.yml
|
||
```
|
||
|
||
### Mise en place d'un script d'init
|
||
|
||
GitLab ne supporte pas officiellement systemd… On doit donc encore passer pas un script d'init classique.
|
||
|
||
```
|
||
# sed -i s'/app_user="git"/app_user="gitlab-demo00"/' /home/gitlab-demo00/gitlab/lib/support/init.d/gitlab
|
||
# install -m 755 /home/gitlab-demo00/gitlab/lib/support/init.d/gitlab /etc/init.d/gitlab-demo00
|
||
# systemctl enable gitlab-demo00
|
||
# sed -i 's#script_path = "/etc/init.d/gitlab"#script_path = "/etc/init.d/gitlab-demo00"#g' /home/gitlab-demo00/gitlab/lib/tasks/gitlab/check.rake
|
||
# sudo -iu gitlab-demo00
|
||
$ cd gitlab
|
||
$ git commit -a -m 'change default user'
|
||
```
|
||
|
||
### Logrotate
|
||
|
||
```
|
||
# install -m 644 /home/gitlab-demo00/gitlab/lib/support/logrotate/gitlab /etc/logrotate.d/gitlab-demo00
|
||
# sed -i 's#/home/git/#/home/gitlab-demo00/#g'
|
||
```
|
||
|
||
### Vérifier l'état de l'installation
|
||
|
||
```
|
||
# sudo -iu gitlab-demo00
|
||
$ cd gitlab
|
||
$ bundle exec rake gitlab:env:info RAILS_ENV=production
|
||
```
|
||
|
||
### Compiler les Assets
|
||
|
||
```
|
||
$ bundle exec rake assets:precompile RAILS_ENV=production
|
||
```
|
||
|
||
### Démarrer l'instance
|
||
|
||
```
|
||
# /etc/init.d/gitlab-demo00 start
|
||
```
|
||
|
||
## Nginx
|
||
|
||
On utilise Nginx car c'est le seul serveur web supporté officiellement par GitLab.
|
||
|
||
> **Note** : La partie SSL/TLS n'est pas évoqué. À 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.
|
||
|
||
### Création du vhost
|
||
|
||
```
|
||
# install -m 644 /home/gitlab-demo00/gitlab/lib/support/nginx/gitlab-ssl /etc/nginx/sites-available/gitlab-demo00
|
||
# sed -i -e 's#/home/git/#/home/gitlab-demo00/#g' \
|
||
-e 's/YOUR_SERVER_FQDN/demo00.gitlab.example.com/g' \
|
||
-e 's#/var/log/nginx/gitlab#/var/log/nginx/gitlab-demo00#g' \
|
||
/etc/nginx/sites-available/gitlab-demo00
|
||
# ln -s /etc/nginx/sites-available/gitlab-demo00 /etc/nginx/sites-enabled/
|
||
# /etc/init.d/nginx restart
|
||
|
||
```
|
||
|
||
|
||
## Terminé !
|
||
|
||
### Vérifier le status
|
||
|
||
```
|
||
# sudo -iu gitlab-demo00
|
||
$ 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 https://demo00.gitlab.example.com
|
||
|
||
# Mise à jour
|
||
|
||
## Mineure
|
||
|
||
Pour les mises à jour mineure, par exemple de 8.13.5 vers 8.13.6, c'est surtout basé sur un simple `git pull` et un `git checkout`.
|
||
|
||
### Backup
|
||
|
||
```
|
||
# sudo -iu gitlab-demo00
|
||
$ cd gitlab
|
||
$ bundle exec rake gitlab:backup:create RAILS_ENV=production
|
||
```
|
||
|
||
### Arrêt du service
|
||
|
||
```
|
||
# /etc/init.d/gitlab-demo00 stop
|
||
```
|
||
|
||
### Mise à jour de GitLab
|
||
|
||
```
|
||
# sudo -iu gitlab-demo00
|
||
$ cd gitlab
|
||
$ git fetch --all
|
||
$ git checkout -- Gemfile.lock db/schema.rb
|
||
$ git checkout v8.13.6 -b v8.13.6
|
||
$ sed -i s'/app_user="git"/app_user="gitlab-demo00"/' lib/support/init.d/gitlab
|
||
$ sed -i 's#script_path = "/etc/init.d/gitlab"#script_path = "/etc/init.d/gitlab-demo00"#g' lib/tasks/gitlab/check.rake
|
||
$ git commit -a -m 'change default user'
|
||
```
|
||
|
||
### Mise à jour de gitlab-shell
|
||
|
||
```
|
||
$ cd ~/gitlab-shell
|
||
$ git fetch
|
||
$ git checkout v$(cat ~/gitlab/GITLAB_SHELL_VERSION) -b v$(cat ~/gitlab/GITLAB_SHELL_VERSION)
|
||
```
|
||
|
||
### 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 db:migrate RAILS_ENV=production
|
||
$ bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production
|
||
```
|
||
|
||
### Démarrer GitLab
|
||
|
||
```
|
||
# /etc/init.d/gitlab-demo00 start
|
||
# /etc/init.d/nginx restart
|
||
```
|
||
|
||
### Vérifier le status
|
||
|
||
```
|
||
# sudo -iu gitlab-demo00
|
||
$ 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é !
|
||
|
||
## Majeure
|
||
|
||
Pour les mises à jour majeure, par exemple de 8.13 à 8.14, il y a une documentation officielle bien défini.
|
||
[Liste des documentations d'upgrades majeure.](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/update)
|
||
|
||
> **Note** : Si nous n'avons pas encore écrit le howto de migration, il faudra bien penser à faire les adaptations nécessaires (chemin, nom d'utilisateur, …).
|
||
|
||
# Création d'une autre instance
|
||
|
||
Il suffit de rejouer la procédure en modifiant « gitlab-demo00 » par le nom d'instance souhaitée. |