Installer Gitlab en https avec Docker et Nginx

277d9badcbd723e913b3a41e64e8d2f3d2c80598

Nous allons aujourd’hui utiliser la puissance de Docker pour créer une instance en https de Gitlab derrière un proxy Nginx.

docker_logo-1455828502290

Dans ce tuto, les ports 443 (SSL) et 22 (SSH) du conteneur sont mappés respectivement sur les ports 4431 et 2201 de l’host mais libre à vous de changer ces valeurs.
Cela veux dire que le reverse proxy de Nginx installé sur l’host devra « écouter » sur le port 4431 et que l’url SSH de vos dépôts sera du type « ssh://git@gitlab.example.com:2201/user/repo.git »

1 – Configuration du conteneur Docker

1.1 – Création du conteneur

Premièrement, il faut récupérer la dernière image Docker de Gitlab.

#https://hub.docker.com/r/gitlab/gitlab-ce/
docker pull gitlab/gitlab-ce

On lance ensuite le conteneur, n’oubliez par de remplacer gitlab.example.com par votre nom de domaine.
Les différents fichiers de Gitlab seronts stockés dans /srv/gitlab/

docker run --detach \
    --hostname gitlab.example.com \
    --publish 4431:443 --publish 2201:22 \
    --name gitlab.example.com \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    --volume /srv/gitlab/logs/reconfigure:/var/log/gitlab/reconfigure \
    gitlab/gitlab-ce:latest

1.2 – Configuration

Configuration de Gitlab /etc/gitlab/gitlab.rb

#ouverture de gitlab.rb dans le conteneur
docker exec -it gitlab.example.com vi /etc/gitlab/gitlab.rb

Dans le fichier gitlab.rb, remplacez les valeurs par défaut par les vôtres

#configuration de l'url de Gitlab. Notez le https.
#https://docs.gitlab.com/omnibus/docker/
external_url 'https://gitlab.example.com'

#modification du port ssh pour coller avec le mapping du conteneur
gitlab_rails['gitlab_shell_ssh_port'] = 2201

#configuration du smtp avec un compte gmail
#https://docs.gitlab.com/omnibus/settings/smtp.html
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "USERNAME@gmail.com"
gitlab_rails['smtp_password'] = "PSW_GMAIL"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = :plain
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'

# on garde les backups pendant 7 jours
#https://docs.gitlab.com/ee/raketasks/backup_restore.html
gitlab_rails['backup_keep_time'] = 604800

Reconfiguration de Gitlab pour prendre en compte les changements

docker exec -it gitlab.example.com gitlab-ctl reconfigure

1.3 – Alternative: docker-compose

Cette configuration peut être faite bien plus simplement avec docker-compose.

Après avoir fait un docker pull gitlab/gitlab-ce comme vu précédemment, on créé un fichier docker-compose.yml avec le contenu suivant:

web:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  hostname: 'gitlab.example.com'
  container_name: 'gitlab.example.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'https://gitlab.example.com'
      gitlab_rails['gitlab_shell_ssh_port'] = 2201
      gitlab_rails['smtp_enable'] = true
      gitlab_rails['smtp_address'] = "smtp.gmail.com"
      gitlab_rails['smtp_port'] = 587
      gitlab_rails['smtp_user_name'] = "USERNAME@gmail.com"
      gitlab_rails['smtp_password'] = "PSW_GMAIL"
      gitlab_rails['smtp_domain'] = "smtp.gmail.com"
      gitlab_rails['smtp_authentication'] = :plain
      gitlab_rails['smtp_enable_starttls_auto'] = true
      gitlab_rails['smtp_tls'] = false
      gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
      gitlab_rails['backup_keep_time'] = 604800
  ports:
    - '4431:443'
    - '2201:22'
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'

CF: https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/docker/docker-compose.yml

Si docker-compose n’est pas installé:

#https://docs.docker.com/compose/install/
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

Lancement du conteneur

docker-compose up -d

2 – Création du certificat SSL

