Syncronice y comparta ficheros en la nube con Seafile

Seafile es una solución de sincronización y uso compartido de archivos, diseñada para brindar alta confiabilidad, rendimiento y productividad. Con Seafile puedes sincronizar, compartir y colaborar entre diferentes dispositivos y equipos. El núcleo del servidor Seafile está escrito en lenguaje de programación C, es pequeño y tiene un rendimiento excelente además presenta un cliente web desarrollado en Python/Django el cual permite administrar (agregar, compartir, eliminar) sus ficheros en la nube, también es posible instalar un cliente/drive el cual fácilita el manejo de sus ficheros desde la comodidad de su dispositivo.

Descargar

En el momento de ejecutar la instalación la versión disponible es la 8.0.4, vea Seafile descarga para obtener la última versión disponible.

$ wget https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-server_8.0.4_x86-64.tar.gz

Crear dir seafile dentro de /opt

$ sudo mkdir /opt/seafile

Copiar el fichero descargado a /opt/seafile

$ sudo mv seafile-server_* /opt/seafile

Moverse al DIR /opt/seafile

$ cd /opt/seafile

Descompactar

$ sudo tar -xzf seafile-server_*

Crear DIR installed

$ sudo mkdir installed

Mover el compactado a installed

$ sudo mv seafile-server_* installed

Crear bases de datos

Seafile usa MySQL o MariaDB como backend, le puede interesar:

create database `ccnet_db` character set = 'utf8';
create database `seafile_db` character set = 'utf8';
create database `seahub_db` character set = 'utf8';

Crear usuario para acceder a la BD

Vea MySQL Administración de usuarios.

create user 'seafile'@'localhost' identified by 'contraseña';
grant all privileges on `ccnet_db`.* to `seafile`@localhost;
grant all privileges on  `seafile_db`.* to `seafile`@localhost;
grant all privileges on  `seahub_db`.* to `seafile`@localhost;
flush privileges;

Cambiar método de autenticación

Si está teniendo problemas al connectarse a la BD es propable que tenga que cambiar el método de autenticación de MySQL, puede tener más detalles en:

MySQL 8.0, cambiar contraseña de root

ALTER USER seafile@localhost IDENTIFIED WITH mysql_native_password BY 'contraseña';
FLUSH PRIVILEGES;

Instalar dependencias Python

$ sudo apt-get install python3 python3-setuptools python3-pip libmysqlclient-dev -y
$ sudo pip3 install --timeout=3600 Pillow pylibmc captcha jinja2 sqlalchemy \
    django-pylibmc django-simple-captcha python3-ldap mysqlclient

Variables de entorno

Agregue la siguiente información al fichero /etc/environment

LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
export LC_ALL LANG LANGUAGE

haga un:

$ source /etc/environment

Instalar

Los desarrolladores de Seafile nos proveen e utilitario setup-seafile-mysql.sh que nos permite realizar el proceso de instalación de una manera sencilla y cómoda.

$ cd seafile-server-*
$ sudo ./setup-seafile-mysql.sh
Checking python on this machine ...

-----------------------------------------------------------------
This script will guide you to setup your seafile server using MySQL.
Make sure you have read seafile server manual at

        https://download.seafile.com/published/seafile-manual/home.md

Press ENTER to continue
-----------------------------------------------------------------


What is the name of the server? It will be displayed on the client.
3 - 15 letters or digits
[ server name ] files

