Skip to content

Gitlab, Docker et Let’s Encrypt

docker-gitlab-banner

Dans cet article, nous allons voir comment déployer un serveur Gitlab rapidement sur du Docker, le tout sécurisé grâce à Let’s Encrypt. Nous aurons besoin de  Docker-compose afin d’orchestrer nos différents containers.

Pour déployer Gitlab sur Docker, nous aurons besoin de 2 containers :

  • Gitlab-ce, l’image officielle de Gitlab
  • Nginx qui servira de reverse proxy HTTPS

Pour mettre en place cela, nous allons commencer par générer nos certificats SSL puis nous pourrons ensuite créer notre fichier docker-compose.yml afin de gérer nos containers.

I – SSL avec Let’s Encrypt

Pour générer les certificats, rien de plus simple, on va utiliser Docker.

docker run -it --rm -p 443:443 -p 80:80 --name letsencrypt \
 -v "/etc/letsencrypt:/etc/letsencrypt" \
 -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
 quay.io/letsencrypt/letsencrypt:latest auth

Le lancement de ce container vous permet de générer les certificats, pour cela il faut accepter les règles d’utilisations et renseigner son domaine, nous utiliserons gitlab.example.com.

Une fois la manipulation terminée, vos certificats se retrouvent dans le répertoire /etc/letsencrypt de la machine hôte (grâce aux volumes).

II – Mis en place de la configuration

Nous allons maintenant pouvoir mettre en place notre configuration, pour cela nous nous placerons dans le dossier /srv/gitlab-docker. La première étape est de copier nos certificats dans ce dossier :

mkdir -p /srv/gitlab-docker/etc
cp -r /etc/letsencrypt /srv/gitlab-docker/etc/

Avant de continuer, nous allons générer le fichier dhparams.pem nécessaire pour la connexion HTTPS :

cd /srv/gitlab-docker
mkdir -p etc/nginx/certs ; cd etc/nginx/certs
openssl dhparam -out dhparams.pem 2048

Ensuite, nous allons mettre en place la configuration de Nginx, pour cela nous allons créer le fichier nginx.conf que vous trouverez ici. Copiez le contenu du fichier et placez le dans /srv/gitlab-docker/etc/nginx/.

Remplacez ensuite gitlab.example.com par votre nom de domaine.

Nos préparations sont terminées, nous allons pouvoir mettre en place notre fichier docker-compose.yml, que nous allons placer dans le répertoire /srv/gitlab-docker.

nginx:
 image: nginx
 restart: always
 ports:
   - 443:443
 volumes:
   - ./etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
   - ./var/log/nginx:/var/log/nginx
   - ./etc/letsencrypt:/etc/letsencrypt
   - ./etc/nginx/certs:/etc/nginx/certs
gitlab:
 image: 'gitlab/gitlab-ce:latest'
 restart: always
 hostname: 'gitlab.example.com'
 environment:
   GITLAB_OMNIBUS_CONFIG: |
   external_url 'https://gitlab.example.com'
   nginx['listen_https'] = false
   nginx['proxy_set_headers'] = {
   "X-Forwarded-Proto" => "https",
   "X-Forwarded-Ssl" => "on"
   } 
   nginx['listen_port'] = 80
   gitlab_rails['smtp_enable'] = true
   gitlab_rails['smtp_address'] = "smtp.gmail.com"
   gitlab_rails['smtp_port'] = 587
   gitlab_rails['smtp_user_name'] = "[email protected]"
   gitlab_rails['smtp_password'] = "password"
   gitlab_rails['smtp_authentication'] = "login"
   gitlab_rails['smtp_enable_starttls_auto'] = true
   gitlab_rails['smtp_tls'] = false
   gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
 ports:
   - '80:80'
   - '1022:22'
 volumes:
   - '/srv/gitlab-docker/config:/etc/gitlab'
   - '/srv/gitlab-docker/logs:/var/log/gitlab'
   - '/srv/gitlab-docker/data:/var/opt/gitlab'

La première partie du fichier lance un container Nginx qui récupère les certificats et la configuration que nous avons mise en place auparavant. La deuxième partie lance le container officiel de Gitlab (gitlab-ce edition) avec plusieurs volumes et des variables d’environnements qui vous permettrons de configurer Gitlab.

Concernant les ports, Nginx écoutera uniquement en HTTPS (443) et Gitlab sera disponible en HTTP (80) qui redirigera vers Nginx et sur le port 1022 pour la connexion SSH.

