Parte de lo hecho hoy fue comenzado ayer pero no quería confundirme más. Ayer fue domingo y desde que estoy varado en casa sin coche los días se me hacen iguales.
Servidor barbacana.venexma.net
He estado realizando un montón de cambios en la configuración de los servidores virtuales bajo Apache2 en esta máquina. Todos han cambiado su definición de escucha para hacerlo en dos direcciones IP: la interna (192.168.100.1) y la externa (79.148.243.240). Sólo en un par de casos el contenido cambia, y es en aquellos servidores que deben dar sólo contenido al interior y no al exterior. Muy pocos. Y ha funcionado correctamente.
He tenido que ponerlos a todos porque si dejo algo con un asterisco como dirección IP suele darle prioridad a éstos y descabalarme todo el montaje. Al final casi mejor.
Otro problema que no sé de dónde sale pero me lo estoy imaginando es que los archivos dentro de /etc/apache2/sites-enabled deberían ser enlaces simbólicos a /etc/apache2/sites-available y son archivos completos. Eso significa que he estado trabajando varias horas sobre archivos creyendo que su contenido se vería reflejado automáticamente en el otro y no era así. Explica varias cosas: que el procedimiento de restauración de configuración antes de Debian 11 no fue correcto y que soy un poco melón por no haberlo visto antes. Lo corrijo entonces porque si no emplear a2ensite y derivados no sirve de nada.
Servidor usuarios.venexma.net
Hace tiempo que buscaba una aplicación web que me permitiese gestionar los usuarios por una parte y proporcionar un servicio de cambio de contraseña por otro. Y no, no la he encontrado. Bueno, un poco sí.
Buscando, buscando, me he topado en github con una aplicación PHP (para no variar) que funciona en un contenedor (para variar menos aún) -porque emplea PHP versión 8- y que más o menos da la funcionalidad que quiero. Se llama ldap-user-manager, es de Brian Lycett y me ha costado bastante que arrancase por falta de lectura de la documentación.
Una vez descargado el contenedor he creado un archivo de configuración para cargar las variables de entorno:
SERVER_HOSTNAME=usuarios.venexma.net ORGANIZATION_NAME="Venexma Europa, S.L." SITE_NAME="Gestión de usuarios de Venexma Europa, S.L." SESSION_DEBUG=TRUE NO_HTTPS=TRUE LDAP_URI=ldap://ldap.venexma.net LDAP_BASE_DN=dc=venexma,dc=net LDAP_REQUIRE_STARTTLS=FALSE LDAP_ADMINS_GROUP=Admins LDAP_ADMIN_BIND_DN=cn=admin,dc=venexma,dc=net LDAP_ADMIN_BIND_PWD=secreto! LDAP_IGNORE_CERT_ERRORS=true LDAP_DEBUG=TRUE LDAP_USER_OU=users LDAP_GROUP_OU=groups LDAP_GROUP_MEMBERSHIP_USES_UID=TRUE DEFAULT_USER_GROUP=Venexma ACCEPT_WEAK_PASSWORDS=TRUE ACCOUNT_REQUESTS_ENABLED=FALSE EMAIL_DOMAIN=venexma.es SMTP_HOSTNAME=smtp.venexma.net EMAIL_FROM_ADDRESS=root@venexma.net EMAIL_FROM_NAME="Victor" RESET_PASSWORD_EMAIL_SUBJECT="Contraseña reiniciada"
También he añadido una estrofa para que se tuviese acceso desde Apache2:
# Creando proxy a aplicación
ProxyPreserveHost on
ProxyPass / http://127.0.0.1:8099/
ProxyPassReverse / http://127.0.0.1:8099/
Habiendo arrancado el contenedor con el puerto -p 8099:80 para que tuviese acceso.
Ahora bien, ¿ funciona ? Hombre, sí que funciona. Si entras con el URL /setup pues echa un buen vistazo a la configuración LDAP, sugiere unas cosas y añade otras si no existen. Crea un usuario de administración y con él puedes ver las otras cuentas y los otros grupos. Y sí, bien, excepto por los siguientes detalles:
- No hay otro idioma que el inglés (mis homínidos no van a usarlo, eso está claro)
- Los mensajes de error LDAP son continuos en la página web. Eso afea.
- Permite enviar una contraseña nueva si lo pide el usuario utilizando el correo que encuentra en el directorio pero
- El mensaje incluye la contraseña en texto plano (mal)
- Sugiere que se visite un URL concreto para cambiar la contraseña (regular)
- Los mensajes están en inglés (pues igual de regular) aunque se pueden definir por completo en la configuración (mira, eso está bien)
- Los servicios para cualquier cuenta no administrativa se reducen al cambio de contraseña. No puede tocar ningún otro valor de su cuenta.
Ahora estoy un poco liado así que no pondré nada nuevo. Me han hablado bien de Fusion Directory. Lo bueno es que está empaquetado para Debian. Lo malo es que hay tropecientos paquetes y lo mismo instalo un monstruo hipervitaminado que nunca voy a terminar de conocer.
Creando réplica del entorno de producción
Pues sí, volvemos a hacer una réplica del entorno de producción para que el muchacho externo 3 pueda trabajar con datos actualizados. Como el procedimiento automatizado no trajo más que problemas -que no he identificado aún y me escuecen de verdad- estoy realizando el procedimiento a mano.
- Avisar en el grupo de Telegram (en el que están todos menos el dire, porque él lo vale)
- Detener el servicio odoo-prod
- Copiar archivos: rsync -av /var/lib/odoo-data-prod/ /var/lib/odoo-data-replica/
- Duplicar la base de datos
- Borrar la base de datos de réplica: sudo -u postgres dropdb replica
- Crearla de nuevo partiendo de la de producción: sudo -u postgres createdb -Tprod replica
- Cambiar el propietario a odoo (en psql): alter database replica owner to odoo;
- Retocar algunos valores internos para que no haga de más (abajo el código SQL)
- Crear el logotipo actualizado (sí, abajo también)
- Actualizar el código (seguimos abajo)
- Poner en marcha ambos servicios
Valores internos
Lo siguiente son cambios que hay que hacer siempre que se replica la base de datos y que sigo ciegamente porque no parecen graves y fueron recomendados por el muchacho externo 1:
update ir_mail_server
set smtp_user = concat('xxx_', smtp_user),
smtp_pass = concat('xxx_', smtp_pass),
smtp_host = concat('xxx_', smtp_host);
update ir_config_parameter set
value = 'https://replica.venexma.net'
where key = 'web.base.url';
update ir_config_parameter set
value = 'http://127.0.0.1:8169'
where key = 'report_url';
update ir_config_parameter set
value = '/opt/odoo-replica/wkhtmltopdf-amd64'
where key = 'webkit_path2';
update ir_config_parameter set value = '$DB_TEST' where key = 'ribbon.name';
update fetchmail_server
set "user" = concat('xxx_', "user"),
password = concat('xxx_', "user"),
server = concat('xxx_', server) ;
update ir_cron set active = False;
Actualizar el código
Aquí viene donde la matan. He intentado organizarlo en repositorios git para que hubiese registro de cambios y se pudiesen retroceder cambios. Y, bueno, sobre el papel está bien, pero los externos tienden a emplear el interfaz web de odoo para subir código y como éste no tiene integración con git se olvidan de la consola y los cambios se quedan ahí, sin registrar.
El caso es que al menos lo hacen ahora en réplica primero y luego lo pasan a producción. Es una gran mejora pero falta la guinda: emplear git.
Así que hay que ir uno por uno, ver cambios, registrarlos, subirlos en una parte y recuperarlos en otra. Seguro que estoy haciendo un montón de cosas mal. Nunca he llegado a entender del todo cómo funciona la herramienta y no paso del uso básico tipo repositorio central. En fin, al menos registrado queda. Si hay problemas ya veremos después cómo los resolvemos.
Cambiar el logotipo
Desde la primera vez que creé una réplica me percaté de que el URL no era lo más apropiado para hacerles ver en qué entorno estaban. odoo pone siempre y en cada una de sus pantallas el logotipo que se asigna a la empresa por lo que me las ingenié para adaptarlo un poco y ser más informativo. Empleando el programa convert modifico la versión original y le añado como texto la fecha y el texto Réplica. Así lo ven continuamente y sufren menos.
El código original, el que no quiero usar por las desgracias que trajo parte de él, es complicado de usar directamente. Así que he hecho un extracto para que funcione en un script aparte:
#!/usr/bin/bash env
LOGO=$1
[ -z "$LOGO" ] && exit 1
LOGO_REPLICA=/tmp/logo-replica.jpeg
FECHA=$(date +%d/%m/%Y)
convert $LOGO \
-gravity south \
-font Cantarell-Bold \
-pointsize 25 \
-annotate 0 $FECHA \
-gravity north \
-pointsize 20 \
-annotate 0 'Réplica' \
$LOGO_REPLICA
logo64=$(base64 $LOGO_REPLICA)
sudo -u postgres psql -d replica <<EOF
update res_company set
logo_web = '${logo64}';
EOF