Premiere version.

This commit is contained in:
Benoît S. 2016-11-16 15:27:47 +01:00
parent e988d6ae4e
commit 3b8252b063

378
HowtoGitlab/8.13.md Normal file
View file

@ -0,0 +1,378 @@
---
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 ».
## Présentation de la brique
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
```
### 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
**TODO**
# Création d'une autre instance
Il suffit de rejouer la procédure en modifiant « gitlab-demo00 » pas le nom d'instance souhnaitée.