Ir al contenido

Ofimática en la nube

Intro

Este documento explica cómo instalar OxOOL (OxOffice Online) desde cero e integrarlo a Nextcloud.

OxOffice Online es una suite ofimática en línea de código abierto, autoalojable y basada en LibreOffice Online.

Sus características incluyen:

  • Edición básica y compartida
  • Alta fidelidad, representación WYSIWYG
  • Soporta el estándar mundial Open Document Format e incluso formatos privativos como DOC/DOCX, PPT/PPTX, XLS/XLSX

Está disponible para RockyLinux 8 y Ubuntu 24.04. Si estás interesado en probarlo en otra plataforma puedes descargar el último código fuente de GitHub e intentar compilarlo.

OxOffice Online y Nextcloud pueden estar en el mismo servidor o en dos diferentes.

Guía de instalación de OxOffice Online para Ubuntu 24.04 (Community Edition)

Como primer paso es necesario descargar imágenes del sistema base de entre las disponibles. Para crear contenedores las imágenes deben haber sido descargadas previamente.

Actualizamos el catálogo de plantillas disponibles:

# pveam update

Listamos las plantillas disponibles:

# pveam available --section system
...
system ubuntu-20.04-standard_20.04-1_amd64.tar.gz
system ubuntu-22.04-standard_22.04-1_amd64.tar.zst
system ubuntu-24.04-standard_24.04-2_amd64.tar.zst
system ubuntu-24.10-standard_24.10-1_amd64.tar.zst
system ubuntu-25.04-standard_25.04-1.1_amd64.tar.zst
...

Para cada plantilla que querramos utilizar, la descargamos usando:

# pveam download local ubuntu-24.10-standard_20.10-1_amd64.tar.zst

Estamos listos para crear contenedores usando esa imagen. Se puede listar todas las imágenes locales con:

# pveam list local
NAME                                                    SIZE 
local:vztmpl/debian-12-standard_12.7-0_amd64.tar.zst     120.65MB
local:vztmpl/ubuntu-20.10-standard_20.10-1_amd64.tar.zst 136.83MB

En este punto, desde la interfaz web, deberías poder hacer clic en el botón ‘Create CT’ y elegir entre las plantillas disponibles.

Ahora bien, si preferís la linea de comandos, para crear un nuevo contenedor usamos

pct create 10 local:vztmpl/ubuntu-20.10-standard_20.10-1_amd64.tar.zst --rootfs local-lvm:24 --cores 2 --net0 name=ens18,bridge=vmbr0,ip=10.11.1.10/24,gw=10.11.1.1 --nameserver 10.11.1.1 --password 123456789 --timezone host

La clave definida en el comando anterior es para el usuario root. Dado que no podremos conectarnos por SSH utilizando ese usuario, iniciamos una consola en el contenedor

pct console 10

A partir de este punto podremos, por ejemplo, agregar usuarios y habilitar el acceso SSH

Reiniciamos el equipo y luego ejecutamos estos comandos para instalar los programas necesarios junto con OxOOL Community Edition

apt update
apt upgrade -y
apt install nano openssh-server net-tools curl -y
# Chooese yes if you get any service restarting prompts
curl -o /etc/apt/keyrings/OSSII.asc http://www.oxoffice.com.tw/deb/OSSII.key
curl -o /etc/apt/sources.list.d/oxool-community-v5-noble.list http://www.oxoffice.com.tw/deb/oxool-community-v5-noble.list
apt update
apt install oxool -y

Definimos que el servicio OxOOL Community Edition se inicie al arrancar y luego reiniciamos

systemctl enable oxool
reboot

Comprobamos si OxOOL Community Edition inicia normalmente

netstat -tlnp

Deberías obtener un resultado similar a este:

tcp6 0 0 :::9980 :::* LISTEN 644/oxool

Configurar un proxy reverso

Dependiendo de la infraestructura disponible puede ser necesario configurar un proxy reverso. Para ello se puede utilizar Apache o Nginx.

Con SSL o sin SSL

La regla del punto de conexión se puede resumir como

  • wss se conecta sólo en https
  • ws se conecta en http

