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ó.