Seafile est une alternative open source à Dropbox. Elle permet le chiffrement des données entre le client et le serveur ainsi que sur le server (le serveur ne disposant pas du mot de passe de chiffrement). Malheureusement aucun paquet Seafile n'est disponible pour Synology. Afin de minimiser la maintenance de l'installation j'ai choisi d'installer Seafile dans un chroot Debian chroot tournant sur le NAS.

Installation des paquets

La documentation de référence pour installer Seafile depuis la source est disponible sur https://github.com/haiwen/seafile/wiki/Build-and-deploy-seafile-server-from-source. Cette procédure reprend la documentation officielle pour installer Seafile 3.0.x en incluant les détails spécifiques à la distribution Debian et ses paquets disponibles ; elle suppose que vous ayez déjà mis en place un chroot Debian sur Synology.

Installation des librairies de développement

~$ aptitude install libevent-dev libcurl4-openssl-dev libglib2.0-dev uuid-dev intltool libsqlite3-dev libarchive-dev libtool libjansson-dev valac libfuse-dev

Au moment de la rédaction certains packages ne sont pas disponibles dans Debian stable. Ajouter les dépots testing aux sources et définir des préférences afin de garantir que la version testing ne sera pas choisie par défault. Consulter AptPreferences pour davantage de détails à propos d'apt pinning.

~$ cat >> /etc/apt/sources.list << EOF
~$ deb http://ftp.fr.debian.org/debian/ jessie main contrib non-free
~$ deb-src http://ftp.fr.debian.org/debian/ jessie main contrib non-free
~$ EOF
~$ cat > /etc/apt/preferences.d/00preferStable << EOF
~$ Package: *
~$ Pin: release a=stable
~$ Pin-Priority: 900
~$
~$ Package: *
~$ Pin: release a=testing
~$ Pin-Priority: 800
~$ EOF
# Adding the packages from jessie (Debian testing)
~$ aptitude install libonig-dev -t jessie
~$ aptitude install libzdb-dev libsqlite3-dev sqlite3 -t jessie

La seule exception est libevhtp: une version spéciale de cette librairie est requise et n'est pas disponible sous Debian.

~$ mkdir libs
~$ cd libs
~$ wget https://github.com/ellzey/libevhtp/archive/1.1.6.zip

Décompresser la librairie et utiliser cmake pour préparer la compilation.

~$ aptitude install cmake
~$ cmake .
~$ make
~$ sudo make install

Installer ensuite les paquets pour seahub, le front end Python de Seafile. Certaines librairies Python ne sont pas disponible dans les dépots Debian et Seafile 3.0.x nécessite Django 1.5.

~$ aptitude install python-simplejson python-chardet gunicorn python-imaging python-six
~$ # Some python lib aren't available from Debian.
~$ aptitude install python-pip
~$ pip install django==1.5
~$ pip install djblets==0.6

Preparation du projet Seafile

