Desarrollo13 de junio de 2026

Cómo autoalojar Plausible Analytics en Kubernetes

¿Alguna vez has pensado que Google Analytics se ha convertido en el cuadro de mandos de una nave alienígena que ningún simple mortal es capaz de manejar? ¿Y que ni tú ni tu cliente necesitáis seguramente todas esas funciones que vienen de la mano de un script de JS de 50 KB? Pues a mí me pasó, y por eso hace unos días me di una vuelta por el mercado de servicios de analítica web para ver qué otras opciones tenía.

Mis criterios eran:

  • monitorización sencilla del tráfico (quién, desde dónde, con qué agente/dispositivo)
  • precio bajo
  • ligereza
  • a ser posible, open source
  • cumplimiento del RGPD y la CCPA

Si hubieras seguido mi mismo camino, habrías descubierto que hay un montón: Clicky, HubSpot, Mixpanel, Gauges, StatCounter y un largo etcétera. Al revisar esa lista, bastante extensa, me di cuenta de que a la mayoría le fallaba al menos uno de mis requisitos, ya fuera por precio, por la complejidad del servicio y un script pesado, o por una UI/UX sosa y anticuada. A la mayoría, pero no a Plausible Analytics.

Así que la decisión estaba tomada.

Plausible Analytics

Interfaz web de Plausible Analytics
Interfaz web de Plausible Analytics

Plausible Analytics es un servicio de analítica web que ofrece métricas sencillas, un script diminuto, una interfaz agradable, transparencia y mucha flexibilidad gracias a que el producto es open source. Tiene argumentos de peso que me convencieron casi al instante: no usa cookies (lo que lo hace totalmente compatible con las distintas leyes de cookies y normativas de privacidad), tiene sede en la UE y funciona con energía renovable y, sobre todo, te permite prescindir de la nube y autoalojarlo sin pagar literalmente nada (aunque te recomiendo, como mínimo, hacerte patrocinador en GitHub) si, como yo, ya tienes alguna infraestructura montada.

Un enfoque ingenuo

Así que me decanté por autoalojarlo, con la idea de meter una instancia de Plausible en el clúster de k8s gestionado con Rancher. Sin embargo, aunque la sección de la documentación explica cómo ponerlo todo en marcha en un servidor con Docker, no dice nada del caso de k8s.

Lo primero que hice fue seguir el enfoque ingenuo, con un único deployment basado en la imagen sugerida plausible/analytics:latest:

  • creé un nuevo namespace plausible
  • rellené la configuración con las variables de entorno necesarias de plausible-conf.env
  • configuré almacenamiento persistente con bind-mount en el directorio creado previamente /data/user/plausible

No hubo suerte. La instancia no conseguía conectarse a las bases de datos de Postgres y Clickhouse que yo daba por hecho que estarían ahí. Eso significaba que la imagen de Plausible no lo incluye todo: solo empaqueta la funcionalidad principal del producto, y la instalación real requiere pasos adicionales para montar las bases de datos. Vale, nada grave.

Lo siguiente fue explorar el repositorio. Allí encontré dos cosas interesantes:

  • docker-compose.yml
  • la carpeta kubernetes

El archivo de compose dejaba claro que la configuración final incluía una base de datos Postgres (plausible-db), una base de datos Clickhouse (plausible-events-db) y el propio Plausible Analytics (plausible), desplegados juntos. Aquí tienes un esquema muy básico de la arquitectura de Plausible que dibujé para entenderlo mejor:

Esquema de la arquitectura de Plausible Analytics
Esquema de la arquitectura de Plausible Analytics

Puedes encontrar más información sobre el stack tecnológico y su funcionamiento en las estupendas notas de desarrollo del blog de Plausible. A mí me parecieron especialmente interesantes Technology choices y los resúmenes de Building Plausible de junio de 2019 y abril de 2020.

La carpeta kubernetes contenía una ampliación no oficial de la documentación sobre cómo ejecutarlo en local con k8s, con un montón de comandos kubectl y todas las configuraciones yaml útiles para este caso. Genial.

Un enfoque con conocimiento de causa

Después de familiarizarme con todos los archivos yaml que he mencionado y de borrar el deployment inicial, ya estaba listo para ponerme manos a la obra.

Configurar Postgres

Empecé con el deployment de la base de datos Postgres. La instalación no tenía ninguna complicación, ya que existía un plausible-db.yaml. Esto es todo lo que hice:

  • crear un nuevo deployment basado en la imagen postgres:latest

  • configurar el puerto del contenedor en 5432

  • configurar almacenamiento con bind-mount en la ruta /data/user/plausible/postgresql y punto de montaje /var/lib/postgresql/data

  • añadir las variables de entorno necesarias


    env:
    - name: POSTGRES_DB
    value: plausible
    - name: PGDATA
    value: /var/lib/postgresql/data/pgdata
    - name: POSTGRES_USER
    value: user
    - name: POSTGRES_PASSWORD
    value: password

  • configurar un service discovery de tipo ClusterIP, del puerto 5432 al 5432 con protocolo TCP, según la configuración

Y prácticamente eso fue todo; el resto de ajustes los dejé por defecto. La instancia de Postgres arrancó sin ningún problema.

Configurar Clickhouse

Lo siguiente en la lista era la base de datos Clickhouse, cuya configuración es muy parecida a la anterior, así que no te voy a aburrir repitiéndola. Aquí tienes el plausible-events-db.yaml, que lo dice todo.

La única diferencia destacable es la incorporación de un ConfigMap:


apiVersion: v1
kind: ConfigMap
metadata:
name: plausible-events-db-config
data:
clickhouse-config.xml: |
<yandex>
<logger>
<level>warning</level>
<console>true</console>
</logger>
{/* Stop all the unnecessary logging */}
<query_thread_log remove="remove"/>
<query_log remove="remove"/>
<text_log remove="remove"/>
<trace_log remove="remove"/>
<metric_log remove="remove"/>
<asynchronous_metric_log remove="remove"/>
</yandex>
clickhouse-user-config.xml: |
<yandex>
<profiles>
<default>
<log_queries>0</log_queries>
<log_query_threads>0</log_query_threads>
</default>
</profiles>
</yandex>

Esto es una pequeña optimización de Clickhouse. Si tienes curiosidad por saber para qué sirve, echa un vistazo a este commit

Y luego se añade junto a los volúmenes de bind-mount, así:


volumeMounts:
- name: data
mountPath: /var/lib/clickhouse
- name: config
mountPath: /etc/clickhouse-server/config.d/logging.xml
subPath: clickhouse-config.xml
readOnly: true
- name: config
mountPath: /etc/clickhouse-server/users.d/logging.xml"
subPath: clickhouse-user-config.xml
readOnly: true

Añades otro service discovery y listo: ya tienes una instancia de la base de datos Clickhouse.

Configurar Plausible

La última gran tarea era configurar el propio Plausible. La misma historia: cogí el plausible.yaml y repetí los pasos anteriores. Eso sí, con dos apuntes:

  1. Tiene que haber dos contenedores, uno de ellos de tipo init, que se ejecuta antes del contenedor principal para preparar las bases de datos y lanzar la migración con el siguiente comando:

initContainers:
- name: plausible-init
image: plausible/analytics:latest
command:
- '/bin/sh'
- '-c'
args:
- sleep 30 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin

Y después se ejecuta el contenedor habitual.

  1. Asegúrate de rellenar correctamente las variables necesarias. Consulta la página de configuración para saber más sobre ellas.

// postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(PLAUSIBLE_DB_SERVICE_HOST):$(PLAUSIBLE_DB_SERVICE_PORT)/plausible
DATABASE_URL=postgres://user:password@plausible-db.plausible:5432/plausible
// http://$(CLICKHOUSE_USER):$(CLICKHOUSE_PASSWORD)@$(PLAUSIBLE_EVENTS_DB_SERVICE_HOST):$(PLAUSIBLE_EVENTS_DB_SERVICE_PORT)/plausible
CLICKHOUSE_DATABASE_URL=http://user:password@plausible-events-db.plausible:8123/plausible
ADMIN_USER_EMAIL=user@mail.com
ADMIN_USER_NAME=user
ADMIN_USER_PWD=password
// notice the protocol
BASE_URL=https://plausible.example.com
// generate one by running "openssl rand -base64 64 | tr -d '\n'" in your terminal
SECRET_KEY_BASE=

Después añades un service discovery más y todo debería funcionar sin problemas. Solo queda un pequeño detalle.

Configurar el proxy inverso

La documentación dice:

Por defecto, Plausible se ejecuta sobre HTTP sin cifrar en el puerto 8000. Recomendamos ejecutarlo con HTTPS detrás de algún tipo de proxy inverso.

Me pareció razonable, así que en el panel de Cloudflare configuré un registro A sencillo con la dirección IP del nodo, volví a Rancher y añadí una configuración de Ingress para exponer mi flamante instancia de Plausible al mundo exterior.

Por fin apareció la pantalla de inicio de sesión en mi dominio seguro de siempre. Misión cumplida.

Página de inicio de sesión de Plausible Analytics
Página de inicio de sesión de Plausible Analytics

¡Y ya está!

Esta ha sido mi experiencia autoalojando Plausible Analytics en k8s. Aunque hay pistas bastante claras de cómo hacerlo, no es algo evidente, y precisamente por eso he escrito este artículo. Espero que te sea útil.

El equipo de Plausible mantiene el producto como open source y da soporte a la versión autoalojada, instrucciones para Kubernetes incluidas, lo que facilita mucho la instalación.

Cuéntanos tu caso

Escríbenos