What is the ip or domain of the server?
For example: www.mycompany.com, 192.168.1.101
[ This server's ip or domain ] files.midominio.local

Which port do you want to use for the seafile fileserver?
[ default "8082" ] 

-------------------------------------------------------
Please choose a way to initialize seafile databases:
-------------------------------------------------------

[1] Create new ccnet/seafile/seahub databases
[2] Use existing ccnet/seafile/seahub databases

[ 1 or 2 ] 2

What is the host of mysql server?
[ default "localhost" ] 

What is the port of mysql server?
[ default "3306" ] 

Which mysql user to use for seafile?
[ mysql user for seafile ] seafile

What is the password for mysql user "seafile"?
[ password for seafile ] 

verifying password of user seafile ...  done

Enter the existing database name for ccnet:
[ ccnet database ] ccnet_db

verifying user "seafile" access to database ccnet_db ...  done

Enter the existing database name for seafile:
[ seafile database ] seafile_db

verifying user "seafile" access to database seafile_db ...  done

Enter the existing database name for seahub:
[ seahub database ] seahub_db

verifying user "seafile" access to database seahub_db ...  done

---------------------------------
This is your configuration
---------------------------------

    server name:            files
    server ip/domain:       files.midominio.local

    seafile data dir:       /opt/seafile/seafile-data
    fileserver port:        8082

    database:               use existing
    ccnet database:         ccnet_db
    seafile database:       seafile_db
    seahub database:        seahub_db
    database user:          seafile


---------------------------------
Press ENTER to continue, or Ctrl-C to abort
---------------------------------

Generating ccnet configuration ...

Generating seafile configuration ...

done
Generating seahub configuration ...

----------------------------------------
Now creating ccnet database tables ...

----------------------------------------
----------------------------------------
Now creating seafile database tables ...

----------------------------------------
----------------------------------------
Now creating seahub database tables ...

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

creating seafile-server-latest symbolic link ...  done


-----------------------------------------------------------------
Your seafile server configuration has been finished successfully.
-----------------------------------------------------------------

run seafile server:     ./seafile.sh { start | stop | restart }
run seahub  server:     ./seahub.sh  { start <port> | stop | restart <port> }

-----------------------------------------------------------------
If you are behind a firewall, remember to allow input/output of these tcp ports:
-----------------------------------------------------------------

port of seafile fileserver:   8082
port of seahub:               8000

When problems occur, Refer to

        https://download.seafile.com/published/seafile-manual/home.md

for information.

Estructura de directorios

Una vez instalado el Seafile debemos tener una estructura de directorios como la que se muestra a continuación:

$ sudo tree -dL 3 /opt/seafile/
seafile/
├── ccnet
├── conf
│   └── __pycache__
├── installed
├── logs
├── pids
├── seafile-data
│   ├── httptemp
│   │   └── cluster-shared
│   ├── library-template
│   ├── storage/opt/
│   │   ├── blocks
│   │   ├── commits
│   │   └── fs
│   └── tmpfiles
├── seafile-server-8.0.4
│   ├── runtime
│   ├── seafile
│   │   ├── bin
│   │   ├── docs
│   │   ├── include
│   │   ├── lib
│   │   └── lib64
│   ├── seahub
│   │   ├── bin
│   │   ├── fabfile
│   │   ├── frontend
│   │   ├── locale
│   │   ├── media
│   │   ├── seahub
│   │   ├── sql
│   │   ├── static
│   │   ├── tests
│   │   ├── thirdpart
│   │   └── tools
│   ├── sql
│   │   ├── mysql
│   │   └── sqlite
│   └── upgrade
│       ├── sql
│       └── win32
├── seafile-server-latest -> seafile-server-8.0.4
└── seahub-data
    └── avatars
        └── groups

Configuraciones

Las configuraciones se encuentra en el directorio con en la estructura anterior

$ sudo tree /opt/seafile/conf
conf/
├── ccnet.conf
├── gunicorn.conf.py
├── __pycache__
│   ├── gunicorn.conf.cpython-37.pyc
│   └── seahub_settings.cpython-37.pyc
├── seafdav.conf
├── seafile.conf
└── seahub_settings.py

Iniciar los servicios

Iniciar el servidor de ficheros

sudo ./seafile.sh start
Starting seafile server, please wait ...
** Message: 17:02:24.029: seafile-controller.c(536): No seafevents.

Seafile server started

Done.

Iniciar el frontend

Ponga especial atención al correo y contraseña que le solicitan porque son las credenciales del usuario administrador y con el cual va a autenticarse en la interfaz web.

sudo ./seahub.sh start

Starting seahub at port 8000 ...

----------------------------------------
It's the first time you start the seafile server. Now let's create the admin account
----------------------------------------

What is the email for the admin account?
[ admin email ] info@seafile.local

What is the password for the admin account?
[ admin password ] 

Enter the password again:
[ admin password again ] 

----------------------------------------
Successfully created seafile admin
----------------------------------------

Seahub is started

Done.

Si tiene problemas ejecute

$ sudo ./seahub.sh start-fastcgi
Starting seahub (fastcgi) at 127.0.0.1:8000 ...
Traceback (most recent call last)
...

El comando anterior nos va a dar una idea de porque el frontend (seahub) no se inicia correctamente.

Resetear credenciales del usuario admin

En caso de que necesite resetear las credenciales del usuario admin ejecute el script reset-admin.sh

$ sudo ./reset-admin.sh

Mapear la interfaz web a una dirección IP y puerto específico

Por defecto la interfaz web solo está accesible via 127.0.0.1:8000 puede cambiar este comportamiento editando el fichero conf/gunicorn.conf.py y modificando la directiva bind.

# default 127.0.0.1:8000
bind = "IP:Puerto"

Reinicie filehub

$ sudo ./seahub.sh restart

Ahora puede acceder al Seafile poniendo en su navegador http://IP:Puerto.

Nota: Tenga en cuenta que exponer en una IP pública al servidor de aplicaciones Gunicorn conlleva riesgos de seguridad por tanto tal y como recomienda su doc lo mejor es desplegarlo detrás de un proxy como NGINX lo que haremos más adelante.

Instalar Memcache

Si su propósito es ofrecer el servicio a más de 50 usuarios instale Memcached lo que permitirá incrementar el rendimiento de la interfaz web.

$ sudo apt-get install memcached libmemcached-dev -y
$ sudo pip3 install --timeout=3600 pylibmc django-pylibmc

Iniciar Memcached con el Sistema Operativo:

$ sudo systemctl enable --now memcached

Usar Memcached.

Modifigue el fichero seahub_settings.py y agregue:

CACHES = {
    'default': {
        'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
    },
}

Administrar los servicios usando systemd

Detener los servicios

$ sudo ./seahub.sh stop 
$ sudo ./seafile.sh stop

Creamos el usuario y el grupo seafile

$ sudo adduser --system --group --HOME /opt/seafile --shell /usr/sbin/nologin --no-create-home seafile

Cambiamos el propietario del directorio de datos

$ sudo chown -Rc seafile:seafile /opt/seafile/seafile-data
$ sudo chown seafile:seafile -Rc /opt/seafile/seahub-data

Cambiamos el grupo del directorio de configuraciones

$ sudo chown :seafile -Rc /opt/seafile/conf/

Permitimos que el grupo pueda acceder al directorio de configuraciones:

$ sudo chmod g=rx -c /opt/seafile/conf/

Le damos permiso de escritura al dir de cache

$ sudo chmod g=rwx -c /opt/seafile/conf/__pycache__

Cambiamos el propietario del DIR de logs

$ sudo chown seafile:seafile -Rc /opt/seafile/logs/

Cambiamos el propietario del DIR pids

$ sudo chown seafile:seafile -Rc /opt/seafile/pids

Cambiar permisos a seahub_settings.py

Con el siguiente comando permitimos que el seahub acceda a su fichero de configuración.

$ sudo chmod g+r -c /opt/seafile/conf/seahub_settings.py

Permitir que el servidor RPC acceda a los ficheros sockets

El servidor RPC usa fichero sockets para ejecutar la comunicación entre los componentes, el siguiente error nos indica que debemos cambiar la configuración de permisos.

socket file exists, delete it anyway
delete socket file failed : Permission denied

Ahora cambiamos el propietario:

$ sudo chown seafile:seafile -Rc /opt/seafile/seafile-server-8.0.4/runtime

Crear las unidades systemd

Con el siguiente comando creamos una nueva unidad para el servicio seafile

$ sudo systemctl edit --force --full seafile

y copiamos el siguiente contenido

[Unit]
Description=Seafile Cloud Storage
After=network.target mysql.service

[Service]
Type=forking
ExecStart=/opt/seafile/seafile-server-latest/seafile.sh start
ExecStop=/opt/seafile/seafile-server-latest/seafile.sh stop
User=seafile
Group=seafile

[Install]
WantedBy=multi-user.target

Procedemos similarmente para el servicio seahub

$ sudo systemctl edit --force --full seahub

y copiamos el siguiente contenido

[Unit]
Description=Seafile Web System Administration (Seahub) 
After=network.target seafile.service

[Service]
Type=forking
ExecStart=/opt/seafile/seafile-server-latest/seahub.sh start
ExecStop=/opt/seafile/seafile-server-latest/seahub.sh stop
User=seafile
Group=seafile

[Install]
WantedBy=multi-user.target

Iniciar el servicio seafile

$ sudo systemctl start seafile

Comprobar estado del servicio seafile

$ sudo systemctl status seafile.service
● seafile.service - Seafile Cloud Storage
   Loaded: loaded (/etc/systemd/system/seafile.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-04-28 17:34:53 -05; 4min 43s ago
    Tasks: 18 (limit: 1147)
   Memory: 5.9M
   CGroup: /system.slice/seafile.service
           ├─2362 /opt/seafile/seafile-server-8.0.4/seafile/bin/seafile-controller -c /opt/seafile/ccnet -d /opt/seafile/seafile-data -F /opt/seafile/conf
           └─2364 seaf-server -F /opt/seafile/conf -c /opt/seafile/ccnet -d /opt/seafile/seafile-data -l /opt/seafile/logs/seafile.log -P /opt/seafile/pids/seaf-server.pid -p /opt/seafile/sea

Apr 28 17:34:50 debian10 systemd[1]: Starting Seafile Cloud Storage...
Apr 28 17:34:50 debian10 seafile.sh[2344]: Starting seafile server, please wait ...
Apr 28 17:34:50 debian10 seafile-control[2360]: seafile-controller.c(536): No seafevents.
Apr 28 17:34:53 debian10 seafile.sh[2344]: Seafile server started
Apr 28 17:34:53 debian10 seafile.sh[2344]: Done.
Apr 28 17:34:53 debian10 systemd[1]: Started Seafile Cloud Storage.

Iniciar el servicio seahub

$ sudo systemctl start seafile

Comprobar estado del servicio seahub

$ sudo systemctl status seahub
● seahub.service - Seafile Web System Administration (Seahub)
   Loaded: loaded (/etc/systemd/system/seahub.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-04-28 17:41:13 -05; 2s ago
  Process: 2487 ExecStart=/opt/seafile/seafile-server-latest/seahub.sh start (code=exited, status=0/SUCCESS)
 Main PID: 2501 (python3)
    Tasks: 6 (limit: 1147)
   Memory: 58.6M
   CGroup: /system.slice/seahub.service
           ├─2501 python3 /opt/seafile/seafile-server-8.0.4/seahub/thirdpart/bin/gunicorn seahub.wsgi:application -c /opt/seafile/conf/gunicorn.conf.py --preload
           ├─2504 python3 /opt/seafile/seafile-server-8.0.4/seahub/thirdpart/bin/gunicorn seahub.wsgi:application -c /opt/seafile/conf/gunicorn.conf.py --preload
           ├─2505 python3 /opt/seafile/seafile-server-8.0.4/seahub/thirdpart/bin/gunicorn seahub.wsgi:application -c /opt/seafile/conf/gunicorn.conf.py --preload
           ├─2506 python3 /opt/seafile/seafile-server-8.0.4/seahub/thirdpart/bin/gunicorn seahub.wsgi:application -c /opt/seafile/conf/gunicorn.conf.py --preload
           ├─2507 python3 /opt/seafile/seafile-server-8.0.4/seahub/thirdpart/bin/gunicorn seahub.wsgi:application -c /opt/seafile/conf/gunicorn.conf.py --preload
           └─2508 python3 /opt/seafile/seafile-server-8.0.4/seahub/thirdpart/bin/gunicorn seahub.wsgi:application -c /opt/seafile/conf/gunicorn.conf.py --preload

Apr 28 17:41:08 debian10 systemd[1]: Starting Seafile Web System Administration (Seahub)...
Apr 28 17:41:08 debian10 seahub.sh[2487]: LC_ALL is not set in ENV, set to en_US.UTF-8
Apr 28 17:41:08 debian10 seahub.sh[2487]: Starting seahub at port 8000 ...
Apr 28 17:41:13 debian10 seahub.sh[2487]: Seahub is started
Apr 28 17:41:13 debian10 seahub.sh[2487]: Done.
Apr 28 17:41:13 debian10 systemd[1]: Started Seafile Web System Administration (Seahub).

Configurar el NGINX como proxy

Cree un virtual host y ponga la siguiente configuración, debe ajustar las directivas server_name, proxy_pass de acuerdo a su configuración.

log_format seafileformat '$http_x_forwarded_for $remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';
server {    
    listen 80;
    server_name files.seafiles.local;
    
    # Put here your SSL
    # listen 443 ssl http2;
    # include snippets/intefid-ssl.conf;
    
    # Max file size useful for file uploading 
    # 
    client_max_body_size 200M;

    proxy_set_header X-Forwarded-For $remote_addr;
    
    location / {
        # NGINX acting as reverse proxy
        #
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        #
        # Set the backend url and port, port is optional for standard services, the
        # $backend_port is defined as a map, see conf.d/mapper.conf also when there is
        # a variable as a part of proxy_pass URL a resolver is needed, 
        # see conf.d/resolver.conf
        #
        proxy_pass http://127.0.0.1:8000;
        
        access_log    /var/log/nginx/seahub.access.log seafileformat;
        error_log       /var/log/nginx/seahub.error.log;
    }

    location /seafhttp {
        rewrite ^/seafhttp(.*)$ $1 break;
        proxy_pass http://127.0.0.1:8082;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_connect_timeout  36000s;
        proxy_read_timeout  36000s;
        proxy_send_timeout  36000s;

        send_timeout  36000s;

        access_log      /var/log/nginx/seafhttp.access.log seafileformat;
        error_log       /var/log/nginx/seafhttp.error.log;
    }
}

Ahora puede poner en su navegador http://seafile.local

Seafile Login

Login

Seafile Library

Library

Enlaces de interés


YouTube Video

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.