Nextcloud sobre nginx y postgreSQL + paquetes ofimáticos collabora o onlyoffice-ds sobre docker

Hoy les traigo un manual de éstos tochos o al menos para llegar hasta aquí ya que hay mucha documentación pero ninguna que lo englobe todo, así que os voy a mostrar mi experiencia y los pasos seguidos.

Primero de todo, la política ha sido de instalar cada servicio en un contenedor o máquina virtual. La instalación de nextcloud va a estar instalada sobre un contenedor lxc y los paquetes ofimáticos, que los vamos a instalar usando docker, sobre las máquinas virtuales kvm. El motivo es que docker no funciona muy bien sobre contenedores lxc.

La otra cosa que tenemos que tener en cuenta, es que para hacer funcionar los paquetes ofimáticos, vamos a usar proxys de nginx, las máquinas van a requerir que se vean correctamente entre ellas y el usuario a las maquinas. Ésto lo comento porque la idea inicial era montar todo el sistema sobre un mismo servidor compartiendo la misma IP y repartir en el host que alberga las maquinas virtuales con iptables a los puertos correspondientes. Ésto me ha dado problemas, así que la mejor opción es servicios preparados.
En éste post me hubiese gustado documentar elasticsearch para poder buscar entre los ficheros, pero aún lo tengo a medio instalar y no he conseguido aún la comunicación. Espero que en unos días pueda publicar otro post en éste mismo blog de como hacer la integración nextcloud-fulltextsearch-elasticsearch.

Así que vamos a empezar! :)

Nextcloud
Partimos de un contenedor lxc, ésto quiere decir que el procedimiento se puede repetir en máquina física o otros tipos de máquinas virtuales. El sistema operativo, debian10. Cuidado que la debian estable actual, es la 9. He actualizado el sistema a Debian 10 para poder disponer de PHP7.3.2, ya que algunos plugins de nextcloud requieren PHP7.3 o superior. Más adelante voy a contar los truquillos usados para poder tener varias cosas que no funcionaban con PHP7.0.33 de debian9.

Lo primero es configurar el sistema, actualizarlo e instalar las dependencias necesarias para la instalación de nextcloud actual:

root@electra10-nextcloud:~# dpkg-reconfigure locales
root@electra10-nextcloud:~# dpkg-reconfigure tzdata
root@electra10-nextcloud:~# apt update && apt -y upgrade && apt -y dist-upgrade
root@electra10-nextcloud:~# apt install -y postgresql php-pgsql php-zip php-dompdf php-xml php-mbstring php-gd php-curl php-fpm php-intl php-common php-imagick php-ldap nginx

Descargamos nextcloud y lo guardamos en /var/www:

root@electra10-nextcloud:~# cd /var/www
root@electra10-nextcloud:/var/www# wget https://download.nextcloud.com/server/releases/nextcloud-15.0.5.zip
root@electra10-nextcloud:/var/www# unzip nextcloud-15.0.5.zip

Tendremos que crear también el directorio donde se van a almacenar los datos de los usuarios de la instancia de nextcloud que estamos instalando. Aprovechamos para asignar los dos directorios creados al usuario www-data:

root@electra10-nextcloud:/var/www# mkdir ownclouddata
root@electra10-nextcloud:/var/www# chown -R www-data:www-data nextcloud
root@electra10-nextcloud:/var/www# chown -R www-data:www-data ownclouddata

El directorio que estoy usando se llama ownclouddata porque es una carpeta que arrastro desde hace años. Owncloud es el antecesor de Nextcloud. Comentar que la instalación que hice la hice copiando la carpeta ownclouddata de otra instancia de nextcloud en la misma versión que estamos instalando, también aproveché para cambiar la base de datos, así que partí de una instalación limpia y datos antiguos, la sorpresa fué que al crear los usuarios en la nueva instancia, al existir un directorio con ficheros existentes, internamente ejecuta ./occ files:scan -p “/files/” y aparecen por arte de magia todos los ficheros antiguos en la nueva instancia :)

Configuramos la base de datos PostgreSQL:

root@electra10-nextcloud:~# su - postgres
postgres@electra-nextcloud:~$ createuser nextcloud_capa8
postgres@electra-nextcloud:~$ createdb -O nextcloud_capa8 nextcloud_db
postgres@electra-nextcloud:~$ psql nextcloud_db

nextcloud_db=# alter user nextcloud_capa8 with encrypted password 'xxxxxxxxxxxxxxxxxxxxxxxx';
ALTER ROLE
nextcloud_db=# grant all privileges on database nextcloud_db to nextcloud_capa8;
GRANT

Creamos los certificados para https:

root@electra10-nextcloud:~# vi /etc/apt/sources.list
# debian backports
deb http://ftp.de.debian.org/debian stretch-backports main

root@electra10-nextcloud:~# apt -y install python-certbot-nginx -t stretch-backports
root@electra10-nextcloud:~# certbot --nginx certonly

Configuramos nginx:

root@electra10-nextcloud:~# vi /etc/nginx/sites-available/nextcloud
#upstream php-handler {
#    #server 127.0.0.1:9000;
#    server unix:/var/run/php/php7.0-fpm.sock;
#}

server {
    #listen 8080;
    server_name _;


    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/onlyofficeds.capa8.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/onlyofficeds.capa8.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_trusted_certificate /etc/letsencrypt/live/onlyofficeds.capa8.net/chain.pem;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    #
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;

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

    # Path to the root of your installation
    root /var/www/nextcloud/;

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

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    location = /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }

    location ~ /.well-known {
        allow all;
        root /var/www/nextcloud;
    }


    # set max upload size
    client_max_body_size 512M;
    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 application/javascript 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;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info  ^(.+\.php)(/.+)$;
        fastcgi_index            index.php;
        fastcgi_pass             unix:/run/php/php7.3-fpm.sock;
        include                  fastcgi_params;
        fastcgi_param   PATH_INFO       $fastcgi_path_info;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location / {
        rewrite ^ /index.php$request_uri;
    }

    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }
    location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+)\.php(?:$|\/) {
        #fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        #include fastcgi_params;
        #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fastcgi_param PATH_INFO $fastcgi_path_info;
        #fastcgi_param HTTPS on;
        ##Avoid sending the security headers twice
        #fastcgi_param modHeadersAvailable true;
        #fastcgi_param front_controller_active true;
        ##fastcgi_pass php-handler;
        #fastcgi_intercept_errors on;
        #fastcgi_request_buffering off;
        fastcgi_split_path_info  ^(.+\.php)(/.+)$;
        fastcgi_index            index.php;
        fastcgi_pass             unix:/run/php/php7.0-fpm.sock;
        include                  fastcgi_params;
        fastcgi_param   PATH_INFO       $fastcgi_path_info;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ ^\/(?:updater|ocs-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into
        # this topic first.
        # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        add_header Referrer-Policy no-referrer;

        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$request_uri;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

root@electra10-nextcloud:~# vi /etc/letsencrypt/options-ssl-nginx.conf
# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.

ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

root@electra10-nextcloud:~# ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/nextcloud
root@electra10-nextcloud:~# nginx -t
root@electra10-nextcloud:~# service nginx restart

Tuneamos un poco el php (cambiamos y añadimos las líneas)

root@electra10-nextcloud:/etc/php/7.3/fpm# vi php.ini
upload_max_filesize = 128M
max_file_uploads = 100

[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

root@electra10-nextcloud:/etc/php/7.3/fpm# cd pool.d/
root@electra10-nextcloud:/etc/php/7.3/fpm/pool.d# vi www.conf 
pm.max_children = 240
pm.start_servers = 24
pm.min_spare_servers = 12
pm.max_spare_servers = 36

; Default Value: clean env
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

root@electra10-nextcloud:/etc/php/7.3/fpm/pool.d# service php7.3-fpm restart

Reiniciamos nginx y php-fpm y accedemos por https a nuestro servidor para configurar nextcloud.

Una cosa muy interesante que podemos hacer a partir de aquí para mejorar la respuesta de nuestro servidor es instalar un servicio de caché, en la documentación nos ofrecen acpu o redis. Por versiones de los programas que hay en los repositorios de debian, nos decantaremos por redis. Para ello lo instalamos y lo configuramos en el fichero de configuración de nextcloud:

root@electra10-nextcloud:~# apt -y install redis-server php-redis
root@electra10-nextcloud:~# vi /var/www/nextcloud/config/config.php
$CONFIG = array (
  [...]
  'memcache.local' => '\\OC\\Memcache\\Redis',
  [...]
);

En mi instalación he tenido problemas con systemd y lxc con partes del sistema compartido, es algo de debian10 con lxc y redis no me arranca directamente por systemd, así que le he hecho una chapuza que al levantar las interfaces de red, levante redis

root@electra10-nextcloud:~# vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.1.6
        netmask 255.255.255.0
        gateway 192.168.1.1
        post-up /usr/bin/redis-server /etc/redis/redis.conf

Para comprobar que las configuraciones que hemos aplicado funcionan correctamente, ejecutaremos en la interfaz web la comprobación del sistema, en mi caso en la url https://cloud.capa8.net/index.php/settings/admin/overview.

Una vez instalado y configurado nextcloud, es posible que queramos activar plugins a cascoporro, algunos de ellos muy interesantes como el antivirus, para hacerlo funcionar deberemos instalar clamav:

root@electra10-nextcloud:~# apt -y install clamav

Si en algunos días notas que de repente webdav va lento, es culpa del antivirus, en mi caso de momento lo he desactivado, pero creo que la solución va por tunear un poco el clamav e indicarle a nextcloud el tamaño de los ficheros a analizar.

Otro plugin interesante y que requiere atención especial es mail. Es posible que en unos días éste párrafo quede obsoleto por la actualización del software. En el momento de hacer éste manual, la versión disponible del plugin mail de nextcloud era la 0.11, pero ésta no es compatible con la versión PHP7.3.2, así que traté de bajarme la master, pero no funcionaba, finalmente con la 0.12-RC2 si que me funcionó y tengo el mail funcionando :) Detallo como hacer la instalación que no está de menos ver como se instala manualmente un plugin de nextcloud:

Recomiendo que antes de realizar éste paso, desactives y desinstales la versión actual de mail.

root@electra10-nextcloud:/var/www# cd nextcloud/apps/
root@electra10-nextcloud:/var/www/nextcloud/apps# wget https://github.com/nextcloud/mail/releases/download/v0.12.0-RC2/mail.tar.gz
root@electra10-nextcloud:/var/www/nextcloud/apps# rm -R mail
root@electra10-nextcloud:/var/www/nextcloud/apps# tar xvzf mail.tar.gz

Otros plugins que son interesantes son fulltextsearch, que te permite indexar dentro el contenido de los ficheros (siempre y cuando no tengas el cifrado de los archivos activado). La instalación de elasticsearch la tengo a medias, así que paciencia, pronto!, o cualquier ayuda será bienvenida :P

Y ahora ya vamos para los plugins tochos, tochos, tochos, mas bien plugin, en singular. Voy a mostrar como se instalan ambos plugins, pero sólo uno de los dos puede estar activo al mismo tiempo, hablamos de collabora o collaboraoffice y onlyoffice.

Empezamos por el que inicialmente tenía previsto y seguiremos con otro que no está de mal pegarle una ojeadilla :)

Collabora o Collaboraoffice
Lo primero, no te lies, docker hehe. He probado varias formas de instalarlo, al igual que el onlyoffice y el elasticsearch y recomiendo hacer un pequeño esfuerzo para mirar en serio docker, si aún no tocas docker como me pasaba a mi hace unos días, espero que éste manual te sirva como breve introducción a docker… vas a ver el mundo de otra forma!

Tal como he comentado al principio, docker y lxc mal, así que partimos de una debian 9 instalada dentro de un KVM, con su propia IP pública y su propio nombre de dominio.

Primero, instalamos docker:

root@collabora:~# apt update && apt-get -y upgrade && apt-get -y dist-upgrade && apt -y install vim mtr glances net-tools curl nginx
root@collabora:~# vi /etc/apt/sources.list
# docker
deb [arch=amd64] https://download.docker.com/linux/debian stretch stable
# deb-src [arch=amd64] https://download.docker.com/linux/debian stretch stable

root@collabora:~# apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
root@collabora:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - && apt-key fingerprint 0EBFCD88 

root@collabora:~# apt update 
root@collabora:~# apt -y remove docker docker-engine docker.io containerd runc
root@collabora:~# apt -y install docker-ce --allow-unauthenticated

Una vez instalado, vamos a descargar la imagen de collabora del repositorio de docker:

root@collabora:~# docker run -t -d -p 127.0.0.1:9980:9980 -e "domain=cloud\.capa8\.net" -e "username=admin" -e "password=xxxxx" -e "extra_params=--o:net.post_allow.host=172\.17\.0\.1 --o:net.proto=IPv4" --restart always collabora/code

Con mucho cuidado con éste comando, primero de todo, tendremos que indicarle el dominio que va a comunicar con éste servidor, en mi caso, el servidor de nextcloud lo tengo bajo cloud.capa8.net, y el que estoy instalando se llama collabora.capa8.net, otro es permitir sólo IPv4 (en resumen hehe) y que se encienda siempre que se reinicie la máquina host. Le indicaremos usuario y contraseña para poder acceder al panel administrativo:

https://collabora.capa8.net/loleaflet/dist/admin/adminSettings.html

Ahora lo siguiente será configurar nginx

Creamos los certificados para https:

root@collabora:~# vi /etc/apt/sources.list
# debian backports
deb http://ftp.de.debian.org/debian stretch-backports main

root@collabora:~# apt update && apt -y install python-certbot-nginx -t stretch-backports
root@collabora:~# certbot --nginx certonly

Configuramos nginx:

root@collabora:~# vi /etc/nginx/sites-available/collabora
server {
    listen               443 ssl http2;
    server_name          collabora.capa8.net;
    ssl_certificate /etc/letsencrypt/archive/collabora.capa8.net/fullchain1.pem;
    ssl_certificate_key /etc/letsencrypt/archive/collabora.capa8.net/privkey1.pem;
    client_max_body_size 10G;
    proxy_set_header     X-Forwarded-Proto 'https';
    underscores_in_headers on;
    add_header           Strict-Transport-Security "max-age=31536000";

    location /.well-known/ {
        root   /var/lib/nginx/letsencrypt/;
        index  index.html index.htm;
    }

    # static files
    location ^~ /loleaflet {
        proxy_pass        https://127.0.0.1:9980;
        proxy_set_header Host $http_host;
        proxy_ssl_verify              off;
    }

    # WOPI discovery URL
    location ^~ /hosting/discovery {
        proxy_pass        https://127.0.0.1:9980;
        proxy_set_header Host $http_host;
        proxy_ssl_verify              off;
        
        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # Main websocket
    location ~ /lool/(.*)/ws$ {
        proxy_pass        https://127.0.0.1:9980;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $http_host;
        proxy_read_timeout 36000s;
        proxy_ssl_verify              off;
        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

    }

    # Admin Console websocket
    location ^~ /lool/adminws {
        proxy_pass        https://127.0.0.1:9980;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $http_host;
        proxy_read_timeout 36000s;
        proxy_ssl_verify              off;
        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

    }

    # download, presentation and image upload
    location ^~ /lool {
        proxy_pass        https://127.0.0.1:9980;
        proxy_set_header Host $http_host;
        proxy_ssl_verify              off;
        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

    }

    location / {
        proxy_pass        https://127.0.0.1:9980;
        proxy_set_header Host $http_host;
        proxy_ssl_verify              off;

        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

}

root@collabora:~# ln -s /etc/nginx/sites-available/collabora /etc/nginx/sites-enabled/collabora
root@collabora:~# nginx -t
root@collabora:~# service nginx restart

Vamos ahora a nextcloud y le indicamos la ubicación del servidor de collabora.

Onlyoffice

El otro cabroncete, pero aquí tenéis la solución de como hacerlo rápido y sencillo. Partimos tal como he dicho de una maquina virtual kvm, evidentemente con debian9.

Primero de todo y realmente muy importante de tener en cuenta, queremos onlyoffice para conectarlo con nuestro nextcloud, pero no lo queremos entero, sólo un trozo! con ésta instalación queda otro software tocho que es interesante echarle una ojeadilla, y más que he conseguido instalarlo hehe. Post en breve :P

Empezamos, actualización de sistema e instalación de docker:

root@onlyofficeds:~# apt update && apt-get -y upgrade && apt-get -y dist-upgrade && apt -y install vim mtr glances net-tools 
root@onlyofficeds:~# vi /etc/apt/sources.list
# docker
deb [arch=amd64] https://download.docker.com/linux/debian stretch stable
# deb-src [arch=amd64] https://download.docker.com/linux/debian stretch stable

root@onlyofficeds:~# apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
root@onlyofficeds:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - && apt-key fingerprint 0EBFCD88 

root@onlyofficeds:~# apt update 
root@onlyofficeds:~# apt -y remove docker docker-engine docker.io containerd runc
root@onlyofficeds:~# apt -y install docker-ce --allow-unauthenticated

Una vez instalado, vamos a descargar la imagen de onlyoffice del repositorio de docker:

root@onlyofficeds:~# docker run -i -t -d -p 80:80 --restart=always onlyoffice/documentserver

Ésto. ¿Cómo, si ya? Vamos a arrancarlo sólo por http, el https lo gestionamos con nginx fuera del contenedor de docker.

Ahora lo siguiente será configurar nginx

Creamos los certificados para https:

root@onlyofficeds:~# vi /etc/apt/sources.list
# debian backports
deb http://ftp.de.debian.org/debian stretch-backports main

root@onlyofficeds:~# apt update && apt -y install python-certbot-nginx -t stretch-backports
root@onlyofficeds:~# certbot --nginx certonly

Configuramos nginx:

root@onlyofficeds:~# vi /etc/nginx/sites-available/onlyofficeds
server {
    include snippets/certbot.conf;

    listen 443 ssl http2;
    listen [::]:8443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/onlyofficeds.capa8.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/onlyofficeds.capa8.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_trusted_certificate /etc/letsencrypt/live/onlyofficeds.capa8.net/chain.pem;

    #server_name onlyoffice.capa8.net;

    location / {
        proxy_pass http://localhost:80;
        include proxy_params;
    }
}
root@onlyofficeds:~# mkdir /etc/nginx/snippets
root@onlyofficeds:~# vi /etc/nginx/snippets/certbot.conf
# set client body size to 2M #
client_max_body_size 20M;

location ~ /.well-known {
    allow all;
    root /var/www/html;
}
root@onlyofficeds:~# ln -s /etc/nginx/sites-available/onlyofficeds /etc/nginx/sites-enabled/onlyofficeds
root@onlyofficeds:~# nginx -t
root@onlyofficeds:~# service nginx restart

Vamos ahora a nextcloud y le indicamos la ubicación del servidor de onlyoffice. Si nos encontramos que no funciona, mi recomendación es entrar en el contenedor y revisar los logs. Si te encuentras con problemas de permisos de acceso, te recomiendo entrar en el contenedor y añadir las ips en el fichero /etc/loolwsd/loolwsd.xml.
Todos los signos punto en la configuración, deben ser escapados, es decir, . tiene que ser \.

Y hasta aquí la configuración de los servicios. Unos breves y útiles apuntes de docker:

Listar los contenedores de docker existentes, con -a muestra los apagados

root@onlyofficeds:~# docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                         NAMES
xxxxxxxxxxxx        onlyoffice/documentserver   "/bin/sh -c /app/onl…"   3 hours ago         Up 3 hours          0.0.0.0:80->80/tcp, 443/tcp   flamboyant_goodall
root@onlyofficeds:~# docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                     PORTS                         NAMES
xxxxxxxxxxxx        onlyoffice/documentserver   "/bin/sh -c /app/onl…"   3 hours ago         Up 3 hours                 0.0.0.0:80->80/tcp, 443/tcp   flamboyant_goodall
xxxxxxxxxxxx        onlyoffice/documentserver   "/bin/sh -c /app/onl…"   22 hours ago        Exited (137) 3 hours ago                                 sleepy_shamir

Entrar por shell a un contenedor

root@onlyofficeds:~# docker exec -i -t flamboyant_goodall /bin/bash

Ver los logs del contendedor, usar -f para salida continua

root@onlyofficeds:~# docker logs flamboyant_goodall
root@onlyofficeds:~# docker logs flamboyant_goodall -f

Se recomienda no manipular los contenedores, a menos que sea aplicar algunas configuraciones.

2 Comments

  1. Hola Blackhold, un post genial como siempre. A ver si tomo ejemplo y publico más cosas, jaja. Aunque últimamente lo único que subo es código a GitLab.

    Quería comentarte que es más securo sacar el directorio ownclouddata fuera del DocumentRoot, pues al estar sobre PHP el usuario www-data puede acceder a cualquier directorio del servidor al que tenga permiso, por lo que el intérprete de PHP también.

    Veo que estás empezando a usar Docker, lo cual es súper bueno y es algo que todos tendremos que saber, yo empecé a jugar con Docker cuando estaba en Gaueko. Si quieres automatizar este despliegue o simplificar cuando levantes varios contenedores diferentes, te recomiendo que le eches un ojo a Docker Compose: https://docs.docker.com/compose/

    Yéndonos a algo más grande, podrías plantearte usar OpenShift (Que también se ofrece en versión gratuita) e incluso puedes usar la versión enterprise de Red Hat si es sólo para desarrollo en: https://developers.redhat.com. Lo que pasa es que ahí deberías replantearte la arquitectura porque es una bestia un poco grande que incluye Jenkins, Docker, Kubernetes, etc. Te serviría para tener todo en el mismo host tal y como querías pero no podías por LXC.

    En cuanto a LXC, sí, es problemático con Docker pues (purismos a parte) usan una tecnología más o menos similar. La arquitectura que yo sigo en mi local es KVM con virt-manager (En un server puedes usar OVirt, pues usa KVM por dentro), creo una máquina virtual con Docker y allá despliego mis containers. También sería interesante que tuvieses tu propio registro privado de imágenes Docker en tu infraestructura de servicios locales para ahorrar ancho de banda y tiempo en el despliegue de las mismas.

    Estas son algunas sugerencias que me vienen a la mente así de repente. Con Elasticsearch no puedo ayudarte mucho pues nunca tuve la oportunidad de pegarle directamente pero si ves que se te complica podemos hacer una conferencia on-line en algún momento a ver si lo resolvemos. Te debo una por la gran ayuda que nos brindaste en una instalación de guifi.net hace algunos años.

    Estoy súper contento de ver que sigues imparable. Besarkada estu-estu bat.

    Respon

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir el correu brossa. Aprendre com la informació del vostre comentari és processada