Tutoriel, installation de Gogs sur Debian
Gogs est un logiciel de "forge logicielle" écrit en Golang. Dans ce tutoriel je vous détaille son installation:
- sur un serveur ayant MariaDB et Nginx déjà installés (le serveur dédié qui héberge ce blog en fait),
- sans containérisation Docker[1],
- avec un port pour le "git over ssh" différent du port de l'administration du serveur qui lui a été durci [2].
Si jamais vous souhaitez dédier un serveur (ou une VM) uniquement à gogs, je vous recommande de ne pas faire comme sur ce billet, et vous passer du reverse proxy Nginx. Gogs sait fournir lui même du https.
Je stocke toute l'installation dans /data/git. N'hésitez pas à adapter ce chemin en fonction de vos contraintes, votre partitionnement, vos points de montage serveur etc....
Installer GO
#Les commandes suivantes sont à éxécuter avec le compte root (su ou sudo su) #Installer git apt-get install git #Créer l'user git qui fera tourner gogs adduser --home /data/git --disabled-login --gecos 'Gogs' git #Les commandes suivantes sont à éxécuter avec le compte git su - git #Creer le dossier pour accueillir go mkdir $HOME/local && cd $_ #Installer GO wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz tar -C /data/git/local -xvzf go1.10.3.linux-amd64.tar.gz #Placer les variables d'environnement dans le .bashrc de l'user git. echo 'export GOROOT=$HOME/local/go' >> $HOME/.bashrc echo 'export GOPATH=$HOME/go' >> $HOME/.bashrc echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> $HOME/.bashrc source $HOME/.bashrc #Vérifier que go fonctionne: go version #doit retourner: # go version go1.10.3 linux/amd64
Installer Gogs:
#Les commandes suivantes sont à exécuter avec l'user git (su - git) #L'environnement go possède des outils pour installer #des sources directement depuis des dépôts git go get -u github.com/gogs/gogs cd $GOPATH/src/github.com/gogs/gogs #Compiler gogs go build #démarer gogs pour le test ./gogs web
Il retourne ceci:
2018/06/18 11:11:56 [ WARN] Custom config '/data/git/go/src/github.com/gogs/gogs/custom/conf/app.ini' not found, ignore this if you're running first time 2018/06/18 11:11:56 [TRACE] Custom path: /data/git/go/src/github.com/gogs/gogs/custom 2018/06/18 11:11:56 [TRACE] Log path: /data/git/go/src/github.com/gogs/gogs/log 2018/06/18 11:11:56 [TRACE] Log Mode: Console (Trace) 2018/06/18 11:11:56 [ INFO] Gogs 0.11.56.0613 2018/06/18 11:11:56 [ INFO] Cache Service Enabled 2018/06/18 11:11:56 [ INFO] Session Service Enabled 2018/06/18 11:11:56 [ INFO] Run Mode: Development 2018/06/18 11:11:56 [ INFO] Listen: http://0.0.0.0:3000
Dans mon cas, ça fonctionne, il écoute bien sur le port 3000. crtl +C pour arréter gogs, puis exit pour sortir de l'user git.
Bases de données.
Comme indiqué, je suppose que vous avez MariaDB (avec les connecteurs mysql) ou MySQL sur le serveur.
mysql -u root -p
Dans le prompt Mariadb ou MySQL:
CREATE DATABASE gogs; GRANT ALL ON gogs.* TO 'gogs'@'localhost' IDENTIFIED BY 'YourThugPassword'; FLUSH PRIVILEGES; exit
Charger la structure de la base[3]:
mysql -u root -p gogs < /data/git/go/src/github.com/gogs/gogs/scripts/mysql.sql
Configuration de Nginx
Notez que la directive client_max_body_size 500m; est un ajout de ma part, totalement arbitraire. Les valeurs par défaut de Nginx sont cependant bloquantes pour des gros push en https.
Adaptez le server_name, les chemins de vos certificats dans l'exemple ci dessous.
server { listen 80; server_name example.com; return 302 https://$server_name$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/certificate_key.key; client_max_body_size 500m; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://localhost:3000; } }
#tester la configuration nginx -t # si ok redémarrer nginx service nginx restart
Script de démarrage automatique de gogs.
Créez le fichier /etc/systemd/system/gogs.service
Il est probable que vous ayez à changer dans l'exemple ci dessous:
- mariadb.service par mysql.service
- Tous les chemins /data/git par le chemin de votre architecture.
[Unit] Description=Gogs (Go Git Service) After=syslog.target After=network.target After=mariadb.service After=nginx.service [Service] Type=simple User=git Group=git WorkingDirectory=/data/git/go/src/github.com/gogs/gogs ExecStart=/data/git/go/src/github.com/gogs/gogs/gogs web Restart=always Environment=USER=git HOME=/data/git [Install] WantedBy=multi-user.target
Activer le script:
systemctl enable gogs
systemctl start gogs
Paramétrages de Gogs.
Rendez-vous à l'adresse https://VotreServeurGogs.[4]
Voila, la page que vous devriez obtenir:
Les champs que je ne mentionne pas, c'est parceque c'est du bon sens (et de toutes façons, on reprendra certains points de paramétrage plus loin avec le fichier de config).
- Type de base: Mysql
- Hôte: 127.0.0.1:3306
- Utilisateur: gogs
- Mot de Passe: YourThugPassword
- (...)
- Domaine your.serveur.tld (Le full qualified domain name de votre serveur)
- Port SSH 2222
- Cocher "Utiliser le serveur SSH incorporé"
- Port: 3000 (laisser le port 3000 même si on le le met pas dans l'URL vu qu'on utilise un reverse proxy
- URL: https://your.serveur.tld/
On ne remplit pas les blocs "Paramètres du service de messagerie ", "Paramètres du serveur et des autres services ", " Paramètres du compte administrateur " maintenant.
Click sur "installer gogs"
On s'inscrit (le premier compte inscrit sera administrateur) puis on se connecte, et ça marche:
Mais ce n'est pas fini, non non, il reste à faire:
- Régler le smtp
- Fermer l'écoute sur le port 3000
Post configuration
un petit tour dans le fichier /data/git/go/src/github.com/gogits/gogs/custom/conf/app.ini
- HTTP_ADDR = 172.0.0.1 sert à indiquer à gogs qu'il ne doit répondre qu'aux connexions locales (le reverse proxy nginx).
- Le bloc [mailer] , je vous laisse prendre exemple pour tu smtp authentifié avec STARTTLS
Avec des mots de passe bidons, voici celui qui sert au gogs du Hackerspace ventres mous.
APP_NAME = VentresMousGit RUN_USER = git RUN_MODE = prod [database] DB_TYPE = mysql HOST = 127.0.0.1:3306 NAME = gogs USER = gogs PASSWD = YourThugPassword SSL_MODE = disable PATH = data/gogs.db [repository] ROOT = /data/git/gogs-repositories [server] DOMAIN = git.ventresmous.fr HTTP_PORT = 3000 HTTP_ADDR = 127.0.0.1 ROOT_URL = https://git.ventresmous.fr/ DISABLE_SSH = false SSH_PORT = 2222 START_SSH_SERVER = true SSH_LISTEN_PORT = 2222 OFFLINE_MODE = false [mailer] ENABLED = true HOST = new.tinad.fr:587 USER = git@ventresmous.fr PASSWD = YourThugEmailPassword FROM = git@ventresmous.fr [service] REGISTER_EMAIL_CONFIRM = true ENABLE_NOTIFY_MAIL = true DISABLE_REGISTRATION = false ENABLE_CAPTCHA = true REQUIRE_SIGNIN_VIEW = false [picture] DISABLE_GRAVATAR = false ENABLE_FEDERATED_AVATAR = false [session] PROVIDER = file [log] MODE = file LEVEL = Info ROOT_PATH = /data/git/go/src/github.com/gogs/gogs/log [security] INSTALL_LOCK = true SECRET_KEY = fghsdfghsdfghdf
Pour que vos modifications dans ce fichier soient prises en compte:
systemctl restart gogs
Mettre à jour golang et gogs.
Mettre à jour go.
#Les commandes suivantes sont à exécuter en tant que "git" su - git #faire un backup avant tar -zcvf ~/local/go-old.tar.gz ~/local/go/ #purger l'ancienne version rm -rf ~/local/go cd ~/local #télécharger et décompression la nouvelle version wget https://dl.google.com/go/LastVersionDeGo.linux.amd64.tar.gz tar -C /data/git/local -xvzf LastVersionDeGo.linux.amd64.tar.gz # Vérifier go version #recompiler gogs cd ~/go/src/github.com/gogs/gogs/ go build #repasser root exit #Redémarrer le service gogs service gogs restart
Mettre à jour Gogs
#Les commandes suivantes sont à exécuter en tant que "git" su - git go get -u github.com/gogs/gogs cd $GOPATH/src/github.com/gogs/gogs #Compiler gogs go build #repasser root exit service gogs restart
Liens et conclusion
Voilà, j'ai tout ce qu'il faut pour quitter Ms Github.
Je vous laisse découvrir les fonctionnalités sur l'interface de gogs. Pour écrire ce tutoriel, je me suis basé sur:
- Install Gogs on Debian 9 with nginx and PostgreSQL (Qui n'est plus trop à jour, mais fonctionne quand même en adaptant les URL des dépôts git et les numéros de version.)
- La documentation de Gogs
Notes
[1] Why? J'utilise docker pour certains services sur le serveur, mais là j'ai préféré m'en passer parce que Hormis Golang et gogs tous les éléments sont déjà fournis par le serveur. Et la mappage de l'image Docker avec un serveur postgre ou mysql et avec les dossier repository, au final, ça donne un truc plus compliqué que de l'installer à l'ancienne.
[2] Et je pense que c'est sécurisant. Laisser Gogs gérer son SSH qui du coup ne permettra que les commandes git sans risque de débordement
[3] Lors de l'installation plus loin, il est censé créer la structure, mais il semble y avoir un bug. Il faut le faire maintenant, c'est plus simple.
[4] Si jamais ça ne fonctionnait pas, allez y sur http://VotreServeurGogs:3000 et je vous laisse voir si le problème vient de gogs ou du reverse proxy