Après avoir ouvert et redirigé le port 443 sur votre box ADSL, on peut utiliser letsencrypt pour générer des certificats gratuits. Attention, ces certificats ne sont valides que 90 jours, il faut penser à les renouveler.

#https://certbot.eff.org/#ubuntuxenial-other
apt-get install letsencrypt 
letsencrypt certonly --standalone -d gitlab.example.com

Copie des certificats dans le dossier config de Gitlab

cd /etc/letsencrypt/live/gitlab.example.com/
mkdir -p /srv/gitlab/config/ssl
chmod 700 /srv/gitlab/config/ssl
cp privkey.pem /srv/gitlab/config/ssl/gitlab.example.com.key
cp cert.pem /srv/gitlab/config/ssl/gitlab.example.com.crt

Reconfiguration de Gitlab pour prendre en compte les changements

docker exec -it gitlab.example.com gitlab-ctl reconfigure

3 – Configuration du reverse proxy sur la machine host

Dans ce tutoriel nous allons utiliser Nginx pour mettre en place un reverse proxy mais vous pouvez également utiliser Apache.

Installation de Nginx

apt-get install nginx

Configuration du proxy

cd /etc/nginx/
vim sites-available/gitlab.example.com

Contenu de /etc/nginx/sites-available/gitlab.example.com

## Redirects all HTTP traffic to the HTTPS host
server {
	listen 0.0.0.0:80;
	listen [::]:80 ipv6only=on;
	server_name gitlab.example.com; 
	server_tokens off;
	return 301 https://$http_host$request_uri;

	access_log  /var/log/gitlab.example.com80.access.log;
	error_log  /var/log/gitlab.example.com80.nginx_error.log debug;
}

server {
        listen *:443 ssl http2;

	ssl on;
	ssl_certificate /srv/gitlab/config/ssl/gitlab.example.com.crt;
	ssl_certificate_key /srv/gitlab/config/ssl/gitlab.example.com.key;

	ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4';
	ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
	ssl_prefer_server_ciphers on;
	ssl_session_cache  builtin:1000  shared:SSL:10m;
	ssl_session_timeout  5m;

	server_tokens off;

        server_name  gitlab.example.com;
        access_log  /var/log/gitlab.example.com.access.log;
        error_log  /var/log/gitlab.example.com.nginx_error.log debug;
        location / {
                proxy_pass         https://127.0.0.1:4431/;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }
}

Pour terminer:

ln -s /etc/nginx/sites-available/gitlab.example.com sites-enabled/giltab.example.com
/etc/init.d/nginx restart

4 – Première connexion

Rendez vous sur https://gitlab.example.com/ pour la première authentification.
Saisissez deux fois un mot de passe que vous choisissez et connecter vous avec l’utilisateur root et ce mot de passe.

Pour empêcher la création de compte allez sur: https://gitlab.example.com/admin/application_settings

5 – Mise à jour de l’image

Avec docker-compose, il suffit de lancer les commande suivantes:

docker-compose pull 
docker-compose up

Dans un prochain article, j’aborderai comment créer des backups et les restaurer.

Tutoriel réalisé sous Ubuntu Xenial (16.04 LTS)

sources:
https://docs.gitlab.com/omnibus/docker/
https://forum.gitlab.com/t/nginx-as-reverse-proxy-for-gitlab-with-ssl/1641
https://docs.gitlab.com/omnibus/settings/nginx.html
https://gitlab.com/gitlab-org/gitlab-recipes/raw/master/web-server/nginx/gitlab-omnibus-ssl-nginx.conf
ttps://gitlab.com/gitlab-org/gitlab-ce/issues/1331

Ce contenu a été publié dans la catégorie Tutoriel . Tags: , Bruce. Permalien.

A propos Bruce

Ingénieur informatique passionné par le développement, les nouvelles technologies et depuis quelques années par la blockchain et les crypto-monnaies. Je souhaite faire de la communauté Crypto-Lyon un espace ou tout le monde peut apprendre, s’informer et s’entraider et plus globalement faire rayonner la ville de Lyon dans le monde des cryptos !

Laisser un commentaire

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