Autoalojar nuestros formularios con LiberaForms

LiberaForms hace fácil la creación, personalización y gestión de los formularios, es respetuoso con los datos de las personas y cumple con la ley de protección de datos europea. ¡Usemos LiberaForms para construir una sociedad más libre, más ética y más soberana! 🙂

El origen del proyecto, tal y como ellos lo cuentan, es 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

Requisitos previos

Para instalar LiberaForms en un Debian 11 es necesario contar con:

  • Python3.7 o superior
  • Un servidor PostgreSQL

También deberemos de tener un dominio para configurarlo luego. Para esta guía, usaremos forms.dominio.edu.ar.

Instalación y configuración de LiberaForms

Descargamos el repo de GitLab de LiberaForms:

git clone https://gitlab.com/liberaforms/liberaforms.git /var/www/vhosts/forms.dominio.edu.ar/www/
cd liberaforms
chown liberaforms logs uploads

Ahora tendremos que crear un entorno virtual de Python, por lo que necesitaremos primero tener instalado estos paquetes:

apt install git python3-venv python3-dev gcc libpq-dev mime-support

Y creamos el entorno virtual:

python3 -m venv /var/www/vhosts/forms.dominio.edu.ar/www/venv

Lo siguiente será instalar los paquetes necesarios:

source /var/www/vhosts/forms.dominio.edu.ar/www/venv/bin/activate
pip install --upgrade pip
pip install -r /var/www/vhosts/forms.dominio.edu.ar/www/requirements.txt

Configuraremos para que se guarden la sesión directamente en el sistema de archivos, también se puede hacer en memoria.

mkdir /var/www/vhosts/forms.dominio.edu.ar/www/liberaforms/flask_session
chown www-data /var/www/vhosts/forms.dominio.edu.ar/www/liberaforms/flask_session

Tras esto, creamos el archivo de configuración y le asignaremos los permisos necesarios:

cp /var/www/vhosts/forms.dominio.edu.ar/www/dotenv.example /var/www/vhosts/forms.dominio.edu.ar/www/.env
chown www-data /var/www/vhosts/forms.dominio.edu.ar/www/.env
chmod go-rw /var/www/vhosts/forms.dominio.edu.ar/www/.env

Creamos el SECRET_KEY para configurarlo en el archivo .env:

#openssl rand -base64 32
python -c 'import secrets; print(secrets.token_hex())'

El resultado de este comando lo añadiremos al archivo .env, también agregamos un correo electrónico para crear el primer usuario.

SECRET_KEY = 'XXXXXXXXXXX'
ROOT_USERS = ['forms@dominio.edu.ar']

Agregamos los datos de acceso a la base de dados.

DB_HOST=localhost
DB_NAME=liberaforms
DB_USER=liberaforms
DB_PASSWORD=clave_para_la_BD

Base de datos

Creamos el usuario y la base de datos con los valores del archivo .env

flask database create

Otra manera de hacer lo mismo

sudo su
su postgres -c "liberaforms/commands/postgres.sh create-db"
exit

Crear las tablas

Actualizamos la base de datos a la última versión

flask db upgrade

Con la base de datos creada ya podemos iniciar la aplicación:

cd /var/www/vhosts/forms.dominio.edu.ar/www/
gunicorn -c /var/www/vhosts/forms.dominio.edu.ar/www/gunicorn.py liberaforms:app

La salida de esto nos mostrará lo siguiente:

[2020-12-07 14:48:56 +0100] [29945] [INFO] Starting gunicorn 20.0.4
[2020-12-07 14:48:56 +0100] [29945] [INFO] Listening at: http://127.0.0.1:5000 (29945)
[2020-12-07 14:48:56 +0100] [29945] [INFO] Using worker: sync
[2020-12-07 14:48:56 +0100] [29948] [INFO] Booting worker with pid: 29948
[2020-12-07 14:48:56 +0100] [29949] [INFO] Booting worker with pid: 29949
[2020-12-07 14:48:56 +0100] [29953] [INFO] Booting worker with pid: 29953
[2020-12-07 14:49:07 +0100] [29945] [INFO] Handling signal: winch

Esto significa que todo funciona correctamente y ahora deberemos de configurar el Proxy Reverso para que LiberaForms responda al dominio escogido.

Configuración de Proxy Reverso con Nginx

Para la configuración de Nginx hay que crear la siguiente configuración:

server {
    listen         80;
    server_name    forms.dominio.edu.ar;
    return         301 https://$server_name$request_uri;

    location / {
        proxy_pass          http://localhost:5000;
        proxy_set_header    Host    $host;
        proxy_set_header    X-Forwarded-For $remote_addr;
        proxy_set_header    X-Real-IP   $remote_addr;
        proxy_pass_header   server;
    }
    access_log /var/www/vhosts/forms.dominio.edu.ar/logs/liberaforms.access.log;
    error_log /var/www/vhosts/forms.dominio.edu.ar/logs/liberaforms.error.log notice;
}

Creamos el enlace simbólico

# ln -s /etc/nginx/sites-available/form.conf /etc/nginx/sites-enabled/form.conf

Comprobamos que la configuración sea correcta:

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Recargamos con configuración de Nginx

# systemctl reload nginx

Configuración de Proxy Reverso con Apache

Para la configuración de Apache hay que crear la siguiente configuración:

<VirtualHost *:80>
ServerName formularios.unau.edu.ar

ProxyPass /favicon.ico !
ProxyPass /logo.png !
ProxyPass /static/ !
ProxyPass /file/media/ !
Alias /static/ /opt/liberaforms/liberaforms/static/
Alias /file/media/ /opt/liberaforms/uploads/media/

UseCanonicalName on
ProxyPreserveHost On
RequestHeader set Host "formularios.unau.edu.ar"
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/

Alias /favicon.ico /opt/liberaforms/uploads/media/brand/favicon.ico
Alias /logo.png /opt/liberaforms/uploads/media/brand/logo.png

<Directory /opt/liberaforms>
Require all granted
Options -Indexes
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error_formularios.log
CustomLog ${APACHE_LOG_DIR}/access_formularios.log combined

</VirtualHost>

Activamos el vhost

# a2ensite formularios.unau.edu.ar.conf

Verificamos con configuración

# apachectl configtest
Syntax OK

Recargamos la configuración de Apache

# systemctl reload apache2

Instalación de Supervisor para controlar el proceso

Instalamos Supervisor para que controle el proceso de LiberaForms:

# apt install supervisor

Editamos el archivo /etc/supervisor/conf.d/LiberaForms.conf y añadimos esta configuración:

[program:LiberaForms]
command = /var/www/vhosts/forms.dominio.edu.ar/www/venv/bin/gunicorn -c /var/www/html/vhosts/forms.dominio.edu.ar/www/gunicorn.py liberaforms:app
directory = /var/www/vhosts/forms.dominio.edu.ar/www
user = www-data

Reiniciamos supervisor:

# systemctl restart supervisor

Crear el primer super usuario

Para crear el primer usuario administrador o superusuario de Liberaforms, tenemos que dirigir el navegador web a la plataforma e ir al apartado Entrar > Has olvidado la contraseña?. Allí introducir la cuenta de correo que hemos configurado en el archivo de configuración anteriormente:

Tras hacer clic sobre Recuperar podremos crear nuestro primer usuario: