La mascota del oso polar de NordBastion de pie ante un atril de piedra nórdica tallada, con un gran panel holográfico cian flotando encima que muestra gráficos de barras, una línea ascendente y un anillo de donut con un acento ámbar, y un único flujo ininterrumpido de puntos cian brillantes que recorre desde una ventana arqueada iluminada por la aurora, a través del panel, hasta una puerta de bóveda rúnica, con un rack de servidores detrás
Guía práctica · Analítica·18 min de lectura · 40 min prácticos

Instaló un script para vigilar a sus lectores.
Vigila de vuelta, e informa a otro lugar.

La analítica es la última etiqueta de terceros que casi todo el mundo conserva, y es la que lo ve todo: cada página, cada lector, cada hora, en un sistema que usted no posee y no puede auditar. Seis pasos para sustituirla por un contador propio — Umami, Plausible Community Edition, Matomo o nada más que el registro del servidor — funcionando en una máquina nórdica alquilada sin documento de identidad. Sin cookies por defecto, sin aviso de consentimiento que discutir, sin transferencia de sus lectores a un tercer país. Desde $3.90 al mes. Probado en Debian 12.

Los seis pasos
  1. 01

    Elegir

    Cuatro herramientas, una tabla honesta

  2. 02

    Aprovisionar

    Un subdominio, tres puertos

  3. 03

    Desplegar

    Compose, Caddy, primer inicio de sesión

  4. 04

    Instrumentar

    Una etiqueta, y la vía de primera parte

  5. 05

    Cumplir

    Dos leyes, no una

  6. 06

    Mantener

    Conservación, copias de seguridad, el registro olvidado

Antes de empezar · Qué es la etiqueta

No es un contador. Es una línea de reporte.

Contar visitantes es genuinamente útil, y no hay nada siniestro en querer hacerlo. Necesita saber si la reescritura ayudó, qué artículo termina de leer la gente realmente, qué referente envía lectores en lugar de rebotes, y si el despliegue de anoche rompió silenciosamente el proceso de compra en un navegador. Cada una de esas preguntas la responde una tabla de páginas vistas, y cada una de ellas es una razón legítima para medir.

Lo que merece la pena mirar de frente es el arreglo que casi todo el mundo aceptó para obtener esas respuestas. La etiqueta de analítica estándar es un fragmento de código, escrito por una empresa de publicidad, que usted coloca en cada página de su sitio y ordena ejecutar en el navegador de su lector. Lee la dirección de la página, el referente, la pantalla, el idioma, el dispositivo; establece o lee un identificador en el dispositivo; envía todo eso a un sistema que usted no puede inspeccionar, en un país cuyas reglas usted no eligió; y entrega el archivo resultante a una empresa cuyos ingresos provienen de saber qué hace la gente. El propietario del sitio obtiene un panel. El panel es la mitad más pequeña de la transacción.

La factura llega en cuatro plazos, y solo uno de ellos es obvio. Está el aviso de consentimiento, que existe casi enteramente por culpa de esta única etiqueta, que le cuesta una parte medible de visitantes en la puerta, y que luego paga a un segundo proveedor para gestionar. Está la cuestión de la transferencia, porque los datos de sus lectores se van a un tercer país y alguien tiene que acabar escribiendo por qué eso es lícito. Están los datos en sí, que son sus lectores, en una base de datos que no puede consultar salvo a través de los informes que le ofrecen. Y está la dependencia: el producto se retira, se renombra o se reestructura según el calendario de otra persona, y la última vez que eso ocurrió, las mediciones antiguas se fueron con él.

Autoalojarlo elimina los cuatro problemas a la vez, y no es un trabajo grande. El software es maduro, gratuito y aburrido; la máquina cuesta unos pocos dólares al mes; el trabajo es una tarde. Lo que recupera es una tabla que le pertenece, en hardware en una jurisdicción que usted eligió, sin terceros que declarar y — en la mayoría de las configuraciones — sin aviso que discutir. Cuatro maneras de saber cuánta gente lee su sitio, y lo que cuesta cada una:

Propiedad La gran etiqueta de analítica gratuita Un SaaS de analítica centrado en la privacidad El mismo software, su VPS
Quién tiene la tabla de lectoresUna empresa de publicidadUn proveedor, mediante contratoUsted, en disco
Aviso de consentimiento necesarioSí, en la práctica siempreNormalmente noNormalmente no — vea el paso 05
Los datos salen del EEESí, por diseñoDepende del proveedorSolo si elige una máquina fuera de él
Terceros que declararAl menos uno, más sus subencargadosUn encargado del tratamientoNinguno
Bloqueado por listas de filtradoMuchoPor nombre de host, a menudoRaramente, una vez que es de primera parte
Datos en bruto disponibles para ustedNo — solo informesA través de una API, mientras pagaEs su base de datos
Coste mensual a 100k visitasNada, en dineroDecenas de dólares, que suben con el tráfico$3.90–$7.90, fijo
Elíjalo cuandoNecesita la integración con la plataforma publicitaria y acepta el restoQuiere la ética sin ejecutar nadaLos lectores son suyos, y también lo es la tabla

La tercera columna es una respuesta real, no un hombre de paja: un proveedor alojado centrado en la privacidad elimina la mayoría de los mismos problemas para quienes no deberían estar administrando servidores, y pagar a uno es un mejor resultado que mantener la etiqueta publicitaria. Esta guía es para el caso en que ya alquila una máquina, o pensaba hacerlo.

Paso 01 · Elegir

Cuatro herramientas. La base de datos decide la factura.

Estas cuatro no son cuatro variantes de la misma cosa. Se diferencian en dónde almacenan los datos, y esa única elección determina la huella de memoria, el crecimiento del disco, el riesgo de las actualizaciones y la profundidad de los informes. Lea primero la columna de almacenamiento y la columna de funciones después; es el orden en el que la decisión realmente se toma.

