Alessandro Zucchini
Scheda operativa per alessandro-zucchini
Alessandro Zucchini
Stato operativo
VPS pronta al cutover. Il cliente controlla il dominio e deve cambiare nameserver a DigitalOcean.
Runtime e deploy
| Voce | Valore |
|---|---|
| Repo | /opt/obelica/repos/alessandro-zucchini |
| Container | alessandro-zucchini |
| Stack | Next.js |
| Porta interna | 3000 |
| Env file | /opt/obelica/secrets/apps/alessandro-zucchini.env |
| Deploy | next-docker |
DNS e TLS
Dominio produzione: alessandrozucchini.com, www.alessandrozucchini.com.
Nameserver attuali prima del cutover: ns4.wixdns.net, ns5.wixdns.net.
Target: ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com.
La zona DigitalOcean e' pronta con A apex/www verso 129.212.141.97, MX Google, SPF e Google site verification. Router Traefik pronto con TLS main alessandrozucchini.com e SAN www.alessandrozucchini.com.
Database, storage e backup
Database su DigitalOcean Managed PostgreSQL. Storage media: Cloudinary secondo stato corrente, con layer Spaces disponibile nel codice. Backup Obelica copre repository/config; database e Cloudinary seguono le rispettive policy esterne.
Aggiornamento 2026-07-03: aggiunto il blocco SPACES_* completo all'env file
(mancava del tutto; backup in alessandro-zucchini.env.bak-20260703),
container staging ricreato e verificato con HTTP 200 su
alessandro-zucchini.vps.obelica.com.
Verifiche
Pre-cutover:
alessandro-zucchini.vps.obelica.com 200 -> /it
alessandrozucchini.com 200 -> /it con --resolve
www.alessandrozucchini.com 200 -> /it con --resolveRunbook: Pre-cutover Alessandro Zucchini.
Router Traefik — modifica 2026-07-03
I domini production sono stati RIMOSSI dal router Traefik: il DNS punta ancora
all'hosting precedente e la challenge ACME falliva in loop ogni ora (rischio
rate-limit Let's Encrypt, 22 errori/24h sui log Traefik). Il compose contiene
un commento AL CUTOVER accanto alla rule con le righe esatte da riattivare
(Host production + label tls.domains). Al cutover: riattivare le label,
docker compose up -d, verificare emissione certificato.
Punti aperti
- attendere cambio nameserver da parte del cliente;
- dopo cambio verificare NS, A, certificato Let's Encrypt e HTTPS pubblico.
- al cutover: riattivare i domini production nel router Traefik (commento AL CUTOVER nel compose).
Upload media / Storage Spaces (risolto 2026-07-19)
Gli upload dell'area admin (media library) usano DigitalOcean Spaces via
presigned URL (src/lib/storage/server → createUploadTarget, client
src/lib/storage/client-upload). Il client chiede un target di upload alla
route, riceve un uploadUrl presigned (ACL public-read) e fa il PUT
direttamente su Spaces.
Bug risolto: in produzione SPACES_ACCESS_KEY_ID e SPACES_SECRET_ACCESS_KEY
erano vuote ("") — le chiavi c'erano ma i valori no. Con
STORAGE_PROVIDER=spaces, createUploadTarget chiamava
requireEnv('SPACES_ACCESS_KEY_ID') e lanciava
Missing required environment variable: SPACES_ACCESS_KEY_ID, quindi la
generazione del target falliva e l'upload non partiva. Nessuno l'aveva ancora
notato (nessun errore nei log: feature non usata di recente).
Fix (env-only, nessun rebuild): popolate le due credenziali riusando quelle
del bucket condiviso obelica-assets-prod (già in uso da wash-dog), backup
dell'env salvato accanto al file, container ricreato
(docker compose up -d --force-recreate --no-build).
Verifica: route upload-target raggiungibile (401 senza auth = modulo storage
ok, nessun problema di bundling del presigner); flusso presigned reale testato
con le credenziali → PUT 200 + GET pubblica 200 image/png sul prefisso
dell'app.
Nota: stesso identico problema che aveva sonja-trekking (vedi sua scheda).
Tutte le app condividono il bucket obelica-assets-prod, namespacato con
SPACES_APP_PREFIX.