y viceversa:

  • https sólo acepta wss
  • http sólo acepta ws

Apache

Para poder procesar el tráfico, es necesario habilitar los siguientes módulos: proxy, proxy_connect, proxy_http, proxy_wstunnel. Para ello

a2enmod proxy proxy_connect proxy_http proxy_wstunnel

Crearemos un host virtual y, dependiendo de la necesidad, utilizaremos una de las siguientes configuraciones de ejemplo:

nano /etc/apache2/sites-available/oxool.conf

Sustituiremos el nombre de dominio que utilizamos para OxOffice Online. No debes olvidar crear un registro A para este subdominio en el DNS.

1. SSL en ambos extremos:

La config correspondiente en /etc/oxool/oxoolwsd.xml es:

<ssl desc="SSL settings">
        <enable type="bool">true</enable>
</ssl>
<VirtualHost *:443>
  ServerName odfweb.dominio.edu.ar:443
  Options -Indexes
  # Encoded slashes need to be allowed
  AllowEncodedSlashes NoDecode
  SSLProxyEngine On
  ProxyPreserveHost On
 # cert is issued for collaboraonline.example.com and we proxy to localhost
 SSLProxyVerify None
 SSLProxyCheckPeerCN Off
 SSLProxyCheckPeerName Off
 oxool_communitty = «oxoolhost»:9980

 # static html, js, images, etc. served from oxoolwsd
 # browser is the client part of Collabora Online
 ProxyPass           /browser https://${oxool_communitty}/browser retry=0
 ProxyPassReverse    /browser https://${oxool_communitty}/browser
 # WOPI discovery URL
 ProxyPass           /hosting/discovery https://${oxool_communitty}/hosting/discovery retry=0
 ProxyPassReverse    /hosting/discovery https://${oxool_communitty}/hosting/discovery
 # Capabilities
 ProxyPass           /hosting/capabilities https://${oxool_communitty}/hosting/capabilities retry=0
 ProxyPassReverse    /hosting/capabilities https://${oxool_communitty}/hosting/capabilities
 # Main websocket
 ProxyPassMatch      "/(c|ox)ool/(.*)/ws$"      wss://${oxool_communitty}/oxool/$1/ws nocanon
 # Admin Console websocket
 ProxyPass           /(c|l)ool/adminws wss://${oxool_communitty}/oxool/adminws
 # Download as, Fullscreen presentation and Image upload operations
 ProxyPass           /(c|ox)ool https://${oxool_communitty}/oxool
 ProxyPassReverse    /(c|ox)ool https://${oxool_communitty}/oxool
 # Compatibility with integrations that use the /lool/convert-to endpoint
 ProxyPass           /lool https://${oxool_communitty}/oxool
 ProxyPassReverse    /lool https://${oxool_communitty}/oxool
</VirtualHost>

2. SSL termina en el proxy:

La config correspondiente en /etc/oxool/oxoolwsd.xml es:

<ssl desc="SSL settings">
        <enable type="bool">false</enable>
        <termination>true</termination>
</ssl>
<VirtualHost *:443>
  ServerName odfweb.dominio.edu.ar:443
  Options -Indexes
  # Encoded slashes need to be allowed
  AllowEncodedSlashes NoDecode
  ProxyPreserveHost On
 # static html, js, images, etc. served from oxoolwsd
 # browser is the client part of Collabora Online
 ProxyPass           /browser http://${oxool_communitty}/browser retry=0
 ProxyPassReverse    /browser http://${oxool_communitty}/browser
 # WOPI discovery URL
 ProxyPass           /hosting/discovery http://${oxool_communitty}/hosting/discovery retry=0
 ProxyPassReverse    /hosting/discovery http://${oxool_communitty}/hosting/discovery
 # Capabilities
 ProxyPass           /hosting/capabilities http://${oxool_communitty}/hosting/capabilities retry=0
 ProxyPassReverse    /hosting/capabilities http://${oxool_communitty}/hosting/capabilities
 # Main websocket
 ProxyPassMatch      "/(c|ox)ool/(.*)/ws$"      ws://${oxool_communitty}/oxool/$1/ws nocanon
 # Admin Console websocket
 ProxyPass           /(c|l)ool/adminws ws://${oxool_communitty}/oxool/adminws
 # Download as, Fullscreen presentation and Image upload operations
 ProxyPass           /(c|ox)ool http://${oxool_communitty}/oxool
 ProxyPassReverse    /(c|ox)ool http://${oxool_communitty}/oxool
 # Compatibility with integrations that use the /lool/convert-to endpoint
 ProxyPass           /lool http://${oxool_communitty}/oxool
 ProxyPassReverse    /lool http://${oxool_communitty}/oxool
