Il tavolo virtuale delle mie campagne di gioco di ruolo online: Foundry VTT in un container Docker, dietro nginx con HTTPS, rimesso in piedi da una pipeline a ogni push.
La configurazione sta nei segreti della pipeline, non sul server. A ogni avvio il container rigenera la configurazione di Foundry dalle variabili d'ambiente, così le credenziali e la licenza si cambiano in un posto solo. Il prezzo è che dopo ogni riavvio la licenza va riaccettata dal browser, e in quei minuti il controllo di salute non distingue l'attesa da un guasto: per questo è solo informativo e non ferma mai il deploy.
Il backup lo fa Foundry, non la pipeline. Fino all'agosto 2026 ogni deploy impacchettava tutta la cartella dei dati. Su 15 GB, 11 erano i backup interni di Foundry: era un backup dei backup, pagato in minuti di deploy e spazio su disco, per un mondo di circa 900 MB già coperto dalle istantanee che Foundry gestisce da sé. L'ho tolto; prima di un aggiornamento rischioso si fa un'istantanea dall'interfaccia.
Piattaforma
- Immagine
- felddy/foundryvtt dal GitHub Container Registry, versione principale fissata a 14
- Risorse
- al massimo 2 CPU e 4 GB, riservati mezza CPU e 512 MB
- Porta
- 30000, aperta solo in locale: da fuori si passa per nginx
- Dati
- un volume con mondi, moduli, configurazione e backup interni di Foundry
Proxy
- HTTPS
- HTTP/2 e IPv6, certificati Let's Encrypt rinnovati da certbot sul server
- Limiti
- 50 richieste al secondo per indirizzo con picco di 100, 20 connessioni
- WebSocket
- percorso dedicato con timeout di un'ora, per le sessioni ferme
- File statici
- fuori dal limite e dai log: un import di Plutonium ne chiede un centinaio insieme
- Caricamenti
- fino a 200 MB
Rilascio
- Pipeline
- Azure DevOps a ogni push su main, esclusi i commit di sola documentazione
- Immagine nuova
- scaricata prima del rollout, con tre tentativi: se il registro non risponde, il container vecchio resta su
- Segreti
- file di ambiente generato sull'agente con permessi 600 e cancellato anche se il deploy fallisce
- Salute
- curl ogni 30 secondi, solo informativo: non blocca il deploy
- Traccia
- un file sul server con commit, build, data e richiedente dell'ultimo deploy
- Monitoraggio
- UptimeRobot su disponibilità e certificato, e il controllo orario del server sullo stato del container
Stack
- Tecnologie
- DockernginxAzure DevOpsLet's Encrypt
