19 años en Internet
Mostrando entradas con la etiqueta seafile. Mostrar todas las entradas
Mostrando entradas con la etiqueta seafile. Mostrar todas las entradas

31 diciembre 2021

SeaFile: La upgrade imposible (migrando de 4.3 a 7.1)

     En septiembre de 2015 (hace 6 años en el momento que escribo esta entrada), me monté una nube casera haciendo uso de una Raspberry PI B+ (procesador ARMv6 700 MHz a 32 bits, 512 MB de memoria RAM, Ethernet 10/100 y 4 puertos USB 2.0) y un viejo disco duro externo de 1 TB (un MyBook de WD de 2011). Como software, utilicé la Raspbian de la época (basada en Debian 8, aka Jessie), la versión “community” 4.3 de SeaFile configurado para tener una BD en formato SQLite y le puse un fork de Apache como frontal configurado para tener activado el fastCGI. Como particularidad, la raspberry se alimentaba por el puerto usb del router wifi (entonces consumían menos voltaje) y la carpeta “seafile-data” (que contiene los documentos de la nube y la base de datos en formato SQLite) era un enlace simbólico apuntado al punto de montaje del disco duro externo.

 
    Lo bueno de tener un enlace simbólico es que, si el día de mañana se te queda pequeño el disco de 1 TB, la bascula a uno de mayor capacidad no es compleja: Paras los servicios de SeaFile, te aseguras que el nuevo disco tenga el mismo formato, copias todo el contenido de un disco al otro, editas el /etc/fstab, remontas las unidades, reinicias los servicios de SeaFile y la magia vuelve a actuar.

Lo compré en 2011 y sigue vivo. Una década ya.

    Otra particularidad es que a nivel de router la raspberry tenía una IP fija en mi red local y que había definido una serie de mapeados de puertos de forma de que todo lo que entrara por el puerto XXXX fuera redirigido al puerto 443 (sí, le puse un certificado) de la raspberry. Además, me hice con un dominio que reenviaba a la IP estática de mi router, de forma si salía de casa, pudiera siempre acceder a mi nube. Y lado en casa, edité los /etc/hosts (para los windowseros, sabed que también tenéis uno en C:/Windows/System32/drivers/etc) de forma que ese dominio se transformara en la IP local de la raspberry y así no sacar el flujo a fuera de casa. Lo bonito habría sido configurar esto último a nivel del router, pero bueno, me encontré con una serie de limitaciones.


     Y así ha ido todo bonito y níquel durante estos 6 años. De vez en cuando se me moría la tarjeta SD de la Raspberry (pensad que es un server encendido 24x7 y que estas tarjetas no están pensadas para ser durables), pero tirando de backups, cada dos años le ponía una nueva y arreando. Total, si la conf del server no cambia, posées la imagen de la SD y los ficheros importantes son enlaces simbólicos a dispositivos externos, la restauración rara vez era complicada. Y comprar una tarjeta cada dos años tampoco es que fuera una gran ruina.

 