</VirtualHost>

Cerramos y guardamos el archivo.
Habilitamos este host virtual con el siguiente comando:

sudo a2ensite oxool.conf

Luego recargamos la configuración de Apache.

systemctl restart apache2

Obtener e instalar certificados TLS

Dado que en otro artículo se explica cómo instalar, configurar y poner en marcha Apache con el módulo mod_md no vamos a ahondar sobre el tema en esta oportunidad.

Nginx

Crearemos un host virtual y, dependiendo de la necesidad, utilizaremos una de las siguientes configuraciones de ejemplo:

nano /etc/nginx/sites-available/oxool.conf

Sustituiremos el nombre de dominio que utilizamos para OxOffice Online. No debes olvidar crear un registro A para este subdominio en el DNS.

1. SSL en ambos extremos:

La config correspondiente en /etc/oxool/oxoolwsd.xml es:

<ssl desc="SSL settings">
        <enable type="bool">true</enable>
</ssl>
upstream oxool-community {
    server «oxoolhost»:9980;
    keepalive 32;
    }
 # static files
   location ^~ /browser {
   proxy_pass https://oxool-community;
   proxy_set_header Host $host;
 }
 # WOPI discovery URL
   location ^~ /hosting/discovery {
   proxy_pass https://oxool-community;
   proxy_set_header Host $host;
 }
 # Capabilities
   location ^~ /hosting/capabilities {
   proxy_pass https://oxool-community;
   proxy_set_header Host $host;
 }
 # main websocket
   location ~ ^/(c|ox)ool/(.*)/ws$ {
   proxy_pass https://oxool-community;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Host $host;
   proxy_read_timeout 36000s;
 }
 # download, presentation and image upload
 location ~ ^/(c|l)ool {
   proxy_pass https://oxool-community;
   proxy_set_header Host $host;
 }
 # Admin Console websocket
 location ^~ /(c|ox)ool/adminws {
   proxy_pass https://oxool-community;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Host $host;
   proxy_read_timeout 36000s;
 }
}

2. SSL termina en el proxy:

La config correspondiente en /etc/oxool/oxool.xml es:

<ssl desc="SSL settings">
        <enable type="bool">false</enable>
        <termination>true</termination>
</ssl>
upstream oxool-community {
    server «oxoolhost»:9980;
    keepalive 32;
    }

    server {
    listen       443 ssl;
    server_name  odfweb.dominio.edu.ar;
    ssl_certificate /ruta/a/certificado_ssl;
    ssl_certificate_key /ruta/a/llave_certificado_ssl;
 # static files
 location ^~ /browser {
   proxy_pass http://oxool-community;
   proxy_set_header Host $host;
 }
 # WOPI discovery URL
 location ^~ /hosting/discovery {
   proxy_pass http://${oxool_communitty};
   proxy_set_header Host $host;
 }
 # Capabilities
 location ^~ /hosting/capabilities {
   proxy_pass http://${oxool_communitty};
   proxy_set_header Host $host;
 }
 # main websocket
 location ~ ^/(c|ox)ool/(.*)/ws$ {
   proxy_pass http://${oxool_communitty};
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Host $host;
   proxy_read_timeout 36000s;
 }
 # download, presentation and image upload
 location ~ ^/(c|l)ool {
   proxy_pass http://${oxool_communitty};
   proxy_set_header Host $host;
 }
 # Admin Console websocket
 location ^~ /(c|ox)ool/adminws {
   proxy_pass http://${oxool_communitty};
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Host $host;
   proxy_read_timeout 36000s;
 }
}

