Reconstrucción y Upgrade de OwnCloud desde repositorios

Reconstrucción inicial

La intención es restaurar la configuración y parametrización actual del Owncloud pero los datos correspondientes a un único usuario.
El primer paso sería comenzar con una instalación de cero de un Owncloud con la misma versión que tenemos en producción.
Utilizaremos un Owncloud 8.1 que tenemos en Freud.
Primero se va a copiar la base de datos y el archivo de configuración actual de Halley que debemos de tener en los respaldos.

Copia de BD y configuración

  • Restauramos a partir de los respaldos desde Backuppc: el /var/backups/pgsql/postgres_dump_all.sql en Halley a un /tmp en Freud

Como el .sql exporta todas las bases de datos de Halley, el nombre de la base de datos creada al restaurarla será exactamente igual al nombre que tenía en producción.

  • Si tenemos una base con el mismo nombre en nuestra instalación, le tenemos que cambiar de nombre
    su - postgres
    psql
    ALTER DATABASE "owncloud-interior" RENAME TO "owncloud_old";
    
  • Luego hacemos la importación de la BD en Freud:
    postgres@freud:~$ psql -U postgres "owncloud-interior"  < /tmp/postgres_dump_all.sql
    

    La primera vez pueden salir errores como estos, debido a incompatibilidades entre versiones de Postgres:
    Ahora está conectado a la base de datos «postgres» con el usuario «postgres».
    SET
    SET
    ....
    GRANT
    GRANT
    \connect: opción de conexión no válida «-reuse-previous»
    

    Esto se soluciona quitando el parámetro -reuse-previous=on de la instrucción de conexión del .sql quedano así:
    \connect "dbname='owncloud-interior'" 
    

    Luego si debería funcionar la importación.

Upgrade

Ahora se va a hacer un upgrade desde la versión 8 a la 9

Pasos previos (no siempre necesarios)

  • Para mayor seguridad conviene mejorar el nombre de usuario (en Halley usabamos un agonzalez) y resetear su clave de conexión al Owncloud. Estos datos deben ser actualizados en el archivo de config de Owncloud.
    Conviene mucho mas renombrar un rol antes que crear un nombre nuevo, debido a que resulta mucho mas complejo asignarle todos los privilegios al usuario nuevo de una base existente.
    ALTER ROLE agonzalez RENAME TO oc2016;
    ALTER ROLE oc2016 WITH password '******';
    
  • Colocamos el archivo de configuración en el lugar correcto /var/www/owncloud/config/config.php
  • Modificamos aquí credenciales de conexión a la base de datos: nombre y password de usuario. Se modifican las urls y nombres de dominio también.
  • En un primer momento se desactiva TLS para poder conectarse, lo que al final deberá reconfigurarse:
    update oc_appconfig set configvalue = 1 where configkey = 'ldap_tls';
    

Actualización de paquetes inicial

Vamos a aplicar este procedimiento
  • Primero configuramos el repositiorio
    echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/Debian_8.0/ /' > /etc/apt/sources.list.d/owncloud.list
    
  • Actualizar y hacer un upgrade (te actualiza el paquete del owncloud)
    sudo apt-get update && sudo apt-get upgrade
    
  • Deshabilitamos el modulo de mantenimiento:
    root@freud:/var/www/owncloud# sudo -u www-data php ./occ maintenance:mode --off
    
  • Hacemos el upgrade desde linea de comandos:
    root@freud:/var/www/owncloud# sudo -u www-data php ./occ upgrade
    ownCloud or one of the apps require upgrade - only a limited number of commands are available
    Set log level to debug - current level: 'Debug'
    Turned on maintenance mode
    Checked database schema update
    Checked database schema update for apps
    Updated database
    Update successful
    Turned off maintenance mode
    Reset log level to 'Debug'
    

    Correr el script para corregir permisos:
    #!/bin/bash
    ocpath='/var/www/owncloud'
    htuser='www-data'
    htgroup='www-data'
    rootuser='root'
    
    find ${ocpath}/ -type f -print0 | xargs -0 chmod 0640
    find ${ocpath}/ -type d -print0 | xargs -0 chmod 0750
    
    chown -R ${rootuser}:${htgroup} ${ocpath}/
    chown -R ${htuser}:${htgroup} ${ocpath}/apps/
    chown -R ${htuser}:${htgroup} ${ocpath}/config/
    chown -R ${htuser}:${htgroup} ${ocpath}/data/
    chown -R ${htuser}:${htgroup} ${ocpath}/themes/
    
    chown ${rootuser}:${htgroup} ${ocpath}/.htaccess
    chown ${rootuser}:${htgroup} ${ocpath}/data/.htaccess
    
    chmod 0644 ${ocpath}/.htaccess
    chmod 0644 ${ocpath}/data/.htaccess
    