Mi Raspberry cada vez que le metía una SD nueva.


    Pero claro, todo este sistema tenía una serie de inconvenientes que al principio podía pasar por alto, pero que conforme pasan los años se volvían algo irritantes. Por ejemplo: El conjunto, o eso pensaba, de tener un voltaje bajo (carecía de adaptador de corriente para la raspberry) y utilizar el cable de ethernet “barato” pues hacía que en la práctica los uploads y downloads de ficheros tuvieran un cuello de botella de 2 MB/s. Esta velocidad, para lo que es el trabajo del día a día no es una gran molestia, pero en el momento que te compras un PC nuevo resulta desesperante (intenta bajarte unos 100 GB de documentos a esa velocidad).


    Así que todo esto que os voy a comentar empezó como una queja de “la nube va lenta” y me puse a indagar y a troubleshootear para ver si esto no se podía mejorar:

  • Comprobé que no se trataba de un tema de alimentación (voltaje insuficiente), puesto que seguía teniendo estas velocidades incluso habiendo conectado la raspberry a un adaptador de corriente (en vez de chupar del router).
  • Comprobé que no era una limitación del cable ethernet, probando con uno de 100 MB/s y con otro a gigabit.
  • Comprobé que no era un tema de tener enchufado el disco duro por USB, puesto que usaba el cable del fabricante y este estaba especificado como 2.0.
  • Llegué a enchufar un adaptador wifi por USB, para ver si podía ir mejor…

    Pero no, iba probando y probando y llegaba siempre al mismo máximo de subida y bajada de 2 MB/s. Me volvía paranoico, empecé a buscar si no se trataba de alguna configuración a nivel del OS o del SeaFile… Pero nada.
 

     No era lógico: La teoría decía que, si mi Raspberry tenía una ethernet de 10/100, la red local por ethernet la tengo a gigabit y el disco duro iba por USB 2.0, debería a velocidades de por lo menos 20 MB/s.

    No daba con la tecla. Así que me puse a googlear y vi que no era el único usuario que se quejaba de las velocidades de SeaFile y que parecía ser que se “corregía” haciendo una subida de versión (es decir, actualizando a una versión más reciente). No estaba nada claro, quiero decir, había usuarios que decía que les iba perfecto y otros remontaban la misma limitación que yo (2 MB/s).
 

    Así que puestos a upgradear, me bajé la última versión 7 de SeaFile (la v7.1.5) para Raspberry PI, dando por hecho de que se trataría de una versión estable (la siguiente es la v8 y tengo prevista instalarla también) y sobre el papel realizar la upgrade no parecía difícil:

  • Paras el servicio
  • Cambias el enlace simbólico de seafile-server-latest para apuntar a la 7.1.5.
  • Entras en la carpeta de seafile-server-latest/upgrades y ejecutas uno a uno todos los scripts de migración. En mi caso, para pasar de 4.3 a 7.1.5 tenía que ejecutar los scripts siguientes: upgrade_4.3_4.4.sh, upgrade_4.4_5.0.sh, upgrade_5.0_5.1.sh, upgrade_5.1_6.0.sh, upgrade_6.0_6.1.sh, upgrade_6.1_6.2.sh, upgrade_6.2_6.3.sh, upgrade_6.3_7.0.sh y upgrade_7.0_7.1.sh
  •  Relanzas el servicio.

    Claro, una cosa es la teoría, pero la práctica… Ejecuto al primer script y este peta. ¿Por qué? Pues por algo increíble: Los scripts verifican la versión de Python que tiene instalado el OS y si es menor a 2.7 no te dejan ejecutarlos… Pero el problema es que los scripts están escritos en Pyhton 3, los cuales no son compatibles con Python 2.


     Ante este panorama tuve que instalar Python 3.7 via apt-get, borrar el /usr/bin/python y crear un enlace simbólico para que /usr/bin/python apunte a /usr/bin/python3.7.
 

    Una vez hecho esto, me pongo a ejecutar los scripts de upgrade y todos funcionan a la perfección. Acto seguido, reinicio el servicio… ¡Y PAM! Pete: El script hace uso de binarios incompatibles. Claro, al leer esto mi reacción fue “¿cómo es posible? ¿no me había bajado la versión arm de raspberry pi?”.
 

    Así que hago un “uname -a” para ver el procesador (armv6l) y entro en la página web de SeaFile para comprobar qué me había bajado… Y resulta que no había versión de armv6l. La versión por defecto para ARM eran la arm64 y la armv7, la cuales no eran compatibles.
 

 

    Al ver esto me morí de miedo: Tenía una base de datos actualizada a 7.1.5 y no podía hacer uso de los binarios de 7.1.5 debido a una incompatibilidad de hardware (concretamente a nivel de procesador). Además, los scripts carecían de rollback posible y temía que si me ponía a ejecutar ahora los binarios de la 4.3 corrompería varios centenares de gigas de datos.
 

    La siguiente opción fue bastante obvia para todo linuxero: Bajarte las fuentes de la 7.1.5 y compilar tú mismo. Pero nada, que no había forma. Los scripts de building son bastantes completos, te instalan todas las dependencias, Python hace su magia con wheels… pero estaba ante un impass: Sencillamente la solución no compilaba en armv6l. No había forma, relanzaba, relanzaba, hacía uso de pip3… Pero nada, que el building no quería ir. Había que cambiar de hardware, no había otra opción posible.
 

 - "Parece que tocará gastarse pelas."

    Así que animado por un video del youtubero TuberViejuner, acabé comprando una Raspberry PI 400: ARM v8 de 4 núcleos a 64 bits y 1,8 GHZ, 4 GB de RAM, puerto ethernet, 2 puertos USB 3.0 y uno 2.0… Vamos, todo un obús comparado con el modelo anterior. Tuve la suerte de hacerme con el kit de programación a un precio bastante barato (flipa con las reventas, se les va la pinza) y ésta me vino ya con el OS preinstalado: Una Raspbian basada en Buster (Debian 10).
 


     Me puse a tunear el sistema operativo y claro, notas rápido la diferencia de seis años: El fork de Apache que utilizaba para utilizar fastCGI ya no existía, los módulos han cambiado de nombre… Total, que me encontraba con una conf de apache que tuve que readaptar a mi gusto (no basta con hacer un copy-paste de los available-sites o del /etc/apache2 completo).
 

    Después enchufé el disco duro externo y edité el fstab a mi gusto y una vez tenía todos los prerrequisitos instalados y un apache funcional, decidí intentar arrancar el SeaFile 7.1.5 sobre esta nueva raspberry… Y cómo no, petó.
 

    ¿Por qué? Porque mis scripts fuerzan el inicio del fastCGI y SeaFile ya no era compatible con fastCGI. Total, me tocó modificar mis scripts y la conf de Apache para quitar el fasfGCI (lo cual no era complicado) y relanzar… Y esta vez sí, parecía que arrancaba.
 

    Así que abro el navegador y miro a ver si la interfaz web estaba disponible… Pero no, no lo estaba. Me saltaba una excepción de Apache y las trazas de este se limitaban a decir que había un problema con el backend (SeaFile). Abro un cliente de SeaFile, intento hacer un login y me devuelve un error de inicio de sesión.


    Así que me pongo a ver las trazas de seafile (lado server) para troubleshootear y descubro que remontan excepciones acerca del cifrado, quejándose de que faltan librerías, dando a entender que faltaba algún tipo de dependencia en “seafile-server-latest/seahub/thirdpart”. A base de comandos de pip verifico que las bibliotecas de crypto y pycrypto están presentes, intento de nuevo, las trazas arrojan siempre el mismo error… Hasta que googleando me doy cuenta que esas librerías están desactualizadas y que a efectos prácticos están siendo remplazadas por el paquete pycryptodome. Así que haciendo uso de pip instalo pycryptodome y al relanzar consigo ver por fin la web de SeaFile y en los clientes consigo hacer login y todas las bibliotecas salen reflejadas.
 

    “Ok, parece que va”… Así que me voy a dormir tranquilo y al día siguiente descubro que ninguna biblioteca se sincroniza: Nada sube a la nube y nada baja de ella. ¿Cómo es posible? Me pongo a ver las trazas de SeaFile y detecto excepciones ligadas a una tabla inexistente en la base de datos: RepoFileCount.
 


    Me pongo a googlear y acabo en un hilo donde otros usuarios comentan el mismo problema que yo: Han hecho una subida de versión, consiguen loguearse, pero ninguna biblioteca se va sincronizando y además, al conectarse a la interfaz web comentan que se van creando bibliotecas vacías. Ahí un usuario responde que el problema parece que es que no se han ejecutado todos los scripts de la v6 (upgrade_6.1_6.2.sh, upgrade_6.2_6.3.sh y upgrade_6.3_7.0.sh).
 

     Pero claro, yo ese análisis lo pongo en duda, debido a que estoy seguro de que los he ejecutado (bendito bash_history) y porque si pillas los scripts en SQL ves que se hacen varios ALTER TABLE, pero no sale reflejado ningún CREATE TABLE :