Cerramos y guardamos el archivo. Luego probamos la configuración de Nginx.

nginx -t

Si la prueba es exitosa, recargamos Nginx.

systemctl reload nginx

Instalar Nextcloud 24 en Ubuntu 20.04

Verificar los requerimientos de Nextcloud e instalar los paquetes de Nginx/Apache, PHP y MariaDB requeridos.

Para tener disponibles todas las versiones de PHP se recomienda instalar el repositorio ppa:ondrej/php. Gracias Ondřej Surý.

add-apt-repository ppa:ondrej/php

Actualizar los índices

apt update

Instalamos algunos paquetes necesarios

apt install software-properties-common dirmngr apt-transport-https

Agregamos los paquetes de software necesarios para el núcleo de Nextcloud

apt install mariadb-server nginx libapache2-mod-php8.3 php8.3-{apcu,common,curl,fpm, gd,json,xml,mbstring,mysql,xml,zip,intl,bz2,ldap,bcmath}

Editamos la configuración de PHP.

nano /etc/php/8.3/fpm/php.ini

Cambiamos la configuración predeterminada por la siguiente, y nos cercioramos de ajustar el límite_memoria de acuerdo a la capaciad máxima disponible y la zona.horaria.fecha con la ubicación/zona horaria de nuestro servidor.

date.timezone = America/Argentina/Buenos_Aires
memory_limit = 512M
upload_max_filesize = 500M
post_max_size = 600M
max_execution_time = 300
file_uploads = On
allow_url_fopen = On
display_errors = Off
output_buffering = Off

Guardamos el archivo y reiniciamos nginx

systemctl restart nginx

Creamos la base de datos para Nextcloud

mariadb -u root -p

Los siguientes comandoas crearán la nueva base de datos basenc, un usuario nextcloud@localhost, con la contraseña secr3Ta. Puedes ajustar los detalles de la base de datos con tu información.

CREATE DATABASE basenc;
CREATE USER nextcloud@localhost IDENTIFIED BY 'secr3Ta';
GRANT ALL PRIVILEGES ON basenc.* to nextcloud@localhost;
FLUSH PRIVILEGES;

Ahora que hemos configurado PHP y MariaDB, descargamos Nextcloud y configumos el directorio raíz de documentos para su instalación.

cd /var/www
sudo wget --no-check-certificate https://download.nextcloud.com/server/releases/latest.tar.bz2
sudo tar -xf latest.tar.bz2
sudo chown -R www-data:www-data nextcloud
sudo chmod -R 750 nextcloud
sudo systemctl restart nginx

A continuación configuramos el servidor web editando el archivo /etc/nginx/conf.d/nxtcld.conf

upstream php-handler {
    server unix:/var/run/php/php8.3-fpm.sock;
}

# Set the `immutable` cache control options only for assets with a cache busting `v` argument
map $arg_v $asset_immutable {
    "" "";
    default ", immutable";
}

