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 :
Les logins par défaut sont root
// 5iveL!fe
On peut vérifier la qualité de la connexion SSL avec SSLLabs :
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 !
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 ^^
docker-compose pull est également bien utile pour mettre toute la stack a jour 😉
Excellent post!!
Je me permet de partager ce repo https://github.com/sameersbn/docker-gitlab qui est réellement bien monté.
et `docker-compose down` … nice!
Cheers!
Pascal
Merci bien pour ce repo, je ne le connaissais pas et il est vraiment complet ! à voir si il suit les MaJ.
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
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’
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 🙂
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 ?
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.