Dans cet article, je vais vous expliquer comment déployer Gogs, un serveur Git avec interface web, écrit en Go et bien plus léger que Gitlab. Nous utiliserons donc l’outils Docker-compose pour lancer Gogs et Nginx avec de l’HTTPS via Let’s Encrypt.
Gogs (Go Git Service) is a painless self-hosted Git service.
Pour commencer, on va préparer un dossier afin de recevoir notre stack Gogs :
mkdir /srv/Gogs mkdir -p /srv/Gogs/etc/nginx mkdir -p /srv/Gogs/etc/certs
Pour continuer, il faut que Docker soit installé sur votre serveur !
Pour cela, tapez ces commandes si ce n’est pas déjà fait (sur Debian jessie) :
On va ensuite générer nos certificats Let’s Encrypt en lançant un container. Il faudra choisir « Temporary Server » et renseigner finalement votre nom de domaine :
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
Voilà, vos certificats sont correctement générés. On va les copier dans notre dossier Gogs :
cp -r /etc/letsencrypt/ /srv/Gogs/etc/
Il nous reste le DHParam à générer à l’aide d’OpenSSL :
cd /srv/Gogs/etc/nginx/certs/ ; openssl dhparam -out dhparam.pem 2048
Il vous faut maintenant le fichier de configuration de Nginx, copiez le dans /srv/Gogs/etc/nginx/nginx.conf :
N’oubliez pas de remplacer git.domain.com par le nom de domaine que vous allez utiliser.
On peut désormais créer notre fichier docker-compose.yml qui va lancer nos deux containers :
vim /srv/Gogs/docker-compose.yml
gogs_web: image: nginx restart: always ports: - 443:443 - 80:80 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 links: - gogs_engine gogs_engine: image: gogs/gogs:latest restart: always ports: - 2222:22 expose: - "3000" volumes: - ./var/gogs:/data
Pour expliquer rapidement, il lance un premier container Nginx nommé gogs_web qui écoute sur les ports 80 et 443 avec plusieurs volumes (conf / certs) et relié à Gogs (link). Le second container est Gogs, se nomme gogs_engine et écoute sur le port 2222 pour SSH. Il expose son port 3000 (web) à Nginx (grâce au link). Il possède également un volume qui contiendra ses données comme les dépôts, la configuration…
Si vous êtes prêt, il y a plus qu’à démarrer notre Stack !
docker-compose up -d
Cette commande lance nos deux containers en mode détachés, utilisez docker-compose logs si il y a un soucis. On se rend enfin sur le port 443 de notre serveur et on arrive sur la page d’installation de Gogs :
Je vous suggère SQLite si vous ne voulez pas de base de données externe, sinon vous pouvez aisément ajouté un MariaDB à votre docker-compose.
Votre serveur Git est maintenant dispo, sécurisé et prêt à l’emploi !
You rock !! Merci pour tout 🙂
Je viens de découvrir ton blog. Tes articles sont de qualité. Bonne continuation !
Merci, ça fait très plaisir !
Bonjour,
Meric pour ce tuto, mais j’obtiens cette erreur au lancement du docker-compose :
Status: Downloaded newer image for gogs/gogs:latest
Creating gogs_gogs_engine_1
ERROR: for gogs_engine Invalid port specification: « 601342 »
Hello,
Essaie de mettre des quotes entre les numéros de port, exemple :
ports:
- "10443:443"
Très clair et franchement pour l’utiliser depuis plusieurs moi, c’est LE serveur git. De plus les mises a jours se font très simplement en mettant a jour l’image et en relançant le projet (up). Juste 2 petites choses
– il faudrait penser a utiliser la version 2 de la syntaxe de compose (beaucoup mieux structurée)
– il faudrait également utiliser les volumes docker ce qui rendra un grand service lors du passage a swarm (portabilité des data entre hôtes docker)
Salut, merci pour ton commentaire.
Pour la v2, il faudra que je jette un oeil à la doc ^^
Pour les volumes, j’ai l’impression de les utiliser dans mes deux containers (Nginx et Gogs), n’est-ce pas le cas ?
Salut ! Très bon tutoriel que j’ai réaliser sur mon serveur, marche impec ! Juste une chose :
dans le nginx.conf, j’ai été obliger d’ajouter :
« client_max_body_size 20m; »
Car lors d’un git push de l’un de mes projets, je suis rester bloquer à 2mo d’up, ce qui pour un gros projet c’est révélé un peu juste.