III – Lancement des containers

Maintenant que notre fichier docker-compose.yml est correctement configuré, on va pouvoir démarrer nos containers et vérifier que tout fonctionne.

cd /srv/gitlab-docker
docker-compose up

Vous allez voir Docker-compose démarrer et lier vos deux containers grâce à la configuration que vous lui avez donnée. Vous pouvez utiliser l’argument « -d » pour lancer les containers en mode détachés car sinon vous verrez les logs de Gitlab dans votre shell (pratique pour débugguer).

Gitlab prend un peu de temps à démarrer surtout au premier lancement (il génère les clés, sa configuration …). Au bout de quelques minutes, vous devriez pouvoir vous rendre sur votre domaine pour vous connecter à votre nouveau serveur Git :

gitlab_sign

Les logins par défaut sont root   // 5iveL!fe

On peut vérifier la qualité de la connexion SSL avec SSLLabs :

gitlab_ssl

Avec quelques modifications, il serait possible d’atteindre A+, cependant, c’est très correct.

IV – Mis à jours de Gitlab

Pour mettre à jour Gitlab, rien de plus simple (sinon on aurait pas fais ça avec Docker). On va donc récupérer la dernière image puis relancer nos containers :

docker pull gitlab/gitlac-ce:latest
docker-compose stop
docker-compose rm -f
docker-compose up -d

Et voilà, votre Gitlab a été mis à jour !

V – Conclusion

Vous remarquerez qu’il est très rapide de déployer un Gitlab sécurisé et approuvé (Let’s Encrypt) grâce à Docker. Pour ma part j’ai déployé cela sur un Scaleway C2 qui offre de très bonnes performances avec Gitlab. J’ai cependant pas mal galéré avec le SMTP coté configuration alors qu’il fallait l’autoriser dans les instances Scaleway (quel con). N’oubliez pas de Backuper le dossier /srv/gitlab-docker, qui peut être redéployé en 5 minutes sur n’importe quelle instance. J’ai également utilisé MailGun pour gérer les e-mails de Gitlab, très pratique !

 

Published inDevOpsDockerGitLinuxTutorielWebWeb server

11 Comments

  1. Pour arrêter et supprimer les docker du docker-compose, tu peux également utiliser « docker-compose down » (Disponible à partir de la version 1.6)

    • Cool merci pour l’astuce, c’était chiant de faire stop ; rm -f.

      • Je te laisse imaginer la joie que j’ai eu quand j’ai vue cette fonctionnalité instauré dans la 1.6 .Tout ça car j’avais la flemme de faire un alias ^^

    • Thomas BENOIT Thomas BENOIT

      docker-compose pull est également bien utile pour mettre toute la stack a jour 😉

    • valentin valentin

      Merci bien pour ce repo, je ne le connaissais pas et il est vraiment complet ! à voir si il suit les MaJ.

  2. Hello,

    Petite question sur le port 443.
    Je suis sur un VPS SSD OVH, j’ai un ISPConfig en https configuré.
    En suivant ton tutoriel, à la première étape j’ai cette réponse :

    docker: Error response from daemon: driver failed programming external connectivity on endpoint letsencrypt (da4….d09ce): Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use.

    Est il possible de configurer différemment sans perdre l’intérêt de la chaine https ?

    D’avance merci.

    f-red

    • valentin valentin

      Hello, ce message indique que le port 443 est déjà utilisé (par ton ISP ducoup), tu peux bien sûr modifier le docker-compose.yml afin d’écouter sur un autre port (4443 par exemple) :
      – ‘4443:443’

  3. Thomas BENOIT Thomas BENOIT

    Super article merci, juste une petite coquille dans le fichier docker-compose.yml, l’indentation du bloc contenu dans GITLAB_OMNIBUS_CONFIG: | n’est pas bonne est du coup le copier/coller ne fonctionnais pas chez moi.

    Merci 🙂

  4. Sylvain Sylvain

    Je bloque sur l’image letsencrypt pour créer des certificats, et j’ai du mal a trouver la doc en rapport avec cet image. Ou est ce que je peux trouver la doc de quay.io/letsencrypt/letsencrypt ?

    • valentin valentin

      Bonjour Sylvain,
      Je n’ai pas trouvé de « docs » pour cette image, mais si tu la lance avec l’argument « -h » ou « –help » tu aurais surement plus d’informations.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Proudly hosted with Open-sources Softwares.