ça n'a pas été facile, mais sayé! J'ai trouvé une solution pour avoir un repo GIT privé ET publique sur un serveur OVH mutualisé, le tout avec une petite interface web pour faire jolie! J'ai mis un bon WE, mais grâce à ce tuto vous ne devrez pas mettre plus d'une heure, c'est cadeau ;)




Sommaire

  1. Présentation
  2. GIT sur le serveur
  3. Installation d'Indefero sur notre serveur
  4. Configuration d'Indefero
  5. Utilisation d'Indefero par les membres (et vous, admin)
  6. Création et utilisation d'un projet git




Présentation

L'objectif est donc de pouvoir disposer d'un GIT privé mais aussi publique sur un serveur mutualisé OVH.
Il est facile de pouvoir disposer d'un git privé étant donné que git est disponible (enfin, une version dinosaure) sur les hébergements mutualisés OVH. Le seul problème est que pour y accéder (git clone, git push, git pull, ...) vous devez utiliser votre 'identifiant' ssh principal, que vous ne pouvez pas partager à d'autres membres du projet, pour des raisons de sécurité bien évidement. Vous me direz, il suffit d'ajouter les clés RSA des autres membres sur le serveur...mouiii, le seul hic c'est qu'il n'y a pas de restriction, ainsi vous donnerez un accès complet à votre serveur... :D

La solution choisie va ainsi :
  • permettre d'avoir une notion d'utilisateur.
  • proposer une interface web pour lister vos projets, leurs informations, ...
  • vous permettre de gérer des projets publiques et privés.

Voici à quoi ressemble Indefero : Indefero.

Ce tuto peut sembler long, ça été le cas pour l'écrire :D, mais sa mise en pratique l'est beaucoup moins, ne vous arrêtez pas à ça ;)

Dans ce tuto je pars du principe que vous sachez vous connecter en ssh et ftp à votre serveur.
Vous devez connaitre le chemin absolu de votre compte, pour cela tapez la commande pwd lors d'une session ssh avec votre serveur :
$ pwd
/homez.xxx/yyy/

Par la suite, lorsque je donnerais une commande ssh, je mentionnerais le chemin de cette manière :
ssh:/git/$ pwd
/homez.xxx/yyy/git

Ainsi, si je tape :
ssh:/$

Cela signifie que vous devez êtres à la racine de votre compte.

Dernière chose, si vous lisez yyy.eu cela correspond à votre nom de domaine.

Bon allez, on a du boulot, on ne traine pas!




GIT sur le serveur

La version de GIT présente sur OVH étant ultra vieille, il faut installer une version plus récente sur votre serveur mutualisé. Ceci est important pour la suite, ne sautez pas cette étape ;)

  • Téléchargez les sources de la dernière version : git-1.7.6.1.tar.bz2.
  • Décompressez l'archive sur votre PC
  • Ouvrez une session ssh avec votre serveur.
  • Créez les dossiers suivant :
    ssh:/$ mkdir -p opt/src/git
    ssh:/$ mkdir opt/git

  • Ouvrez une connexion ftp, et transférez le contenu de l'archive git que vous avez téléchargée précédemment dans le dossier opt/src/git/.
  • A l'aide de votre session SSH appliquez les droits suivants au dossier git :
    ssh:/opt/src/$ chmod -R 755 git/

  • Et on y va :
    ssh:/opt/src/$ cd git
    ssh:/opt/src/git/$ make clean
    ssh:/opt/src/git/$ make configure
    ssh:/opt/src/git/$ ./configure --prefix=$HOME/opt/git --without-tcltk
    ssh:/opt/src/git/$ make
    ssh:/opt/src/git/$ make install

    REMARQUE 1 :Si durant la compilation vous avez des problèmes de permission, appliquez un chmod +x sur le fichier en question. Petit exemple :
    ssh:/opt/src/git/$ chmod +x generate-cmdlist.sh

    REMARQUE 2 : Si la compilation échoue avec un message d'erreur '/bin/sh: msgfmt: command not found' utiliser la commande suivante pour compiler :
    ssh:/opt/src/git/$ make -i

    SOYEZ BIEN ATTENTIF AU RESULTAT DE LA COMPILATION, histoire de ne pas louper une erreur de compilation causée par un problème de permission!
  • Ensuite éditez le fichier .bash_profile pour faire connaitre notre installation de git au serveur :
    ssh:/$ nano .bash_profile

    Ajoutez la ligne en rouge :
    PATH=$PATH:$HOME/bin
    PATH=$HOME/opt/git/bin:$PATH

    Fermez nano avec un CTRL+X, O puis ENTER.

Et voila, nous avons une version récente de git sur notre serveur. Etape suivante !




Installation d'Indefero sur notre serveur

Indefero va nous permettre de manager nos projets à l'aide d'une interface web mais aussi de mettre en place les accès git pour vos logiciels favoris (ou ligne de commandes pour les vraies dures^^).

Pour bien vous organiser, vous devez considérer Indefero comme un site indépendant que vous mettriez sur votre serveur. En toute logique, il est bien d'organiser l'arborescence de votre serveur de cette manière :
/www/monsite1/
/www/monsite2/
/www/Indefero/

Pour ma part je vais considérer qu'Indefero sera installé comme présenté ci-dessus. Si vous ne suivez pas cette arborscence soyez bien attentif à la suite de ce tuto!

A titre indicatif, nos projets git seront organisés ainsi :
/git/projet1.git
/git/projet2.git

Allez, go go go!

  • Téléchargez la dernière version d'Indefero : Indefero downloads.
  • Décompressez et uploadez les fichiers de l'archive dans le dossier /www/Indefero
    REMARQUE : n'uploadez pas les fichiers .git*
  • Téléchargez Pluf : Pluf.
  • Décompressez, renommez le dossier pluf-master en pluf et uploadez le dans /www/Indefero/src/.
Maintenant vous devez créer un fichier .htaccess dans le dossier www/ d'Indefero. Ce dernier va nous permettre d'activer le rewrite_mode afin d'avoir des adresses comestibles lors de l'utilisation d'Indefero ;).
ssh:/www/Indefero/www/$ nano .htaccess

Contenu :

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) /index.php/$1
SetEnv PHP_VER 5
SetEnv REGISTER_GLOBALS 0
Options -Indexes

