Esta pagina se ve mejor con JavaScript habilitado

ONLYOFFICE y ownCloud

 ·   ·  ☕ 13 minutos lectura  ·  🦎 Odair

La edición colaborativa

El mes pasado hablábamos de ownCloud, un importante competidor de soluciones de almacenamiento en la nube, que junto con NextCloud aparecen como alternativas a los grandes de la web como lo son Dropbox, Google Drive y Microsoft OneDrive, entre otros. Mencionábamos en el artículo de ownCloud, tu propia nube, que la posibilidad de compartir y colaborar con archivos había cobrado mayor relevancia que el mero hecho de tener un backup remoto, y resulta ser en ese punto donde una solución de almacenamiento colaborativo expande su utilidad, cuando se le agrega edición online de documentos, hojas de cálculo y presentaciones.

ONLYOFFICE, el complemento ideal

ONLYOFFICE es una suite completa de oficina, que bien podemos instalar en nuestra propia infraestructura, o usarla como servicio premium proporcionado por la gente de Ascensio System SIA. Pero como ya es tradición en este blog, vamos a ir más allá instalando ONLYOFFICE para ser usado en conjunto con nuestra instalación de ownCloud.

Nota: si eres usuario de NextCloud, buena parte de este tutorial te servirá.

La instalación que vamos a seguir es la correspondiente a los paquetes de la distribución para Ubuntu/Debian. En el sitio oficial podrás encontrar instrucciones para Docker que están bien documentadas y gozan de buena participación de la comunidad en foros y otros blog posts. Es por ello que profundizaremos en la opción de instalación con paquetes de software, dado que así tienes mayor control sobre cada archivo de configuración y podrás resolver los problemas que vas encontrando mientras entiendes la estructura de ONLYOFFICE.

Una pequeña queja

Quiero descargar un poco de frustración con el modelo OpenSource que están implementando algunas compañías. Si bien, siempre preferiré el OpenSource al modelo cerrado y privativo, ocurre que cuando los proyectos no siguen las reglas del software libre y simplemente abren su código para atraer desarrolladores, llega el momento en que inician su etapa Enterprise o Premium y terminan abandonando parcialmente las versiones Community o de Código Abierto, dejándolas en manos de una comunidad muy pequeña que no tiene la capacidad de dar el soporte que un proyecto de código abierto requiere.

Esto se da en parte porque las licencias que son sólo OpenSource y no de software libre, no exigen que lo que derives de allí deba permanecer debidamente documentado y dispuesto tanto en fuentes como binarios. Entonces te encuentras con proyectos como este, o como Collabora Office y Alfreso Community Edition, entre otros tantos, a quienes les viene muy bien ofrecerte una imagen de Docker que les resuelve un poco el dilema de disponer un binario funcional. Sin embargo, para quienes hacemos SysAdmin y somos responsables de la seguridad de la infraestructura que manejamos, el escalamiento de privilegios que hace Docker sobre los contenedores que despliega, representa un alto riesgo, en especial porque si de antemano no conoces la estructura interna del software, no sabrás qué es lo que estás exponiendo con privilegios de root hacia lo salvaje.

Así que está bien que puedas probar rápidamente su software OpenSource con una imagen de Docker, pero si quieres montar esto en un entorno de producción seguro, deberás preocuparte un poco más de asegurar dicho despliegue mediante las opciones que tienes disponible en Docker. Al final para mi, esto sigue siendo un quiebre de responsabilidades que permite el OpenSource y considero que para proteger realmente tu proyecto, deberías jugar las reglas del software libre, aquellas que no están mejor pintadas en otro lugar que en el modelo de licenciamiento GPL.

Gracias por leer, ya me siento mejor 🤗.

Requisitos previos

ONLYOFFICE está desarrollado en PHP para su backend, e integrado con Nginx como servidor HTTP y HTTPS, por lo que si tu sistema ya corre otro servidor web como Apache2, tendrás que usar puertos alternativos; ya veremos como. Adicionalmente, ONLYOFFICE también hace uso del servidor de AMQP RabbitMQ. Su frontend está desarrollado con NodeJS, con el cual no tendrás que vértelas porque está sólidamente desarrollado e integrado.

Nota: este tutorial fue probado para ONLYOFFICE versión 6.1.1.

La instalación la haremos sobre Ubuntu 18.04 Server. Ten en cuenta las siguientes dependencias que serán instaladas junto con ONLYOFFICE, de las cuales quiero resaltar supervisor, que es un sistema de control de servicios similar a systemd, pero para servicios de software de usuario, en este caso los componentes de ONLYOFFICE correrán como servicios de supervisor.

