Installer mon propre GitLab ✔️

Installer GitLab sur son propre serveur est une idée alléchante, mais qui s'avère être un parcours du combattant pour peu que vous ne soyez pas un habitué et que vous vouliez personnaliser un peu votre installation : mailing, HTTPS, et sous-domaine...

Pour ma part, après avoir pas mal tâtonner sur mon ancien VPS, j'ai fini par tout reprendre de zéro, et ai profité d'un serveur bien mieux dimensionner pour faire tourner convenablement mon instance GitLab, qui, il faut le dire, n'est pas si légère que ça.

Ici, je vous propose d'installer GitLab via l'image Docker officielle, et de l'exposer sur un de vos sous-domaines, le tout accessible en HTTPS, grâce à nginx et certbot (Let's Encrypt).

Docker

Commençons par le fichier docker-compose.yml

version: '3'

services:
    gitlab:
      container_name: gitlab
      image: gitlab/gitlab-ce:latest
      restart: always
      hostname: gitlab.corentindesfarges.fr
      environment:
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'https://gitlab.corentindesfarges.fr'
          nginx['listen_https'] = false
      ports:
        - '30443:443'
        - '3080:80'
      volumes:
        - $GITLAB_HOME/config:/etc/gitlab
        - $GITLAB_HOME/logs:/var/log/gitlab
        - $GITLAB_HOME/data:/var/opt/gitlab
docker-compose.yml

Il est important ici de déclarer les volumes à utiliser, afin de persister vos données et configurations.

J'ai choisi d'exposer GitLab sur les port 30443 (pour le HTTPS - 443) et 3080 (HTTP - 80) afin d'éviter tout conflit, mais vous êtes libre de choisir vos propres ports. Il faudra toutefois penser à les utiliser lorsque vous ferez le paramétrage du reverse proxy.

N'oubliez pas de définir votre hostname, en spécifiant le sous-domaine. Idem pour la variable d'environnement GITLAB_OMNIBUS_CONFIG, où il faut définir external_url. N'oubliez pas ici le protocol cible, à savoir https://.

Enfin, notez que nous allons configurer nginx nous-même afin de forcer l'accès en HTTPS, d'où le nginx['listen_https'] = false.

Définissez la variable d'environnement GITLAB_HOME sur votre serveur, comme suit :

export GITLAB_HOME=/srv/gitlab

Enfin, lancez la commande suivante pour démarrer votre instance :

docker-compose up

nginx

Il faut maintenant configurer votre reverse proxy, afin de rediriger correctement les appels vers votre instance sur votre sous-domaine.

Si ce n'est déjà fait, commencez par installer nginx :

sudo apt update
sudo apt install nginx

Créez ensuite le fichier /etc/nginx/conf.d/gitlab.conf, en remplaçant server_name par votre adresse (avec sous-domaine), et vérifiez que le port du proxy_pass correspond bien à ce que vous avez défini dans le docker-compose.yml.

# bloc de rediction http => https
server {
  listen 80;
  server_name gitlab.corentindesfarges.fr;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name gitlab.corentindesfarges.fr;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header HOST $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://127.0.0.1:30443;
    proxy_redirect off;
  }
}
/etc/nginx/conf.d/gitlab.conf

Enregistrez et relancez nginx :

sudo systemctl restart nginx

certbot

Comme d'habitude, on l'installe si on ne l'a pas déjà :

sudo apt update
sudo apt install certbot

Et puis on le lance, rien de plus simple ici :

sudo certbot --nginx

L'outil va automatiquement scanner vos configuration nginx, et vous proposera de choisir les domaines pour lesquels vous souhaitez obtenir un certificat SSL. Si vous avez plusieurs sous-domaines, pour éviter de gérer trop de certificat, n'hésitez pas à les resélectionner à chaque fois que vous lancerez la commande et choisissez (E)xpand lorsque ce choix vous sera suggéré.

Certbot vous proposera par la suite de rediriger vos appels HTTP vers HTTPS. N'acceptez pas, vous l'avez déjà fait dans votre gitlab.conf !

La suite ? Rendez-vous dans votre navigateur !