LiberaForms: un servicio autoalojado de formularios web

1 May

Recién instalado y ya con varias instalaciones y un puñado de formularios en uso, la primera impresión es excelente. Muy buen diseño y una usabilidad fantástica, de las que te olvidas casi al instante.

Llevaba tiempo intentando probar un sistema de este tipo (tiene muchas utilidades especialmente en temas de protección de datos) pero no había encontrado nada que fuese sencillo y limpio de instalar. En este caso LiberaForms tampoco es lo ideal (no está empaquetado para Debian) pero ofrece lo suficiente como para disculparlo.

Y hace unas semanas empecé a seguir un blog llamado _VOID NULL y tiene una entrada hablando precisamente de ello. Así que me decidí a intentarlo y seguí todos los pasos que indicaba a excepción de la configuración del servidor de proxy inverso donde he preferido usar Apache. Más abajo cuento los detalles.

El proyecto me ha gustado mucho en todos los aspectos. Su origen tal y como ellos lo cuentan me parece precisamente el ejemplo de punto de partida para crear cosas como esas:

El software se empezó a desarrollar en el 2019 bajo el nombre de GNGforms, pero la idea se tuvo dos años antes. Cuando en el 2017 en el barrio de Sants se estaba luchando para conservar el Hortet de La Farga, se creó un formulario de Google para recoger firmas. Y resultó que no sólo se pagaba con datos: a partir de cierto número de respuestas al formulario, o pagabas o la empresa secuestraba los datos. Y así fue cómo nació la idea de crear unos formularios éticos para que los colectivos del barrio pudiesen recoger datos de forma respetuosa y sin sorpresas.

https://liberaforms.org/es/projekto

Instalación y configuración

Está muy bien descrita en el blog mencionado. Se necesita un servidor MongoDB, clonar el repositorio e instalarlo con un entorno Python virtual (incluyendo el uso de supervisor) y configurar el proxy inverso.

La configuración tampoco tiene nada de especial; el archivo que se emplea es absurdamente simple y sólo requiere una clave de cifrado (openssl rand -base64 32) y una o varias cuentas de correo que se consideran como de administración.

Cuando el sistema está en marcha y se accede a él por primera vez se debe entrar con una de esas cuentas y terminar de crearla para disponer de un modo administrador (modo root) donde se pueden crear otros usuarios, configurar algunos detalles de aspecto y contenido (un texto markdown) para la página principal, el idioma y demás.

Apache2 como proxy inverso

Las instrucciones del programa incluyen configuración para nginx pero he querido probar a utilizar Apache2 (porque lo necesito para otros servicios en la máquina) y he conseguido una configuración base que funciona sin problemas:

<VirtualHost *:443>
        ServerName      forms.venexma.es
        ServerAdmin     root@venexma.es

        Include "/etc/apache2/ssl.conf"

        <Location />
                UseCanonicalName        on
                ProxyPreserveHost       On
                RequestHeader           set Host "forms.venexma.es"
                ProxyPass               "http://localhost:5000/"
                ProxyPassReverse        "http://localhost:5000/"
        </Location>
</VirtualHost>

Se necesitan algunos módulos extra como proxy y proxy_http y headers para realizar el ajuste en la variable de cabecera y la configuración correcta para SSL, por supuesto. No da ningún problema más.

Envío de correo

Una pieza clave es definir el servidor de correo electrónico y en este caso me he encontrado con que al estar el correo en Google tengo muy poco margen de maniobra. Bueno, no es exactamente así; puedo emplear una de las cuentas pagadas para enviar correo pero he tenido algunos problemas antes si usaba una cuenta existente para enviar y cambiaba la cuenta de origen del envío.

Por eso he pensado que podría utilizar el mismo mecanismo que estoy usando en otros casos. Un servidor local con envío a través del registrador del dominio (gandi.net) y ajustes en el DNS para que reconozca a forms.venexma.es como emisor de correo para el dominio.

He terminado con una instalación básica de exim4 que utiliza como envío de correo los servidores del registrador del dominio gandi.net con el añadido de firmarlos digitalmente (DKIM) antes de lanzarlos fuera.

Así que en la parte del DNS he ampliado el registro SPF para que incluya también a Gandi por lo que ahora tiene como cuatro zonas habilitadas para envío: dominios propios con registro MX apuntando a venexma, los dominios de Google que mantiene (por ahora) las cuentas de correo, los de MailRelay para envío de boletines (conseguí convencerlos de que había que comprar una subscripción) y los de Gandi. Eso ha hecho que dé algunos avisos en programas que comprueban la configuración SPF porque hay demasiados hosts implicados pero casi todos lo aceptan como bueno.

Lo de la clave DKIM está bien pensado. Como hay que utilizar un selector arbitrario ha sido muy sencillo tener varias claves públicas en el dominio que son generadas por sistemas diferentes. No hay necesidad de estar compartiendo claves privadas entre entornos muy distantes entre sí.

Empleo

Respecto al uso decir que es de lo más sencillo. El programa tiene un panel de control que permite construir formularios web con una dirección específica. Esos formularios, una vez rellenos y enviados son registrados bajo el panel de control y el autor recibe un correo con los datos en texto plano.

Conserva estadísticas de uso de los formularios y de valores introducidos, por lo que usarse para encuestas, y además permite el acceso a los datos en formato JSON, XML y alguno más. Está muy bien pensado y es muy sencillo ponerlo en marcha.

Por debajo, entre otras, utiliza una herramienta de terceros, formbuilder.online, limitando los tipos de campos que puede tener. Los archivos, por ejemplo, no están contemplados así que si se necesitan será mejor recurrir a otra herramienta de las que recomiendan. En mi caso lo estoy empleando para solicitar datos y consentimiento a clientes y vecinos (tengo ya dos instalaciones) y de momento va muy bien.

Un detalle que me gustaría añadir (y posiblemente lo haga) es crear un correo de respuesta mejorado, con una información más cuidada sobre qué datos nos ha dado y cuáles son nuestras condiciones de uso y conservación de los mismos. Creo que podría hacerse añadiendo código al formulario pero seguramente termine por implementar un filtro de contenido en el servidor de correo interno que estoy utilizando. Tengo que estudiarlo pero de momento ya lo he apuntado aquí, en mi pila.

Copias de seguridad

Es una aplicación construida sobre un entorno virtual de Python en un único directorio que incluye cachés, directorio de imágenes (para logotipos) y sesiones. Por otro lado emplea MongoDB y Apache2 así que bastaría con hacer una copia de su directorio, la configuración del servidor y un volcado de la base de datos.

Referencias