Ajouter un utilisateur seafile et créer un dossier pour préparer le layout du project. Définir ORGANIZATION_NAME avec un nom décrivant votre installation Seafile (nom d'entreprise ou nom de domaine).

~$ ORGANIZATION_NAME=
~$ adduser seafile
~$ su seafile
~$ cd
~$ mkdir -p $ORGANIZATION_NAME/seafile-server
~$ cd $ORGANIZATION_NAME/seafile-server

Obtenir les sources. Remplacer VERSION avec la version de Seafile désirée.

~$ VERSION=3.0.3
~$ mkdir src
~$ cd src
~$ wget https://github.com/haiwen/libsearpc/archive/v${VERSION}-server.tar.gz
~$ tar xf v${VERSION}-server.tar.gz
~$ rm v${VERSION}-server.tar.gz
~$ wget https://github.com/haiwen/ccnet/archive/v${VERSION}-server.tar.gz
~$ tar xf v${VERSION}-server.tar.gz
~$ rm v${VERSION}-server.tar.gz
~$ wget https://github.com/haiwen/seafile/archive/v${VERSION}-server.tar.gz
~$ tar xf v${VERSION}-server.tar.gz
~$ rm v${VERSION}-server.tar.gz
~$ cd ..
~$ wget https://github.com/haiwen/seahub/archive/v${VERSION}-server.tar.gz
~$ tar xf v${VERSION}-server.tar.gz
~$ rm v${VERSION}-server.tar.gz
~$ mv seahub-${VERSION}-server seahub

Compilation de Seafile

Générer et installer les projets Seafile. Les commandes autogen, configure et make peuvent être executée par l'utilisateur seafile mais la commande "make install" nécessite les privileges de l'utilisateur root.

~$ cd src/libsearpc-${VERSION}-server
~$ ./autogen.sh
~$ ./configure
~$ make
~$ make install
~$ ~$ cd ../ccnet-${VERSION}-server
~$ ./autogen.sh
~$ ./configure --disable-client --enable-server # `export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig` if libsearpc is not found
~$ make
~$ make install
~$
~$ cd ../seafile-${VERSION}-server

Avec Seafile 3.0.3, l'exécutable seafile-controller nécessite une petite correction. Au démarrage, ce programme définit ses dossiers de configuration, bin et pids en fonction de l'emplacement du binaire. Etant installé dans /usr/local/bin au lieu d'un sous dossier de seafile-server, le démarrage échoue. Pour le corriger, éditer la fonction init_seafile_path dans le fichier controller/seafile-controller.c :

static void init_seafile_path (char *config_dir)
{
topdir = g_path_get_dirname (config_dir);
installpath = g_build_filename (topdir, "seafile-server", NULL);
}

Il faut également modifier l'appel à init_seafile_path depuis la fonction seaf_controller_init :

static int seaf_controller_init (SeafileController *ctl,
char *config_dir,
char *seafile_dir,
char *logdir,
gboolean cloud_mode)
{
init_seafile_path (config_dir);

Completer maintenant l'installation de seafile-server avec cette petite correction.

~$ ./autogen.sh
~$ ./configure --disable-client --enable-server
~$ make
~$ make install

Deploiement de Seafile

Avec l'utilisateur seafile, se placer dans le dossier racine et démarrer le script de configuration de Seafile.

~$ cd ~/$ORGANIZATION_NAME
~$ export PYTHONPATH=/home/seafile/$ORGANIZATION_NAME/seafile-server/seahub/thirdpart
~$ seafile-admin setup

Répondre aux quelques questions d'installation et démarrer Seafile

~$ seafile-admin setup

Seafile doit maintenant être lancé et accessible depuis le NAS.

Démarrage automatique de Seafile

La commande seafile-admin doit être lancée par l'utilisateur seafile depuis le dossier racine de l'installation. Avec l'utilisateur seafile, créer un script pour lancer cette commande.

~$ cd ~/$ORGANIZATION_NAME/
~$ cat >> start_seafile.sh << EOF
~$ #!/bin/bash
~$ cd `dirname $0`
~$ seafile-admin start
~$ EOF
~$ chmod +x start_seafile.sh

Puis avec l'utilisateur root, installer sudo

~$ aptitude install sudo

La dernière partie est d'ajouter ce script à la séquence de démarrage de Synology. Si un script S99chrootDebian.sh est déjà présent, y ajouter :

~$ cat >> /usr/local/etc/rc.d/S99chrootDebian.sh << EOF
~$ # Start seafile
~$ chroot \$CHROOT /usr/bin/sudo -u seafile /bin/bash /home/seafile/<organization_name>/start_seafile.sh
~$ EOF
~$ chmod 755 /usr/local/etc/rc.d/S99chrootDebian.sh

Commentaires   

# Problème avec la fonction init_seafile_pathFranck 18-08-2014 16:10
Bonjour,

Merci pour ce tuto détaillé. Je le suis avec comme variante de travailler dans le Debian chroot de SynoCommunity (https://synocommunity.com), du coup j'ai pu installer libevhtp avec aptitude.

Mon problème est ailleurs : lorsque je veux modifier la fonction init_seafile_path comme indiqué, la mienne ne prend pas de paramètre, du coup, je ne vois pas comment la modifier. Je pourrais modifier l'appel aussi, mais quoi lui passer. Ci-dessous la fonction qui est dans le code source que j'ai obtenu en suivant le tuto.

Tout aide sera la bienvenue ! Merci. :-)
Franck

Code :static void
init_seafile_path ()
{
GError *error = NULL;
char *exectuble = g_file_read_link ("/proc/self/exe", &error);
char *tmp = NULL;
if (error != NULL) {
seaf_warning ("failed to readlink: %s\n", error->message);
return;
}

bin_dir = g_path_get_dirname (exectuble);

tmp = g_path_get_dirname (bin_dir);
installpath = g_path_get_dirname (tmp);

topdir = g_path_get_dirname (installpath);

g_free (exectuble);
g_free (tmp);
}
Répondre
# neo73 24-08-2014 17:58
Bonjour Franck,
Effectivement petit oubli, je n'avais pas mentionné le changement dans l'appel à init_seafile_path depuis seaf_controller_init. C'est corrigé, il suffit normalement d'ajouter config_dir en paramètre lors de l'appel.
Merci :cheer:
Répondre
# Guest 25-08-2014 16:02
Merci ! Je m'en étais tiré entre temps en codant topdir en dur lors de sa déclaration et en supprimant son affectiation dans la fonction.
F.
Répondre
# Problème lors du build de la librairie ccnetCutman2593 02-10-2016 22:34
Bonjour !

Merci pour ce tutoriel bien complet !
Par contre, je rencontre un problème au niveau du build de la librairie ccnet ...

Voici le bout de code montrant l'erreur lors de l'éxécution de la commande 'make' dans le dossier "ccnet-3.0.3-server"

----------------------------------

[libsearpc]: done

make all-am

make[3]: Entering directory '/home/seafile/seafile-server/src/ccnet-3.0.3-server/lib'

/bin/bash ../libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I../include -I../include/ccnet -I../lib -I../include -DG_LOG_DOMAIN=\"Ccnet\" -pthread -I(DESTDIR)/usr/local/include -I(DESTDIR)/usr/local/include/searpc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wall -DCCNET_LIB -g -O2 -MT libccnet_la-ccnet-client.lo -MD -MP -MF .deps/libccnet_la-ccnet-client.Tpo -c -o libccnet_la-ccnet-client.lo `test -f 'ccnet-client.c' || echo './'`ccnet-client.c

/bin/bash: -c: line 0: syntax error near unexpected token `('

/bin/bash: -c: line 0: `/bin/bash ../libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I../include -I../include/ccnet -I../lib -I../include -DG_LOG_DOMAIN=\"Ccnet\" -pthread -I(DESTDIR)/usr/local/include -I(DESTDIR)/usr/local/include/searpc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wall -DCCNET_LIB -g -O2 -MT libccnet_la-ccnet-client.lo -MD -MP -MF .deps/libccnet_la-ccnet-client.Tpo -c -o libccnet_la-ccnet-client.lo `test -f 'ccnet-client.c' || echo './'`ccnet-client.c'

Makefile:563: recipe for target 'libccnet_la-ccnet-client.lo' failed

make[3]: *** [libccnet_la-ccnet-client.lo] Error 1

make[3]: Leaving directory '/home/seafile/seafile-server/src/ccnet-3.0.3-server/lib'

-----------------

L'autogen ou le configure n'aurait pas marché ? Je ne sais pas, je trouve ça vraiment bizarre comme erreur, aurais-tu des idées ? (ou au moins comment débuguer la chose ... )

Merci d'avance :)

Cutman2593
Répondre
# neo73 02-10-2016 23:15
Bonjour,

Quelques pistes :
- Vérifies que la commande executée est make et non make install (la présence de DESTDIR dans la ligne générant l'erreur est étrange, cette variable étant généralement utilisée pour l'installation)
- Relance les commandes autogen.sh et configure donnera peut-être des messages d'erreurs permettant de comprendre ce qui ne va pas.
Si ces solutions ne donnent rien :
- Edite le fichier Makefile et remplace (DESTDIR) par $(DESTDIR)
- Lance make DESTDIR=/
Répondre
# Autre problème ...cutman2593 03-10-2016 20:51
Re-bonjour !

Après avoir suivi tes conseils, j'ai modifié tous les Makefile incorrects en corrigeant la syntaxe. Du coup la compilation des librairies externes a fonctionné.

Par contre, je les collectionne ... là, bug au niveau de la compilation de seafile-server,

Code :
repo-op.o: In function `gen_new_commit':
/home/seafile/seafile-server/src/seafile-3.0.3-server/server/repo-op.c:520: undefined reference to `seaf_branch_manager_test_and_update_branch'

repo-op.o: In function `seaf_repo_manager_revert_on_server':
/home/seafile/seafile-server/src/seafile-3.0.3-server/server/repo-op.c:4320: undefined reference to `seaf_branch_manager_test_and_update_branch'

../common/rpc-service.o: In function `seafile_edit_repo':
/home/seafile/seafile-server/src/seafile-3.0.3-server/server/../common/rpc-service.c:1439: undefined reference to `seaf_branch_manager_test_and_update_branch'

../common/rpc-service.o: In function `seafile_change_repo_passwd':
/home/seafile/seafile-server/src/seafile-3.0.3-server/server/../common/rpc-service.c:1547: undefined reference to `seaf_branch_manager_test_and_update_branch'

processors/recvbranch-proc.o: In function `update_repo':
/home/seafile/seafile-server/src/seafile-3.0.3-server/server/processors/recvbranch-proc.c:198: undefined reference to `seaf_branch_manager_test_and_update_branch'

collect2: error: ld returned 1 exit status
Makefile:681: recipe for target 'seaf-server' failed
make[3]: *** [seaf-server] Error 1
make[3]: Leaving directory '/home/seafile/seafile-server/src/seafile-3.0.3-server/server'



Il doit manquer un include quelque part pour qu'il fasse un 'undefined reference', mais alors pour quelle librairie ? ...
Aurais-tu des idées encore ?

J'ai trouvé quelque chose ici https://forum.seafile.de/t/seafile-server-wont-compile/2801 mais je t'avouerai que ça ne m'a pas aidé plus que ça ...

Voilà, merci bien pour l'aide que tu m'apportes ^^

Bonne soirée
Cutman2593
Répondre
# neo73 03-10-2016 22:38
La fonction en question est common/branch-mgr.h et ce fichier est bien inclu par common/rpc-service.c et autres fichiers... Je conseille de ne pas trop insister sur les fix manuels, surtout puisqu'il y a potentiellement eu des erreurs lors des étapes précédentes.

Comme la version 3 de seafile commence à dater il vaudrait mieux recommencer une install à partir d'une version plus récente des sources. J'avais fait une rapide update pour l'install de la version 4 ( http://www.rooot.net/fr/geek-stuff/synology/43-upgrade-seafile-synology.html ). Seafile en est maintenant à la version 6 mais il devrait y avoir peu de modifications ( https://manual.seafile.com/build_seafile/linux.html ).
Je tâcherai de faire une install de cette nouvelle version prochainement sur mon NAS.
Répondre
# neo73 13-03-2017 15:18
J'ai finalement pris le temps de passer à Seafile 6.0.8 ( http://www.rooot.net/en/geek-stuff/synology/44-seafile6-armv7-synology-diskstation-nas.html ) depuis un chroot Debian Jessie. En reprenant les mêmes étapes pour compiler les projets je n'ai pas rencontré de problème.

Peux-être la génération de libtool s'était mal passée, vérifie que tu as bien les dernières versions d'autoconf, automake et libtool installées et que l'éxécution d'autogen et configure ne remontent pas d'erreur.
Répondre