git-logo

[Synology] Serveur de dépôts Git

Cet article a été rédigé il y a 5 années ! Il commence à dater, mais n'est pas forcément obsolète.. Lisez-le en gardant cela en tête !
Bonjour, Un grand incontournable sur un serveur, lorsqu’on fait du versionning, est sans aucun doute le serveur de dépôts Git. Nous allons voir comment l’installer et ce en un temps record sur un serveur Synology, avec un système complet d’authentification rsa et une interface web. Voyez le résultat : http://git.gauss-it.net

I) Installation de Git & Gitolite

En quelques mots pour les personnes ne connaissant pas Gitolite, il s’agit d’un système de dépots git avec gestion des droits L’installation de Git et Gitolite étant simplifiée à l’aide de Geasy (Cf. Prérequis), nous allons commencer par générer une paire RSA qui nous permettra d’utiliser un système d’authentification par clef RSA.

a. Générer une Paire RSA :

Installer le paquet sur Linux :
sudo apt-get update && sudo apt-get install ssh
Installer le paquet sur Mac OSX : Le paquet est installé par défaut Installer le paquet sur Windows : ? (Good luck !) Enfin lancez la commande suivante pour créer la clef, quelque soit le système d’exploitation unix que vous utilisez :
ssh-keygen -t rsa
Vous aurez à remplir un formulaire. Laissez les champs passphrases vides, bref appuyez continuellement sur ENTRER.  (sauf peut-etre votre nom :-] ?) Ne changez pas le nom id_rsa sur la clef privée, laissez là dans le dossier .ssh, de toute façon cette clef vous allez vous en resservir pour tout système demandant une authentification rsa, il n’y a pas d’intérêt d’en recréer d’autres. Cependant ne donnez JAMAIS votre clef privée, elle doit rester sur votre ordinateur. Donner uniquement la clef .pub aux gens qui vous réclament une clef rsa. La clef publique par contre vous pouvez changer son nom et la laisser en libre accès quelque part (expl : http://partage.gauss-it.net/rsa) En résumé :
  1. Il faut conserver la clef privée dans le dossier ~/.ssh et ne JAMAIS la donner !
  2. Prendre la clef publique .pub et la donnez à quiconque voudrait vous donner accès à une machine via un système d’authentification rsa.

b. Installation via Geasy

Geasy (Cf. prérequis) prend ici tout son sens, car vous n’avez qu’à lancer la commande suivante pour installer Git et Gitolite. Il ne vous reste plus qu’à suivre les instructions du terminal pour correctement installer git-gitolite.
geasy install git-gitolite
Voilà vous possédez à présent un serveur de dépôt Gitolite, si tout c’est correctement passé, et c’est ce que nous allons vérifier tout de suite !

d. Tester que tout fonctionne

Parce qu’il est vite arrivé qu’un problème débarque de nul part, déconnectez vous du terminal et lancez la commande suivante : (en modifiant monserveur.tld par le votre)
ssh git@monserveur.tld
Si tout fonctionne vous aurez le message suivant :
PTY allocation request failed on channel 0 hello VOTRE_PSEUDO, this is git@monserveur.tld running gitolite3 v3.5.1-5-g412d9ab on git 1.8.2.3 R W gitolite-admin R W testing Connection to monserveur.tld closed.
Sinon contactez-moi ou laissez un commentaire si il y a une problème, on trouvera une solution. 🙂 À partir de là, il ne vous reste plus qu’à configurer vos repos en clonant sur votre ordinateur le dépôt gitolite-admin. Voilà un peu d’aide : http://gitolite.com  

II) Installation de Gitweb :

Dans le paquet que vous allez installer, j’ai mis Gitweb, ainsi qu’un habillement plus moderne pour que votre service soit plus joli ! De plus j’ai légèrement modifié la page original pour rajouter un bouton qui donne accès au dossier gitweb/repositories/, dont on verra l’utilité plus tard. Pour l’instant lancez la commande suivante et suivez les instructions du terminal :
geasy install gitweb
N’oubliez pas de créer un hôte virtuel git qui pointe sur le dossier /volume1/web/git, depuis votre DSM. Et vous aurez accès à gitweb depuis http://git.example.org/ L’utilisateur par défaut étant admin via l’installation par Geasy  

III) Compléments & Astuces :

a. Visibilité d’un repo depuis gitweb

