Tutoriales de VPS
Plausible Analytics autoalojado en un VPS (2026): Docker, PostgreSQL, ClickHouse, HTTPS con Caddy y analítica respetuosa con la privacidad
Despliega Plausible Analytics en un VPS desde cero: ejecuta la aplicación, PostgreSQL y ClickHouse con Docker Compose, configura HTTPS con Caddy, SMTP, analítica respetuosa con la privacidad, copias de seguridad y restauración, actualizaciones y reversiones, y solución de problemas comunes.

Plausible Analytics autoalojado en un VPS (2026): Docker, PostgreSQL, ClickHouse, HTTPS con Caddy y analítica respetuosa con la privacidad
Si buscas una alternativa ligera a Google Analytics y no quieres que los datos de visitas de tu sitio web salgan de tu propio VPS, Plausible Analytics es una buena opción para sitios pequeños, desarrolladores independientes y sitios de contenido. Su interfaz es sencilla, por defecto no crea perfiles personales entre sitios y su script de seguimiento es más ligero que el de las herramientas de analítica tradicionales.
Sin embargo, autoalojar Plausible no consiste solo en ejecutar un contenedor. Un entorno de producción debe gestionar PostgreSQL, ClickHouse, volúmenes persistentes, HTTPS del dominio, un correo de administrador, copias de seguridad y reversiones de actualización. Este artículo usa Ubuntu 24.04 LTS, Docker Compose y Caddy como ejemplo para desplegar una Plausible Community Edition que pueda funcionar a largo plazo.
| Herramienta | Más adecuada para | Principales contrapartidas |
|---|---|---|
| Plausible | Analítica web sencilla, rápida y respetuosa con la privacidad | Menos informes en profundidad y menos ecosistema de plugins que Matomo |
| Umami | Solo ver visitas, fuentes, páginas y eventos, con bajo coste de mantenimiento | Menos analítica avanzada y menos procesamiento de datos |
| Matomo | Necesidad de objetivos, embudos, comercio electrónico, búsqueda interna y análisis detallado de visitantes | Mantenimiento más complejo de base de datos, archivado y actualizaciones |
Si solo necesitas analítica ligera, puedes empezar con el tutorial de Umami autoalojado en un VPS. Si tu sitio ya usa Matomo, puedes comparar con el tutorial de instalación de Matomo en un VPS para evaluar el coste de migración. La ventaja de Plausible es que sus informes predeterminados son suficientemente claros y, tras el despliegue, no necesitas mantener tareas adicionales de archivado en el navegador.
Plausible usa al mismo tiempo la aplicación web, PostgreSQL y ClickHouse. Un blog pequeño o un sitio corporativo puede empezar con la siguiente configuración:
| Escala | Configuración recomendada | Adecuada para |
|---|---|---|
| Hasta 100.000 páginas vistas al mes | 2 núcleos, 4 GB de RAM, 50 GB SSD | Blogs personales, landing pages, sitios de pequeñas empresas |
| De 100.000 a 1.000.000 al mes | 4 núcleos, 8 GB de RAM, 150 GB SSD o más | Varios sitios, sitios con campañas publicitarias continuas |
| Más de 1.000.000 | Prueba de carga primero y luego separa bases de datos o amplía | Sitios de noticias, SaaS y sitios de contenido con mucho tráfico |
El espacio en disco lo consumen principalmente los datos de eventos de ClickHouse y los datos de configuración de PostgreSQL. Antes de publicar, prepara un dominio dedicado, por ejemplo analytics.example.com, y apunta sus registros A / AAAA al VPS. Abre solo SSH, 80 y 443 en el firewall y no expongas el 5432 de PostgreSQL ni el 8123 de ClickHouse a internet.
Instala Docker Engine y Compose v2 según la documentación oficial de Docker y luego confirma las versiones:
docker --version
docker compose version
Crea el directorio de despliegue y el directorio de copias de seguridad:
sudo mkdir -p /opt/plausible/backups
sudo chown -R "$USER":"$USER" /opt/plausible
cd /opt/plausible
Genera tres valores aleatorios y escríbelos en .env:
openssl rand -hex 32
openssl rand -hex 32
openssl rand -hex 32
nano .env
chmod 600 .env
BASE_URL=https://analytics.example.com
SECRET_KEY_BASE=替换为第一组随机值
POSTGRES_PASSWORD=替换为第二组随机值
CLICKHOUSE_PASSWORD=替换为第三组随机值
DATABASE_URL=postgres://plausible:替换为第二组随机值@postgres:5432/plausible
CLICKHOUSE_DATABASE_URL=http://plausible:替换为第三组随机值@clickhouse:8123/plausible_events
BASE_URL debe coincidir exactamente con la dirección de acceso final. Una vez que SECRET_KEY_BASE está en producción, no lo cambies sin motivo, o las sesiones existentes y los datos cifrados dejarán de ser válidos.
Crea /opt/plausible/compose.yaml:
services:
plausible:
image: ghcr.io/plausible/community-edition:v3.2.1
container_name: plausible
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
clickhouse:
condition: service_healthy
ports:
- "127.0.0.1:8000:8000"
env_file:
- .env
environment:
DISABLE_REGISTRATION: invite_only
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8000/api/health || exit 1"]
interval: 30s
timeout: 10s
retries: 10
start_period: 60s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
postgres:
image: postgres:16-alpine
container_name: plausible-postgres
restart: unless-stopped
env_file:
- .env
environment:
POSTGRES_DB: plausible
POSTGRES_USER: plausible
volumes:
- plausible_postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U plausible -d plausible"]
interval: 10s
timeout: 5s
retries: 20
clickhouse:
image: clickhouse/clickhouse-server:24.8-alpine
container_name: plausible-clickhouse
restart: unless-stopped
env_file:
- .env
environment:
CLICKHOUSE_DB: plausible_events
CLICKHOUSE_USER: plausible
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1"
volumes:
- plausible_clickhouse:/var/lib/clickhouse
- plausible_clickhouse_logs:/var/log/clickhouse-server
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8123/ping | grep -q Ok"]
interval: 10s
timeout: 5s
retries: 20
volumes:
plausible_postgres:
name: plausible_postgres
plausible_clickhouse:
name: plausible_clickhouse
plausible_clickhouse_logs:
name: plausible_clickhouse_logs
El puerto de la aplicación se enlaza solo a 127.0.0.1:8000 y las bases de datos permanecen por completo en la red interna de Compose. El ejemplo fija Plausible Community Edition v3.2.1 y la serie ClickHouse 24.8; antes de una actualización oficial, sigue consultando las notas de versión de Plausible y la matriz de compatibilidad, y no uses latest directamente en un entorno sin supervisión.
Inicia y comprueba:
docker compose config >/dev/null
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 plausible
curl -I http://127.0.0.1:8000
sudo ss -lntp | grep ':8000'
Si ves 0.0.0.0:8000, el enlace del puerto está mal y debes cambiarlo de inmediato a 127.0.0.1.
Edita /etc/caddy/Caddyfile:
analytics.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:8000
request_body {
max_size 16MB
}
}
Valida y recarga:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://analytics.example.com
Caddy solicita y renueva los certificados automáticamente. Si usas Cloudflare, mantén coherentes el DNS, el modo de proxy y el puerto de origen, y no configures redirecciones forzadas contradictorias entre Caddy, la CDN y la capa de aplicación. Para más detalles, consulta Proxy inverso con Caddy y HTTPS automático en un VPS.
Abre https://analytics.example.com en el navegador y crea la primera cuenta de administrador. Usa un correo dedicado y una contraseña larga generada por un gestor de contraseñas. Después, añade un sitio web, rellena el dominio del sitio, la zona horaria de los informes y los eventos que necesitas recopilar, y mantén desactivado el registro público.
Copia el código JavaScript que proporciona Plausible y colócalo antes de la etiqueta de cierre head de la plantilla de tu sitio web. Si usas CSP, permite al menos el dominio de carga del script y el dominio de envío de la analítica; si un plugin de caché combina o aplaza el script, excluye primero el script de Plausible.
Visita el sitio web en una ventana de incógnito, confirma en la pestaña Network del navegador que aparece una solicitud a /api/event y luego verifícalo en el panel en tiempo real de Plausible. Que la página de inicio cargue no significa que el script de seguimiento esté funcionando.
Las invitaciones de miembros, el restablecimiento de contraseñas y las notificaciones de alertas dependen del correo. Añade lo siguiente en .env según el servicio SMTP que uses:
[email protected]
SMTP_HOST_ADDR=smtp.example.com
SMTP_HOST_PORT=587
[email protected]
SMTP_USER_PWD=替换为SMTP专用密码
SMTP_HOST_SSL_ENABLED=false
Después de modificarlo, reconstruye el contenedor de la aplicación:
docker compose up -d --force-recreate plausible
docker compose logs --tail=100 plausible
El puerto 587 suele funcionar con STARTTLS y el 465 suele usar TLS directo; consulta la documentación de tu proveedor de correo para los detalles. No uses la contraseña principal de tu cuenta de correo personal.
Plausible no depende de cookies ni de perfiles personales entre sitios por defecto, pero el autoalojamiento no equivale automáticamente a cumplimiento normativo. Antes de publicar, comprueba:
- La política de privacidad explica qué páginas, fuentes e información del dispositivo se recopilan y durante cuánto tiempo se conservan;
- No incluyas información personal como correos, nombres o números de pedido en URL, nombres de eventos o propiedades personalizadas;
- Crea solo los eventos personalizados que realmente necesites y evita enviar el contenido de los formularios tal cual;
- Si tu región o escenario de negocio exige consentimiento, pausa la analítica no esencial hasta obtenerlo;
- Elimina periódicamente los sitios y miembros que ya no necesites y protege las cuentas de administrador;
- Restringe los puntos de entrada mediante el firewall y Caddy y no expongas los puertos de las bases de datos a internet.
"Sin cookies" reduce el riesgo para la privacidad, pero aún necesitas una evaluación completa basada en los registros de acceso, el tratamiento de IP, las plataformas publicitarias y la región donde opera tu negocio.
PostgreSQL guarda cuentas, sitios y configuración, mientras que ClickHouse guarda los eventos de visita. Si solo haces copia de seguridad de uno de ellos, tras restaurar obtendrás "puedo iniciar sesión pero los informes históricos están vacíos" o "hay datos pero se perdió la configuración de los sitios".
Copia de seguridad de PostgreSQL:
cd /opt/plausible
mkdir -p backups
docker compose exec -T postgres pg_dump \
-U plausible -d plausible --format=custom \
> "backups/plausible-postgres-$(date +%F-%H%M).dump"
Al hacer copia de seguridad del volumen de datos de ClickHouse, detén primero las escrituras:
docker compose stop plausible clickhouse
docker run --rm \
-v plausible_clickhouse:/source:ro \
-v "$PWD/backups:/backup" \
alpine sh -c 'tar -C /source -czf /backup/plausible-clickhouse.tar.gz .'
docker compose start clickhouse plausible
Conserva al menos una copia de los archivos de copia de seguridad en otra máquina o en almacenamiento de objetos, y restringe los permisos de acceso. Puedes consultar Copias de seguridad y simulacros de restauración en un VPS para el cifrado, las sumas de verificación y las pruebas periódicas de restauración.
Después de restaurar, comprueba la lista de sitios, los informes históricos, los eventos en tiempo real y el inicio de sesión del administrador; no te limites a comprobar si el contenedor está en ejecución.
Antes de actualizar, guarda la versión actual de la imagen, el archivo Compose y las copias de seguridad de PostgreSQL y ClickHouse. Realiza la actualización en horas de baja actividad:
cd /opt/plausible
docker compose config >/dev/null
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=200 plausible
Finaliza la ventana de actualización solo después de confirmar que el panel de administración, el script de seguimiento, los eventos en tiempo real y los informes históricos funcionan con normalidad. Si la nueva versión no arranca, restaura la etiqueta de imagen anterior y las copias de seguridad de los datos. No ejecutes docker compose down -v sin una copia de seguridad, porque elimina los volúmenes de las bases de datos.
Monitoriza los recursos con regularidad:
docker stats --no-stream plausible plausible-postgres plausible-clickhouse
df -h
docker system df
El disco de ClickHouse suele crecer más rápido que el de PostgreSQL. Configura alertas para el disco de datos de Docker, el directorio de copias de seguridad y los registros, y reserva al menos un 20% de espacio libre.
docker compose ps
docker compose logs --tail=200 plausible
curl -I http://127.0.0.1:8000
sudo journalctl -u caddy --no-pager -n 100
Mientras la aplicación aún se está iniciando, Caddy devolverá temporalmente 502; si persiste, comprueba SECRET_KEY_BASE, BASE_URL, las conexiones a las bases de datos y la memoria del contenedor.
docker compose logs --tail=200 postgres clickhouse
docker compose exec plausible getent hosts postgres clickhouse
Los nombres de host en la red de Compose son los nombres de servicio postgres y clickhouse, y no puedes usar localhost. Cambiar la contraseña en .env no cambia automáticamente el usuario ya inicializado de la base de datos; debes actualizar la cuenta de la base de datos de forma sincronizada o seguir el procedimiento de restauración de copias de seguridad.
En la pestaña Network del navegador, comprueba el código de estado de /api/event, el dominio de la solicitud y los errores de CSP. Las causas habituales incluyen un dominio del sitio incorrecto, el script aplazado por un plugin de caché, bloqueadores de anuncios que bloquean la solicitud y el sitio web usando una dirección HTTP/HTTPS incorrecta. Primero usa una ventana de incógnito para descartar la influencia de las extensiones del navegador.
docker compose exec clickhouse clickhouse-client --query 'SELECT 1'
docker compose logs --tail=200 clickhouse
df -h /var/lib/docker
Comprueba si ClickHouse está sano, si el disco está lleno y si hay errores de migración tras una actualización. Si solo falta un periodo de tiempo concreto, usa los registros del contenedor y los registros de acceso de Caddy para determinar si los eventos no se enviaron o si la base de datos de analítica no los escribió.
- La aplicación escucha solo en 127.0.0.1:8000, y 5432 y 8123 no están expuestos a internet
- BASE_URL, el dominio y la configuración HTTPS de Caddy son coherentes
- El administrador usa una contraseña fuerte y la política de registro sigue siendo solo por invitación
- Se han probado los correos SMTP de invitación y restablecimiento de contraseña
- El navegador puede ver /api/event y el panel en tiempo real recibe visitas de prueba
- Se han confirmado la política de privacidad, la retención de datos, los eventos personalizados y el mecanismo de consentimiento
- Tanto PostgreSQL como ClickHouse tienen copias de seguridad externas
- Se ha completado al menos un simulacro de restauración y se pueden restaurar los informes históricos
- Las versiones están fijadas y con copia de seguridad antes de actualizar, y tras actualizar se comprueban los errores 502, los eventos y el espacio en disco
Solo después de completar estos pasos Plausible es un servicio de analítica en VPS que puede funcionar a largo plazo, y no una demo de Docker solo apta para una prueba temporal. Para los sitios web que valoran la privacidad, la velocidad de página y la autonomía de los datos, logra un buen equilibrio entre la complejidad del despliegue y la capacidad analítica.