A continuación debemos ir actualizando 1 a 1 las versiones sin saltarnos ninguna para que el procedimiento funcione correctamente.

Upgrade desde versión 8.0 a 8.2

Nos basamos en esto donde encontramos esta reseña:

How to Upgrade Your ownCloud Server

There are three ways to upgrade your ownCloud server:

Using your Linux package manager with our official ownCloud repositories. This is the recommended method.
With the Updater App (Server Edition only). Recommended for shared hosters, and for users who want an easy way to track different release channels. (It is not available and not supported on the Enterprise edition.)
Manually upgrading with the ownCloud .tar archive from owncloud.org/install/.
Manually upgrading is also an option for users on shared hosting; download and unpack the ownCloud tarball to your PC. Delete your existing ownCloud files, except data/ and config/ files, on your hosting account. Then transfer the new ownCloud files to your hosting account, again preserving your existing data/ and config/ files.
Enterprise customers will use their Enterprise software repositories to maintain their ownCloud servers, rather than the Open Build Service. Please see Installing & Upgrading ownCloud Enterprise Edition for more information.

Y también en esto :

Changes in ownCloud 8.2

The Linux package repositories have changed, and you must configure your system to use these new repositories to install or upgrade ownCloud 8.2+. The new repositories are at our Open Build Service.
Apache configuration files are in a separate package, owncloud-config-apache.

  • Estando en la 8.1, se deben configurar estos otros repositorios y correr un apt-get install:
    wget -nv https://download.owncloud.org/download/repositories/8.2/Debian_8.0/Release.key -O Release.key
    apt-key add - < Release.key
    
    sh -c "echo 'deb http://download.owncloud.org/download/repositories/8.2/Debian_8.0/ /' > /etc/apt/sources.list.d/owncloud.list" 
    apt-get update
    apt-get install owncloud
    
  • Upgrade manual a nivel del Owncloud:
    sudo -u www-data php ./occ upgrade
    

Upgrade desde versión 8.2 a 9

Usamos estos repos
  • Corremos el upgrade:
    wget -nv https://download.owncloud.org/download/repositories/9.0/Debian_8.0/Release.key -O Release.key
    apt-key add - < Release.key
    
    sh -c "echo 'deb http://download.owncloud.org/download/repositories/9.0/Debian_8.0/ /' > /etc/apt/sources.list.d/owncloud.list" 
    apt-get update
    apt-get install owncloud
    
    sudo -u www-data php ./occ upgrade
    

Upgrade desde versión 9 a 9.1