Pour créer des repositories visibles depuis gitweb, il faut que l’utilisateur http:http (Utilisateur APACHE,PHP) ait accès en lecture au dossier /volume1/homes/git/ et son contenu. Ce qui devrait être configuré par défaut via Geasy Je vous conseille d’utiliser le fichier de configuration ci-dessous, dans la mesure où vous avez installez gitolite via Geasy. http://partage.gauss-it.net/syno/gitolite.conf Ce dernier contient la configuration par défaut pour permettre à gitweb d’aller chercher les informations concernant les repos.  

b. Clef RSA : id_rsa

Par expérience personnelle, j’ai pu remarquer que si l’on change le nom ou l’on créé une clef privée avec un nom différent de id_rsa, la connexion à gitolite par ssh ne marchera pas.. Pas de problème pour id_rsa.pub, vous pouvez lui mettre le nom que vous voulez. De plus, de manière générale, vous n’allez utiliser qu’une clef rsa pour toutes les authentifications rsa que vous aurez à faire, il serait à priori inutile d’en créer plusieurs.. !  

c. Dossier /volume1/web/git/repositories/ et Autopull

J’ai évoqué avant un dossier "repositories/" et un "bouton" au sujet de l’interface modifiée de gitweb. Ce dossier est créé pour vous permettre d’afficher le contenu d’un repository. Si vous faites un site web, une application web, etc.. Vous pourrez voir le résultat directement en ligne depuis http://git.example.org/repositories/mon_depot/ en clonant le repo dans le dossier /volume1/web/git/repositories/ Lancez donc les commandes suivantes pour cela :
cd /volume1/web/git/repositories/ git clone /volume1/homes/git/repositories/mon_depot
Attention : Le propriétaire de ce repository doit être git:users pour qu’il puisse puller le repo par la suite
chown git:users -R /chemin/vers/repositories/nom_du_repo/
  A présent vous allez rendre automatique cette commande de mise à jour à l’aide du dossier hooks, contenu dans chaque repo que vous souhaitez automatiser. Il y a des fichiers qui permettent d’effectuer des actions en tant qu’utilisateur git, avant et après la transmission de nouveaux commits. (/var/services/homes/git/repositories/mon_depot/hooks/) Bref, vous pouvez tout automatiser.. Le fichier que nous allons utiliser ici est le fichier post-receive. S’il n’existe pas créez-le et ajoutez-y les commandes suivantes :
#! /bin/sh cd /volume1/web/git/repositories/mon_depot git pull
N’oubliez pas de changer les droits du fichier post-receive, si nouvellement créé pour permettre son exécution. De cette façon à chaque fois que vous poussez des commits, le dossier du repo est mis à jour et votre site sera mis à jour automatiquement à l’adresse http://git.example.org/repositories/nom_du_repo !  

d. Erreur à la mise à jour de git

