Alojar Umami en un VPS administrado significa guardar la analítica de sus sitios web en una máquina propia, que nuestros equipos mantienen actualizada y supervisan día y noche. Umami es software libre con licencia MIT que mide la audiencia sin cookies. Esta guía sigue su documentación oficial: la instalación con Docker Compose y PostgreSQL, HTTPS, el primer inicio de sesión, el script de seguimiento, lo que dice el proyecto sobre los datos personales, los ajustes útiles, las copias de seguridad y las actualizaciones.
Por Simon Vasconcelos Lee
Publicado el 15 de noviembre de 202612 minutos de lectura
APP_SECRET y TWO_FACTOR_ENCRYPTION_KEY al azar, sirva Umami en HTTPS con su propio subdominio y cambie enseguida la contraseña de la cuenta admin.<head> de sus páginas: el script de seguimiento no usa cookies.pg_dump, guarde el archivo .env en lugar seguro y actualice con docker compose pull.Umami es una plataforma de analítica web y de producto de código abierto. Su documentación describe una herramienta que reúne el tráfico, las campañas, el comportamiento de los visitantes, las conversiones, la retención y los ingresos, desde la primera visita hasta los resultados que cuentan para su actividad. Está escrita en TypeScript sobre Next.js, y su imagen Docker se ejecuta con una cuenta sin privilegios.
Una sola instancia sigue varios sitios web: cada uno recibe su propio identificador y su script de seguimiento, y sus colegas se organizan mediante cuentas y equipos.
Umami se publica bajo la licencia MIT, a nombre de Umami Software, Inc. Concede, de forma gratuita, el derecho a usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y vender copias del software. Puede, por tanto, ejecutarlo para su empresa y para los sitios de sus clientes, sin ninguna licencia que comprar.
Su única condición: el aviso de copyright y el aviso de permiso acompañan a todas las copias o partes sustanciales del software. Como cualquier licencia MIT, ofrece el software «tal cual», sin garantía.
La documentación presenta Umami como una analítica sin cookies, sin seguimiento entre sitios y sin recogida automática de datos personales. Autoalojado, guarda su analítica en su propio servidor: usted decide dónde se guarda y cuánto tiempo se conserva.
| Cuestión | Lo que dice el proyecto | Fuente |
|---|---|---|
| Las cookies | El script de seguimiento web no usa cookies; que su sitio necesite un aviso de cookies depende de los demás servicios que use y de los requisitos que le sean aplicables | FAQ |
| Los datos recogidos | Páginas vistas, URL de procedencia, navegadores, sistemas operativos, tipos de dispositivo y ubicación aproximada | FAQ |
| La dirección IP | La tabla de sesiones no tiene ninguna columna para la dirección IP; un identificador de sesión es un hash del sitio, de la dirección, del navegador y de una sal que cambia cada mes por defecto | Esquema y código, versión 3.4.1 |
| La conservación | Autoalojados, los datos se conservan hasta que usted los elimina | FAQ |
| El RGPD | Umami está diseñado pensando en la privacidad, y la conformidad depende de cómo lo configure y lo use | FAQ |
| Los datos que envía | Un identificador de visitante o unas propiedades de evento que decida enviar quedan bajo su responsabilidad | Introducción |
Tres ajustes del script de seguimiento van más allá, si lo desea: data-exclude-search retira los parámetros de búsqueda de las URL registradas, data-exclude-hash retira el fragmento, y data-do-not-track desactiva el seguimiento en los navegadores que expresan la preferencia Do Not Track. La documentación señala que este último ajuste no constituye, por sí solo, una solución completa de gestión del consentimiento.
Si identifica a los visitantes conectados con data-distinct-id o umami.identify(), la documentación recomienda un identificador interno de usuario o un hash en lugar de una dirección de correo: el valor puede leerse en el HTML de la página.
El repositorio ofrece un docker-compose.yml que arranca Umami y su base de datos PostgreSQL. Desde la versión 3, PostgreSQL es la única base admitida, en la versión 12.14 como mínimo, y la documentación recomienda configurarla en la zona horaria UTC. En un servidor con Docker instalado, cree una carpeta y empiece por sus secretos, generados al azar con openssl, como sugiere la documentación:
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
APP_SECRET=$(openssl rand -hex 32)
TWO_FACTOR_ENCRYPTION_KEY=$(openssl rand -hex 32)
EOF
chmod 600 .env
Coloque después este compose.yaml a su lado. Sigue el archivo del proyecto en la versión 3.4.1, con dos cambios: los secretos proceden del archivo .env, y el puerto solo se publica en 127.0.0.1.
services:
umami:
image: ghcr.io/umami-software/umami:latest
ports:
- "127.0.0.1:3000:3000"
environment:
DATABASE_URL: postgresql://umami:${POSTGRES_PASSWORD}@db:5432/umami
APP_SECRET: ${APP_SECRET}
TWO_FACTOR_ENCRYPTION_KEY: ${TWO_FACTOR_ENCRYPTION_KEY}
depends_on:
db:
condition: service_healthy
init: true
restart: always
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
interval: 5s
timeout: 5s
retries: 5
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- umami-db-data:/var/lib/postgresql/data
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
volumes:
umami-db-data:
docker compose up -d
curl -s http://127.0.0.1:3000/api/heartbeat
DATABASE_URL: la única variable obligatoria, la cadena de conexión a la base. La contraseña hexadecimal se escribe tal cual; una contraseña con caracteres especiales necesitaría codificación porcentual.APP_SECRET: una cadena aleatoria que protege los tokens de autenticación, única para cada instalación. En el código de la versión 3.4.1, interviene también en el cálculo de los identificadores de sesión: manténgala estable.TWO_FACTOR_ENCRYPTION_KEY: 64 caracteres hexadecimales que cifran los secretos de la doble autenticación. Sin ella, nadie puede activar la doble autenticación.admin. La sonda /api/heartbeat responde {"ok":true} en cuanto Umami está listo.latest sigue la última versión publicada. El registro del proyecto publica también etiquetas de versión, como 3.4.1, para fijar la que ejecuta.La documentación de instalación no da ninguna cifra de memoria ni de procesador. El tamaño depende del tráfico de los sitios seguidos y del volumen de datos que conserve. En un VPS administrado, descríbanos su uso y le recomendamos el tamaño adecuado.
Umami escucha en HTTP en el puerto 3000, y la documentación sugiere servirlo detrás de su servidor web, mediante un proxy inverso. Dele su propio subdominio, como stats.example.com, que apunte al servidor con registros A y AAAA. Servir Umami bajo una ruta pasa por BASE_PATH, una variable que se lee al compilar la aplicación: con la imagen publicada, el subdominio es la vía directa.
El proxy debe transmitir también la dirección del visitante. Umami la lee en las cabeceras que recibe, entre ellas X-Real-IP y X-Forwarded-For: la usa para distinguir a los visitantes y localizar su país. Si su proxy usa otra cabecera, CLIENT_IP_HEADER la indica.
Caddy obtiene el certificado de Let’s Encrypt y activa HTTPS por sí mismo. Su directiva reverse_proxy establece X-Forwarded-For por defecto: estas tres líneas bastan.
stats.example.com {
reverse_proxy 127.0.0.1:3000
}
Este bloque sigue el ejemplo de Nginx de la documentación de Umami, y escucha en el puerto 80 para que Certbot pueda instalar HTTPS:
server {
listen 80;
listen [::]:80;
server_name stats.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Certbot instala después el certificado y se encarga de renovarlo:
sudo certbot --nginx
Al crear su base de datos, Umami abre una cuenta de administrador: usuario admin, contraseña umami. La documentación pide cambiar esta contraseña en el primer inicio de sesión.
admin y umami.Guarde TWO_FACTOR_ENCRYPTION_KEY con sus copias de seguridad: la documentación advierte de que perder o cambiar esta clave hace ilegibles los secretos guardados, y cada usuario debe entonces volver a configurar la doble autenticación.
<head> de sus páginas y visite después su sitio: los datos aparecen enseguida en el panel.<script defer src="https://stats.example.com/script.js" data-website-id="your-website-id"></script>
next/script en lugar de una simple etiqueta <script>.data-domains limita el seguimiento a sus dominios de producción, lo que deja sus entornos de prueba fuera de las estadísticas.localStorage.setItem('umami.disabled', 1).Algunos bloqueadores de anuncios bloquean todo lo que parece analítica. Autoalojado, Umami ya se sirve desde su propio dominio, y dos variables van más allá: TRACKER_SCRIPT_NAME da al script un nombre distinto de script.js, y COLLECT_API_ENDPOINT cambia el nombre del punto de recogida, en lugar de /api/send. El script llama entonces por sí mismo al nuevo punto; en sus páginas solo cambia la fuente del código de seguimiento.
TRACKER_SCRIPT_NAME: "stats.js"
COLLECT_API_ENDPOINT: "/api/collect"
Estas variables de entorno van en el servicio umami de compose.yaml, y docker compose up -d recrea después el contenedor para tenerlas en cuenta:
| Variable | Lo que hace | Valor |
|---|---|---|
DISABLE_TELEMETRY | Desactiva la telemetría anónima que Umami envía al proyecto para mejorar la aplicación | 1 |
PRIVATE_MODE | Desactiva todas las llamadas de red externas, incluidos los iconos de los sitios, servidos por defecto desde DuckDuckGo | 1 |
DISABLE_UPDATES | Desactiva la comprobación de nuevas versiones | 1 |
IGNORE_IP | Excluye de la recogida direcciones IP y rangos CIDR, como los de sus oficinas | Una lista separada por comas |
SALT_ROTATION | Fija la frecuencia con la que cambia la sal de los identificadores de sesión | month por defecto |
REDIS_URL | Añade una caché Redis, que la documentación recomienda para los sitios con mucho tráfico o para varias instancias | Su dirección Redis |
MCP_ENABLED | Abre el punto /mcp: su asistente de IA lee su analítica en solo lectura, con una clave de API creada en Settings, API keys | 1 |
Todo lo que Umami conserva vive en su base de datos PostgreSQL: cuentas, sitios, equipos y analítica. Expórtela cada día y justo antes de cada actualización: autoalojados, estos datos se conservan sin límite de tiempo. Junto a la base, el archivo .env guarda los secretos que la hacen utilizable:
| Elemento | Lo que guarda | Copia de seguridad |
|---|---|---|
| La base de datos PostgreSQL | Cuentas, sitios, equipos, informes y toda la analítica | Obligatoria, con pg_dump |
.env | La contraseña de la base, APP_SECRET y la clave de la doble autenticación | Obligatoria, cifrada |
compose.yaml | La configuración de su instancia | Recomendada |
pg_dump hace una exportación coherente mientras la base está en uso. El formato personalizado, -Fc, va comprimido y se restaura con pg_restore:
docker compose exec -T db pg_dump -U umami -d umami -Fc > umami-$(date +%F).dump
Programe este comando en el servidor al menos una vez al día, haga limpieza entre las exportaciones, que se acumulan, y envíe una copia a otro lugar. Colocadas en el disco del servidor, estas exportaciones entran también en sus copias de seguridad nocturnas.
docker compose stop umami.docker compose stop umami
docker compose exec -T db pg_restore -U umami -d umami --clean --if-exists < umami-YYYY-MM-DD.dump
docker compose start umami
Repita este ejercicio de vez en cuando, sobre una copia: así comprueba que una copia de seguridad funciona.
La documentación da dos comandos, desde la carpeta del compose.yaml. La base de datos se queda en su volumen:
docker compose pull
docker compose up --force-recreate -d
Al reiniciar, el contenedor aplica por sí mismo las migraciones del esquema. La versión 3.4.0, del 17 de septiembre de 2026, traía dos, para las anotaciones y las claves de API; la versión 3.4.1, del 23 de octubre de 2026, no trae ninguna. Tras una actualización mayor, como el paso a la versión 3, la documentación sugiere ejecutar ANALYZE en PostgreSQL para que los paneles recuperen su velocidad:
docker compose exec db psql -U umami -d umami -c "ANALYZE;"
postgres:15-alpine del archivo. Pasar a una nueva versión mayor de PostgreSQL exige una exportación y una restauración, o pg_upgrade.El autoalojamiento exige mantener el servidor además de la aplicación. En un VPS administrado, nuestros equipos se encargan del servidor y siguen su instancia de forma proactiva; Umami sigue siendo su software, con sus ajustes y sus datos.
| Tema | Nuestros equipos | Usted |
|---|---|---|
| El servidor | Actualizaciones del sistema y de seguridad, con intervenciones en el servidor incluidas | El momento que mejor convenga a su actividad |
| La supervisión | Servidor vigilado las 24 horas del día, los 7 días de la semana, con intervención sin esperar su llamada | La lectura de los registros de su instancia |
| Umami | Seguimiento proactivo: errores, lentitud y espacio en disco detectados, corrección recomendada | Su instalación, sus actualizaciones y sus ajustes, que aplica usted o su asistente de IA |
| Los sitios y la analítica | El servidor que los soporta, vigilado y con copias de seguridad | Las cuentas, los sitios seguidos, el script de seguimiento y la duración de conservación de los datos |
| Las copias de seguridad | Cada noche, cifradas y guardadas fuera de la máquina; restauración incluida | Las exportaciones propias de Umami, y la petición de restauración, cuando la necesite |
| La migración | Su servidor actual migrado, gratis | El momento del cambio |
Si prefiere que nuestros equipos intervengan en la propia aplicación, ese servicio se factura por horas o a precio cerrado, con un presupuesto comunicado antes de la intervención.
Con un VPS administrado de Simafri, nuestros equipos mantienen actualizado el servidor de su instancia de Umami, lo vigilan día y noche e intervienen sin esperar su llamada; también siguen su instancia de forma proactiva y le recomiendan las correcciones útiles, que aplica usted o su asistente de IA. Las copias de seguridad se cifran cada noche y se guardan fuera de la máquina, su restauración está incluida, y la migración de su servidor actual es gratuita.
Sí. Umami tiene licencia MIT: puede usarlo, modificarlo y redistribuirlo en su empresa sin ninguna licencia que comprar, siempre que conserve su aviso de copyright. Queda el coste del servidor que lo ejecuta.
No. La FAQ del proyecto indica que el script de seguimiento web de Umami no usa cookies. Que su sitio necesite un aviso de cookies depende de los demás servicios que use en él y de los requisitos que le sean aplicables.
Ya no desde la versión 3: Umami admite PostgreSQL, en la versión 12.14 como mínimo. Una instancia de la versión 2 con MySQL traslada primero sus datos a PostgreSQL con la guía de migración del proyecto, y pasa después a la versión 3.
Parta del docker-compose.yml del proyecto, que ejecuta Umami y PostgreSQL, con secretos aleatorios en un archivo .env y el puerto publicado en 127.0.0.1. Ejecute docker compose up -d y coloque después delante un proxy inverso en HTTPS, con un subdominio.
En la instalación, Umami crea una cuenta admin con la contraseña umami. Cámbiela en su primer inicio de sesión, en Settings y después Profile, y active la doble autenticación en la pestaña Security una vez definida TWO_FACTOR_ENCRYPTION_KEY.
En una instancia autoalojada, TRACKER_SCRIPT_NAME da al script un nombre distinto de script.js, y COLLECT_API_ENDPOINT cambia el nombre del punto de recogida /api/send. Cambie después la fuente del código de seguimiento en sus páginas.
Exporte cada día la base PostgreSQL con pg_dump, desde el contenedor de la base, y guarde aparte el archivo .env, que contiene APP_SECRET y la clave de la doble autenticación. Restaure con pg_restore y pruebe la restauración con regularidad.
Un VPS administrado cubre el servidor: sistema, seguridad, supervisión y copias de seguridad. Nuestros equipos siguen también su instancia de forma proactiva y le recomiendan las correcciones útiles, que aplica usted. Una intervención en la aplicación se factura por horas o a precio cerrado.
Simafri
Hablemos de su proyecto
Díganos en pocas palabras lo que necesita: le respondemos rápidamente.
¡Gracias! Su solicitud ha sido enviada. Le responderemos en breve.
¿Prefiere el correo? Escríbanos a support@simafri.com.