server {
    listen 80;
    server_name nxtcld.edu.ar;

    access_log /var/log/nginx/nxtcld.edu.ar.log;
    error_log  /var/log/nginx/nxtcld.edu.ar.log;

    root /var/www/nextcloud;

    # set max upload size and increase upload timeout:
    client_max_body_size 512M;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;
    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml text/javascript application/javascript application/wasm application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    server_tokens off;

    client_body_buffer_size 512k;

    # HTTP response headers borrowed from Nextcloud `.htaccess`
    add_header Referrer-Policy                   "no-referrer"       always;
    add_header X-Content-Type-Options            "nosniff"           always;
    add_header X-Frame-Options                   "SAMEORIGIN"        always;
    add_header X-Permitted-Cross-Domain-Policies "none"              always;
    add_header X-Robots-Tag                      "noindex, nofollow" always;
    add_header X-XSS-Protection                  "1; mode=block"     always;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    include mime.types;
    types {
        text/javascript mjs;
    }

    index index.php index.html /index.php$request_uri;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # Rules borrowed from `.htaccess` to hide certain paths from clients
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }

    location ~ \.php(?:$|/) {
        # Required for legacy support
        rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) /index.php$request_uri;

        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;

        fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
        fastcgi_param front_controller_active true;     # Enable pretty urls
        fastcgi_pass php-handler;

        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;

        fastcgi_max_temp_file_size 0;
    }

    # Serve static files
    location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ {
        try_files $uri /index.php$request_uri;
        # HTTP response headers borrowed from Nextcloud `.htaccess`
        add_header Cache-Control                     "public, max-age=15778463$asset_immutable";
        add_header Referrer-Policy                   "no-referrer"       always;
        add_header X-Content-Type-Options            "nosniff"           always;
        add_header X-Frame-Options                   "SAMEORIGIN"        always;
        add_header X-Permitted-Cross-Domain-Policies "none"              always;
        add_header X-Robots-Tag                      "noindex, nofollow" always;
        add_header X-XSS-Protection                  "1; mode=block"     always;
        access_log off;     # Optional: Don't log access to assets
    }

    location ~ \.(otf|woff2?)$ {
        try_files $uri /index.php$request_uri;
        expires 7d;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets
    }

    # Rule borrowed from `.htaccess`
    location /remote {
        return 301 /remote.php$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }

Nos conectamos a Nextcloud y completamos la configuración básica en a http://nxtcd.edu.ar

Ingresamos los datos de la cuenta de administrador y de la base de datos que definimos para finalizar la configuración.

Configurar la conexión entre Nextcloud y OxOOL Community Edition

Inicia sesión en Nextcloud como administrador:
Hacemos clic en [Nombre de usuario] en la esquina superior derecha de la pantalla → [+ Aplicaciones] Buscamos Nextcloud Office en el lado izquierdo de la pantalla, seleccionamos [Activar] → ingrese la contraseña del administrador del sistema.
Una vez activada esta aplicación, vamos a la configuración de Nextcloud. Hacemos clic en la pestaña Nextcloud Office de la izquierda. Tenemos que seleccionar «Use su propio servidor» e introducir el nombre de dominio de nuestro OxOffice Online incluyendo el prefijo https://, luego hacemos clic en el botón «Save».

Tras completar la configuración, cuando hagas clic en el botón de añadir (+) en Nextcloud, podrás crear documentos de texto, hojas de cálculo y presentaciones directamente desde tu navegador web.

La consola de administración de OxOOL está disponible en https://odfweb.dominio.edu.ar/browser/dist/admin/admin.html. Es necesario introducir admin como nombre de usuario y contraseña.

La clave se puede modificar desde el menu System ubicado arriba a la derecha. En caso de no querer utilizarla, se puede deshabilitarla completamente editando el archivo /etc/oxool/oxoolwsd.xml
En la sección

<admin_console desc="Web admin console settings.">
<enable desc="Enable the admin console functionality" type="bool" default="true">true</enable>
<enable_pam desc="Enable admin user authentication with PAM" type="bool" default="false">false</enable_pam>
<username desc="The username of the admin console. Ignored if PAM is enabled.">admin</username>
<password desc="The password of the admin console. Deprecated on most platforms. Instead, use PAM or oxoolconfig to set up a secure password.">admin</password>
<logging desc="Log admin activities irrespective of logging.level">
<admin_login desc="log when an admin logged into the console" type="bool" default="true">true</admin_login>
<metrics_fetch desc="log when metrics endpoint is accessed and metrics endpoint authentication is enabled" type="bool" default="true">true</metrics_fetch>
<monitor_connect desc="log when external monitor gets connected" type="bool" default="true">true</monitor_connect>
<admin_action desc="log when admin does some action for example killing a process" type="bool" default="true">true</admin_action>
</logging>
</admin_console>

El archivo /etc/oxool/oxoolwsd.xml contiene distintos parámetros que nos puede interesar modificar y/o ajustar. Por ejemplo, los idiomas soportados, la ruta del archivo de registro o la lista de host permitidos, entre otros.

Con información de docs.ossii.com.tw