Dernière étape de cette installation!
  • Ouvrez le fichier /www/Indefero/scripts/gitserve.py.
  • Supprimez tout son contenu et mettez ceci à la place :
    #!/usr/bin/env python # -*- coding: utf-8 -*-
    #
    # Merci à ekozan : http://forum.ovh.com/showthread.php?t=71543
    #
    # ***** BEGIN LICENSE BLOCK *****
    # This file is part of InDefero, an open source project management application.
    # Copyright (C) 2008 Céondo Ltd and contributors.
    #
    # InDefero is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # InDefero is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
    #
    # ***** END LICENSE BLOCK ***** */
    import os
    import sys
    import commands
    import traceback

    n = len("/gitserve.py")
    GITSERVEPHP = '%s/gitserve.php' % traceback.extract_stack(limit=1)[0][0][0:-n]
    status, output = commands.getstatusoutput('php.BETA -q %s %s' % (GITSERVEPHP, sys.argv[1]))
    if status == 0:
    os.execvp('git', ['git', 'shell', '-c', output.strip()])
    else:
    sys.stderr.write("%s\n" % output)
    sys.exit(1)

    L'installation est terminée, nous devons maintenant configurer Indefero.




    Configuration d'Indefero

  • Première chose, Indefero a besoin d'une base de donnée (de type MySQL), créez en une depuis le ManagerOVH. Pour la suite je prendrai l'exemple d'une base se nommant yyyIndef.
  • Ensuite, sur votre PC allez dans le dossier Indefero/src/IDF/conf/.
  • Dupliquez les fichiers idf.php-dist et path.php-dist en supprimant le -dist sur chacun d'entre eux.
  • Maintenant regardons le fichier idf.php ensemble (c'est le gros du boulot). J'ai commenté les modifications et mis en rouge les lignes que vous devez modifier :
    // Ajoutez ces lignes
    define('PLUF_PATH', dirname(__FILE__).'/../../pluf/src');
    define('IDF_PATH', dirname(__FILE__).'/../..');

    set_include_path(get_include_path()
    .PATH_SEPARATOR.PLUF_PATH
    .PATH_SEPARATOR.IDF_PATH
    );


    $cfg = array();

    // On désactive le debug
    $cfg['debug'] = false;
    $cfg['debug_scm'] = false;

    // Chemin absolu de notre dossier git
    $cfg['git_repositories'] = '/homez.xxx/yyy/git/%s.git';

    // Chemin d'accès aux repo git.
    $cfg['git_remote_url'] = 'git://yyy.eu/%s.git';

    // Chemin d'accès indiqué aux utilisateurs (remplacez userssh par le vôtre)
    $cfg['git_write_remote_url'] = 'ssh://usersssh@yyy.eu/%s.git';


    // Chemin vers le fichier mettant à jour le fichier de clés
    $cfg['idf_plugin_syncgit_path_gitserve'] = '/homez.xxx/yyy/www/indefero/scripts/gitserve.py';

    // Fichier des clés à mettre à jour (pas d'importance pour nous OVHien^^)
    $cfg['idf_plugin_syncgit_path_authorized_keys'] = '/homez.xxx/yyy/git/.ssh/authorized_keys';

    // Propose de supprimer un dépôt automatiquement lors de la suppression d'un projet
    $cfg['idf_plugin_syncgit_remove_orphans'] = false;

    // Répertoire home de l'utilisateur git
    $cfg['idf_plugin_syncgit_git_home_dir'] = '/homez.xxx/yyy/git';

    // Chemin absolu du fichier de synchronisation
    $cfg['idf_plugin_syncgit_sync_file'] = $cfg['idf_plugin_syncgit_git_home_dir'].'/sync/SYNC-GIT';

    // Chemin des dépôts
    $cfg['idf_plugin_syncgit_base_repositories'] = '/homez.xxx/yyy/git';


    // On ne veut pas utiliser svn, on commente
    #$cfg['svn_repositories'] = 'file:///home/svn/repositories/%s';
    #$cfg['svn_remote_url'] = 'http://localhost/svn/%s';


    // De même, on ne veut pas de monotone, on commente
    #$cfg['mtn_path'] = 'mtn';
    #$cfg['mtn_opts'] = array('--no-workspace', '--no-standard-rcfiles');
    #$cfg['mtn_repositories'] = '/home/mtn/repositories/%s.mtn';
    #$cfg['mtn_remote_url'] = 'mtn://my-host.biz/%s';
    #$cfg['mtn_db_access'] = 'local';
    #$cfg['mtn_confdir'] = '/path/to/dir/tree/';
    #$cfg['mtn_confdir_extra'] = array('hooks.d/something.lua')
    #$cfg['mtn_usher_conf'] = '/path/to/usher.conf';


    // Pas de Mercurial, on commente
    #$cfg['mercurial_repositories'] = '/home/mercurial/repositories/%s';
    #$cfg['mercurial_remote_url'] = 'http://projects.ceondo.com/hg/%s';


    // Alors maintenant il faut configurer la partie mail. Cela permet d'envoyer un mail aux
    // nouveaux inscrit pour qu'ils puissent valider l'inscription. Pour cela je vous conseil de
    // créer une boite gmail et de configurer les champs ci-dessous.
    // Je ne commente pas chaque ligne pour la partie mail, c'est assez explicite^^
    $cfg['admins'] = array(
    array('Admin', 'mrplop@gmail.com'),
    );


    $cfg['send_emails'] = true;
    $cfg['mail_auth'] = true;//PENSEZ A AJOUTER CETTE LIGNE
    $cfg['mail_backend'] = 'smtp';
    $cfg['mail_host'] = 'ssl://smtp.gmail.com';
    $cfg['mail_port'] = 465;
    $cfg['mail_username'] = 'mrplop@gmail.com';
    $cfg['mail_password'] = 'SuperMotDePasseIntrouvable';


    // Ce que je vous conseil, c'est de créer un (sous-)domaine pour accéder directement
    // à votre Indefero. Je prendrais l'exemple d'un sous-domaine indefero.yyy.eu qui pointe
    // vers www/indefero/www/
    $cfg['idf_base'] = '';
    $cfg['url_base'] = 'http://indefero.yyy.eu';


    // Le dossier media est dans www/indefero/www/, on met donc notre sous-domaine
    // pour faire jolie :)
    $cfg['url_media'] = 'http://indefero.yyy.eu/media';
    $cfg['url_upload'] = 'http://indefero.yyy.eu/media/upload';


    // On indique le chemin absolu du dossier upload
    $cfg['upload_path'] = '/homez.xxx/yyy/www/indefero/www/media/upload';

    // On renseigne à nouveau le chemin absolu sur un autre dossier
    $cfg['upload_issue_path'] = '/homez.xxx/yyy/www/indefero/attachments';

    // Indiquez ici une clé secrète uniquement utile à Indefero :
    // au minimum 40 caractères, alors défoulez-vous sur votre clavier, c'est le bon moment ;)
    $cfg['secret_key'] = 'LaTechnologieThunderboltPermetDeTransfererDesDonneesALaVitesseDeLEclair';

    // L'identité du spameur
    $cfg['from_email'] = 'mrplop@gmail.com';
    $cfg['bounce_email'] = 'mrplop@gmail.com';

    $cfg['tmp_folder'] = '/tmp';

    // On renseigne les champs de notre base de donnée
    // Pour le champ 'db_server' vous aurez l'information depuis le ManagerOVH, le serveur
    // est de la forme mysqlxx-yy.zzz
    $cfg['db_login'] = 'yyyIndef';
    $cfg['db_password'] = 'SuperMotDePasseIntrouvable';
    $cfg['db_server'] = 'mysqlxx-yy.zzz';

    $cfg['db_version'] = '5.1'; # Only needed for MySQL
    $cfg['db_table_prefix'] = 'indefero_';

    // On utilise une base de donnée MySQL
    $cfg['db_engine'] = 'MySQL';
    $cfg['db_database'] = 'yyyIndef';


    # $cfg['idf_extra_upload_ext'] = 'ext1 ext2';

    // On défini la 'time_zone'
    $cfg['time_zone'] = 'Europe/Paris';

    $cfg['pear_path'] = '/usr/share/php';

    $cfg['login_success_url'] = $cfg['url_base'].$cfg['idf_base'];
    $cfg['after_logout_page'] = $cfg['url_base'].$cfg['idf_base'];

    $cfg['cache_engine'] = 'Pluf_Cache_File';
    $cfg['cache_timeout'] = 300;
    $cfg['cache_file_folder'] = $cfg['tmp_folder'].'/cache';

    $cfg['template_folders'] = array(
    dirname(__FILE__).'/../templates',
    );

    $cfg['installed_apps'] = array('Pluf', 'IDF');
    $cfg['pluf_use_rowpermission'] = true;
    $cfg['middleware_classes'] = array(
    'Pluf_Middleware_Csrf',
    'Pluf_Middleware_Session',
    'IDF_Middleware',
    'Pluf_Middleware_Translation',
    );

    $cfg['template_context_processors'] = array('IDF_Middleware_ContextPreProcessor');
    $cfg['idf_views'] = dirname(__FILE__).'/urls.php';

    $cfg['languages'] = array('en', 'fr', 'de', 'es_ES');

    $cfg['allowed_scm'] = array('git' => 'IDF_Scm_Git',
    'svn' => 'IDF_Scm_Svn',
    'mercurial' => 'IDF_Scm_Mercurial',
    'mtn' => 'IDF_Scm_Monotone',
    );

    // Enfin on renseigne le chemin de git que nous avons précédement installé
    $cfg['git_path'] = '/homez.xxx/yyy/opt/git/bin/git';

    return $cfg;

    Fiou, le plus gros est fait! Je vous rassure, j'ai fini de vous éclater les yeux avec tout ce rouge :p

  • Maintenant on modifie le fichier path.php. J'ai mis en rouge la ligne que vous devez modifier :
    define('PLUF_PATH', dirname(__FILE__).'/../../pluf/src');

    define('IDF_PATH', dirname(__FILE__).'/../..');

    set_include_path(get_include_path()
    .PATH_SEPARATOR.PLUF_PATH
    .PATH_SEPARATOR.IDF_PATH
    );

    (Diantre! je suis à une ligne rouge de saigner des yeux!)

    A présent nous sommes à 2,3 commandes de la fin de la configuration d'Indefero. Vérifiez bien vos informations et ensuite tapez cette commande par ssh :
    ssh:/www/indefero/www/$ php.BETA /homez.xxx/yyy/www/indefero/src/pluf/src/migrate.php --conf=/homez.xxx/yyy/www/indefero/src/IDF/conf/idf.php -a -i -d -u
    Vous devriez obtenir ces deux lignes :
    Pluf_Migrations_Install_setup
    IDF_Migrations_Install_setup

    REMARQUE : (mouai, je ne sais si le bleu est vraiement mieux^^) Ne continuez pas si vous obtenez des erreurs. Les erreurs sont en générales en lien avec votre base de données, vérifiez qu'elle est disponible (cela prend quelques minutes pour la créer du coté d'OVH) et que les informations que vous avez renseignées sont correctes.

    Si tout est bon, tapez la même commande mais sans le -u :
    ssh:/www/indefero/www/$ php.BETA /homez.xxx/yyy/www/indefero/src/pluf/src/migrate.php --conf=/homez.xxx/yyy/www/indefero/src/IDF/conf/idf.php -a -i -d

    Maintenant passons à la création de l'admin! Créez un fichier boot.php dans www/.
    Insérez le code suivant dedans et remplacez les données par les vôtres :
    //Sans espace entre le < et ? < ?php

    require '/homez.xxx/yyy/www/indefero/src/IDF/conf/path.php';
    require 'Pluf.php';
    Pluf::start('/homez.xxx/yyy/www/indefero/src/IDF/conf/idf.php');
    Pluf_Dispatcher::loadControllers(Pluf::f('idf_views'));

    $user = new Pluf_User();
    $user->first_name = 'PLOP';
    $user->last_name = 'Mr'; // Required!
    $user->login = 'plop'; // must be lowercase!
    $user->email = 'mrplop@gmail.com';
    $user->password = 'SuperMotDePasseIntrouvable';
    $user->administrator = true;
    $user->active = true;
    $user->create();
    print "Utilisateur créé\n";

    ?>

    REMARQUE : Ne faites pas comme moi, renseignez des informations correctes afin de ne pas avoir un suivi bordélique du projet. Si les membres renseignent n'importe quoi, le projet deviendra vite du grand n'importe quoi...

    Exécutez le fichier de cette manière :
    ssh:/www/$ php.ORIG.5.3.5 boot.php

    Vous venez d'enregistrer l'admin Indefero.

    Pensez ensuite à supprimer le fichier boot.php :
    ssh:/www/$ rm boot.php

    Et voila, votre environnement Indefero est en place, accessible via http://yyy.eu/indefero/ ou depuis le (sous-)domaine que vous avez pu renseigner dans la config plus haut.
    Il ne reste plus qu'une chose, créer votre premier projet! ;)




    Utilisation d'Indefero par les membres (et vous, admin)

    A ce stade vous disposez d'un environnement pour la gestion de vos projets publique et privé. Ce choix se fait lors de la création d'un projet avec Indefero par une petite case à cocher si vous souhaitez rendre ce dernier privé. A noter que seul les admins peuvent créer des projets.

    La première étape : la gestion des membres (pas vous pour le moment)! Le processus d'enregistrement de leur clé ne pouvant être automatique sur nos serveurs mutualisé, la marche à suivre est la suivante :

    • Le nouveau membre (peb pour l'exemple) doit tout d'abord s'enregistrer sur Indefero.
    • Il doit ensuite générer une paire de clé RSA.
      > Pour Windows : je vous laisse chercher (regardez de ce coté ICI).
      > Pour OSX/Linux : Ouvrez un terminal et tapez la commande suivante :
      $ ssh-keygen -t rsa
      Tapez sur entrer à chaque question.
      REMARQUE : Par la suite vous DEVREZ METTRE UNE PASSPHRASE pour des raisons de sécurité. Disons que pour la mise en place vous n'en mettrez pas, mais ça ne doit être que temporaire!
    • Il doit ensuite vous envoyer le fichier id_rsa.pub qui correspond à sa clé plubique qui va permettre de l'identifier auprès du serveur.
    • VOUS, créez un fichier authorized_keys2 dans le dossier /.ssh de votre serveur et enregistrez sa clé de cette manière :
      command="python /homez.xxx/yyy/www/indefero/scripts/gitserve.py peb",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1[...]NbKf mac@peb
      REMARQUE : ces lignes vont entre autre permettre la redirection automatique de l'adresse d'accès vers le repo git mais aussi de limiter les accès de cet utilisateur sur votre serveur. Tout ceci doit être sur une ligne (pas de saut de ligne pour un même utilisateur). Notez bien le nom de l'utilisateur Indefero présent dans ce fichier.

      Voila, en gros de votre coté (admin), vous devez simplement ajouter la clé publique des utilisateurs au fichier authorized_keys2.
      A présent ils peuvent jouer avec les repo git présent sur votre serveur UNIQUEMENT s'ils font partie du projet (vous pouvez le définir dans les paramètres du projet sous Indefero). Nous avons bien une notion de projet privé avec Indefero.

      Alors pour vous, admin de votre serveur, un petit problème se pose... Vous devez disposer de votre connexion ssh pour gérer votre serveur (vous en aurez besoins pour la création de projet git, on verra cela plus bas). Or la commande utilisée pour les membres empêche la connexion ssh pour des opérations autres qu'avec git... Mais elle permet aussi de faire automatiquement les redirections des adresse des repo git... Bref, vous devrez vous coltiner les adresses de repo super pas pratique^^.
      Ainsi ne mettez pas votre clé dans le fichier authorized_keys2 et sachez que pour vos opérations git vous devrez faire différement (nous allons voire cela ci-dessous).




      Création et utilisation d'un projet git

      fiouuuu, enfin! nous y sommes arrivés :p

      REMARQUE : ici je ne détaillerais pas les commandes git, ceci fera l'objet d'un futur tuto ;)

      Pour créer un projet git vous devez :
      • Connectez vous en ssh à votre serveur et initialisez votre repo git:
        ssh:/$ cd git
        ssh:/git$ mkdir plop.git
        ssh:/git$ cd plop.git
        ssh:/git/plop.git$ git init --bare
        REMARQUE : En créant le repo de cette manière vous ne verrez pas les fichiers par la suite dans le dossier plop.git, ceci est tout à fait normal et correcte.

      • Créez ensuite le projet sous Indefero (avec le même nom bien évidement, ici plop, sans le .git)

      C'est tout, votre repo est prêt!

      Maintenant VOUS, clonez le repo sur votre PC/MAC ainsi :
      $ git clone ssh://userssh@yyy.eu/homez.xxx/yyyy/git/plop.git
      Créez vos fichiers, puis faites un push :
      $ git add .
      $ git commit -m "First commit"
      $ git push origin master
      Et voila, vous verrez vos fichiers sous Indefero :)

      Dernière des dernières étapes, un membre du projet veut cloner le repo :
      $ git clone ssh://peb@pebdev.eu/plop.git
      REMARQUE : peb correspond au nom de l'utilisateur sous Indefero. Par ailleurs vous voyez ici l'intérêt de la redirection dont vous ne bénéficiez pas. L'accès est clairement mémorisable dans ce cas, beaucoup moins pour vous admin.

      Victoire! Indefero est à présent totalement fonctionnel sur votre hébergement mutualisé OVH, avec des notions d'utilisateurs, de projets privés et publiques, le tout avec une interface web bien partique!

      Dernière chose très importante, pensez bien à protéger l'ensemble d'Indefero par un htaccess, c'est important pour éviter quelques petits soucis.

      Comme d'habitude, si vous avez des questions n'hésitez pas à les poser dans les commentaires! Pour ma part je vais aller reposer mes yeux fortement irrités par l'écriture de ce tuto^^



      Liens m'ayant fortement aidés :