pi@raspberrypi:seafile-server-latest/upgrade/sql $ grep -R Count *
6.3.0/mysql/seafile.sql:ALTER TABLE RepoFileCount DROP primary key;
6.3.0/mysql/seafile.sql:ALTER TABLE RepoFileCount ADD id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
6.3.0/mysql/seafile.sql:ALTER TABLE RepoFileCount ADD UNIQUE (repo_id);


     Total, que desde mi punto de vista esa tabla se ha creado nueva entre la 4.4 y la 6.3.0 y en ningún momento se ha hecho su CREATE TABLE en los scripts de migración. Por suerte, los diferentes CREATE TABLE de MySQL y SQLite pueden encontrarse en la carpeta seafile-server-latest/sql:

pi@raspberrypi:seafile-server-latest/sql $ grep -R Count *
mysql/seafile.sql:CREATE TABLE IF NOT EXISTS RepoFileCount (
sqlite/seafile.sql:CREATE TABLE IF NOT EXISTS RepoFileCount (repo_id CHAR(36) PRIMARY KEY, file_count BIGINT UNSIGNED);

    Así que con un cliente de sqlite me conecté a la BD de mi Seafile y ejecuté manualmente el CREATE TABLE:

main: seafile.db
sqlite> .tables
Branch RepoHead RepoTrash UserShareQuota
GarbageRepos RepoHistoryLimit RepoUserToken VirtualRepo
InnerPubRepo RepoInfo RepoValidSince WebAP
OrgQuota RepoOwner SeafileConf WebUploadTempFiles
OrgUserQuota RepoSize SharedRepo
Repo RepoSyncError SystemInfo
RepoGroup RepoTokenPeerInfo UserQuota
sqlite> CREATE TABLE RepoFileCount (repo_id CHAR(36) PRIMARY KEY, file_count BIGINT UNSIGNED);
sqlite> .exit

    Y tras hacer esto, SeaFile volvió a funcionar perfecto: Podía hacer login, descargar bibliotecas, todo se sincronizaba, alcanzaba velocidades de entre 20-50 MB/s de subida y bajada (y seguramente iría mucho mejor si usara un disco duro externo por USB 3.0). Vamos, que todo iba bien y perfecto.

    Pero claro, con tanto troubleshooting me vino una desagradable sorpresa: Se me llenó el disco de un tera. Durante mis pruebas hice un borrado de una biblioteca pesada y la volví a cargar. Pero claro, las cuentas no me salían: Si una carpeta pesa X, otra carpeta tiene Y, he quitado la opción de histórico… ¿por qué el disco duro se ha llenado si debería de tener unos 300 GB disponibles?
 


     Así que me puse a indagar y resulta que SeaFile no borra datos incluso si tú los borras. Cada modificación de fichero o cada fichero borrado sigue ocupando su espacio en disco en el servidor. SeaFile se comporta como un repositorio de revisiones, como GIT o SVN, cada modificación tiene su referencia en hash y su contenido en blob y cuando tú borras un fichero o quitas la historización, el blob y el hash quedan huérfanos de referencia, pero siguen existiendo en el disco.
 
 
    Por suerte, existe un script dentro de seafile-server-latest llamado “seaf-gc.sh” que lo que hace es buscar todos esos nodos huérfanos y borrarlos del disco. Y bueno, para lanzarlo tienes que parar antes el servicio. En mi caso, tras lanzar el script gané como unos 275 GB de espacio (imaginaos, unos 7 años sin hacer “limpieza”). Una vez descubierto esto preparé un script de parada + limpieza + reinicio y se lo endosé a un crontab para que se lanzara una vez cada 15 días.


    Y poco más, tras muchas horas y varias noches de sufrimiento, por fin tengo de nuevo mi nube disponible y me está funcionando mejor que nunca.

13 septiembre 2015

Seafile, una nube opensource

Motivación

    Llevaba un tiempo buscando alternativas de almacenamiento en la nube desde que se anunció la muerte de Ubuntu ONE a mediados de 2014. Vale que los chicos de Canonical no reinventaron la rueda, pero su servicio funcionaba bastante bien. Tenía sus bugs y los clientes de Windows y Mac eran demasiado básicos, es cierto, pero cumplía bastante bien con mis necesidades.

    Antes de descubrir Ubuntu ONE utilizaba Google Drive para albergar documentos en la nube... pero realmente es algo que nunca me ha gustado mucho, puesto que hoy Google da miedo. Sabe demasiado y tampoco es cuestión de que filtre contenido a entidades dudosas como la NSA. Ya me dirán a mi por qué un servicio secreto de un país extranjero pudiera estar interesado en leer mi hoja de gastos mensual... En fin. Lo único bueno es que si algún día perdemos el móvil o la contraseña de GMail podremos escribirle una carta a la NSA o a la CIA para que nos los chiven :-).

    A pesar de ello, aunque más bien por motivos laborales, me vi en la obligación de coquetear con Office 365 y su flamante One Drive. Pero esa solución no me gustaba, porque era de ir de Guatemala a Guatepeor (pido disculptas a los guatemaltecos, pero es una expresión muy arraigada en la cultura española). Llevo trabajando casi un año como administrador de varios repositorios de SharePoint Online y aunque One Drive sea seguro y una delicia con su integración de Office Online, yo mismo he podido observar hasta qué punto un administrador puede ojear este tipo de archivos (con permiso de los usuarios finales, claro está). Pero claro, ¿y si un administrador de Microsoft que esté descontento desea mirar mi One Drive?

   Aunque él, a priori, no tenga permiso de administración sobre mi cuenta puede proclamarse como tal sin que yo reciba una notificación al respecto. Recordemos, que en pleno siglo XXI ya han robado contraseñas de eBay, Adobe e incluso de la PlayStation Network, recordando señores que la consolas de sobremesa de Sony suelen ser las más vendidas. No es que sea un terrorista en potencia, pero no quiero que los hackers que robaron en su día las fotos de centenares de famosas que posaron con sus iPhones como Dios les trajo al mundo puedan hacerse por ejemplo con el código fuente del último juego que esté programando.

   La cosa es que leyendo el número 91 de la revista francesa "Linux Pratique" leí un reportage sobre Seafile que me resultó interesante y tras trastear un poco con una de mis Raspberries Pi tengo que decir que funciona bastante bien, puesto que permite hacer lo que andaba buscando: Un usuario puede gestionar/sincronizar varias bibliotecas (carpetas), tiene soporte para multiusuario y permite la compartición de una biblioteca con varios usuarios... y ni Google, ni Microsoft, ni Facebook tienen por qué enterarse de la existencia de mis archivos.