Herramienta Pila y almacenamiento Nivel razonable Elíjalo para
UmamiAplicación Node + PostgreSQL o MySQL. Dos contenedores.Sentinel · $3.90La respuesta por defecto. Ligero, legible, sin cookies, multisitio, con licencia MIT.
Plausible Community EditionAplicación Elixir + PostgreSQL + ClickHouse. Cuatro contenedores.Garrison · $7.90Objetivos, embudos y paneles públicos; consultas rápidas a gran volumen.
MatomoAplicación PHP + MariaDB, más una tarea de archivado programada.Garrison · $7.90Paridad de funciones con la herramienta establecida — segmentos, cohortes, comercio electrónico, importación de registros.
GoAccessUn único binario que lee el registro de acceso del servidor web. Sin base de datos.Lo que ya esté ejecutandoNada de JavaScript — sitios estáticos, documentación, APIs.

Umami es la opción a la que recurrir salvo que tenga un motivo para no hacerlo. Es una aplicación Node sobre una única base de datos relacional, se conforma con un gigabyte de memoria, el esquema es un puñado de tablas que puede consultar usted mismo, y los informes cubren lo que la mayoría abre un panel para ver: páginas, referentes, países, dispositivos, además de eventos personalizados cuando los quiera. No utiliza cookies de forma predeterminada, y no le pide que lo configure.

Plausible Community Edition es la versión autoalojable del producto alojado, y la pieza adicional es ClickHouse — un almacén columnar que hace que las consultas agregadas sobre decenas de millones de filas parezcan instantáneas, y que usará toda la memoria que se le permita. Es un intercambio razonable por encima de unos pocos millones de visitas mensuales, y resulta extraño por debajo de esa cifra. Lea los términos de la licencia del proyecto antes de desplegarla: esta edición está pensada para ejecutar su propia analítica, no para revenderla como servicio.

Matomo es la única de las cuatro que sustituye genuinamente a la herramienta establecida función por función, y la honestidad de esa afirmación tiene doble filo: obtiene segmentos, embudos, cohortes, atribución de comercio electrónico, mapas de calor mediante complementos y la posibilidad de importar sus propios registros de servidor, y también obtiene una gran aplicación PHP cuyas tablas en bruto crecen con rapidez y cuyos informes se precalculan mediante una tarea de archivado que debe programar usted mismo. Dos cosas la hacen merecedora de atención en cualquier caso: puede configurarse para no establecer cookies, y sus configuraciones de medición de audiencia han aparecido en listas publicadas por los reguladores como herramientas exentas de consentimiento — consulte la lista vigente y no una entrada de blog, aunque es una ventaja real sobre el papel.

GoAccess es la opción que nadie sugiere y que varias personas deberían adoptar. Lee el registro de acceso que su servidor web ya escribe y lo presenta como un informe de terminal o como una única página HTML autocontenida. Nada se ejecuta en el navegador, nada se almacena en el dispositivo, y no hay ninguna pregunta de consentimiento que responder, porque no hay recopilación más allá de la propia solicitud. Lo que se pierde es todo lo que ocurre dentro de la página, y cualquier esperanza de contar personas en lugar de solicitudes. Para un sitio de documentación o un blog estático, suele ser un intercambio razonable — y combina bien con una de las otras herramientas, en lugar de sustituirla.

La decisión en una línea

Si no puede nombrar la función que necesita de Plausible o Matomo, necesita Umami. Despliéguelo en veinte minutos, ejecútelo durante un mes, y deje que lo que descubra no poder responder le diga si debe cambiar. Migrar más adelante le cuesta el historial y nada más, y el historial que estaría perdiendo es el de un mes.

Paso 02 · Aprovisionar

Una máquina, un nombre. Fije primero el nombre.

Pida el VPS y elija el bastión según dónde estén sus lectores y dónde quiera que residan los datos — Stockholm, Helsinki, Oslo o Reykjavík están todos dentro del EEE, que es precisamente el objetivo. Luego ejecute la pasada de refuerzo de la primera hora antes de que nada más toque la máquina: SSH solo con clave, un puerto cambiado, un cortafuegos con denegación por defecto, actualizaciones desatendidas. Son los mismos cuarenta minutos para cada guía de esta serie, y no es opcional en una máquina que va a contener un año de lectores de alguien.

Luego decida el nombre de host, porque queda incrustado en el fragmento de seguimiento de cada página de cada sitio que mide, y cambiarlo más adelante significa editarlos todos mientras el nombre antiguo sigue recibiendo solicitudes. Hay dos formas que funcionan. Un subdominio dedicado del sitio que está midiendo — el proxy inverso de la máquina de analítica responde por él, y es lo más sencillo que funciona. O un nombre neutro en un dominio propio, si una sola instancia va a dar servicio a varios sitios no relacionados y prefiere que el código fuente de cada sitio no delate a los demás. Cree el registro y déjelo resolver antes de continuar: el proxy le pide un certificado a una autoridad de certificación en el primer arranque, y la autoridad comprueba el nombre desde fuera.

dig +short stats.example.com          # must return the VPS address before you deploy
ufw default deny incoming
ufw allow 47222/tcp                  # administrative SSH, moved off 22
ufw allow 80/tcp                     # ACME challenge and the redirect to 443
ufw allow 443/tcp                    # the dashboard and the collection endpoint
ufw enable && ufw status numbered