J’ai été surpris de voir l’erreur apparaître, une fois git mis à jour ! Elle vous empeche de pusher un repo ou même de cloner. >( Voici la vilaine erreur :
WARNING: Can’t exec "git": No such file or directory at /volume1/homes/git/gitolite/src/commands/info line 55, line 1. WARNING: Use of uninitialized value in substr at /volume1/homes/git/gitolite/src/commands/info line 55, line 1. WARNING: substr outside of string at /volume1/homes/git/gitolite/src/commands/info line 55, line 1.
Pour palier à cela, il faut recréer les liens symboliques de la façon suivante :
ln -s /opt/bin/git* /usr/bin
Une fois cela fait, plus de problèmes !! Une solution propre, magique, comme on les aime 🙂  

e. Premier push

Le premier push doit toujours se faire de cette façon :
git push -u origin master
Toutefois pour les suivants, git push suffira ! Encore faudra t’il se trouver dans la bonne branche !!  

f. Backup et restauration des repos

(Ajout du 31/05/2015) Il arrive de se planter avec le serveur gitolite et je me suis déjà retrouvé avec des repositories foireux.. Plus moyen d’afficher les repos sur gitweb et la commande push me sortait des erreurs pas très rassurantes. Je me suis alors mis en quête d’un moyen de restaurer mes projets clonés dans un nouveau repo propre. La démarche est plutôt rapide : Depuis votre ordinateur :
git clone –bare git@gauss-it.net:monrepo.git ; cd monrepo.git
Si jamais vous avez le monrepo.git cloné sans –bare, et n’avez plus accès au repository :
cd monrepo.git/.git/
  Depuis le serveur git, une fois le clonage terminé :
rm -r monrepo.git ; mkdir monrepo.git ; cd monrepo.git git –bare init ; cd .. chmod 755 -R monrepo.git chown git:users -R monrepo.git
  Retour sur l’ordinateur (depuis le dossier –bare) :
git clone –mirror git@gauss-it.net:monrepo.git
  Voilà terminé, vous devriez avec ces commandes, lancez dans l’ordre, retrouver votre repo !

31 réponses à “[Synology] Serveur de dépôts Git

  1. Bonsoir,

    Ce tuto à l’air très intéressant. J’ai tout d’abord installé le module ipkg sur mon syno DS212. J’ai maintenant accès à la commande ipkg update / upgrade. En revanche, dès que j’exécute "ipkg install ssh-keygen" j’obtiens l’erreur "Cannot find package ssh-keygen"

    Avez-vous une idée ?
    Merci

    1. En effet, le package ssh-keygen n’existe pas ! Il n’y a rien a installer la commande ssh-keygen fonctionne par défaut sur le DSM dès que le service SSH est activé depuis le DSM.
      Je viens à l’instant de corriger le tutoriel.
      Si jamais d’autres erreurs subsistent n’hésitez pas à me le faire remarquer ! Je vous en serez très reconnaissant 🙂

      La commande à lancer finalement est la suivante : ipkg install openssh

    1. J’ai quelques peu changer l’architecture mon centre de partage, après l’article sur la création d’un dossier de partage publique.
      J’ai corrigé les liens morts dans l’article ! (Il suffit d’enlever public/ à l’adresse en fait)
      C’était une petite modification que j’ai fais dans le but d’alléger l’écriture ! Mais je me doutais que j’allais oublier des liens !! ^^

  2. Il est nécessaire de faire un chmod 775 sur le fichier install.sh sinon la commande "./install.sh mon_pseudo.pub" génère l’erreur suivante : "Permission denied"

    1. Oui je pense que c’est nécessaire sur install.sh, bon réflexe 🙂

      Personnellement étant sur mac, j’avais carrément directement généré la clef rsa sur mon ordi comme ça pas de soucis, je n’ai plus qu’à distribuer la clef publique !

      Je pense d’ailleurs qu’en passant par le syno pour généré la clef cela risque de créer des soucis pour accéder à gitolite via l’authentification rsa. Si jamais un problème apparaît lors du test pour voir si tout fonctionne, il est fort probable que le problème vienne de là. Faites moi en part et je réécrirai la partie malgré que je voulais resté indépendant de la plateforme utilisé, n’ayant pas windows ^^

    1. Surtout pas ! Sauf si votre pseudo c’est "git" ^^

      "votre_pseudo.pub" c’est la clef publique associée à VOTRE clef privée.
      Il n’y a pas un unique membre sur gitolite. Il peut en avoir autant que l’on souhaite, mais pour savoir qui est l’administrateur initial il faut entrer une première clef publique, la votre ici.

      Après gitolite s’administre à l’aide de git et permet de rajouter d’autres clefs publiques pour chacun des autres membres C’est pourquoi je met "votre_pseudo.pub" car vous êtes un membre (administrateur) parmis une infinité potentiellement.

  3. merci pour cette explication. Je n’arrive pas à me connecter en ssh avec l’utilisateur git, pourtant mon fichier passwd contient bien la ligne : git:x:1033:100::/var/services/homes/git:/sbin/ash

  4. Bonsoir,
    Je rencontre une erreur lors de l’execution du script install.sh pour gitolite
    Tout ce déroule correctement jusqu’à ce que, à la ligne 39 du script
    Voici le déroulement :
    NAS> ./install.sh id_rsa.pub
    Downloading http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/Packages.gz
    Inflating http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/Packages.gz
    Updated list of available packages in /opt/lib/ipkg/lists/cross
    Successfully terminated.
    Package make (3.82-1) installed in root is up to date.
    Nothing to be done
    Successfully terminated.
    Package git (1.8.2.3-2) installed in root is up to date.
    Nothing to be done
    Successfully terminated.
    Package mktemp (1.7-1) installed in root is up to date.
    Nothing to be done
    Successfully terminated.
    Package textutils (2.1-5) installed in root is up to date.
    Nothing to be done
    Successfully terminated.
    Cloning into 'gitolite'...
    remote: Counting objects: 8142, done.
    remote: Compressing objects: 100% (2705/2705), done.
    remote: Total 8142 (delta 5603), reused 7711 (delta 5270)
    Receiving objects: 100% (8142/8142), 1.85 MiB | 85 KiB/s, done.
    Resolving deltas: 100% (5603/5603), done.
    ./install.sh: line 39: /var/services/homes/git/gitolite/install: not found
    ./install.sh: line 40: gitolite: not found
    chmod: /var/services/homes/git/repositories/gitolite-admin.git: No such file or directory

    J’arrive à me connecter en ssh mais je dois rentrer mon mot de passe et je n’ai pas le message que tu décris lors de la connection.

    Merci pour ton aide

    1. Bonsoir,

      C’est drôle que tu aies cette erreur, il me semble que le repo gitolite n’a pas correctement été installé. Du coup l’installation de gitolite n’a pas lieu.

      Peux-tu lancer ces qqes commandes pour avoir une idée plus précises de ta situation? Connecte toi comme lors de ta première tentative.

      cd /var/services/homes/git/
      ls

      cd
      ls

      whoami

      De plus as tu correctement créé l’utilisateur git ? Enfin dans quel dossier se trouve ta clef id_rsa ?

  5. NAS> cd /var/services/homes/git/
    -rwxr-xr-x 1 git users 5160 Jul 23 23:30 .gitolite.rc
    -rw-r--r-- 1 git users 152 Jul 23 23:30 .profile
    drwxr-xr-x 2 git users 4096 Jul 23 23:30 bin
    drwxr-xr-x 5 git users 4096 Jul 23 23:30 gitolite

    NAS> cd /tmp/git-gitolite/
    -rwxrwxrwx 1 root root 479 Jun 15 12:48 README
    drwxrwxrwx 2 root root 100 Jul 17 01:44 __MACOSX
    -rwxrwxrwx 1 root root 108 Jul 17 01:36 autopull.sh
    -rwxrwxrwx 1 root root 5160 May 27 17:49 gitolite.rc.bak
    -rwxrwxrwx 1 root root 1210 Jun 5 01:38 install.sh

    NAS> whoami
    root

    Le user git a été créé dans l’admin du syno, avec les droits "utilisateur" sans accès aux dossiers partagés disponible.
    Voici la ligne dans /etc/passwd :
    git:x:1028:100::/var/services/homes/git:/bin/ash

    Avant le lancement du script ma clé pub est dans le dossier /tmp/git-gitolite/ mais apparement supprimée par le script.

    Merci ! 🙂

    1. Bonjour,

      Que le script ais supprimé la clef c’est un processus normal en vu de se que j’ai écrit ! Autrement elle se trouve bien au bonne endroit et l’utilisateur git semble être correctement configuré.

      Je te propose de réessayer la démarche (en remettant la clef .pub dans le dossier git-gitolite), car j’ai essayé l’installation à partir de ma clef publique dans la même configuration que toi et pas de soucis pour l’installation.

      Lance éventuellement la commande suivante aussi histoire d’avoir une idée plus claire du problème
      cd /var/services/homes/git/gitolite/
      ls

  6. Après avoir tout supprimé puis tout réinstallé, j’ai la même erreur…

    Ma clé pub est généré depuis mon poste sous ubuntu, je ne pense pas que cela pose problème.

    NAS> ll /var/services/homes/git/gitolite/
    drwxr-xr-x 5 git users 4096 Jul 24 20:44 .
    drwxr-xr-x 4 git users 4096 Jul 24 20:44 ..
    drwxr-xr-x 8 git users 4096 Jul 24 20:44 .git
    -rw-r–r– 1 git users 3821 Jul 24 20:44 CHANGELOG
    -rw-r–r– 1 git users 1315 Jul 24 20:44 CONTRIBUTING
    -rw-r–r– 1 git users 15170 Jul 24 20:44 COPYING
    -rw-r–r– 1 git users 13665 Jul 24 20:44 README.txt
    -rwxr-xr-x 1 git users 3656 Jul 24 20:44 check-g2-compat
    -rwxr-xr-x 1 git users 3667 Jul 24 20:44 convert-gitosis-conf
    -rwxr-xr-x 1 git users 2140 Jul 24 20:44 install
    drwxr-xr-x 7 git users 4096 Jul 24 20:44 src
    drwxr-xr-x 3 git users 4096 Jul 24 20:44 t

    Lorsque j’édite le fichier /var/services/homes/git/gitolite/install celui ci est bien présent

    1. Je ne sais pas si ta clef est mauvaise, car on n’a même pas le temps de la testé. Dans le 1er lors que tu as écrit, on voit clairement que tu ne démarres pas correctement le programme install.sh

      Je te propose de lancer ces commandes, après avoir mis ta clef id_rsa.pub dans le dossier /var/services/homes/git/, parcontre si cela ne marche pas.. Je ne vois pas trop quoi dire de plus. Le fichier existe, il est correctement configuré en droit et pourtant ton serv annonce que le fichier n’existe pas. ^^


      /var/services/homes/git/gitolite/install -ln
      gitolite setup -pk /var/services/homes/git/id_rsa.pub

    1. Le point d n’est juste qu’une phase de test, pour voir si l’on a bien mis en place la clef rsa.
      Si la clef a correctement été installée, alors vous verrez le message "PTY allocation request failed on channel 0…".
      Sinon si la demande de mot de passe apparait c’est que le système n’a pas réussi à déterminer votre identité via l’authentification rsa.

      Vous n’avez alors pas correctement installé la clef rsa !

    1. Bonjour,
      Je ne me suis jamais posé la question, mais une documentation en anglais est disponible pour gitolite, peut-être que cela est possible couplé avec le server Apache du syno!

      Il faudrait alors modifier les virtualhosts, mais je pense que c’est possible 🙂

      Bonne fin d’apres’m

  7. Ok, certains client Git ne fonctionnent qu’en HTTPS d’où ma question.
    Visual Studio par exemple, ce qui n’empêche en rien de bosser en command line mais c’est simplement pour plus de confort.

    Je verrai du coup si y’a moyen de bidouiller avec le package Git de Syno pour qu’il fonctionne en HTTPS.

    Bonne fin d’apès’m à vous aussi.

  8. Bonjour,

    Ma question va peut-être paraître un peu bête, mais est-ce que vous pensez que l’installation de GitLab à la place serait faisable ?

    Bonne journée 😉

    1. Bonjour,

      Votre question est tout à fait intéressante ! Je pense que l’installation de GitLab peut se tenter, ça vaut le coup, car ça a l’air très intéressant ! 🙂

      Mais je ne suis pas très confiant sur le résultat, car GitLab utilise Ruby et il me semble que le driver MySQL-Ruby a des problèmes avec l’encodage UTF-8. Le driver MySQL2 lui parcontre est assez difficile à installer, cela fait quelques mois que j’essaie sans succès 🙁

      Je veux bien avoir le retour de votre installation, si vous souhaitez essayer !

  9. Salut,
    merci pour toutes ces sources et tutoriaux que tu mets en ligne… ils m’ont été très utile.
    J’ai eu un soucis, qui ressemble grandement au commentaire de @neveralone : mon problème venait du fait que le package PERL ne semble pas être installé par défaut sur mon syno. Une fois ce package installé, tout le reste s’est passé correctement.
    Manu

    1. Salut ecaste,
      Merci pour la précision apporté concernant le package PERL, peut-être que le problème ne c’est pas présenté chez moi, car j’avais installé depuis longtemps le package PERL depuis le DSM, sans y avoir fait attention.
      J’ai prévu prochainement de faire le tour des paquets Geasy pour corriger les erreurs que j’ai noté (je ne sais pas si tu es passé par la pour installer Git)
      Je porterai une attention particulière à Git en tout cas ! 🙂

  10. Oui je suis passé par Geasy pour l’installation de GIT, je n’ai pas utilisé le package standard de DSM. Par contre j’ai des soucis pour l’installation de gitweb : de ce que je vois et comprends, on dirait que mon serveur web n’execute pas les script perl, en gros dans mon navigateur, je ne fais que naviguer au sein des repertoire /volume1/web/git/…
    Une idée ?
    Merci

    1. Il ne me semble pas que Gitweb utilise PERL parcontre. Pour Gitweb, l’idée est de retélécharger les sources de Git et de recopier quelques fichier pour à la fin obtenir un dossier cgi-bin et gitweb.cgi qui écoute ton serveur git.

      Est-ce que tu peux m’envoyer ta sortie standard ? Autrement est-ce que tu as accès à la page gitweb avec tes projet git ?
      http://dl.gauss-it.net

  11. Re,
    alors je t’ai envoyé une archive zip de 2 screenshots de ce que j’obtiens. Comme tu vas le voir, j’ai la sensation qu’il me manque pas mal de choses. Je pense que le hook fonctionne bien, lorsque je fais un commit, les fichiers sont bien ‘pull’ dans le rep web, mais il me manque l’interface…
    Merci

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *