Nextcloud sobre nginx y postgreSQL + fulltextsearch + 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 …

Servidor ldap

ldap es un sistema de autenticación que nos puede valer para centralizar la autenticación de los usuarios. Una vez creada ésta base de datos podemos llamar a los programas que requieran autenticación contactar con ésta base de datos centralizada.

Partimos como casi siempre con una Debian recién instalada y ahí instalamos slapd que es el servicio de ldap y ldap-utils que nos va a permitir gestionar la base de datos ldap.

# apt -y install slapd ldap-utils 

Durante la instalación nos va a pedir el password para el usuario admin (cn=admin,dc=capa8,dc=net).

En algunos manuales hacen referencia a tocar los ficheros de configuración. Dicha acción no es recomendable, para ello, lo recomendable es usar browsers de ldap como jxplorer con el que entraremos mas adelante o con las herramientas que trae ldap-utils.

De momento, para verificar que el servidor está funcionando, en el mismo servidor donde hemos instalado ldap, vamos a ejecutar el comando slapcat, que nos muestra el contenido de la base de datos ldap

# slapcat

Con el siguiente comando vamos a poder ver las entradas disponibles

# ldapsearch -x -h localhost

A continuación para configurar nuestro dominio vamos a reconfigurar slapd

# dpkg-reconfigure -plow slapd 
Omit ldap configuration: NO
DNS domain name: capa8.net
Organization name: Capa8
Administrator Password: password
Database backend to use: MDB
Do you want database to be removed when slapd is purged? NO
Move old database?: YES

Creación y configuración de Usuario, Grupos y U. Organizativas en LDAP.
Ahora vamos a crear todos los objetos …

Enviar correos electrónicos por SMTP+TLS con python

Pues otra espinita que llevaba unos días clavada sacada! :)

Con uno de los programas que estoy haciendo necesitaba mandar un correo electrónico para hacer la verificación de correo electrónico y activación posterior del usuario. Me puse con ello pero los ejemplos que encontraba requería poner la configuración del correo electrónico en el código en lugar de cogerlo de la base de datos, además estaba dando problemas de autenticación con el servidor, cosa que entre que mi código estaba mal y la configuración con el servidor era errónea no se mandaban los mensajes, en el servidor salía el error feúcho:

Error: dict-client: server returned failure:

Así que para implementar ésto sólo vamos a tocar los ficheros de mi proyecto almacenado en ~/dev/ (mi entorno de desarrollo, en producción lo suelo dejar bajo /var/www/ o /var/www/html/).

en ~/dev/capa8/ es donde almaceno los settings.py y las url.py
en ~/dev/web/ es donde almaceno el código de mi programa
~/dev/ es pues donde está mi manage.py de django

Vamos a ver pues el código de urls.py almacenado en capa8, vamos a ver la página de registro de usuario y de validación del correo electrónico:

# vi capa8/urls.py
############
# /account/
# account patterns
urlpatterns += [
    ...
    path('create', views_account.create, name='create'),
    path('verify/<str:token>', views_account.verify_mail, name='verify'),
    ...
]

Ambas funciones las vamos a buscar en el fichero que está en web/views_account.py, pero primero editaremos el web/views.py que es donde voy a crear la función a la que le pasaremos la dirección donde queremos enviar el correo, el …

Arreglando modelos con django sobre postgresql

Éstos días estaba atascada con los modelos, como soy novata con todo ésto y para ponerlo mas difícil todavía sobre postgresql! así que una chuletilla por cuando se me de por empezar a toquetear los modelos y empiecen a salir errores raros que te joden por todos lados. Por supuesto en el entorno en el que estoy trabajando es de desarrollo y estas burradas en entornos de producción es necesario exportar los datos y luego importarlos.

Primero de todo, para cualquier instancia de python que esté usando la base de datos postgresql y reinicia postgresql.

# service postgresql restart
# su - postgres

Ahora nos podemos encontrar con dos cosas, primero, que queramos reconstruir la base de datos o que simplemente queramos eliminar el contenido relacionado con un modelo.

Recrear base de datos

postgres@server:~$ dropdb wcli_db
postgres@server:~$ createdb wcli_db

Eliminar contenido referente a un modelo

postgres@server:~$ psql wcli_db
psql (9.6.10)
Type "help" for help.

wcli_db=# DROP TABLE web_voucher CASCADE;
NOTICE:  drop cascades to constraint web_payment_id_voucher_id_c75a11d9_fk_web_voucher_id on table web_payment
DROP TABLE

Con el CASCADE le indicamos que borre todas las vistas y constraints vinculadas a la tabla.…

Crear entorno virtualenv de python3.5

Si usamos virtualenv a secas nos creará un entorno virtual de python2 y python3, pero en mi caso me interesa usar python3.5 para una aplicación que estoy haciendo. Así que hoy veremos como instalar y entrar en un entorno virtual de python.

Primero de todo, python es fácilmente extendible con módulos, los módulos son librerías que han programado otros y que hacen cosas, yo los llamo chinos, porque una vez compiladas, las librerías son binarios y si los editas con un editor de textos lo que ves es un galimatías de carácteres, lo comúnmente llamado “chinos”.
Ésta forma de programar nos permite avanzar mucho mas rápido en el desarrollo de nuestra aplicación, destinando nuestro tiempo a programar lo que hace realmente nuestra aplicación y facilitar el trabajo a la creación de por ejemplo la estructura de la página web con Flask y Bootstrap o un framework como django.

Los módulos las instalamos mediante un gestor de paquetes, como en cualquier distribución de gnu/linux, podemos especificar pip para python2 y pip3 para python3 o python3.5, ésto lo que hace es descargarte el módulo en el directorio /usr/local/lib/python3.5/dist-packages, con pip3 show podemos ver información del módulo:

laura@melatonina:/usr/src$ pip3 show flask
Name: Flask
Version: 1.0.2
Summary: A simple framework for building complex web applications.
Home-page: https://www.palletsprojects.com/p/flask/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD
Location: /usr/local/lib/python3.5/dist-packages
Requires: Jinja2, click, itsdangerous, Werkzeug

Si necesitas saber qué hace el módulo, es tan simple como ir al directorio correspondiente y editar el fichero .py correspondiente al módulo.…

Freeswitch 1.9 (continuación): mod fs_curl, usuarios almacenados en BBDD

Pues ya volvemos a estar aquí un mes después… hehe, si, tuve freeswitch aparcado unos días, pero han sido días muy provechosos! ya iré contando :)

Pues éste post sería la continuación de éste otro que publiqué hace un mes.

En el anterior manual instalábamos freeswitch con soporte de postgresql y veíamos como con la base de datos creada pero vacía, al arrancar creaba las tablas necesarias para trabajar. Pero las tablas que estaban no te permitían gestionar los usuarios de la centralita directamente desde la base de datos y estabas obligado a usar los ficheros de configuración y recargar la configuración. Pues en éste manual llegaremos a éste objetivo, para poder atacar desde otro programa a la base de datos y realizar cambios en caliente!

Vamos a ello pues… lo primero será parar freeswitch y borrar la base de datos y volver a crearla para que quede vacía.

root@freeswitch-capa8:~# /etc/init.d/freeswitch.sh stop
root@freeswitch-capa8:~# su - postgres
postgres@freeswitch-capa8:~$ dropdb freeswitch_db
postgres@freeswitch-capa8:~$ createdb -O freeswitch_user freeswitch_db
postgres@freeswitch-capa8:~$ psql 
psql (9.6.7)
Type "help" for help.

postgres=# \dt
No relations found.

Mis andanzas y conocimientos: uno no aprende del día a la mañana

Nunca me he considerado una buena programadora, pero hoy tenía las ganas de avanzar un poco con mi nivel de programación… Realmente, siempre he sido una muy mala programadora, porque no era capaz de entender los conceptos que estaba leyendo o me estaban enseñando. Es simplemente que el enfoque era simplemente incorrecto. Es por ésto que muchas veces me atasco con tonterías…

Aprendí a programar y realmente hacer algo útil con lo aprendido en 2001 (lo de antes con el html en 1998 eran garabatos), cuando tuve la oportunidad de crear un programa para gestionar una imprenta en la que curraba en Cornellà. Además ahí ya estaba empezando a aburrirme, estaba jugando ya con un servidor en gnu/linux, y estaba jugando en hacer pequeños programillas chorras, como descargar los frames del radar de lluvias de la web de metereología y ponerlos en un gif para poderlo visualizar en el applet del tiempo de gnome2. Con ésto pillé curiosidad y sin darme cuenta ya estaba programando y cuando llegó la propuesta (que un poco fue mía porque estaba entusiasmada con lo que estaba haciendo… ¡estaba creando!) pues estaba preparada para ir más allá, con un objetivo, una meta.…

Nextant: Indexador de ficheros de nextcloud

Una vez instalado Nextcloud vemos que la interfaz cambia un poco además de que tenemos un montón de aplicaciones disponibles que no teníamos con owncloud.

En antaño había instalado una aplicación para indexar el contenido que hay dentro de los ficheros almacenados en el cloud, pero a partir de alguna de las actualizaciones de owncloud dejó de funcionar, traté de identificar el bug y solucionarlo, pero la cosa se quedó al aire y fuera de mis capacidades, así que simplemente desactivé dicha aplicación. Ahora con Nextcloud vuelve a aparecer una herramienta, basada en solr/java para indexar el contenido de los ficheros. El solr es un viejo conocido (monstruo) en Alfresco, así que vamos a ver como trabaja en la instancia de cloud que tengo en funcionamiento, mucho mas cargada de ficheros y documentación que la que tenía inicialmente en Alfresco… también los años van pasando…

Vamos a ver pues como instalar Nextant

Solr
Primero tendremos que instalar solr como servicio, para ello tendremos que instalar primero java y después solr.

Mi primera pregunta, ¿cuál java? ¿el SE, JRE, JDK? el JDK.

Lo guardamos en /opt por ejemplo y lo descomprimimos, a continuación creamos un link simbólico en alguno de los directorios de ejecución (mirar printenv para ver cuales son)

# cd /opt
# tar xvzf jdk-9.0.1_linux-x64_bin.tar.gz
# cd /usr/local/bin
# ln -s /opt/jdk-9.0.1/bin/java .

Comprobamos que java nos aparece como un programa escribiendo directamente en la terminal java –version

# java --version
java 9.0.1
Java(TM) SE Runtime Environment 

Migrar de owncloud a nextcloud

Nextcloud es el fork que se hizo de Owncloud cuando éste empezó a ofrecer un servicio premium y aplicaciones de pago. Para ello la comunidad decidió pasarse a Nextcloud, manteniendo las actualizaciones y funcionalidad de y con Owncloud.

Hace ya un par de años instalé Owncloud en un servidor que lo he ido actualizando de vez en cuando, hace unas semanas decidí pasar de Owncloud a Nextcloud, así que lo actualicé a la versión 10.0.3 para previamente pasarlo a Nextcloud pero me encontré que la versión 12.0.3 de Nexcloud aún no estaba preparada para migrar desde Owncloud 10.0.3. Así que tuve que esperar hasta la release de la versión 12.0.4 de Nextcloud ayer mismo :)

Lo primero será realizar una copia de seguridad de los ficheros y de la base de datos. Una recomendación que hago que se realice automáticamente a diario.

Mi instancia de owncloud la tengo instalada en /var/www y tengo separados los ficheros en 2 directorios, owncloud que es donde se almacena el software del programa y ownclouddata que es donde se almacenan los ficheros de los usuarios, además tengo un script que hace un dump de la base de datos.

Nos posicionaremos pues en el directorio superior de donde tenemos owncloud y descargaremos la última versión de nextcloud

# cd /var/www
# wget -c --no-check-certificate https://download.nextcloud.com/server/releases/nextcloud-12.0.4.zip
# unzip nextcloud-12.0.4.zip

Copiaremos el fichero de configuración de owncloud a nextcloud

# cp owncloud/config/config.php nextcloud/config/

Tendremos que cambiar el directorio por defecto de trabajo del servidor web (apache en …

radicale: servidor de CalDAV

Hace ya unos meses que me persiguen para integrar el calendario de varias herramientas, como owncloud (nextcloud), egroupware, thunderbird y el móvil pero ninguno de los dos primeros las versiones que tengo instaladas permiten compartir el calendario públicamente para que las otras herramientas puedan acceder a él. Así que sólo nos queda o tirar de googlecalendar o montar nuestro propio sistema de CalDAV.

Primero de todo remarcar que vamos a tener los calendarios en 2 modos, sólo lectura y otros de escritura y lectura, el motivo es que algunos calendarios van a ser públicos y otros privados, los públicos no se van a poder modificar y los entregaremos en formato ics, los privados si :)

Vamos a ello

Aunque radicale está en los repositorios de debian, vamos a descargarnos la última versión de su página web.

root@radicale-dav:~# apt-get install apache2

Instalaremos python-setuptools y apache2-utils para crear passwords y usuarios a nuestros calendarios

root@radicale-dav:~# apt-get install python-setuptools apache2-utils

Ahora descargamos radicale y lo instalamos

root@radicale-dav:~# cd /var/www
root@radicale-dav:/var/www# wget -c --no-check-certificate https://pypi.python.org/packages/source/R/Radicale/Radicale-1.1.1.tar.gz
root@radicale-dav:/var/www# tar xvzf Radicale-1.1.1.tar.gz
root@radicale-dav:/var/www# mv Radicale-1.1.1 radicale

Ahora creamos un sitio donde vamos a almacenar el fichero de configuración

root@radicale-dav:/var/www/radicale# mkdir /etc/radicale
root@radicale-dav:/var/www/radicale# cp config /etc/radicale/

Y ahora lo modificamos y dejamos algunas líneas como indico

root@radicale-dav:/var/www/radicale# vi /etc/radicale/config
hosts = 127.0.0.1:5232
daemon = True
base_prefix = /
type = filesystem
filesystem_folder = /var/www/radicale_collections

Creamos el usuario que va a hacer funcionar radicale y creamos el directorio donde se van a guardar los calendarios de los usuarios

root@radicale-dav:/var/www#