Ceci est une ancienne révision du document !


en cours d'écriture

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

C'est la norme aujourd'hui, les projets, les utilisateurs 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. devel/git ;
  2. 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 ce 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:

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.

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

Et d'affecter à votre utilisateur comme groupe principal git_daemon:

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

Le seul protocole qui permettent un accès sécurisé aux utilisateurs est ssh(1).Attribuez les clefs ssh de votre utilisateur distant.

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:/ # service -j git sshd start

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:

# allow jail_git to connect to internet
nat on $ext_if inet6 from $jail_git to any -> ($ext_if)
# 
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:

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.1590330886.txt.gz
  • Dernière modification : 2020/05/24 14:34
  • de david