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

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
Merci beaucoup pour ce super article qui m’a permis de lancer un gitlab en quelques minutes 🙂 !