Tres puertos, y nada más. La base de datos no debe publicarse: vive en la red interna de Docker, accesible para el contenedor de la aplicación y para nadie más en internet. Esta es la forma más común, con diferencia, en que una máquina de analítica autoalojada acaba en el resultado de un escaneo — un puerto de PostgreSQL o MySQL vinculado a la dirección pública porque un archivo de Compose de un tutorial tenía un mapeo de puertos que estaba ahí para el desarrollo local.

En cuanto al tamaño, resista la tentación de comprar de más. Un Sentinel — 2 vCPU, 4 GB, 120 GB NVMe, $3.90 al mes — ejecuta Umami junto con Postgres con margen de sobra, y guardará años de eventos para un sitio con seis cifras de visitas mensuales. Suba a un Garrison — 4 vCPU, 8 GB, 240 GB — si eligió Plausible, porque ClickHouse está más a gusto ahí, o Matomo, porque la tarea de archivado necesita los núcleos. El ancho de banda es ilimitado en todos los niveles, y el tráfico de analítica es un error de redondeo frente a eso: cada solicitud pesa unos pocos cientos de bytes.

Paso 03 · Desplegar

Dos contenedores y un proxy. Luego cierre la puerta.

El despliegue de referencia a continuación es Umami, porque es el que la mayoría de los lectores debería ejecutar y porque la forma se generaliza: un contenedor de aplicación, un contenedor de base de datos al que puede llegar y al que nadie más puede, y un proxy inverso que guarda el certificado. Plausible y Matomo difieren en el número de contenedores y en los nombres de las variables, no en la estructura — tome sus archivos de Compose oficiales y aplique las mismas tres reglas.

Las tres reglas, en orden de cuánto le costará ignorarlas. Fije cada imagen a una etiqueta exacta, nunca a una flotante: una pila de analítica que descarga en silencio una nueva versión mayor durante un reinicio no relacionado es una migración de esquema que usted no programó. Genere el secreto de la aplicación con una fuente aleatoria real y consérvelo — cifra el material de sesión, y cambiarlo más adelante, en el mejor de los casos, desconecta a todo el mundo. No publique ningún puerto de base de datos: los dos contenedores comparten una red, y eso es todo el control de acceso que necesitan.

mkdir -p /srv/analytics && cd /srv/analytics
openssl rand -base64 32 > .app_secret      # keep this file; back it up with the database
openssl rand -base64 24 > .db_password
chmod 600 .app_secret .db_password

El archivo de Compose. Dos servicios, una red privada, un volumen con nombre para la base de datos, y ni un solo puerto publicado — el proxy es lo único que habla con el exterior:

services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-v2.x.y   # an exact tag, never :latest
    environment:
      DATABASE_URL: postgresql://umami:CHANGE_ME@db:5432/umami
      APP_SECRET:   CHANGE_ME                                # the openssl output above
    depends_on: [db]
    restart: unless-stopped
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB:       umami
      POSTGRES_USER:     umami
      POSTGRES_PASSWORD: CHANGE_ME
    volumes:
      - umami-db:/var/lib/postgresql/data
    restart: unless-stopped
volumes:
  umami-db:

Caddy es el camino más corto hacia una configuración TLS correcta aquí: dos líneas de configuración, un certificado obtenido y renovado sin necesidad de una tarea cron, y valores predeterminados modernos que no tiene que investigar. Si ya ejecuta nginx en la máquina, mantenga nginx — el requisito es un proxy por delante, no este proxy en particular. En cualquier caso, la aplicación de analítica nunca debe ser lo que escucha directamente en el 443.

# Caddyfile — Caddy runs as a third service in the same Compose project, so
# "umami" resolves on the internal network. It is the only service that
# publishes ports (80 and 443).
stats.example.com {
    encode zstd gzip
    reverse_proxy umami:3000
}

Póngalo en marcha, y luego haga la única cosa que es realmente urgente. docker compose up -d, espere a las migraciones, y abra el panel. Todas estas herramientas incluyen o bien una cuenta de administrador predeterminada y documentada, o bien una pantalla de primer registro abierta, y el nombre de host se hizo público en el instante en que se emitió el certificado, porque los registros de transparencia de certificados son públicos y se rastrean continuamente. Cambie la contraseña predeterminada y cierre el registro a los pocos minutos de la primera carga exitosa, no mañana.

docker compose up -d
docker compose logs -f umami          # wait for the schema migration to finish
docker compose ps                     # both services healthy, no published ports listed
ss -tlnp | grep -E ':(5432|3306)'     # must print nothing at all
Los cinco minutos que deciden quién es el propietario de la instancia

Umami incluye una cuenta de administrador documentada cuya contraseña es la misma en todas las instalaciones del planeta. El primer visitante de Plausible se convierte en el propietario, salvo que el registro esté desactivado en el entorno. Matomo guía al primer visitante a través de un instalador que crea el superusuario. En los tres casos, la ventana entre "el certificado existe" y "usted inició sesión" es una ventana en la que otra persona puede iniciar sesión en su lugar — y no necesita adivinar el nombre de host, porque se lo publican. Inicie sesión primero, cambie la credencial, y luego ponga el interruptor de registro en cerrado, y recargue la página para confirmar que se aplicó.

Paso 04 · Instrumentar

Una etiqueta. Luego decida en qué dominio vive.

Registre el sitio en el panel, copie el identificador que le entrega, y coloque una etiqueta de script diferido en la plantilla — en el head o al final del body, no importa mucho, pero diferido en cualquier caso, para que nunca pueda retrasar la página. Esta es toda la integración. No hay gestor de etiquetas, ni contenedor, ni capa de datos ni cableado de modo de consentimiento, y esa ausencia es la mayor parte de lo que vino buscando.

<script defer src="https://stats.example.com/script.js"
        data-website-id="00000000-0000-0000-0000-000000000000"></script>