Descripción del Software.

    Seafile es una solución que consta de dos partes: Un programa servidor donde gestionamos los usuarios, grupos, bibliotecas y albergamos todos los datos; Y un programa cliente por cada ordenador que necesite conectarse.

    El servidor a su vez puede parametrarse con el navegador web gracias a un servidor web que lleva embebido y a su vez se puede instalar con muy pocas líneas de consola. Por desgracia, por defecto parte del tráfico se realiza en claro, a través del protocolo HTTP. No obstante, aparentemente esto se limita únicamente al login (lo cual no es poco...) y además Seafile nos permite proteger las bibliotecas con contraseñas, permitiendo a su vez el cifraje del contenido. De todas formas en esta entrada explicaré también como modificar y utilizar un servidor Apache 2 local para forzar el uso de SSL (protocolo HTTPS) de forma que nuestra comunicación sea 100% cifrada.

Instalación del servidor.

    Necesitamos una máquina Linux y tener derechos de administrador. En este caso voy a explicar el proceso para instalarlo en una Raspberry PI, máquina que se adapta a mis necesidades. No obstante, recomiendo encarnizadamente (sobretodo si trabajas para una empresa) utilizar un servidor serio, como pudiera ser una máquina Red Hat EL o una Ubuntu Server. El servicio funciona muy bien en una Raspberry PI, pero porque apenas lo utilizo para dos usuarios y utilizo una cuota de espacio reducida (10 Go). Si también pretendes utilizar una Raspberry PI vete mentalizando en comprarte un disco duro externo.

    Los programas necesarios para instalar el servidor son los siguientes: Python 2.7, Python Setup Tools, Python Imaging y SQLite 3. Estos pueden instalarse con el siguiente comando en las máquinas debianitas (Ubuntus inclusive):
