net:git

Donner accès à vos dépôt git

C'est devenu la norme aujourd'hui, pour leurs projets, les développeurs donnent accès à un dépôt git pour permettre à d'autres de télécharger leur travail. De base, git s'installe avec un démon et un serveur web pour faciliter cette approche.

Vous devez vous préparer à fournir les ports suivants:

  1. www/fcgiwrap si vous utilisez nginx;

Préparez une jail nommée git, dans le répertoire /jails/git avec les paramètres standards.

Installez devel/git qui amène le démon git_daemon.

Cnfigurez le tout pour recevoir vos dépôts dans /usr/local/git:

rc.conf
git_daemon_enable="YES"
git_daemon_flags="--syslog --reuseaddr --detach --verbose --base-path=/usr/local/git --export-all"

Ajoutez un premier dépôt:

root@git:/ # mkdir -p /usr/local/git
root@git:/ # cd /usr/local/git
root@git:/usr/local/git # git clone --bare --shared https://gitlab.com/TurtleCrazy/inkscape-1.0-freebsd.git
root@git:/usr/local/git # git init --bare --shared test
root@git:/usr/local/git # chown -R git_daemon:git_daemon *

La dernière ligne, qui donne des droits d'écriture à git_daemon ne sera utile qui si vous voulez permettre via un ou plusieurs utilisateurs un accès git distant.

Accéder aux dépôts

Démarrez le service:

root@popeye:/ # service -j git git_daemon start

Redirigez le port git,9418, vers votre jail.Ici, avec pf(4):

/etc/pf.conf
rdr pass on $ext_if proto tcp from any to ($ext_if) port 9418 -> $jail_git port 9418
rdr pass on $ext_if inet6 proto tcp from any to ($ext_if) port 9418 -> $jail_git port 9418

Serveur web

git-web est une interface gci qui va offrir un accès web vers vos dépôts.

Il peut être utilisé directement sous Apache, mais nécessite le port www/fcgiwrap pour fonctionner sous nginx. De plus, il va nous fournir une socket unix bien pratique pour accéder à notre jail.

Installez et configurez le:

root@popeye:/ # pkg -j git install www/fcgiwrap
root@popeye:/ # service -j git fcgiwrap start

Configurez nginx comme suit:

nginx.conf
        http{
                location /git {
                        alias /jails/git/usr/local/www/gitweb/;
                        index gitweb.cgi;
                }
                location ~ ^/git/gitweb.cgi  {
                        include fastcgi_params;
                        fastcgi_param SCRIPT_NAME gitweb.cgi;
                        fastcgi_param SCRIPT_FILENAME /usr/local/www/gitweb/gitweb.cgi;
                        fastcgi_pass unix:/jails/git/var/run/fcgiwrap/fcgiwrap.sock;
                }
        }

C'est l'outil embarqué avec git pour fournir une interface web. Il suffit d'en copier les fichiers d'exemple et de le configurer:

root@git:/usr/local/git # mkdir -p  /usr/local/www
root@git:/usr/local/git # cp -r /usr/local/share/examples/git/gitweb /usr/local/www/
/usr/local/www/gitweb/gitweb.cgi
--- /usr/local/share/examples/git/gitweb/gitweb.cgi     2020-05-20 09:07:32.000000000 +0000
+++ gitweb.cgi  2020-05-21 16:38:46.625856000 +0000
@@ -84,7 +84,7 @@
 
 # absolute fs-path which will be prepended to the project path
 #our $projectroot = "/pub/scm";
-our $projectroot = "/pub/git";
+our $projectroot = "/usr/local/git";
 
 # fs traversing limit for getting project list
 # the number is relative to the projectroot
@@ -98,7 +98,7 @@
 
 # name of your site or organization to appear in page titles
 # replace this with something more descriptive for clearer bookmarks
-our $site_name = ""
+our $site_name = "popeye.lapinbilly.eu"
                  || ($ENV{'SERVER_NAME'} || "Untitled") . " Git";
 
 # html snippet to include in the <head> section of each page

Et voilà.

david@loin:~>git clone git://popeye.lapinbilly.eu/inkscape-1.0-freebsd
Clonage dans 'inkscape-1.0-freebsd'...
remote: Enumerating objects: 68, done.
remote: Counting objects: 100% (68/68), done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 68 (delta 37), reused 68 (delta 37), pack-reused 0
Réception d'objets: 100% (68/68), 27.65 Kio | 272.00 Kio/s, fait.
Résolution des deltas: 100% (37/37), fait.

Jusqu'ici, vous utilisateurs peuvent cloner les dépôts via le protocole git:

david@loin:~>git clone git://popeye.lapinbilly.eu/inkscape-1.0-freebsd
Clonage dans 'inkscape-1.0-freebsd'...
remote: Enumerating objects: 68, done.
remote: Counting objects: 100% (68/68), done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 68 (delta 37), reused 68 (delta 37), pack-reused 0
Réception d'objets: 100% (68/68), 27.65 Kio | 272.00 Kio/s, fait.
Résolution des deltas: 100% (37/37), fait.

Vous pouvez bien sûr autoriser n'importe qui à faire n'importe quoi^W^W^W^W pousser ses propres modifications, en ajoutant les autorisations idoines à git_daemon.
Mais la plupart du temps, vous voudrez restreindre les modifications sur vos dépôts à quelques personnes triées sur le volet. Le seul protocole pris en charge par git, qui vous permette de faire cela simplement est ssh(1).

La première difficulté est la question des droits d'accès et l'emplacement des dépôts. Les utilisateurs doivent avoir le droit d'écriture dans les dépôts et git_daemon doit pouvoir y accéder en lecture.

Le plus simple est de laisser les dépôts dans /usr/local/git et de connecter un répertoire de l'utilisateur vers ce dernier:

root@git:/usr/local/git # su - david
$ ln -s /usr/local/git git
$ exit
root@git:/usr/local/git # chown -R david:git_daemon /usr/local/git/le_depot_a_david

Ou, faites en sorte que ce soit l'utilisateur qui créé le dépôt. Aussi, affecter à ce dernier le groupe principal git_daemon:

root@git:/usr/local/git # pw usermod david -g git_daemon

Attribuez les clefs ssh de votre utilisateur distant à l'utilisateur local à la jail.

Il faut que l'utilisateur puisse accéder à la jail en ssh(1).
Démarrez d'abord le service sshd(8) dans la jail.

root@popeye:/ # sysrc -j git sshd_enable='YES'
sshd_enable: no -> YES
root@popeye:/ # sysrc -j git sshd_flags="-o ListenAddress=192.168.0.13 -o ListenAddress=fc00::168:13"
sshd_flags:  -> -o ListenAddress=192.168.0.13 -o ListenAddress=fc00::168:13
root@popeye:/ # service -j git sshd start
Par défaut sshd écoute sur toutes les interfaces, les options sont là pour le restreindre aux adresses de la jail.

Maintenant, il faut connecter l'hôte à la jail. A moins d'interdire totalement l'accès ssh(1) sur l'hôte, il est peu probable que cela vous convienne, il faudra utiliser un autre port que le classique 22 pour se connecter à la jail.

Ici, le port 9022 est attribué par pf(4) pour cela:

/etc/pf.conf
# allow jail_git to connect to internet
nat on $ext_if inet6 from $jail_git to any -> ($ext_if):0
# 
rdr pass on $ext_if proto tcp from any to ($ext_if) port 9022 -> jail_git port 22
rdr pass on $ext_if inet6 proto tcp from any to ($ext_if) port 9022 -> $jail_git port 22
rdr pass on $ext_if proto tcp from any to ($ext_if) port 9418 -> jail_git port 9418
rdr pass on $ext_if inet6 proto tcp from any to ($ext_if) port 9418 -> $jail_git port 9418

Du coté du client, adaptez votre configuration ssh à la connexion git:

.ssh/config
Host git.popeye.lapinbilly.eu
    HostName popeye.lapinbilly.eu
    IdentityFile ~/.ssh/git_rsa 
    User git
    Port 9022

Enfin:

david@loin:~>git clone david@git.popeye.lapinbilly.eu:git/inkscape-1.0-freebsd
Clonage dans 'inkscape-1.0-freebsd'...
Enter passphrase for key '/home/david/.ssh/llanura': 
remote: Enumerating objects: 68, done.
remote: Counting objects: 100% (68/68), done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 68 (delta 37), reused 68 (delta 37), pack-reused 0
Réception d'objets: 100% (68/68), 27.65 Kio | 363.00 Kio/s, fait.
Résolution des deltas: 100% (37/37), fait.
  • net/git.txt
  • Dernière modification : 2022/05/31 20:18
  • de david