{"id":4087,"date":"2021-05-01T10:34:09","date_gmt":"2021-05-01T08:34:09","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=4087"},"modified":"2021-05-01T11:20:28","modified_gmt":"2021-05-01T09:20:28","slug":"liberaforms-un-servicio-autoalojado-de-formularios-web","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2021\/05\/01\/liberaforms-un-servicio-autoalojado-de-formularios-web\/","title":{"rendered":"LiberaForms: un servicio autoalojado de formularios web"},"content":{"rendered":"\n<p>Reci\u00e9n instalado y ya con varias instalaciones y un pu\u00f1ado de formularios en uso, la primera impresi\u00f3n es excelente. Muy buen dise\u00f1o y una usabilidad fant\u00e1stica, de las que te olvidas casi al instante. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Llevaba tiempo intentando probar un sistema de este tipo (tiene muchas utilidades especialmente en temas de protecci\u00f3n de datos) pero no hab\u00eda encontrado nada que fuese sencillo y limpio de instalar. En este caso <a href=\"https:\/\/liberaforms.org\" target=\"_blank\" rel=\"noreferrer noopener\">LiberaForms<\/a> tampoco es lo ideal (no est\u00e1 empaquetado para Debian) pero ofrece lo suficiente como para disculparlo.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/imagen.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/imagen-1024x642.png\" alt=\"\" class=\"wp-image-4089\" width=\"669\" height=\"418\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/imagen-1024x642.png 1024w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/imagen-300x188.png 300w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/imagen-768x481.png 768w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/imagen-600x376.png 600w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/imagen.png 1269w\" sizes=\"auto, (max-width: 669px) 100vw, 669px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Y hace unas semanas empec\u00e9 a seguir un blog llamado <a href=\"https:\/\/voidnull.es\/\" target=\"_blank\" rel=\"noreferrer noopener\">_VOID NULL<\/a> y tiene una entrada hablando precisamente de ello. As\u00ed que me decid\u00ed a intentarlo y segu\u00ed todos los pasos que indicaba a excepci\u00f3n de la configuraci\u00f3n del servidor de proxy inverso donde he preferido usar Apache. M\u00e1s abajo cuento los detalles. <\/p>\n\n\n\n<p>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:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow\"><p>El software se empez\u00f3 a desarrollar en el 2019 bajo el nombre de GNGforms, pero la idea se tuvo dos a\u00f1os antes. Cuando en el 2017 en el barrio de Sants se estaba luchando para conservar el Hortet de La Farga, se cre\u00f3 un formulario de Google para recoger firmas. Y result\u00f3 que no s\u00f3lo se pagaba con datos: a partir de cierto n\u00famero de respuestas al formulario, o pagabas o la empresa secuestraba los datos. Y as\u00ed fue c\u00f3mo naci\u00f3 la idea de crear unos formularios \u00e9ticos para que los colectivos del barrio pudiesen recoger datos de forma respetuosa y sin sorpresas.<\/p><cite><a href=\"https:\/\/liberaforms.org\/es\/projekto\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/liberaforms.org\/es\/projekto<\/a><\/cite><\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Instalaci\u00f3n y configuraci\u00f3n<\/h3>\n\n\n\n<p>Est\u00e1 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 <a rel=\"noreferrer noopener\" href=\"http:\/\/supervisord.org\/\" target=\"_blank\">supervisor<\/a>) y configurar el proxy inverso. <\/p>\n\n\n\n<p>La configuraci\u00f3n tampoco tiene nada de especial; el archivo que se emplea es absurdamente simple y s\u00f3lo requiere una clave de cifrado (<em>openssl rand -base64 32<\/em>) y una o varias cuentas de correo que se consideran como de administraci\u00f3n. <\/p>\n\n\n\n<p>Cuando el sistema est\u00e1 en marcha y se accede a \u00e9l por primera vez se debe entrar con una de esas cuentas y terminar de crearla para disponer de un modo administrador (<em>modo root<\/em>) donde se pueden crear otros usuarios, configurar algunos detalles de aspecto y contenido (un texto <em>markdown<\/em>) para la p\u00e1gina principal, el idioma y dem\u00e1s. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Apache2 como proxy inverso<\/h4>\n\n\n\n<p>Las instrucciones del programa incluyen configuraci\u00f3n para <em>nginx<\/em> pero he querido probar a utilizar Apache2 (porque lo necesito para otros servicios en la m\u00e1quina) y he conseguido una configuraci\u00f3n base que funciona sin problemas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"apacheconf\" class=\"language-apacheconf\">&lt;VirtualHost *:443&gt;\n        ServerName      forms.venexma.es\n        ServerAdmin     root@venexma.es\n\n        Include \"\/etc\/apache2\/ssl.conf\"\n\n        &lt;Location \/&gt;\n                UseCanonicalName        on\n                ProxyPreserveHost       On\n                RequestHeader           set Host \"forms.venexma.es\"\n                ProxyPass               \"http:\/\/localhost:5000\/\"\n                ProxyPassReverse        \"http:\/\/localhost:5000\/\"\n        &lt;\/Location&gt;\n&lt;\/VirtualHost&gt;\n<\/code><\/pre>\n\n\n\n<p>Se necesitan algunos m\u00f3dulos extra como <em>proxy<\/em> y <em>proxy_http<\/em> y <em>headers<\/em> para realizar el ajuste en la variable de cabecera y la configuraci\u00f3n correcta para SSL, por supuesto. No da ning\u00fan problema m\u00e1s. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Env\u00edo de correo<\/h3>\n\n\n\n<p>Una pieza clave es definir el servidor de correo electr\u00f3nico 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\u00ed; 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\u00edo. <\/p>\n\n\n\n<p>Por eso he pensado que podr\u00eda utilizar el mismo mecanismo que estoy usando en otros casos. Un servidor local con env\u00edo a trav\u00e9s 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. <\/p>\n\n\n\n<p>He terminado con una instalaci\u00f3n b\u00e1sica de <em>exim4<\/em> que utiliza como env\u00edo de correo los servidores del registrador del dominio <a rel=\"noreferrer noopener\" href=\"https:\/\/gandi.net\" target=\"_blank\">gandi.net<\/a> con el a\u00f1adido de firmarlos digitalmente (DKIM) antes de lanzarlos fuera. <\/p>\n\n\n\n<p>As\u00ed que en la parte del DNS he ampliado el registro SPF para que incluya tambi\u00e9n a Gandi por lo que ahora tiene como cuatro zonas habilitadas para env\u00edo: dominios propios con registro MX apuntando a venexma, los dominios de Google que mantiene (por ahora) las cuentas de correo, los de <a href=\"https:\/\/www.mailrelay.com\" target=\"_blank\" rel=\"noreferrer noopener\">MailRelay<\/a> para env\u00edo de boletines (consegu\u00ed convencerlos de que hab\u00eda que comprar una subscripci\u00f3n) y los de Gandi. Eso ha hecho que d\u00e9 algunos avisos en programas que comprueban la configuraci\u00f3n SPF porque hay demasiados <em>hosts<\/em> implicados pero casi todos lo aceptan como bueno. <\/p>\n\n\n\n<p>Lo de la clave DKIM est\u00e1 bien pensado. Como hay que utilizar un selector arbitrario ha sido muy sencillo tener varias claves p\u00fablicas en el dominio que son generadas por sistemas diferentes. No hay necesidad de estar compartiendo claves privadas entre entornos muy distantes entre s\u00ed. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Empleo<\/h3>\n\n\n\n<p>Respecto al uso decir que es de lo m\u00e1s sencillo. El programa tiene un panel de control que permite construir formularios web con una direcci\u00f3n espec\u00edfica. 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. <\/p>\n\n\n\n<p>Conserva estad\u00edsticas de uso de los formularios y de valores introducidos, por lo que usarse para encuestas, y adem\u00e1s permite el acceso a los datos en formato JSON, XML y alguno m\u00e1s. Est\u00e1 muy bien pensado y es muy sencillo ponerlo en marcha. <\/p>\n\n\n\n<p>Por debajo, entre otras, utiliza una herramienta de terceros, <a rel=\"noreferrer noopener\" href=\"https:\/\/formbuilder.online\/\" target=\"_blank\">formbuilder.online<\/a>, limitando los tipos de campos que puede tener. Los archivos, por ejemplo, no est\u00e1n contemplados as\u00ed que si se necesitan ser\u00e1 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. <\/p>\n\n\n\n<p>Un detalle que me gustar\u00eda a\u00f1adir (y posiblemente lo haga) es crear un correo de respuesta mejorado, con una informaci\u00f3n m\u00e1s cuidada sobre qu\u00e9 datos nos ha dado y cu\u00e1les son nuestras condiciones de uso y conservaci\u00f3n de los mismos. Creo que podr\u00eda hacerse a\u00f1adiendo c\u00f3digo 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 <a rel=\"noreferrer noopener\" href=\"https:\/\/esferas.org\/pila\/2021\/05\/01\/filtro-de-correo-en-salida\/\" target=\"_blank\">aqu\u00ed<\/a>, en mi pila.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Copias de seguridad<\/h3>\n\n\n\n<p>Es una aplicaci\u00f3n construida sobre un entorno virtual de Python en un \u00fanico directorio que incluye cach\u00e9s, directorio de im\u00e1genes (para logotipos) y sesiones. Por otro lado emplea MongoDB y Apache2 as\u00ed que bastar\u00eda con hacer una copia de su directorio, la configuraci\u00f3n del servidor y un volcado de la base de datos. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Referencias<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/voidnull.es\/instalar-liberaforms-en-debian-10-para-olvidarte-de-google-forms\/\" target=\"_blank\">Instalar LiberaForms en Debian 10 para olvidarte de Google Forms<\/a><\/li><li>Copias de seguridad de MongoDB: <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/backups\/\" target=\"_blank\">https:\/\/docs.mongodb.com\/manual\/core\/backups\/<\/a><\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reci\u00e9n instalado y ya con varias instalaciones y un pu\u00f1ado de formularios en uso, la primera impresi\u00f3n es excelente. Muy buen dise\u00f1o y una usabilidad fant\u00e1stica, de las que te olvidas casi al instante.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[2],"tags":[41,221,1096,1098,1095,1097,180,44],"class_list":["post-4087","post","type-post","status-publish","format-standard","hentry","category-software","tag-debian","tag-exim","tag-formbuilder-online","tag-formularios","tag-liberaforms","tag-mongodb","tag-proxy-inverso","tag-servicios-web"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=4087"}],"version-history":[{"count":13,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4087\/revisions"}],"predecessor-version":[{"id":4103,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4087\/revisions\/4103"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=4087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=4087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=4087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}