Installer SeaFile

Pour faire court et troller a minima, pour moi OwnCloud est à la synchronisation ce que MySQL est à la base de données (du canada dry). SeaFile semble être une alternative plus fiable et plus rapide. Le temps dira si je suis dans le vrai mais ça ne peut pas être pire ; la petite expérience que j’en ai est très concluante. Voilà donc un petit tuto pour installer SeaFile rapidement avec tout ce qui va bien (démarrage auto, branchement sur Apache, MySQL -oui bon ça va, c’est ça ou SQLite- et https).

La doc en anglais est très complète mais j’ai besoin d’un aide-mémoire.

Choix de déploiement

J’installe la 3.1.7 64bits sur une Debian/wheezy. Je suis les recommandations des auteurs en matière de répertoires ce qui simplifiera les upgrades.

Ce tutoriel a été complété pour Debian8/Jessie et Seafile 5.0.4
Puis encore complété pour Debian9/Stretch et Seafile 6.0.7

Je vais créer les bases de données à la main car le script fourni ne crée pas d’utilisateur et c’est le compte root de MySQL qui sera utilisé (ce que je ne souhaite pas d’autant que son mot de passe est en clair dans un fichier de config).

Je vais créer un utilisateur quelconque pour limiter l’impact d’un éventuel trou de sécurité.

Je vais enfin, pour les besoins de cette doc, utiliser :

  • le chemin /var/www/seafile
  • l’URL http[s]://seafile.mondomaine.com

Préparation

Création de l’utilisateur seafile :

adduser --system --no-create-home --disabled-password seafile

Création des bases de données :

mysql -u root -p

Indiquer le mot de passe root de mysql puis :

create database `ccnet-db` character set = 'utf8';
create database `seafile-db` character set = 'utf8';
create database `seahub-db` character set = 'utf8';

create user 'seafileuser'@'localhost' identified by 'monmotdepassesecret';

GRANT ALL PRIVILEGES ON `ccnet-db`.* to `seafileuser`;
GRANT ALL PRIVILEGES ON `seafile-db`.* to `seafileuser`;
GRANT ALL PRIVILEGES ON `seahub-db`.* to `seafileuser`;
flush privileges;

Packages

apt-get update
apt-get install python2.7 python-setuptools python-simplejson python-imaging python-mysqldb

Téléchargement et extraction

Visiter la page officielle de téléchargement, scroller jusqu’aux packages serveurs, clic droit sur la dernière version et copier l’adresse du lien.

sudo -i
cd /var/www
mkdir seafile
cd seafile
mkdir installed
wget -P installed https://bitbucket.org/haiwen/seafile/downloads/seafile-server_3.1.7_x86-64.tar.gz
tar xzf installed/seafile-server_3.1.7_x86-64.tar.gz

Installation basique

cd seafile-server-*
./setup-seafile-mysql.sh

Répondez aux questions suivantes (appuyez sur Entrée pour laisser les valeurs par défaut pour les autres) :

  • server name
  • This server’s ip or domain (je mets seafile.mondomaine.com)

Quand la question sur les bases de données arrive, répondez 2 (Use existing … databases) puisqu’on les a déjà créées.

  • mysql user for seafile : seafileuser
  • password for seafileuser : monmotdepassesecret (à adapter bien sûr)
  • ccnet database : ccnet-db
  • seafile database : seafile-db
  • seahub database : seahub-db

Validez, c’est prêt.

Premier démarrage

Il va falloir créer le compte admin avant de passer aux choses sérieuses.

./seafile.sh start
./seahub.sh start

À la question admin email indiquez… votre email (celui de l’admin). Les utilisateurs sont authentifiés par une adresse email. Elle n’a pas forcément besoin d’exister ou d’être relevée.

On arrête les serveurs :

./seahub.sh stop
./seafile.sh stop

Branchement sur Apache

Seahub est le front-end web de Seafile qui écoute sur le port 8000. On va faire en sorte que les clients discutent avec Apache (sur les ports 80 et/ou 443) qui redirigera les requêtes, en interne, ver Seahub sur le port 8000.