Cargue una página del sitio, y luego mire el panel: la solicitud debería aparecer en segundos. Si no aparece, la consola del navegador y la pestaña de red lo resuelven en menos de un minuto — los dos modos de fallo son un identificador mal escrito, que produce una solicitud que se acepta y se descarta, y una solicitud que nunca llega a salir, lo que significa que una extensión se la comió. Excluya su propio tráfico antes de empezar a leer las cifras, o sus propias recargas serán su principal referente durante una semana.

Ahora la decisión que merece la pena pensar. El fragmento anterior hace una solicitud a un nombre de host que no es el del propio sitio, y una parte de sus visitantes ejecuta software que bloquea ese tipo de solicitudes por patrón. Las listas detectan los nombres de archivo conocidos — cualquier cosa que termine en el propio nombre de script del proveedor — y los dominios alojados conocidos, sin importar a qué servidor apunten. La solución tiene dos partes: renombrar el archivo del script y el endpoint de recogida a algo que no sea un nombre de rastreador, algo que todas estas herramientas admiten, y servirlos desde el propio origen del sitio a través de una ruta que su proxy actual reenvíe. Entonces ya no queda ninguna solicitud de terceros que bloquear.

# On the site's own web server — the two paths the tracker needs, first-party:
example.com {
    handle /p/s.js      { reverse_proxy https://stats.example.com { header_up Host stats.example.com } }
    handle /p/collect   { reverse_proxy https://stats.example.com { header_up Host stats.example.com } }
    # ... the rest of the site
}

Dos detalles marcan la diferencia entre que esto funcione del todo o solo a medias. El proxy debe reenviar la dirección del visitante en una cabecera que la aplicación de analítica esté configurada para confiar, o cada solicitud se atribuirá a su propio servidor web y el informe de países será una sola barra. Y hay que decirle al rastreador adónde enviar sus datos, lo cual es un atributo de datos en la etiqueta de script en las tres herramientas — renombrar el archivo sin redirigir el endpoint le da un script que carga y no informa a ningún sitio.

Ese es también el final honesto de la historia de la medición. Un visitante con JavaScript desactivado, o con una lista estricta más una regla cosmética de primera parte, no será contado, y no debería gastarse nada de ingeniería en perseguirlo — un filtro a nivel de red es una preferencia declarada, y la respuesta educada es el registro del servidor, que los cuenta sin recopilar nada adicional. Los eventos y las aplicaciones de página única son la otra mitad de la instrumentación: cada herramienta expone una pequeña función para eventos personalizados, y cada una de ellas necesita una llamada explícita en cada cambio de ruta, porque un framework que cambia la vista sin una navegación no produce ninguna carga de página que el script pueda advertir.

Paso 05 · Cumplir

Dos leyes, no una. La mayor parte de internet las confunde.

La razón por la que la gente no logra ponerse de acuerdo sobre si la analítica necesita un aviso es que están discutiendo sobre dos normas distintas como si fueran una sola. Sepárelas y la respuesta se vuelve manejable. El artículo 5(3) de la Directiva ePrivacy — transpuesto al derecho nacional en todos los Estados miembros, y la fuente real del aviso de cookies — establece que almacenar información en el equipo terminal de un abonado, o acceder a información ya almacenada en él, requiere su consentimiento, salvo que sea estrictamente necesario para prestar un servicio que haya solicitado explícitamente. Observe lo que no dice: no dice cookie, y no dice dato personal. Alcanza a localStorage, alcanza al fingerprinting de dispositivos, y se aplica incluso a un valor que no identifica a nadie.

El RGPD es la segunda norma y regula una cuestión distinta: qué puede hacer con los datos personales una vez que los tiene. Se aplica a su analítica tanto si almacena algo en el dispositivo como si no, porque una solicitud web entrega una dirección IP, y el Tribunal de Justicia resolvió en el asunto Breyer (C-582/14) que una dirección IP puede ser un dato personal en manos de un operador de sitio web. Así que las dos normas se combinan: 5(3) pregunta ¿escribió usted en el dispositivo?, el RGPD pregunta ¿qué hizo con lo que llegó?

Un servidor de analítica sin cookies está construido para responder a ambas de forma estricta. No almacena nada en el dispositivo — ninguna cookie, ninguna entrada de localStorage, ningún identificador de ningún tipo — lo que deja fuera de juego al 5(3), porque no hay almacenamiento ni acceso a almacenamiento. Y toma la dirección IP que necesariamente recibe, la combina con el user agent, el sitio y una sal secreta que rota cada día, aplica un hash al resultado, conserva el hash y descarta la dirección. Ese hash permite que la herramienta distinga entre dos visitantes dentro de un mismo día, y deja de ser útil en el momento en que la sal rota, que es precisamente la razón por la que la misma persona al día siguiente cuenta como un visitante nuevo. El tratamiento es real, y es tan mínimo como puede llegar a ser un tratamiento.

Lo que queda es una base jurídica para esa operación acotada, y en la práctica los operadores se apoyan en el interés legítimo conforme al artículo 6(1)(f), documentado con una evaluación de ponderación que es breve porque los hechos son sencillos: sin perfilado, sin compartición, sin seguimiento entre sitios, un seudónimo que muere cada día, un periodo de conservación definido. Varias autoridades de control han ido más allá y han publicado criterios según los cuales la medición de audiencia estrictamente limitada queda exenta de consentimiento por completo — los criterios varían según el país, se actualizan, y el que importa es el de la suya. Esto no es asesoramiento legal. Es el mapa de qué instrumentos se aplican, para que el asesoramiento que reciba pueda tratar sobre su situación en lugar de sobre la forma general del problema.

La pregunta Etiqueta de analítica ad-tech Sin cookies, autoalojado en el EEE
¿Escribe en el dispositivo del visitante?Sí — así que se aplica el consentimiento del artículo 5(3)No — no se activa el 5(3)
¿Se conserva un identificador duradero?De meses a años, entre sitiosUn hash con sal que caduca cada día
¿Transferencia a un tercer país que documentar?Sí, con un mecanismo de transferencia que mantenerNinguno — la máquina está en el EEE
Encargados del tratamiento que nombrar y contratarEl proveedor y sus subencargadosSu proveedor de hosting, por el hardware, y nadie más
Quién puede responder a una solicitud de acceso de un interesadoUsted, mediante cualquier exportación que existaUsted, con SQL — y a menudo no hay nada que devolver

Hay una línea más que pertenece al expediente, porque es el argumento silencioso para hacer todo esto. La legalidad de enviar datos de visitantes europeos a un servicio de analítica estadounidense se ha litigado durante una década: el Tribunal de Justicia anuló el marco de transferencia anterior en el asunto Schrems II (C-311/18) en 2020, varias autoridades de control nacionales fallaron contra la etiqueta de analítica estándar sobre esa base en 2022 — Austria en enero, Francia en febrero, Italia en junio, y otras después — y una nueva decisión de adecuación, el Marco de Privacidad de Datos UE-EE. UU., restableció una vía de transferencia en julio de 2023 y está ella misma bajo impugnación. No tiene por qué tener una opinión sobre cómo termine eso. Una máquina en Helsinki elimina la cuestión de su expediente de forma permanente, y eso vale más que tener razón sobre el estado actual del asunto.

Paso 06 · Conservar

Conservación, copias de seguridad, actualizaciones. Y el registro que olvidó.

Configure el periodo de conservación el primer día, mientras todavía es un número abstracto y no un año de datos a los que está apegado. Todas estas herramientas pueden borrar los eventos en bruto según un calendario y conservar los resúmenes agregados; doce meses de detalle es generoso para casi cualquier propósito, y significa que la respuesta honesta a "¿cuánto tiempo lo conserva?" es un número y no "indefinidamente". También resuelve el problema de disco antes de que empiece, lo cual importa sobre todo para Matomo, cuyas tablas en bruto son las que crecen.

Haga una copia de seguridad de la base de datos en un lugar que no sea esta máquina y cífrela a la salida — la guía de copias de seguridad ofrece el tratamiento completo, y la versión breve es un volcado nocturno canalizado hacia un repositorio de solo apéndice en una segunda máquina, idealmente en una segunda jurisdicción. Respalde el secreto de la aplicación junto con ella: una base de datos que puede restaurar y un secreto que no puede son un panel en el que nadie puede iniciar sesión. Luego restáurela una vez en un VPS de pruebas, a propósito, antes de que lo necesite.

docker compose exec -T db pg_dump -U umami umami | zstd -q -o /srv/backup/umami-$(date -u +%F).sql.zst
restic -r sftp:backup@bastion-2:/srv/repo backup /srv/backup /srv/analytics/.app_secret
restic -r sftp:backup@bastion-2:/srv/repo forget --keep-daily 7 --keep-weekly 8 --prune

Las actualizaciones merecen algo más de cuidado que un simple cambio de contenedor, porque estas aplicaciones son dueñas de un esquema. Lea las notas de la versión para cada versión mayor que se salte, haga la copia de seguridad antes y no después, luego cambie la etiqueta fijada y levante la pila mientras observa los registros — una migración que falla a mitad de camino es recuperable a partir del volcado de la noche anterior, y muy desagradable sin él. No hay ninguna razón para estar en la versión más nueva la semana en que aparece, y sí una buena razón para no estarlo.

El registro que deshace todo el ejercicio

Acaba de desplegar una pila que deliberadamente nunca almacena una dirección IP. A dos metros de distancia, su proxy inverso está escribiendo la dirección IP completa de cada visitante en un registro de acceso, en texto claro, y conservándola durante el tiempo que indique la rotación predeterminada — tanto en la máquina de analítica como en el servidor web que va delante de su sitio real. Ese registro es un conjunto de datos más grande y más sensible que la base de datos de analítica, es una operación de tratamiento de la que tiene que responder, y casi nadie se acuerda de ella. Decida para qué sirve: si es solo para depuración, truncar o enmascarar el último octeto en el formato del registro y rotarlo agresivamente; si lo quiere para una medición basada en el registro, dígalo en la política y dele un periodo de conservación real. Lo que no debe hacer es dejarlo en el valor predeterminado y describir su sitio como uno que no recopila direcciones IP.

Por último, los límites sobre los que conviene ser honesto, porque un contador autoalojado no es una versión estrictamente mejor de lo que sustituye. Pierde la identidad entre dispositivos y entre días, así que visitante que regresa significa algo más limitado de lo que significaba antes. Pierde la integración con la plataforma publicitaria, lo cual importa si compra tráfico y es irrelevante si no lo hace — los datos de Search Console son un producto distinto y no se ven afectados. Asume una actualización y una copia de seguridad, lo cual es un coste recurrente real medido en tardes de trabajo. Y la máquina en sí misma se convierte en algo que merece protección: contiene a sus lectores, está en la internet pública, y la lista de refuerzo junto con una ruta privada al panel son las dos cosas que la mantienen aburrida.

Notas de campo · Seis trampas

Seis formas en que esto sale mal. Dos de ellas son silenciosas.

Trampa 01 · Fatal

La contraseña predeterminada que todo el mundo conoce

Una de estas herramientas incluye la misma credencial de administrador en todas las instalaciones del planeta; las demás entregan la propiedad a quien se registre primero. El nombre de host se publica en los registros de transparencia de certificados en el momento en que TLS funciona. Inicie sesión, cámbiela, cierre el registro — en los primeros cinco minutos, no mañana.

Trampa 02 · Fatal

El puerto de la base de datos del tutorial

Los archivos de Compose escritos para un portátil publican el 5432 o el 3306 para que el autor pudiera conectarse desde una GUI. Copie uno en una máquina pública y la tabla de lectores queda a un intento de contraseña de distancia. El contenedor de la aplicación llega a la base de datos a través de la red interna; no es necesario publicar nada salvo el proxy.

Trampa 03 · Legal

Suponer que autoalojado equivale a exento

Trasladar el software a su propia máquina responde a la cuestión de la transferencia y a la cuestión del encargado del tratamiento. No responde al artículo 5(3) si luego activa una función que escribe en el dispositivo, y no redacta su política de privacidad por usted. La exención es una propiedad de la configuración, no del alojamiento.

Trampa 04 · Silenciosa

Todos los visitantes llegan desde el mismo país

Un proxy inverso que no reenvía la dirección del cliente hace que cada solicitud parezca proceder del propio proxy. El panel se llena, los totales parecen correctos, y las columnas de geografía y unicidad son, silenciosamente, ficción. Compruebe el desglose por país el primer día, no en la revisión trimestral.

Trampa 05 · Silenciosa

El registro de acceso que sigue conservando

La pila se eligió porque nunca almacena una dirección IP. El proxy que va delante sí almacena todas ellas en texto claro por defecto, y también lo hace el servidor web que va delante de su sitio real. Enmascárelas o rótelas deliberadamente, y descríbalo en la política — o deje de afirmar que no las recopila.

Trampa 06 · Evitable

Perseguir las cifras antiguas

Los totales nuevos no coincidirán con los antiguos, y ninguna configuración hará que coincidan. Reglas de conteo distintas, una proporción de bloqueo distinta, y ningún aviso filtrando la muestra. Dedique las dos semanas a conocer su propia proporción, y luego trate la cifra nueva como la referencia y deje de reconciliar dos definiciones.

Preguntas frecuentes · Analítica autoalojada

Preguntas, respondidas.

Once preguntas que surgen al hacer esto — empezando por la que todo el mundo entiende mal, en ambas direcciones.

¿Puedo realmente eliminar el aviso de cookies si autoalojo la herramienta?

A menudo sí, y la razón es más precisa que "si es autoalojado, no hay problema". Entran en juego dos normas independientes. El artículo 5(3) de la Directiva ePrivacy — la que todo el mundo llama la ley de cookies — exige consentimiento para almacenar información en el dispositivo de un visitante, o leer información de él, salvo que sea estrictamente necesario para un servicio que este haya solicitado. Se aplica a las cookies, pero también a localStorage, a sessionStorage y a cualquier otra cosa que se quede almacenada, y se aplica tanto si los datos son personales como si no. Una herramienta que no escribe nada en el dispositivo, sencillamente, no lo activa. El RGPD es la segunda norma y no desaparece: usted sigue recibiendo una dirección IP y una cadena de user agent en cada solicitud, y una dirección IP es un dato personal en manos de un operador de sitio web (Tribunal de Justicia, asunto Breyer, C-582/14). Lo que hace un servidor de analítica sin cookies es aplicar un hash a esa IP con una sal que rota cada día y luego descartarla, de modo que lo que llega a la base de datos es un seudónimo por día y por sitio, no una persona. Esa es una operación de tratamiento acotada y bien documentada, en la que la mayoría de los operadores se apoyan en el interés legítimo, y varias autoridades de control han publicado criterios según los cuales la medición pura de audiencia está exenta de consentimiento. Es una posición defendible, no una palabra mágica: anote qué recoge, por qué, y durante cuánto tiempo, y lea las directrices de su propia autoridad de control en lugar de la página de aterrizaje de un proveedor. Nada en esta página constituye asesoramiento legal.

¿Cuál debería elegir si no quiero pensar en ello?

Umami. Es una única aplicación Node y una base de datos PostgreSQL, se siente cómoda dentro de 1 GB de memoria, el panel es legible desde la primera visita, es sin cookies de fábrica, y una sola instancia da servicio sin esfuerzo a todos los sitios que posee. Para la inmensa mayoría de las personas que sustituyen Google Analytics en un blog, un sitio de documentación, una tienda o el sitio de una empresa, es la respuesta correcta, y las otras tres son una discusión que no necesitaba tener. Elija Plausible Community Edition en su lugar si quiere embudos, objetivos de ingresos y una propuesta de panel público más sólida, y está dispuesto a ejecutar ClickHouse para ello. Elija Matomo si realmente necesita el conjunto de funciones de Google Analytics — segmentos, cohortes, informes personalizados, atribución de comercio electrónico, importación de registros en bruto — y acepta que va a ejecutar una gran aplicación PHP con una tarea de archivado programada. Elija GoAccess si no quiere absolutamente nada de JavaScript en la página.

¿Por qué las cifras no coinciden con las de Google Analytics?

Porque están contando cosas distintas, y la diferencia va en ambas direcciones a la vez. Hacia arriba: Google Analytics detrás de un aviso de consentimiento solo ve a los visitantes que pulsaron aceptar, lo que en Europa suele ser la mitad de ellos, mientras que un contador sin cookies y sin aviso los ve a todos. Hacia arriba otra vez: su nuevo endpoint está en su propio dominio y no figura en las listas de filtrado que descartan las solicitudes a rastreadores conocidos. Hacia abajo: un hash que rota diariamente no puede reconocer a la misma persona al día siguiente, así que un lector que visita el sitio el lunes y el jueves cuenta como dos visitantes, no como un visitante que regresa — las sesiones se enlazan dentro de un mismo día y nunca entre días o dispositivos. Hacia abajo otra vez: la mayoría de las herramientas autoalojadas incluyen un filtro de bots conservador y ninguna inflación al estilo Discover. El consejo práctico es dejar de reconciliar. Ejecute ambas durante dos semanas para conocer su propia proporción, anótela, y luego elimine la etiqueta de Google y use las cifras nuevas como la referencia que ahora son. Lo que importa para tomar decisiones es la forma de la tendencia y el orden relativo de páginas y fuentes, y ambos sobreviven intactos al cambio.

¿Los bloqueadores de anuncios también bloquearán mi propia instancia?

En parte, y merece la pena saber exactamente cómo, porque el mecanismo es más rudimentario de lo que se supone. Las grandes listas de filtrado funcionan por patrones: los nombres de host de los servicios alojados, y un conjunto de nombres de archivo y de ruta conocidos — una solicitud de algo que termine en plausible.js, umami.js o matomo.php es reconocible sin importar a qué servidor vaya. Traslade el software a stats.example.com con los nombres de archivo de fábrica y seguirá perdiendo una parte del público técnico. Hay dos soluciones honestas y se combinan. Renombrar el script y el endpoint de recogida a algo que no sea un nombre de rastreador — todas estas herramientas se lo permiten, y cuesta una línea de configuración. Servirlos desde el mismo origen que el propio sitio, a través de una ruta en su dominio principal que el proxy inverso reenvíe, de modo que no quede ninguna solicitud de terceros que bloquear. Entre las dos recupera la mayor parte de la pérdida. No recuperará toda, y no debería querer hacerlo: un visitante que ejecuta una lista estricta más JavaScript desactivado ha tomado una decisión, y la respuesta correcta a eso es el registro del servidor, no una escalada.

¿Es un patrón oscuro redirigir el script a través de mi propio dominio?

Merece la pregunta, y la respuesta depende de qué estaba protegiendo el bloqueador. Una lista de filtrado tiene una sola herramienta contundente y dos objetivos muy distintos: la red de ad-tech que sigue a una persona a través de diez mil sitios y construye un perfil, y el contador que le dice a un único propietario de sitio que su página de documentación se leyó cuatrocientas veces ayer. Bloquear el primero es una persona defendiéndose de la vigilancia. Bloquear el segundo es un daño colateral de una regla que no puede distinguirlos. Servir su propio contador desde su propio dominio no es introducir de contrabando un rastreador más allá de una defensa; es eliminar una solicitud de terceros que nunca debería haber existido, y la misma visita genera igualmente una línea en su registro de acceso. Donde deja de ser defendible es en el momento en que lo que está redirigiendo no es lo descrito aquí — si añade identificadores entre sitios, fingerprinting, o un canal hacia una plataforma publicitaria, el bloqueador tenía razón y el proxy es una mentira. La prueba es sencilla y merece la pena aplicársela una vez a uno mismo: ¿podría publicar una página que describa exactamente lo que recoge este endpoint, y se limitaría un lector a encogerse de hombros? Si la respuesta es sí, rediríjalo. Si no, el problema no es el proxy.

¿Qué tamaño necesita realmente el VPS?

Más pequeño de lo que se temía, con una excepción. Umami es un proceso Node y una base de datos Postgres: se estabiliza por debajo de 1 GB de memoria para un sitio normal, y la base de datos crece aproximadamente el tamaño de una línea de texto por página vista, así que un Sentinel — 2 vCPU, 4 GB, 120 GB NVMe, $3.90 al mes — tiene margen para años. GoAccess es un error de redondeo. Matomo se sitúa en el medio: PHP y MariaDB son poco exigentes hasta que se ejecuta la tarea de archivado, que es el pico de CPU para el que hay que dimensionar, y sus tablas en bruto crecen más rápido que las demás porque guarda más por solicitud. La excepción es Plausible Community Edition, y la razón es ClickHouse, no Plausible: un almacén columnar está diseñado para cambiar memoria por velocidad de consulta, y se apropiará de todo lo que deje a su alcance. Funciona con 4 GB si limita sus cachés en la configuración de fábrica, y va cómodo con 8 GB — por lo que el nivel Garrison a $7.90 es el mínimo razonable para ese caso. En todos los casos, el número que finalmente obliga a una mejora es el disco, no la memoria, y el paso 06 es cómo lo evita.

¿Puede una sola instancia medir varios sitios distintos?

Sí, y es la forma normal de ejecutar estas herramientas. Las tres herramientas de JavaScript son multisitio por diseño: registra cada dominio en el panel, cada uno recibe su propio identificador, y el mismo endpoint de script acepta solicitudes para todos ellos mientras mantiene los informes separados. Una máquina, un certificado, una copia de seguridad, una actualización — veinte sitios. Dos cosas que tener en cuenta a medida que la lista crece. Los informes están separados por sitio, así que si administra sitios para clientes, use los permisos propios de usuario y equipo de la herramienta en lugar de entregarle a todo el mundo la cuenta de administrador, y compruebe qué implica una instancia compartida antes de aceptarlo en un contrato: usted se convierte en la parte que retiene los datos de los visitantes de sus clientes. Y el endpoint de seguimiento es un nombre compartido, lo que significa que el dominio que lo sirve aparece en el código fuente de cada sitio de la lista — un hecho que merece la pena mencionar a un cliente cuyos competidores leen el código fuente de la página, y un argumento a favor de la vía de primera parte del paso 04.

¿Realmente necesito JavaScript? ¿Qué hay de analizar el registro del servidor?

Para una amplia categoría de sitios, el registro basta, y es la medición más honesta disponible: no recopila nada adicional, porque las líneas ya existen. GoAccess lee un registro de acceso del servidor web y produce un informe de terminal o un panel HTML autocontenido — páginas principales, referentes, códigos de estado, ancho de banda, tiempos de respuesta, user agents — para un sitio estático, un conjunto de documentación o una API, eso es la mayor parte de lo que una etiqueta de script le iba a contar. Dos límites decidirán si le basta. Un registro no puede ver lo que ocurre dentro de la página: nada de profundidad de scroll, nada de clics en enlaces salientes, nada de eventos de botón, ningún cambio de ruta en una aplicación de página única, porque nada de eso llega al servidor. Y un registro cuenta solicitudes, no personas, así que queda a merced del caché y de una población de bots que ahora es mayoría del tráfico en bruto — filtrar es una tarea de mantenimiento permanente y no un paso de configuración. También hay una trampa de privacidad en la dirección opuesta a la que espera, y el paso 06 la cubre: el registro que está analizando contiene direcciones IP completas, que son más datos personales que los que conservaba la herramienta de JavaScript que rechazó.

¿Puedo importar mi historial de Google Analytics?

En la práctica, no, y planificar contando con eso es mejor que luchar contra ello. Matomo es la única de las cuatro con una historia de importación mínimamente seria, e incluso ahí las vías prácticas son importar sus propios registros de servidor web y usar las herramientas de migración pensadas para instancias antiguas de Matomo, en lugar de una transferencia limpia de los informes ya procesados por Google. Umami y Plausible Community Edition pueden aceptar una carga masiva a través de sus API si está dispuesto a escribir el mapeo, pero estaría inventando sesiones y visitantes a partir de exportaciones agregadas, y el resultado es un gráfico que parece continuo y no es comparable a través de esa unión. Lo que realmente funciona: exporte de Google los informes que le importan antes de que la propiedad desaparezca — los totales mensuales, las páginas principales, las fuentes principales, los recuentos de conversión — como CSV, guárdelos en el mismo lugar que sus otros registros, y arranque la nueva herramienta con una base limpia en una fecha que anote. Consultará la exportación antigua dos veces durante el primer año y nunca más, y cada cifra en ella se midió de todos modos bajo una definición distinta.

¿Qué tengo que escribir realmente en la política de privacidad?

Menos de lo que cree, y la brevedad es precisamente el objetivo — un párrafo que pueda defender vale más que una página que copió. Diga qué es la herramienta y que la ejecuta usted mismo; indique la ubicación del servidor y el operador legal, ya que poder decir "en una máquina que alquilamos en Finlandia" es todo el beneficio de hacer esto. Diga qué se registra por visita: la página, el referente, el país, el dispositivo y la familia de navegador, y un identificador seudónimo derivado de la dirección IP y el user agent con una sal que cambia cada día, del cual no puede recuperarse la IP original. Diga qué no se registra: sin cookies, sin identificador entre sitios, sin perfil, sin datos vendidos ni compartidos. Indique la base jurídica en la que se apoya y el periodo de conservación, y asegúrese de que el número que escribe es el número con el que está configurada la herramienta. Si su proxy inverso conserva registros de acceso, eso es una operación de tratamiento distinta con su propio periodo de conservación — menciónelo, porque es lo que la gente suele olvidar. Luego mantenga el párrafo sincronizado con la configuración: una política que describe la instalación que tenía hace dos años es peor que una vaga.

¿Por qué importa el proveedor de alojamiento para una máquina que solo contiene páginas vistas?

Porque "solo páginas vistas" queda corto para describir lo que es una base de datos de analítica. Agregada durante un año, es el conjunto de lectores de su sitio: qué páginas, en qué orden, desde qué países, a qué horas, llegando desde qué enlaces — y para un editor pequeño o una tienda de nicho, eso es un plan de negocio y una lista de fuentes en una sola tabla. Es también, desde el punto de vista jurisdiccional, exactamente el tipo de datos que un adversario le pide a un proveedor en lugar de pedírselo a usted. De ahí se derivan dos propiedades. Dónde se encuentra la máquina decide qué proceso legal puede alcanzarla: una máquina en Stockholm, Helsinki, Oslo o Reykjavík se encuentra dentro del EEE, lo que elimina por completo la cuestión de la transferencia internacional de su expediente de cumplimiento, y dentro de cuatro regímenes constitucionales con fuertes tradiciones de libertad de prensa. Y de quién es el nombre en la cuenta decide qué revela la propia cuenta: en NordBastion no hay documento de identidad, ni nombre legal ni tarjeta, la factura se liquida en Monero o Bitcoin, y la máquina que alberga a sus lectores no es una fila en una base de datos de clientes en algún lugar con su pasaporte adjunto. La guía de jurisdicciones cubre en detalle el suelo legal de cada una de las cuatro.

Obtener la máquina

Sus lectores, en una máquina en el EEE que no está registrada a su nombre.

Sentinel — 2 vCPU, 4 GB y 120 GB de NVMe por $3.90 al mes, en Helsinki, Stockholm, Oslo o Reykjavík — ejecuta Umami y su base de datos con margen para años de eventos. Suba a Garrison por $7.90 si eligió Plausible o Matomo. Sin correo electrónico en el registro, sin documento de identidad, sin tarjeta, y sin terceros que guarden la lista de todos los que alguna vez han leído su sitio.

Última revisión · 2026-10-12 · Fuentes · Documentación de Umami, Plausible Community Edition, Matomo y GoAccess; Directiva ePrivacy 2002/58/EC, artículo 5(3); Reglamento (UE) 2016/679; sentencias del Tribunal de Justicia en los asuntos Breyer (C-582/14) y Schrems II (C-311/18); decisión de adecuación del Marco de Privacidad de Datos UE-EE. UU. de julio de 2023 · Cadencia · anual

Alojamiento privado, construido en el Norte.