Usamos estos repos
  • Corremos el upgrade:
    wget -nv https://download.owncloud.org/download/repositories/stable/Debian_8.0/Release.key -O Release.key
    apt-key add - < Release.key
    
    sh -c "echo 'deb http://download.owncloud.org/download/repositories/stable/Debian_8.0/ /' > /etc/apt/sources.list.d/owncloud.list" 
    apt-get update
    apt-get install owncloud
    
    root@freud:/var/www/owncloud# sudo -u www-data php ./occ upgrade
    
  • Sacar el servidor de modo mantenimiento:
    sudo -u www-data php ./occ maintenance:mode --off
    
  • Aplicamos luego este script para corregir permisos:
    #!/bin/bash
    ocpath='/var/www/owncloud'
    htuser='www-data'
    htgroup='www-data'
    rootuser='root'
    
    printf "Creating possible missing Directories\n" 
    mkdir -p $ocpath/data
    mkdir -p $ocpath/assets
    mkdir -p $ocpath/updater
    
    printf "chmod Files and Directories\n" 
    find ${ocpath}/ -type f -print0 | xargs -0 chmod 0640
    find ${ocpath}/ -type d -print0 | xargs -0 chmod 0750
    
    printf "chown Directories\n" 
    chown -R ${rootuser}:${htgroup} ${ocpath}/
    chown -R ${htuser}:${htgroup} ${ocpath}/apps/
    chown -R ${htuser}:${htgroup} ${ocpath}/assets/
    chown -R ${htuser}:${htgroup} ${ocpath}/config/
    chown -R ${htuser}:${htgroup} ${ocpath}/data/
    chown -R ${htuser}:${htgroup} ${ocpath}/themes/
    chown -R ${htuser}:${htgroup} ${ocpath}/updater/
    
    chmod +x ${ocpath}/occ
    
    printf "chmod/chown .htaccess\n" 
    if [ -f ${ocpath}/.htaccess ]
     then
      chmod 0644 ${ocpath}/.htaccess
      chown ${rootuser}:${htgroup} ${ocpath}/.htaccess
    fi
    if [ -f ${ocpath}/data/.htaccess ]
     then
      chmod 0644 ${ocpath}/data/.htaccess
      chown ${rootuser}:${htgroup} ${ocpath}/data/.htaccess
    fi
    
  • Instalar todos los nuevos módulos que tenía la versión instalados la versión anterior en producción

Configurar conexión LDAP+TLS

En la documentación de Owncloud, nos decía que además de elegir el puerto 389 (como lo define TLS) había que "install tls certificate on ownCloud server".
La activación del TLS dejó de estar visible en la interfaz web desde hace varias versiones atrás. La forma de activar/desactivar el soporte es a través de la base de datos, como root:

su - postgres
psql -U postgres owncloud-interior
owncloud-interior=# select * from oc_appconfig where configkey like '%tls%';
   appid   | configkey | configvalue 
 user_ldap | ldap_tls  | 0
owncloud-interior=# update oc_appconfig set configvalue = 1 where configkey = 'ldap_tls';

De todas formas la conexión seguía sin funcionar. Desde los logs de Owncloud, se veían errores como:
ldap_start_tls(): Unable to start TLS: Connect error at /var/www/owncloud/apps/user_ldap/lib/ldap.php#257

Investigando vemos que hay problemas de PHP con los certificados TLS: aca y aca
Errores de que PHP no encuentra sus certificados.

El procedimiento que funcionó fue copiar el certificado TLS que puede ser encontrado en Wschebor en el archivo /etc/ldap/ldap.conf a Halley en la ubicación /etc/ssl/certs/.
Luego desde Halley configuramos que el servidor conozco el certificado:

chmod 644 /etc/ssl/certs/CAcert_interior.edu.uy.pem
nano /etc/ldap/ldap.conf 
TLS_CACERT      /etc/ssl/certs/CAcert_interior.edu.uy.pem
service apache2 restart

Configuración Let's Encrypt

Para configurar el certificado Let's Encrypt utilizamos esta documentación que nos proporcionó Daniel.
  • Configuramos los backport de Debian Jessie en /etc/apt/source.list:
    deb http://ftp.debian.org/debian jessie-backports main
    
  • Instalamos paquetes necesarios:
    sudo apt-get install python-certbot-apache -t jessie-backports
    
  • Generamos los certificados:
    certbot --apache
    

