Passo 03 · Deploy
Due container e un proxy. Poi chiuda la porta.
Il deployment di riferimento qui sotto è Umami, perché è quello che la maggior parte dei lettori dovrebbe eseguire e perché la struttura si generalizza: un container applicativo, un container database che può raggiungere e che nessun altro può raggiungere, e un reverse proxy che detiene il certificato. Plausible e Matomo differiscono nel numero di container e nei nomi delle variabili, non nella struttura — prenda i loro file Compose ufficiali e applichi le stesse tre regole.
Le tre regole, in ordine di quanto le costeranno se ignorate. Blocchi ogni immagine su un tag esatto, mai su uno mobile: uno stack di analisi che scarica silenziosamente una nuova versione principale durante un riavvio non correlato è una migrazione dello schema che non ha pianificato. Generi il secret dell'applicazione da una vera fonte casuale e lo conservi — cifra il materiale di sessione, e cambiarlo in seguito, nel migliore dei casi, disconnette tutti. Non pubblichi alcuna porta del database: i due container condividono una rete ed è tutto il controllo degli accessi di cui hanno bisogno.
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
Il file Compose. Due servizi, una rete privata, un volume denominato per il database, e nessuna porta pubblicata — il proxy è la sola cosa che comunica con il mondo esterno:
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 è qui la via più breve verso una configurazione TLS corretta: due righe di configurazione, un certificato ottenuto e rinnovato senza un cron job, e impostazioni predefinite moderne che non deve andare a cercare. Se sul server esegue già nginx, mantenga nginx — il requisito è un proxy davanti, non questo proxy in particolare. In ogni caso l'applicazione di analisi non deve mai essere ciò che resta in ascolto direttamente sulla porta 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
}
Lo avvii, poi faccia l'unica cosa che è davvero critica in termini di tempo. docker compose up -d, attenda le migrazioni, e apra la dashboard. Ognuno di questi strumenti fornisce o un account amministratore predefinito documentato o una schermata di prima registrazione aperta, e il nome host è diventato di pubblico dominio nell'istante in cui il certificato è stato emesso, perché i log di certificate transparency sono pubblici e vengono scansionati continuamente. Cambi la password predefinita e chiuda la registrazione entro pochi minuti dal primo caricamento riuscito, non domani.
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
I cinque minuti che decidono chi possiede l'istanza
Umami viene distribuito con un account amministratore documentato la cui password è la stessa per ogni installazione al mondo. Il primo visitatore di Plausible diventa il proprietario a meno che la registrazione non sia disabilitata nell'ambiente. Matomo guida il primo visitatore attraverso un installer che crea il superuser. In tutti e tre i casi, la finestra tra "il certificato esiste" e "ha effettuato l'accesso" è una finestra in cui qualcun altro può accedere al posto suo — e non ha nemmeno bisogno di indovinare il nome host, perché viene pubblicato per lui. Acceda prima lei, cambi la credenziale, poi imposti l'interruttore di registrazione su chiuso e ricarichi la pagina per confermare che la modifica sia stata applicata.