1
sudo apt install -y libcurl4 libxml2 supervisor fonts-dejavu fonts-liberation ttf-mscorefonts-installer fonts-crosextra-carlito fonts-takao-gothic fonts-opensymbol

Preparando el sistema

ONLYOFFICE usa una base de datos PostgreSQL, por tanto vamos a instalarlo y a configurar dicha DB.

1
sudo apt-get install postgresql

Tanto el usuario de la DB como el password deben ser onlyoffice, vamos a crearlos directamente desde la consola de usuario un comando a la vez:

1
2
3
sudo -i -u postgres psql -c "CREATE DATABASE onlyoffice;"
sudo -i -u postgres psql -c "CREATE USER onlyoffice WITH password 'onlyoffice';"
sudo -i -u postgres psql -c "GRANT ALL privileges ON DATABASE onlyoffice TO onlyoffice;"

Nota: también podrías hacer esto en el intérprete de comandos de PostgreSQL o mediante algún administrador gráfico.

Ahora instalemos RabbitMQ y Nginx:

1
sudo apt-get install rabbitmq-server nginx-extras

Como lo dije anteriormente, en este tutorial configuraremos la instalación para que funcione en puertos alternativos. La forma más expedita es haciendo uso de debconf un comando a la vez:

1
2
echo onlyoffice-documentserver onlyoffice/ds-port select 8081 | sudo debconf-set-selections
echo onlyoffice-documentserver onlyoffice/ds-ssl-port select 8443 | sudo debconf-set-selections

Además, asegurémonos de que ONLYOFFICE use autenticación por JWT.

1
2
echo onlyoffice-documentserver onlyoffice/jwt-enable select true | sudo debconf-set-selections
echo onlyoffice-documentserver onlyoffice/jwt-secret select TuClaveUltraSecreta | sudo debconf-set-selections

Esto fijará los datos necesarios en la DB de debconf para que el paquete de ONLYOFFICE se configure correctamente.

Ahora agreguemos la llave y el repositorio a nuestras fuentes de software:

1
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5
1
sudo echo "deb https://download.onlyoffice.com/repo/debian squeeze main" | sudo tee /etc/apt/sources.list.d/onlyoffice.list
1
sudo apt-get update; sudo apt-get install onlyoffice-documentserver

Nota: el instalador te preguntará por el usuario y contraseña de PostgreSQL, el cual definimos anteriormente como onlyoffice. Si seleccionas estos parámetros en debconf no tendrás que ingresarlos; la lista de parámetros la puedes ver con el comando sudo debconf-show onlyoffice-documentserver.

Finalizada la instalación procederemos a configurar el acceso HTTPS, si no lo requieres, podrás usar la instalación por defecto y acceder a http://tu-direccion-ip:8081, con lo que verás la página de bienvenida después de aceptar las advertencias de seguridad:

onlyoffice wellcome
onlyoffice: Página de bienvenida

Nota: es posible que la configuración del paquete de onlyoffice falle cuando estás usando el puerto 80 con otro servicio distinto a nginx, para lo cual deberás asegurarte que tu configuración de nginx le permita arrancar (mira abajo la configuración de nginx) y verificado este punto, ejecutar sudo dpkg --configure -a para terminar la configuración del paquete onlyoffice-documentserver.

¿Qué tenemos hasta ahora?

Pues bien, supongo que esperabas ver la interfaz de edición de documentos, yo también esperaba eso, pero para ver lo que esperábamos es necesario iniciar un demo que viene con la instalación. ¿Y qué es eso del demo?, es una configuración especial con pocas opciones de seguridad, que carga una página inicial desde donde se llaman a los editores y conversores de documentos. Lo que en realidad instalaste fue un servidor de documentos (documentserver) que podrás usar mediante el API disponible, y que si no lo aseguras, podría ser usado por cualquier tercero que tenga acceso a tu dirección ip pública.

Por tanto, vamos a asegurar el servidor y a integrarlo a ownCloud, en lugar de usar el demo, que de cualquier manera te invito a probar para que te animes a continuar.

Aseguramiento del servidor

El paso primordial es habilitar el HTTPS para Nginx, para lo cual puedes optar por usar certificados autofirmados siguiendo esta guía, o si tienes un dominio, crear un registro A en tu administrador de dominios para un host como onlyoffice.example.com, que apunte a tu dirección IP, para después usar Certbot y obtener los certificados desde Let’s Encrypt.

Nota: puedes crear el host con el nombre que quieras.