Quelques packages

Debian Stretch

FastCGI n’existe plus pur Debian Stretch et a été remplacé par proxy-fcgi.

a2enmod rewrite proxy_fcgi proxy_http
systemctl restart apache2.service

Debian Jessie

Pour Apache 2.4 (Debian Jessie), fastcgi est dispo dans les sources par défaut donc on peut sauter cette étape :

Debian wheezy

Le module fastcgi est disponible sur les sources nonfree sur Debian. Donc on les active dans /etc/apt/sources.list :

deb http://ftp.debian.org/pub/debian/ wheezy main non-free
deb-src http://ftp.debian.org/pub/debian/ wheezy main non-free
deb http://security.debian.org/ wheezy/updates main non-free
deb-src http://security.debian.org/ wheezy/updates main non-free

Puis :

apt-get update
apt-get install python-flup libapache2-mod-fastcgi

On a aussi besoin des modules proxy_http et rewrite donc :

a2enmod proxy_http rewrite
service apache2 restart

Configurer Apache

Il faut maintenant déclarer le module FastCGI de Seafile. Deux choses importantes :

  • le module seahub.fcgi n’existe pas vraiment (il n’y a pas de fichier de ce nom proprement dit)
  • le chemin dans lequel on le déclare devra être dans le DocumentRoot qu’on utilisera sinon Apache générera une erreur 404.

Pour Wheezy et Jessie uniquement

On ajoute donc la ligne suivante à la fin de /etc/apache2/apache2.conf :

FastCGIExternalServer /var/www/seafile/seahub.fcgi -host 127.0.0.1:8000

On va maintenant créer le VirtualHost (par exemple /etc/apache2/sites-available/seafile.conf)

<VirtualHost *:80>
    ServerName seafile.mondomaine.com
    DocumentRoot /var/www/seafile
    Alias /media /var/www/seafile/seafile-server-latest/seahub/media

    RewriteEngine On

    <Location /media>
        Order allow,deny
        Allow from all
## Pour Apache 2.4, commenter les 2 lignes ci-dessus et décommenter celle ci-dessous
##        Require all granted
    </Location>

    #
    # seafile fileserver
    #
    ProxyPass /seafhttp http://127.0.0.1:8082
    ProxyPassReverse /seafhttp http://127.0.0.1:8082
    RewriteRule ^/seafhttp - [QSA,L]

    #
    # seahub
    #
    RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /seahub.fcgi/$1 [QSA,L,E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</VirtualHost>

Attention à bien respecter les ruptures de lignes, notamment la dernière RewriteRule.

Attention, pour un Apache 2.2, il faut remplacer :

Require all granted

Par :

Order Allow,Deny
Allow from all

On n’oublie pas d’activer le VirtualHost :

a2ensite seafile.conf
service apache2 reload

Pour Stretch

<VirtualHost *:80>
        ServerName seafile.mondomaine.com
        Redirect permanent / https://seafile.mondomaine.com/
</VirtualHost>


<VirtualHost *:443>
    ServerName seafile.mondomaine.com
    DocumentRoot /var/www/sites/seafile
    Alias /media  /var/www/sites/seafile/seafile-server-latest/seahub/media

    RewriteEngine On

    <Location /media>
        Require all granted
    </Location>

    #
    # seafile fileserver
    #
    ProxyPass /seafhttp http://127.0.0.1:8082
    ProxyPassReverse /seafhttp http://127.0.0.1:8082
    RewriteRule ^/seafhttp - [QSA,L]

    #
    # seahub
    #
    SetEnvIf Request_URI . proxy-fcgi-pathinfo=unescape
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    ProxyPass / fcgi://127.0.0.1:8000/
</VirtualHost>

Mettre à jour la configuration de Seafile

Puisqu’on va maintenant accéder à l’interface web via Apache et son port 80 (et non plus le port 8000 de Seahub) il faut l’indiquer.

ccnet.conf

Dans /var/www/seafile/ccnet/ccnet.conf (/var/www/seafile/conf/ccnet.conf pour la version 5.x de Seafile) modifier la ligne SERVICE_URL en :

SERVICE_URL = http://seafile.mondomaine.com

(en bref, virez le :8000)

seahub_settings.py

Modifiez le fichier /var/www/seafile/seahub_settings.py (/var/www/seafile/conf/seahub_settings.py pour Seafile 5.x) et ajoutez à la fin :

FILE_SERVER_ROOT = 'http://seafile.mondomaine.com/seafhttp'

Redémarrer les serveurs

cd /var/www/seafile/seafile-server-latest
./seafile.sh start
./seahub.sh start-fastcgi

Attention à la dernière ligne, il est écrit start-fastcgi.

Normalement, vous devriez pouvoir ouvrir un navigateur vers http://seafile.mondomaine.com et voir l’interface.

On arrête les serveurs, on n’a pas fini :

./seahub.sh stop
./seafile.sh stop

Démarrage automatique

Là, ça dépend vraiment de votre distrib… Sous Ubunutu, c’est pas pareil que sous Debian. La page de manuel est assez complète. Vous savez lire.

Wheezy et Jessie

Sous Debian/Wheezy, on crée un fichier /etc/init.d/seafile-server qui contient :

#!/bin/sh

### BEGIN INIT INFO
# Provides:          seafile-server
# Required-Start:    $local_fs $remote_fs $network mysql
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts Seafile Server
# Description:       starts Seafile Server
### END INIT INFO

# Change the value of "user" to your linux user name
user=seafile

# Change the value of "script_path" to your path of seafile installation
seafile_dir=/var/www/seafile
script_path=${seafile_dir}/seafile-server-latest
seafile_init_log=${seafile_dir}/logs/seafile.init.log
seahub_init_log=${seafile_dir}/logs/seahub.init.log

# Change the value of fastcgi to true if fastcgi is to be used
fastcgi=true
# Set the port of fastcgi, default is 8000. Change it if you need different.
fastcgi_port=8000

case "$1" in
        start)
                sudo -u ${user} ${script_path}/seafile.sh start >> ${seafile_init_log}
                if [  $fastcgi = true ];
                then
                        sudo -u ${user} ${script_path}/seahub.sh start-fastcgi ${fastcgi_port} >> ${seahub_init_log}
                else
                        sudo -u ${user} ${script_path}/seahub.sh start >> ${seahub_init_log}
                fi
        ;;
        restart)
                sudo -u ${user} ${script_path}/seafile.sh restart >> ${seafile_init_log}
                if [  $fastcgi = true ];
                then
                        sudo -u ${user} ${script_path}/seahub.sh restart-fastcgi ${fastcgi_port} >> ${seahub_init_log}
                else
                        sudo -u ${user} ${script_path}/seahub.sh restart >> ${seahub_init_log}
                fi
        ;;
        stop)
                sudo -u ${user} ${script_path}/seafile.sh $1 >> ${seafile_init_log}
                sudo -u ${user} ${script_path}/seahub.sh $1 >> ${seahub_init_log}
        ;;
        *)
                echo "Usage: /etc/init.d/seafile {start|stop|restart}"
                exit 1
        ;;
esac

Rendre le fichier exécutable :

chmod a+x /etc/init.d/seafile-server

Créer le dossier qui contiendra les logs (il existe peut-être déjà) :

mkdir /var/www/seafile/logs

Et rendons à César…

chown -R seafile:www-data /var/www/seafile

Sous Debian 8 / Jessie (et toute autre distribution qui utilise systemd), il faut dire à systemd qu’il y a un nouveau service :

systemctl daemon-reload

Vérifier que tout démarre bien :

service seafile-server start

Faire en sorte qu’il démarre automatiquement :

update-rc.d seafile-server defaults 95

Stretch

Faisons les choses proprement pour systemd. On crée deux fichiers dans /etc/systemd/system :

seahub.service qui contient :

[Unit]
Description=Seafile hub
After=network.target seafile.service

