Métricas, privacidad y analíticas

Cuando monté el blog, desconocía si tendría algún alcance. Al fin y al cabo, publico todo aquello con lo que trasteo para que no se me olvide, y saber cómo funcionan las métricas de un sitio web era una más de la lista. Y así comienza esta pequeña historia...

Métricas, privacidad y analíticas

Al comenzar esta aventura apenas tenía idea de cómo funcionaba el tema de las métricas web ni las analíticas. Empecé metiendo un tag de Google Analytics, pues era lo más sencillo. Con el tiempo, Matomo se cruzó en mi camino y lo añadí al blog; al principio fue en modo experimental y, con el tiempo, se ha convertido en mi fuente principal de extracción de métricas. A través de ellas he descubierto que el blog tiene cierto seguimiento desde España y algunos países de América Latina ☺️, así como que hay temas que tienen mucho más interés que otros (sobre Mosquitto tengo ganas de hacer una serie de entradas pues, por algún motivo, es lo que más se visita del blog 😳).

El servidor VPS donde mantengo todo esto es bastante básico, y Matomo consume muchos recursos para el uso que realmente le doy. Sin embargo, no tenía muchas alternativas libres y que protegieran la privacidad... hasta que descubrí Offen. Se trata de un software de código abierto para la extracción de métricas de navegación muy enfocado en la privacidad que consume muy pocos recursos. Mientras que Matomo considera la aceptación de las cookies de manera predeterminada, Offen lo interpreta al revés. Así, salvo que des tu consentimiento expreso de que aceptas ese rastreo, Offen no instalará ninguna cookie ni realizará seguimiento alguno. Por si esto fuera poco, permite que los usuarios puedan consultar sus datos, revocarlos en cualquier momento y borrarlos pero seguir siendo rastreados si así lo desean. Y todo con una retención de datos máxima de 6 meses. Para una gran empresa o portales donde estos datos son interesantes para la venta, puede ser una ventana pequeña, pero para sitios como éste, que sólo pretendemos divulgar lo que conocemos sin ningún ánimo de lucro, es más que suficiente para sacar una foto de cómo estamos haciendo las cosas.

Y tras esta gran introducción que espero que no os haya anestesiado demasiado, vamos a

Instalación de Offen

Para instalar Offen en nuestro sistema, recurriremos, una vez más, a Docker. Para ello, configuraremos nuestro fichero docker-compose.yml de la siguiente manera:

version: '3'

services:
  offen:
    image: offen/offen:v1.1.0
    container_name: "offen"
    restart: always
    env_file: .env
    networks:
      - traefik
    volumes:
      - ./offen_data:/var/opt/offen
    labels:
      - "traefik.enable=true"
      - "traefik.port=80"
      - "traefik.docker.network=traefik_net"
      - "traefik.http.routers.offen.entrypoints=https"
      - "traefik.http.routers.offen-secure.rule=Host(`offen.example.org`)"
      - "traefik.http.routers.offen.tls=true"
      - "traefik.http.routers.offen.tls.certresolver=certlocal"
      - "traefik.http.services.offen.loadbalancer.server.port=80"

networks:
  traefik:
    external:
      name: public
Fichero docker-compose.yml para Offen

Una vez tenemos el fichero creado, deberemos crear el directorio offen_data y el fichero .env para contener las variables de configuración. Ambos deben tener los permisos del usuario de Offen para trabajar, por lo que ejecutaremos las siguientes órdenes para crearlos correctamente (en la misma ruta donde hemos creado el fichero docker compose):

$ mkdir offen_data
$ touch .env
$ sudo chown 10000:10001 .env
$ sudo chown -R 10000:10001 offen_data
Creación del fichero de variables y la carpeta donde desplegaremos los datos del servicio

Inicialización de Offen y creación de una base de datos por defecto

A continuación, lanzaremos la imagen de Offen en modo setup para que nos haga la instalación inicial de la base de datos (usará SQLite) y nos cree el primer usuario administrador. En la terminal, ejecutaremos el comando:

$ docker run -it --rm \
  -v /home/miusuario/metrics/offen_data:/var/opt/offen \
  -v /home/miusuario/metrics/offen_certs:/var/www/.cache \
  -v /home/miusuario/metrics/.env:/etc/offen/offen.env \
  offen/offen:v1.1.0 setup \
  -email admin@example.org \
  -name admin \
  -populate
Arranque de Offen en modo configuración inicial

Si repasamos el comando, veremos que lo que estoy haciendo es lanzar un contenedor al que le indico 3 volúmenes: offen_data para que instale en él la base de datos, offen_certs (si vamos a querer usar certificados, si no lo podemos omitir, como es mi caso, ya que al exponer el servicio a través de Traefik no necesitaré que los certificados los gestione Offen) y el fichero que contendrá las variables de entorno .env. En los 3 casos deberemos indicar las rutas absolutas. Tras ellas, viene la imagen que vamos a usar (a fecha de esta entrada la última release es la v1.1.0), el comando setup, el email del usuario administrador (lo podremos cambiar después), el nombre de dicho usuario y el parámetro -populate.

Al ejecutar el comando, se nos pedirá la contraseña de ese usuario administrador que estaremos creando. Y gracias al comando -populate, se nos inicializará el fichero .env con el secreto necesario.

Tras ejecutarse el comando, ya tendremos creado nuestro usuario administrador. Si listamos el directorio de offen_data veremos que se nos ha creado un fichero offen.db. Ésta es la base de datos SQLite que usará Offen. En cuanto al fichero .env, si lo abrimos, veremos que ahora contiene una línea con la clave OFFEN_SECRET y una clave generada.

Configuración del correo electrónico

Offen nos permite añadir la configuración necesaria para enviar notificaciones a través del correo electrónico. La necesitaremos si pretendemos crear más de un usuario y para resetear nuestra contraseña en caso de que la olvidemos. Para ello, en el fichero .env añadiremos la siguiente información:

OFFEN_SMTP_HOST=<SMTP_SERVER>
OFFEN_SMTP_PORT=<SMTP_PORT>
OFFEN_SMTP_USER=<SMTP_USER>
OFFEN_SMTP_PASSWORD=<SMTP_PASSWORD>
OFFEN_SMTP_SENDER=noreply@example.org
Configuración en el fichero env para utilizar el envío de correos electrónicos

Como podéis ver, necesitaremos especificar los parámetros SMTP de host, puerto, usuario, contraseña y remitente (por defecto Offen utilizará si no no-reply@offen.dev). De esta forma, si damos de alta un usuario nuevo u se olvida la contraseña, le podremos enviar un correo con un enlace de 24h de duración para que la restablezca. Es la única manera de restablecerla por parte del usuario.

Configuración del resto de parámetros

A continuación, veremos una serie de parámetros para configurar Offen que nos pueden ser de utilidad:

  • OFFEN_SERVER_REVERSEPROXY: Indica a Offen que está funcionando detrás de un proxy inverso, con lo que delegará en él algunas tareas relacionadas con el log y cacheo de cabeceras de seguridad.
  • OFFEN_DATABASE_DIALECT: Por defecto, será sqlite, pero si queremos usar MySQL o PostgreSQL, los especificaremos (además del resto de parámetros necesarios para la conexión).
  • OFFEN_SECRET: Creado durante el proceso de setup, se trata de un secreto que utiliza Offen para firmar las cookies y validar los token URL. Se crea en base64 y, si bien puede omitirse, será necesario para no perder la información entre reinicios de la aplicación. La manera más sencilla de generarlo es mediante el comando anterior de setup con la orden -populate y olvidarnos de ello.
  • OFFEN_APP_LOCALE: Define el locale de la aplicación, tanto en la ventana emergente donde solicita el consentimiento, como en el resto de la aplicación. De esta forma, podemos definir el idioma en el que el administrador manejará la interfaz de Offen y los usuarios verán la información recopilada sobre ellos y las explicaciones de qué es cada cosa. Por defecto es en (inglés), pero admite además, a fecha de hoy, alemán, francés, portugués y español 🥰.
  • OFFEN_APP_LOGLEVEL: Nos permite definir el nivel de log de la aplicación. Por defecto ésta se encuentra en info.
  • OFFEN_APP_RETENTION: Podemos definir el máximo de tiempo que queremos que se recopilen los datos. Por defecto (y como máximo) esta duración será de 6 meses (186 días), y los posibles valores que puede tomar esta variable serán: 6months, 12weeks, 6weeks, 30days o 7days.

Aquí he listado los que he considerado más importantes, pero si queréis ver todos, los tenéis disponibles en su documentación.

Teniendo en cuenta esto último y lo que llevamos visto, nuestro fichero .env podría tener finalmente un aspecto similar a éste:

OFFEN_SECRET=<MI_SECRETO>
OFFEN_APP_LOCALE=es
OFFEN_SERVER_REVERSEPROXY=true
OFFEN_APP_LOGLEVEL=warn
# SMTP config
OFFEN_SMTP_HOST=<SMTP_HOST>
OFFEN_SMTP_PORT=<SMTP_PORT>
OFFEN_SMTP_USER=<SMTP_USER>
OFFEN_SMTP_PASSWORD=<SMTP_PASSWORD>
OFFEN_SMTP_SENDER=noreply@example.org
Aspecto final del fichero de configuración .env

Arranque de Offen

¡Ahora sí! Ya tenemos todo listo y preparado para levantar nuestro servicio de métricas. Un simple docker-compose up -d y veremos cómo el servicio arranca y cómo, en cuanto Traefik lo detecta, expone su URL al mundo y ya podremos acceder a él. Si accedemos a la página principal (en el ejemplo: offen.example.org), veremos cómo ya nos identifica como un usuario nuevo y nos solicita permiso directamente para instalar la cookie. No es necesario visitar una página en la que tengamos metido el script, desde la web principal de Offen también se nos pedirá permiso y se nos permitirá revocarlo en cualquier momento.  Se puede apreciar que todo está en castellano, ya que especifiqué el locale es en el fichero de configuración. Como veis en la captura de aquí abajo, en la parte inferior tenemos el acceso de usuarios (u operadores como lo llaman ellos):

Página inicial de Offen
Página inicial de Offen

Nos logaremos con el mail y la contraseña que pusimos en la fase de setup y nos llevará a la página principal, donde estarán las métricas (que, por ahora, estarán vacías). Si hacemos scroll, veremos que abajo tenemos las distintas opciones del menú, cada una de ellas con una explicación bastante clara de su función, por lo que sólo me pararé en las más importantes.

Código de inserción

Sección del código de inserción
Sección del código de inserción

En esta sección veremos el código HTML que deberemos insertar en todos los sitios web que queramos que Offen rastree. Bastará con pegarlo justo antes de la etiqueta </head> de nuestro blog, página web, etc. y automáticamente Offen empezará a registrar las visitas.

Permitir acceso de usuarios a datos

Sección del acceso de usuarios a los datos
Sección del acceso de usuarios a los datos

En esta sección, a diferencia de otros servicios de rastreo, se nos ofrece la posibilidad de exponerle al usuario un enlace (bien mediante un simple enlace web que podremos pegar en nuestra página, o bien mediante un widget con formato específico) para que pueda acceder a su propio panel de Offen y visualizar las métricas que recopilamos de él, además de poder revocar el permiso, volver a concederlo e, incluso, borrar sus datos pero seguir permitiendo que se recopilen. Esto es algo que me ha llamado muchísimo la atención y que me ha parecido de lo más respetuoso con la privacidad que he visto en mucho tiempo. Y por si alguien lo duda... sí, los datos se borran de verdad. Lo he probado yo mismo y no es que, simplemente, desaparezcan de cara al usuario... Se borran por completo.

Personalizar apariencia

Sección de personalización de los banner de consentimiento
Sección de personalización de los banner de consentimiento

En esta sección podremos personalizar la apariencia de la ventana emergente que el usuario verá al visitar el sitio, con el fin de hacer que encaje en el diseño de nuestra web. Como vemos, está en el mismo idioma que especificamos en el locale (tengo que probar si la lista admite más de uno, para que intente coger el del navegador del usuario... Aunque para mi blog, al ser de habla hispana, en realidad basta con uno). Hay 2 ventanas, puesto que la primera será la que solicite el consentimiento y la segunda, en caso de que el usuario lo dé, será la que muestre el enlace al panel con la información de rastreo y modificación de dicho consentimiento. Lo único que no me está convenciendo mucho es que, actualmente, estas ventanas aparecen en todo el medio de la web, en lugar de poder definir si las queremos en una esquina, arriba... Pero bueno, supongo que así también forzamos a que el usuario sea un poco más consciente de aceptar o no la instalación de la cookie... al fin y al cabo una vez acepte o rechace, desde ese navegador no se le volverá a preguntar (hasta que borre las cookies, claro está).

¡Y hasta aquí el tutorial! Como extra os comentaré que yo, actualmente, tengo denegada la cookie del blog en mi navegador, más que nada porque no quiero interferir en los resultados mientras está en pruebas. Y, de momento, mantendré Matomo y Google Analytics funcionando un tiempo, la primera para contrastar los datos y la segunda porque me ayuda con aspectos del blog relacionados con la visualización en diferentes pantallas y tiempos de carga. Pero ésta última acabará desapareciendo y un día los datos que recopile este blog serán, realmente, únicamente para mejorar y no saldrán de mi máquina para absolutamente nada (cosa que ahora no puedo afirmar al 100% porque no sé qué hará Google con su métrica... Y por eso quiero acabar con ella).

Si te ha gustado la entrada, o te ha sido útil y quieres ayudarme a pagar los gastos que conlleva el servidor y mantener así el blog libre completamente de anuncios, puedes hacer una donación en Bitcoin en la siguiente dirección:

Donar