Umami Docker Compose te permite desplegar en minutos un analytics web privado y ligero, sin cookies ni identificación de usuarios: métricas de visitas, referrers, dispositivos y eventos personalizados. Es la alternativa open source a Google Analytics que muchos equipos eligen para cumplir con privacidad y GDPR. En esta guía verás cómo levantar Umami con Docker Compose usando el docker-compose.yml oficial, configurar PostgreSQL, cambiar la contraseña por defecto y exponer el servicio detrás de un proxy inverso. Más guías en Docker Compose en el blog.
¿Qué es Umami Docker Compose?
Umami es una plataforma de analytics open source (licencia MIT) que prioriza la privacidad: no usa cookies, no hace fingerprinting y no almacena datos personales. El script de seguimiento pesa menos de 2 KB y no ralentiza tu web. Con Umami Docker Compose despliegas la aplicación y la base de datos PostgreSQL en un solo comando. El proyecto está en GitHub (umami-software/umami) y la documentación oficial en umami.is/docs.
La herramienta incluye métricas básicas: páginas vistas, visitantes únicos, tasa de rebote, duración de sesión, referrers, navegadores, sistemas operativos, dispositivos y países. Además soporta eventos personalizados (clics, formularios, conversiones) y en versiones recientes embudos, análisis de retención y seguimiento de campañas UTM. Todo se almacena en tu propio servidor; no hay envío de datos a terceros. Si buscas una alternativa ligera a Google Analytics o Matomo, esta solución encaja muy bien en entornos DevOps y en blogs o sitios que quieren cumplir GDPR sin renunciar a métricas útiles.
El equipo detrás del proyecto mantiene una versión cloud en umami.is para quien prefiera no administrar servidores, pero la opción self-hosted con Umami Docker Compose es la más elegida por equipos técnicos: control total sobre los datos, sin límites de eventos y sin coste por tráfico. La API REST permite integrar las métricas en dashboards propios o en herramientas de monitorización. En resumen, Umami Docker Compose te da un analytics moderno, ligero y respetuoso con la privacidad en unos minutos.
Requisitos e instalación con Umami Docker Compose
Necesitas Docker y Docker Compose v2 instalados en el servidor. Umami requiere PostgreSQL 12 o superior; el compose oficial usa PostgreSQL 15 Alpine, ligero y suficiente para la mayoría de instalaciones. Crea un directorio para el proyecto, por ejemplo umami, y guarda en él el archivo docker-compose.yml que detallamos más abajo.
Antes de arrancar, genera una cadena aleatoria segura para APP_SECRET (por ejemplo con openssl rand -base64 32) y sustitúyela en la configuración. Esta clave se usa para firmar sesiones y tokens; no la reutilices de otras instalaciones. Las variables de entorno se documentan en umami.is/docs/install y en la sección de environment variables de la documentación. Para producción, usa contraseñas fuertes tanto para PostgreSQL como para APP_SECRET. Si ya tienes un servidor con otros contenedores, el stack de Umami Docker Compose puede convivir en la misma red o en redes aisladas según prefieras.
No necesitas instalar Node.js ni compilar nada: la imagen oficial de Umami incluye la aplicación ya construida. El único requisito es tener Docker y Docker Compose v2 (el plugin compose integrado en la CLI de Docker). En Linux suele bastar con los paquetes docker.io y docker-compose-plugin o la instalación desde los repositorios oficiales de Docker. Una vez tengas el archivo docker-compose.yml y las variables sustituidas, el primer arranque creará las tablas en PostgreSQL y el usuario administrador por defecto. A partir de ahí podrás añadir sitios web y obtener los códigos de seguimiento para insertar en tus páginas.
En comparación con otras soluciones de analytics self-hosted, Umami destaca por su simplicidad: un solo contenedor de aplicación y una base de datos, sin colas de mensajes ni cachés externos obligatorios. Eso reduce la superficie de mantenimiento y hace que el despliegue con Umami Docker Compose sea ideal para equipos pequeños o para probar analytics privados sin complicarse. Si más adelante necesitas escalar, puedes mover PostgreSQL a un servidor dedicado o a un servicio gestionado y apuntar DATABASE_URL a esa instancia; la aplicación sigue siendo la misma.
docker-compose.yml para Umami Docker Compose
El siguiente docker-compose.yml está basado en el oficial del repositorio de Umami. Incluye el servicio de la aplicación y la base de datos PostgreSQL con healthchecks para que el contenedor de Umami espere a que la base esté lista antes de arrancar. La imagen ghcr.io/umami-software/umami:latest se actualiza con cada release; en producción puedes fijar una etiqueta concreta (por ejemplo 1.x.x) para evitar sorpresas al hacer docker compose pull. La base de datos usa la imagen postgres:15-alpine, pequeña y adecuada para cargas moderadas; para mucho tráfico puedes usar postgres:15 estándar o una versión más reciente según la documentación de PostgreSQL.
services:
umami:
image: ghcr.io/umami-software/umami:latest
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:TU_PASSWORD_SEGURA@db:5432/umami
APP_SECRET: TU_APP_SECRET_GENERADA
depends_on:
db:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/api/heartbeat || exit 1"]
interval: 10s
timeout: 5s
retries: 3
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: TU_PASSWORD_SEGURA
volumes:
- umami-db-data:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U umami -d umami"]
interval: 5s
timeout: 5s
retries: 5
volumes:
umami-db-data:
Sustituye TU_PASSWORD_SEGURA y TU_APP_SECRET_GENERADA por valores únicos. La misma contraseña debe aparecer en POSTGRES_PASSWORD y en la parte de DATABASE_URL. Arranca con docker compose up -d. Accede a http://TU_IP:3000. Credenciales por defecto: usuario admin, contraseña umami; cámbialas desde el primer acceso en la interfaz.
La documentación recomienda usar UTC en PostgreSQL para evitar desfases horarios en las métricas; la imagen Alpine por defecto suele estar configurada correctamente. Para más opciones (hostname, puerto, modo privado, nombre del script del tracker para evitar bloqueadores), consulta la documentación de Umami. El volumen umami-db-data persiste los datos; no lo elimines si quieres conservar el historial de analytics. Con este archivo ya tienes un despliegue funcional de Umami Docker Compose listo para añadir sitios web y empezar a medir.
Si prefieres no exponer el puerto 3000 directamente, puedes quitar la sección ports del servicio umami y acceder solo a través de un proxy inverso en la misma red Docker. El healthcheck comprueba el endpoint /api/heartbeat para asegurarse de que la aplicación responde antes de que otros contenedores que dependan de ella consideren el servicio listo. En entornos con varios proyectos, usar un nombre de proyecto distinto (docker compose -p mi-analytics up -d) ayuda a no mezclar contenedores. El mismo docker-compose.yml sirve en un VPS, en un NAS o en una máquina local; la portabilidad es una de las ventajas de Umami Docker Compose.
Configurar Umami Docker Compose detrás de proxy inverso
En producción conviene poner la aplicación detrás de Traefik, Caddy o Nginx para terminar SSL y opcionalmente ocultar el puerto 3000. Configura el proxy para reenviar las peticiones a http://contenedor_umami:3000 o a http://localhost:3000 si el proxy y los contenedores comparten red. Asegúrate de que el nombre del servicio en el compose coincida con el host que usa el proxy (por defecto umami). Si el proxy está en otro host, usa la IP o el nombre DNS del servidor donde corre Umami y el puerto 3000, o conecta ambos mediante una red Docker overlay si usas varios nodos. La documentación de Docker Compose explica los tipos de red y cómo exponer servicios de forma segura.
Si usas un subdominio (por ejemplo https://analytics.tudominio.com), no suele hacer falta definir HOSTNAME o NEXT_PUBLIC_APP_URL salvo que la aplicación enlace a sí misma en correos o en la interfaz; en ese caso indica la URL pública. Los datos se almacenan en el volumen umami-db-data; haz copias de seguridad periódicas de PostgreSQL con pg_dump o con tu herramienta habitual. Referencia de configuración de redes y proxies en Docker Compose networking y en la documentación de tu proxy inverso. Muchas guías de Docker Compose en este blog incluyen ejemplos con Traefik o Caddy que puedes reutilizar para Umami Docker Compose.
Con Traefik, por ejemplo, puedes definir etiquetas en el servicio umami para que genere automáticamente el certificado Let’s Encrypt y el hostname. Con Caddy, un bloque reverse_proxy apuntando al contenedor suele ser suficiente. En ambos casos el tráfico entre el proxy y Umami puede ir por HTTP en la red interna; el SSL termina en el proxy. Si más adelante cambias de dominio o de puerto, no es necesario tocar la base de datos: basta con actualizar la configuración del proxy y, si aplica, las variables de URL de la aplicación. Mantener Umami Docker Compose detrás de un proxy es la práctica recomendada para cualquier instalación accesible desde internet.
Integrar el tracker e instalar Umami Docker Compose en producción
Tras iniciar sesión en Umami, crea un sitio web en la interfaz y obtendrás un código de seguimiento. Añade el script en las páginas que quieras medir; el script es mínimo y no utiliza cookies, por lo que es compatible con políticas de privacidad estrictas. El snippet suele incluir la URL de tu instancia y un identificador del sitio; no expone datos personales de los visitantes. Si despliegas la aplicación en un dominio distinto al de las webs que analizas, configura CORS o usa la URL pública del API de Umami según indique la documentación oficial. En la mayoría de casos basta con que el dominio de la web que lleva el tracker esté permitido en la configuración de Umami; la documentación detalla los pasos.
Para entornos sensibles puedes activar PRIVATE_MODE para desactivar llamadas externas desde el servidor. Opcionalmente puedes personalizar el nombre del script del tracker con TRACKER_SCRIPT_NAME para intentar eludir bloqueadores de anuncios que filtran por nombre; la documentación explica las opciones. Actualizar la pila es sencillo: docker compose pull y docker compose up -d. Revisa las release notes en GitHub por si hay migraciones de base de datos. Más detalles en PostgreSQL docs para el mantenimiento de la base de datos y backups. La ventaja de Umami Docker Compose es que todo el stack queda versionado y reproducible en cualquier servidor con Docker.
Una vez tengas el código de seguimiento, pégalo antes del cierre de </head> en tu HTML o añade el script mediante tu CMS o generador de sitios estáticos. El script envía las métricas al endpoint de tu instancia de Umami; si la instancia está en un subdominio (por ejemplo https://analytics.tudominio.com), las peticiones irán allí. No necesitas configurar nada más en el servidor de las webs que analizas salvo incluir el snippet. Para múltiples sitios, crea un sitio web en Umami por cada dominio o subdominio y usa el código correspondiente; así separarás las métricas por proyecto. Si migras de otro analytics, Umami no importa datos históricos; los datos comienzan desde el día en que instalas el tracker. Con Umami Docker Compose puedes tener varias instancias (por ejemplo una por cliente o por entorno) usando el mismo archivo de compose y distintas carpetas o proyectos.
Conclusión
Con Umami Docker Compose tienes analytics web privado y ligero en pocos minutos: métricas útiles sin cookies, compatible con GDPR y con datos bajo tu control. El compose oficial con PostgreSQL y healthchecks facilita el despliegue y las actualizaciones; combinado con un proxy inverso y contraseñas seguras tendrás una solución lista para producción. No hace falta tocar código ni compilar: la imagen oficial y este docker-compose.yml son suficientes para tener Umami Docker Compose funcionando en cualquier equipo con Docker. Si quieres explorar más stacks, revisa otras guías de docker-compose en tutorialesdevops.es.
FAQ sobre Umami Docker Compose
¿Cuáles son las credenciales por defecto? Usuario admin y contraseña umami. Cámbialas en el primer acceso.
¿En qué puerto escucha Umami? Por defecto en el 3000 dentro del contenedor; el ejemplo mapea 3000:3000 en el host.
¿Puedo usar MySQL en lugar de PostgreSQL? Umami soporta también MySQL; hay imágenes y ejemplos en el repositorio oficial. La variante recomendada en la documentación es PostgreSQL.
¿Dónde se guardan los datos? En el volumen Docker umami-db-data, que persiste los datos de PostgreSQL. Haz backups de la base de datos para no perder métricas.
¿Cómo actualizo Umami? Ejecuta docker compose pull y luego docker compose up -d. Revisa las notas de la versión en GitHub por cambios en el esquema de la base de datos. Con Umami Docker Compose las actualizaciones se limitan a actualizar la imagen y reiniciar los contenedores.