[Service]
# change start to start-fastcgi if you want to run fastcgi
ExecStart=/var/www/sites/seafile/seafile-server-latest/seahub.sh start-fastcgi
ExecStop=/var/www/sites/seafile/seafile-server-latest/seahub.sh stop
User=seafile
Group=www-data
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Et seafile.service qui contient :

[Unit]
Description=Seafile
# add mysql.service or postgresql.service depending on your database to the line below
After=network.target mysql.service

[Service]
Type=oneshot
ExecStart=/var/www/sites/seafile/seafile-server-latest/seafile.sh start
ExecStop=/var/www/sites/seafile/seafile-server-latest/seafile.sh stop
RemainAfterExit=yes
User=seafile
Group=www-data

[Install]
WantedBy=multi-user.target

On les démarre :

systemctl start seafile.service
systemctl start seahub.service

Puis on les active :

systemctl enable seafile.service
systemctl enable seahub.service

httpS !

Je pars du principe que vous avez un certificat (auto-signé ou non)

Apache

On active modssl dans Apache (mais c’est sûrement déjà fait) :

a2enmod ssl

Puis on modifie le VirtualHost (on remplace :80 par :443) :

<VirtualHost *:443>

Si ce n’est déjà fait, ajouter à /etc/apache2/ports.conf :

NameVirtualHost *:443

Et on ajoute une redirection pour faire propre :

<VirtualHost *:80>
    ServerName seafile.mondomaine.com
    Redirect permanent / https://seafile.mondomaine.com/
</VirtualHost>

On ajoute la déclaration des certificats :

SSLEngine               on
SSLCertificateFile      /etc/ssl/certs/mondomaine.com.crt
SSLCertificateKeyFile   /etc/ssl/private/mondomaine.com.key
SSLCACertificateFile    /etc/ssl/certs/GandiStandardSSLCA.pem

Bien sûr, vous adaptez.

ccnet.conf

On retourne modifier dans /var/www/seafile/ccnet/ccnet.conf la ligne SERVICE_URL en :

SERVICE_URL = https://seafile.mondomaine.com

(https au lieu de http)

seahub_settings.py

Même chose dans /var/www/seafile/seahub_settings.py :

FILE_SERVER_ROOT = 'https://seafile.mondomaine.com/seafhttp'

Redémarrages

service seafile-server restart
service apache2 restart

ou, pour Stretch :

systemctl restart apache2
systemctl restart seafile.service
systemctl restart seahub.service

Fini

Voilà. Il n’y a rien de compliqué. Seafile marche vraiment très bien, il est rapide, les clients Mac et Linux sont nickel. Ses développeurs ont même l’intelligence de fournir l’APK pour le client Android (pour ceux qui, comme moi, n’ont pas de compte Google attaché à leur téléphone).

13 réflexions sur « Installer SeaFile »

  1. Roh, c’te troll 🙂

    Owncloud est certes un peu lourd, mais sinon, je ne vois pas ce que tu lui reproches. Aucun souci avec la synchronisation. Tu peux aussi avoir l’appli android avec f-droid (n’ayant pas de compte gmail sur mon téléphone non plus).

    Mais je me garde ça sous le coude, on ne sait jamais.

    PS : je ne dois pas être humain. Je me suis planté sur un captcha >.<

  2. C’est pas un vrai troll, j’ai eu des galères sans nom avec OwnCloud (par exemple des fichiers qui se synchronisent tout le temps parce-que, pour une mystérieuse raison il détecte en permanence que le fichier est modifié des 2 côtés ou un dossier en plein milieu de l’arborescence qui ne se synchronise jamais). Le support de la communauté est du niveau de commentcamarche.net (je ne te fais pas de dessin, je préfère le support technique de M$), c’est effectivement très lourd, très très lent surtout si on atteint plusieurs dizaines de milliers de fichiers et/ou une dizaine d’utilisateurs. Franchement un des pires produits que j’ai vu.

    Seafile server tourne sans problème sur un RaspPi et, avec la même config que celle qui m’a tellement fait perdre de temps sous OC, je n’ai pas le moindre problème depuis un mois.

    +1 pour l’APK dispo sur f-droid

  3. Moi je peux dire ce qui ne va pas sur Owncloud !
    IL N’EST PAS FIABLE/STABLE !
    J’ai un client qui met des * dans le nom de ses dossiers … Eh ben ça fait bugguer Owncloud ! J’espère que ça ne fera pas buguer seafile 🙂

  4. Très bon tuto,

    J’ai la même config, alors je fais quasi du copier/coller.

    J’en suis au script de démarrage, on peut ajouter, pour automatiser le démarrage :

    update-rc.d seafile-server defaults 95

  5. Hello,
    Je me pose une question : j’utilisais ownCloud, que j’abandonne à cause des nombreux bugs jamais résolus. Je sauvegardais les data de owncloud facilement, puisqu’il suffit de sauvegarder le répertoire data du serveur pour retrouver son arborescence. Sur Seafile, il est certes aussi simple de sauvegarder les données, le problème, c’est pour les restaurer. Si je rencontre un problème et que Seafile n’est plus opérationnel, comment je fais pour récupérer les données d’une sauvegarde et pouvoir restaurer les fichier sur un ordinateur ? That is the question.

    • Je n’ai jamais essayé mais je suppose qu’il suffit de réinstaller seafile et de restaurer la base seafile-db et l’arborescence seafile-data. (Si tu fais le test, tu es le bienvenu pour raconter ton expérience ici :-))

      Bien sûr, ce n’est pas un filesystem directement copiable comme avec OwnCloud mais ça ajoute un niveau de sécurité (faible je te l’accorde) puisqu’il faut “reconstituer” les fichiers à partir des blocs ; ça évite au moins qu’un petit malin qui prendrait le contrôle du serveur puisse exploiter les fichiers directement. Et je suppose que c’est grâce à ce système de stockage que SeaFile est si rapide et fiable.

  6. Bonjour,
    Nous utilisons Seafile avec une dizaine de postes, un serveur + un serveur de secours (dossier environ 40 go). Je viens de prendre une tablette Android avec une SD de 128 go. Lorsque Seafile descend les dossiers sur la tablette il les mets dans un dossier en cache (les 10go de la tablette). Comment puis-les descendre directement (et donc avoir automatiquement les mises à jour) sur la SD?
    merci

    • Aucune idée. Je suppose qu’il faudrait pouvoir indiquer dans la config de l’application tablette le répertoire de cache à utiliser. Mais le fait de passer par un dossier de cache est indispensable : SeaFile télécharge des blocs qui lui servent à reconstituer les fichiers une fois qu’il a tout reçu.

  7. Concernant le comparatif avec Owncloud, il n’y a pas photo :
    – fiabilité des mises à jour des dossiers -> Owncloud 0 Seafile 1
    – lors des mises à jour avec des gros répertoires, Owncloud prenait toute la bande -> Owncloud 0 Seafile 1

  8. Excellent tuto qui m’à permis avec peu de connaissance sur Linux d’arriver à bien.
    J’ai eu quelques difficultés sur la partie HTTPS qui me semble (pour moi c’est peut être très clair pour les autres) un peu confuse, surtout pour les fichier à modifier. Je n’avais pas les même choses que dans le tuto dans les fichiers, mais en recoupant plusieurs tuto apache2/seafile, j’ai fini par en venir à bout…
    J’ai aussi fait un truc bien casse gueule, changer le répertoire de place…. Ca m’as cassé mes bibliothèques avant de voir que le cp était faire avec -p et pas -P…. faute de débutant je vous l’accorde.
    En tout cas en couplant avec Let’s Encrypt, ça donne une magnifique solution pour être tranquille! J’ai plus qu’à Backup le tout et c’est ok.
    Un très grand merci pour tes explications les plus claires que j’ai pu trouver sur Seafile en Français.

    • Merci beaucoup pour ton retour. C’est vrai qu’ajouter une section spéciale pour Let’s encrypt serait une très bonne idée (ça n’existait pas encore à l’époque de la rédaction de l’article).
      Pour cp j’ai l’habitude d’utiliser cp -a (récursif + préserve liens et permissions).

Laisser un commentaire

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