Vamos a ver la segunda opción.

Instalar certificado de Let’s Encrypt con Certbot

Recuerda que Certbot usará la configuración HTTP de tu servidor Nginx para obtener el certificado, por lo que no te adelantes a crear la configuración HTTPS dentro de tu sitio de Nginx sin tener previamente los certificados, dado que esto no permitirá que Nginx arranque.

Asegúrate de tener la configuración del host general de nginx de la siguiente manera:

1
sudo nano /etc/nginx/conf.d/ds.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
include /etc/nginx/includes/http-common.conf;

## Normal HTTP host
server {
  listen 0.0.0.0:8081;
  listen [::]:8081 default_server;
  server_name onlyoffice.example.com;
  server_tokens off;
}

#HTTP host for internal services
server {
  listen 127.0.0.1:8081;
  listen [::1]:8081;
  server_name localhost;
  server_tokens off;

  include /etc/nginx/includes/ds-common.conf;
  include /etc/nginx/includes/ds-docservice.conf;
}

Nota: ds.conf es un enlace simbólico a /etc/onlyoffice/documentserver/nginx/ds.conf. Revisa el contenido de los últimos include, dentro de ellos está el document root de ONLYOFFICE.

Reinicia Nginx con sudo systemctl restart nginx y revisa que esté corriendo sobre el puerto especificado entrando a http://onlyoffice.example.com:8081.

Nota: puede ocurrir que tengas una instalación previa de Nginx y prefieras tener tus virtual host ordenados dentro de /etc/nginx/sites-availible habilitándolos con un enlace simbólico desde /etc/nginx/sites-enabled, esto también lo puedes hacer moviendo el enlace /etc/nginx/conf.d/ds.conf a dicho directorio. Tampoco he dicho que ONLYOFFICE no pueda correr sobre Apache, sin embargo no está soportado oficialmente.

Ahora que está probado que Nginx corre bien, vamos a seguir la guía de Certbot para Ubuntu 18.04 y a generar los certificados para el dominio onlyoffice.example.com.

Con los certificados ya generados, es hora de modificar la configuración del host principal de Nginx así:

1
sudo nano /etc/nginx/conf.d/ds.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
include /etc/nginx/includes/http-common.conf;

## Normal HTTP host
server {
  listen 0.0.0.0:8081;
  listen [::]:8081 default_server;
  server_name onlyoffice.example.com;
  server_tokens off;

  ## Redirects all traffic to the HTTPS host
  root /nowhere; ## root doesn't have to be a valid path since we are redirecting
  return 301 https://onlyoffice.example.com:8443$request_uri;
}

#HTTP host for internal services
server {
  listen 127.0.0.1:8081;
  listen [::1]:8081;
  server_name localhost;
  server_tokens off;

  include /etc/nginx/includes/ds-common.conf;
  include /etc/nginx/includes/ds-docservice.conf;
}

## HTTPS host
server {
  listen 8443 ssl http2;
  listen [::]:8443 ssl http2;
  server_name onlyoffice.example.com;
  server_tokens off;
  root /usr/share/nginx/html;

  ssl_certificate /etc/letsencrypt/live/onlyoffice.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/onlyoffice.example.com/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

  include /etc/nginx/includes/ds-*.conf;
}

Nota: nginx podría fallar para arrancar por varios motivos, el principal es porque no hayas generado correctamente el certificado SSL, revisa los logs para ver de qué se trata.

Las opciones que más nos interesan son ssl_certificate y ssl_certificate_key. Que deben coincidir con la ruta en la que Certbot guardó los certificados de Let’s Encrypt (mira tu consola, la salida del comando certbot te lo dirá).

Si todo ha salido bien, podrás acceder a https://onlyoffice.example.com:8433 y ver la página de bienvenida.

Nota: nuevamente, si usaste los puertos por defecto, no tendrás que especificar puerto alguno en la url.

Asegurar el documentserver mediante token

Como te expliqué anteriormente, onlyoffice usa JWT para asegurar la comunicación entre el documentserver y las aplicaciones que se conecten, para ello ambos deberán compartir la misma clave; esta la definimos arriba en la configuración de debconf como TuClaveUltraSecreta, pero nos falta habilitar el uso de tokens en la configuración del documentserver.

Las configuraciones que debes tocar están concentradas todas el archivo local de configuración del documentserver, el resto de archivos que encontrarás en el directorio /etc/onlyoffice/documentserver/ son de uso general del software y no hay motivos para que tengas que tocarlas. Entonces vamos a mirar como va; editemos el archivo local.json el cual deberá quedar con el siguiente contenido.

1
sudo nano /etc/onlyoffice/documentserver/local.json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
{
  "services": {
    "CoAuthoring": {
      "sql": {
        "type": "postgres",
        "dbHost": "localhost",
        "dbPort": "5432",
        "dbName": "onlyoffice",
        "dbUser": "onlyoffice",
        "dbPass": "onlyoffice"
      },
      "token": {
        "enable": {
          "request": {
            "inbox": true,
            "outbox": true
          },
          "browser": true
        },
        "inbox": {
          "header": "Authorization"
        },
        "outbox": {
          "header": "Authorization"
        }
      },
      "secret": {
        "inbox": {
          "string": "TuClaveUltraSecreta"
        },
        "outbox": {
          "string": "TuClaveUltraSecreta"
        },
        "session": {
          "string": "TuClaveUltraSecreta"
        }
      }
    }
  },
  "rabbitmq": {
    "url": "amqp://guest:guest@localhost"
  }
}

Luego, hay que decirle al ownCloud que el encabezado JWT para la autenticación de ONLYOFFICE será el mismo definido en la configuración local:

1
sudo nano /var/www/owncloud.example.com/public_html/config/config.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
$CONFIG = array (
  'ONLYOFFICE' => array(
    'jwt_header' => "Authorization",
  ),
  'passwordsalt' => 'ua/Nd2m7jKNgDuljGRxzLotT0pojOW',
  'secret' => '9pcYnFrwRfQcLyL6/bWf6xDgntHC41nghEvnttKBL7coChoq',
  'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => 'owncloud.example.com',
  ),
.
.
.

Nota: es posible que la autenticación JWT siga fallando, por lo que es posible que debas cambiar el encabezado a AutorizationJWT en ambos archivos.

Con esto queda sólo reiniciar los servicios de ONLYOFFICE y detener el ejemplo, ya que también se inicia junto con los demás.

1
sudo supervisorctl restart all; sudo supervisorctl stop ds:example

Integración de ownCloud y ONLYOFFICE

La integración es realizada por una de las aplicaciones que puedes instalar en ownCloud, así mismo, como dije anteriormente, también puedes integrarlo a NextCloud con el mismo mecanismo.

Para ello podemos ir al Market de aplicaciones e instalarla, o podemos descargarla directamente desde GitHub. Vamos con la primera opción; ve al Market de tu instalación de ownCloud en la sección Tools, busca ONLYOFFICE y le das clic en INSTALAR:

ONLYOFFICE app installation
ONLYOFFICE: App de Market

Posteriormente, en la sección de ajustes de tu perfil como administrador de ownCloud, en la parte inferior izquierda, da clic en Adicional; verás la configuración del app.

ONLYOFFICE app configuration
ONLYOFFICE: Configuración del App

Finalmente, escribe la URL que configuramos anteriormente para el documentserver y TuClaveUltraSecreta. Da clic en guardar y si todo sale bien verás la siguiente información:

ONLYOFFICE app options
ONLYOFFICE: Opciones del App

Nota: en este punto pueden aparecer errores sobre token inválido o sobre cosas que cURL no pudo hacer algo, error 403 forbidden, etc; así mismo sobre que el conversor de documentos no pudo convertir no se que cosa. Muchos de estos mensajes están relacionados con la configuración del token en los pasos anteriores, puedes intentar desactivando en todos los archivos anteriormente editados todas las solicitudes de token y probar habilitar el app sin token sobre un servidor http, no https, y si carga, ya sabes dónde buscar el problema.

Finalmente podrás acceder a tu perfil de ownCloud y tendrás disponible un bonito menú para crear documentos, hojas de cálculo y presentaciones. Te invito a revisar las opciones del app, tal vez desees que los archivos se abran en la misma pestaña, o que los formatos no nativos (odt, ods, odp, etc.) del app se abran para edición por defecto, entre otras.

Nota: el formato nativo de ONLYOFFICE es OpenXML, es decir: docx, xlsx, pptx, etc.

ONLYOFFICE app menu
ONLYOFFICE: Menú del App

Te invito a probar esta gran herramienta, su funcionalidad está a la altura de las opciones dominantes del mercado y honestamente a mi me conquistó por encima de Google Docs e incluso de Collabora Office que es también OpenSource.

ONLYOFFICE spreadsheet
ONLYOFFICE: Hoja de Cálculo

Cuéntame qué te pareció el tutorial, y si tienes dudas déjame un comentario o ponte en contacto.

compartir en

Odair Trujillo
Escrito por
Odair
Software Developer