apt-get install python2.7 python-setuptools python-imaging sqlite3
Entra en el directorio /srv y descarga la versión deseada. En este caso voy a descargar la versión estable 4.3.0:
  Debian 64 bits:
wget https://bintray.com/artifact/download/seafile-org/seafile/seafile-server_4.3.0_x86-64.tar.gz
  Debian 32 bits:
wget https://bintray.com/artifact/download/seafile-org/seafile/seafile-server_4.3.0_i386.tar.gz
  Raspberry PI:
https://github.com/haiwen/seafile-rpi/releases/download/v4.3.0/seafile-server_4.3.0_pi.tar.gz
Nota: Si tienes problemas con las URL, puedes conseguir las más actuales desde https://www.seafile.com/en/download.

Creamos los directorios necesarios:
mkdir -p /srv/seafile/installed
Y descomprimimos el tar.gz y lo guardamos en installed:
tar -c /srv/seafile -zxf seafile-server_*.tar.gz
mv seafile-server_*.tar.gz /srv/seafile/installed
 A continuación ejecutamos el instalable:
/srv/seafile/seafile-server-4.3.0/setup-seafile.sh
    El instalable nos preguntará el nombre del servidor y la IP/dominio de éste. Si vas a usarlo únicamente en tu red local, indica sin miedo la dirección IP del servidor donde estás realizando esta instalación. Si por el contrario quieres hacer que el servicio esté también disponible fuera de casa, te recomiendo registrarte en un servicio de dominios dinámicos, como pudiera ser http://freedns.afraid.org, para encargar un subdominio gratuito y utilizarlo para rellenar dicho parámetro de la instalación.

    También se te preguntará por el directorio donde guardar los datos que vas a ir albergando tus bibliotecas (en caso de que vayas a usar una Raspberry PI, sería interesante indicar aquí el directorio de un disco duro externo) y el puerto por donde se atenderán las peticiones (por defecto 8082). Si quires que tu nube sea accesible desde fuera de casa, recuerda mapear una regla en tu router para que el puerto 8082 apunte al 8082 de esta máquina.