Personalización del diseño de Owncloud

Nos basamos en esta documentación

  • Agregamos en la configuración de Owncloud, en /var/www/owncloud/config/config.php el nuevo Theme:
  • agregamos "theme" => "udelar"
  • Copiamos el theme 'example' como 'udelar' y empezamos a editarlo.
  • Cambiamos todas las veces que diga 'Custom cloud' en el archivo default.php.
  • Debemos colocar un logo dentro de la carpeta con el mismo nombre core/img/logo.png
  • En el directorio core/css/styles.css se puede cambiar todo el estilo de la página de login y de las interiores.

Restauración de archivos

Los archivos si los copias con rsync o restauras directo con Backuppc no serán automáticamente sincronizados en Owncloud ni serán visibles por el usuario.
Para lograr esto, hay que dar un paso como se describe "acá":Referencia http://askubuntu.com/questions/779969/how-to-scp-data-to-owncloud .

Desde la línea de comando hay que usar el comando occ pasandole el parámetro files:scan y luego el nombre de directorio del usuario en cuestión.
Como en este caso el usuario entra por el ldap, el nombre de directorio es un código largo generado por una función de hasheo.

root@freud:/var/www/owncloud/data# sudo -u www-data php ../occ files:scan 968fe23e-4729-1034-87e4-457db7958182
Starting scan for user 1 out of 1 (968fe23e-4729-1034-87e4-457db7958182)
Exception while scanning: File with id "33360" has not been found.
#0 /var/www/owncloud/apps/files_sharing/lib/sharedstorage.php(391): OC\Files\View->getPath(33360)
#1 /var/www/owncloud/lib/private/Files/Storage/Wrapper/Wrapper.php(596): OC\Files\Storage\Shared->releaseLock('', 1, Object(OC\Lock\DBLockingProvider))
#2 /var/www/owncloud/lib/private/Files/Cache/Scanner.php(231): OC\Files\Storage\Wrapper\Wrapper->releaseLock('', 1, Object(OC\Lock\DBLockingProvider))
#3 /var/www/owncloud/apps/files_sharing/lib/Scanner.php(72): OC\Files\Cache\Scanner->scanFile('', 3, -1, NULL, true)
#4 /var/www/owncloud/lib/private/Files/Cache/Scanner.php(309): OCA\Files_Sharing\Scanner->scanFile('', 3, -1, NULL, true)
#5 /var/www/owncloud/lib/private/Files/Utils/Scanner.php(195): OC\Files\Cache\Scanner->scan('', true, 3)
#6 /var/www/owncloud/apps/files/lib/Command/Scan.php(158): OC\Files\Utils\Scanner->scan('/968fe23e-4729-...')
#7 /var/www/owncloud/apps/files/lib/Command/Scan.php(226): OCA\Files\Command\Scan->scanFiles('968fe23e-4729-1...', '/968fe23e-4729-...', false, Object(Symfony\Component\Console\Output\ConsoleOutput), false)
#8 /var/www/owncloud/3rdparty/symfony/console/Command/Command.php(259): OCA\Files\Command\Scan->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#9 /var/www/owncloud/core/Command/Base.php(158): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#10 /var/www/owncloud/3rdparty/symfony/console/Application.php(844): OC\Core\Command\Base->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#11 /var/www/owncloud/3rdparty/symfony/console/Application.php(192): Symfony\Component\Console\Application->doRunCommand(Object(OCA\Files\Command\Scan), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#12 /var/www/owncloud/3rdparty/symfony/console/Application.php(123): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#13 /var/www/owncloud/lib/private/Console/Application.php(146): Symfony\Component\Console\Application->run(NULL, NULL)
#14 /var/www/owncloud/console.php(94): OC\Console\Application->run()
#15 /var/www/owncloud/occ(11): require_once('/var/www/ownclo...')
#16 {main}

+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 28      | 57    | 00:00:06     |
+---------+-------+--------------+