Primer arranque.

 Ejecutaremos seafile.sh y después el seahub.sh, en ese orden y ambos con el parámetro start:
/srv/seafile/seafile-server-latest/seafile.sh start
/srv/seafile/seafile-server-latest/seahub.sh start
    En este primer arranque la aplicación nos pedirá que ofrezcamos el correo electrónico del administrador (se utilizan las direcciones de correo como los identificadores de cuenta, es decir, hace falta dar un correo electrónico para poder loguearnos después en la cuenta que estamos creando) y la contraseña que tendrá la cuenta.

Creación del servicio.

    Vamos a añadir el siguiente script, basado en el que hay disponible en el manual de Seafile y en el suministrado por la revista francesa Linux Pratique, pero adaptado a mis necesidades. Este script deberá almacenarse en /etc/init.d/seafile:
### BEGIN INIT INFO
# Provides:             seafile
# Required-Start:       $network
# Required-Stop:        $network
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
### END INIT INFO

seafile_dir="/srv/seafile"
scripts_path="${seafile_dir}/seafile-server-latest"
seafile_init_log=${seafile_dir}/logs/seafile.init.log
seahub_init_log=${seafile_dir}/logs/seahub.init.log

case "$1" in
        start|restart)
                ${scripts_path}/seafile.sh $1 >> ${seafile_init_log}
                ${scripts_path}/seahub.sh $1 >> ${seahub_init_log}
        ;;
        stop)
                ${scripts_path}/seahub.sh $1 >> ${seahub_init_log}
                ${scripts_path}/seafile.sh $1 >> ${seafile_init_log}
        ;;
        *)
                echo "Usage: $0 {start|stop|start}"
                exit 1
        ;;
esac
Y a continuación registramos el servicio:
chmod a+x /etc/init.d/seafile
update-rc.d seafile defaults
Y probamos:
service seafile stop
service seafile start
    Al cabo de un minuto podrás acceder a la interfaz web, insertando la dirección IP del servicio y accediendo por el puerto 8000. Ejemplo: http://192.168.0.20:8000

    En esa página web podrás crear todas las cuentas de usuario que creas necesario, crear bibliotecas, gestionarlas a grupos, etcétera.

    Tu nube ya está lista para usarse. Ahora, sólo tienes que instalar uno de los diferentes clientes disponibles para Windows, Linux, Mac OS X, iOS o Android: https://www.seafile.com/en/download.
 

Configurando SSL.

    Si vas a hacer accesible tu nube fuera de casa (es decir, que sea accesible por internet) resulta recomendable configurar Seafile para utilizar el protocolo HTTPS en detrimento del HTTP.

    El primer paso es instalar un servidor apache:
apt-get install apache2
    A continuación necesitamos instalar una serie de programas "privativos". Revisa que en tu /etc/apt/sources.list tenga habilitado los repositorios non-free, contrib y las fuentes (deb-src).
Ejemplo de sources.list de Raspberry PI:
root@Editor /home/sebas # cat /etc/apt/sources.list
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
     Y actualizamos las listas:
apt-get update
   Instalamos el paquete python-flup:
apt-get install python-flup
    Y ejecutamos las siguientes líneas para instalar el paquete libapache-mod-fastcgi:
apt-get update && apt-get -y upgrade
apt-get install postfix ntp ntpdate
apt-get install apache2-mpm-worker php5-fpm php-apc
apt-get install debhelper dpatch libtool cdbs libapr1-dev apache2-threaded-dev
apt-get -b source libapache-mod-fastcgi
dpkg -i libapache2-mod-fastcgi*.deb
    Activamos los siguientes módulos de Apache:
a2enmod rewrite
a2enmod fastcgi
a2enmod proxy_http
    Editamos el fichero de configuración de Apache (apache2.conf) para añadir la siguiente línea al final:
FastCGIExternalServer /var/www/seahub.fcgi -host 127.0.0.1:8000
    Entramos en /srv/seafile/conf y generamos aquí el certificado SSL:
openssl genrsa -out privkey.pem 2048
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
    Se te preguntará una serie de datos. Muy importante: El nombre del host debe de concidir con el dominio (subdominio también) de la máquina. Es decir, no pongas la IP local de tu máquina. Si has reservado por ejemplo el dominio "manolo.com", ese debe de ser el nombre del host en la generación del certificado. Si empleas un subdominio, por ejemplo "cloud.manolo.com", ese deberá de ser el nombre del host. Si no, los navegadores catalogarán tu certificado como "No confiable".

Nota: Tendrás que renovar el certificado cada 1095 días y los navegadores se chivarán de que se trata de un certificado auto firmado.

    A continuación editamos el fichero /etc/apache2/sites-enabled/000-default-ssl con el siguiente contenido:
<IfModule mod_ssl.c>
<VirtualHost *:443>

    ServerName my.domain.com
    DocumentRoot /var/www
    Alias /media  /srv/seafile/seafile-server-latest/seahub/media

    SSLEngine On
    SSLCertificateFile /srv/seafile/conf/cacert.pem
    SSLCertificateKeyFile /srv/seafile/conf/privkey.pem


    RewriteEngine On

   
        Order allow,deny
        Allow from all
   

   
        Order allow,deny
        Allow from all
   


    #
    # 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>
</IfModule>


    Verificamos de nuevo que la configuración de nuestro Apache sea correcta:
a2enmod rewrite ssl actions include
    Y reiniciamos Apache:
service apache2 restart
    A continuación, editaremos el fichero /srv/seafile/ccnet/ccnet.conf y modificaremos el valor de SERVICE_URL para usar el protocolo https. Si vas a poner una regla en tu router, sería recomendable ponerle las cosas difíciles a los hackers, haciendo que el puerto de acceso del HTTPS no sea el 443. Es decir, puedes crear una regla para que el puerto externo 7799 apunte al puerto 443 (el correspondiente al https) de este servidor. De esta forma, deberías de modificar el valor de la variable de la siguiente forma:
SERVICE_URL = https://my.domain.com:7799
Pero si te vas a limitar a usar el puerto 443 por defecto, déjalo de la siguiente forma:
SERVICE_URL = https://my.domain.com
Siguiendo dicho patrón, editamos el  /srv/seafile/seahub_settings.py para editar la linea
FILE_SERVER_ROOT:
FILE_SERVER_ROOT = 'https://my.domain.com:7799/seafhttp'
Y por último editamos el script /etc/init.d/seafile para reemplazar la primera línea "${scripts_path}/seahub.sh $1 >> ${seahub_init_log}" por "${scripts_path}/seahub.sh start-fastcgi >> ${seahub_init_log}" y reiniciamos el servicio:
service seafile stop
service seafile start

 Bibliografía: