Sonja Trekking
Scheda operativa per sonja-trekking
Sonja Trekking
Stato operativo
Produzione migrata su DigitalOcean DNS e VPS il 2026-07-01.
Runtime e deploy
| Voce | Valore |
|---|---|
| Repo | /opt/obelica/repos/sonja-trekking |
| Container | sonja-trekking |
| Stack | Next.js |
| Porta interna | 3000 |
| Env file | /opt/obelica/secrets/apps/sonja-trekking.env |
| Deploy | next-docker |
DNS e TLS
Dominio produzione: sonjatrekking.com, www.sonjatrekking.com.
Nameserver: DigitalOcean.
Record preservati: Google Workspace, SPF, DKIM Google, DMARC, Stripe custom email domain, CAA.
TLS Let's Encrypt emesso per sonjatrekking.com con SAN www.sonjatrekking.com.
Database, storage e backup
Database su DigitalOcean Managed PostgreSQL. Storage migrato verso DigitalOcean Spaces. Backup Obelica copre repo/config; database e Spaces seguono policy dedicate.
Risolto definitivamente il 2026-07-03: il container in produzione girava con
STORAGE_PROVIDER non impostato → default vercel (upload verso Vercel
Blob). Interventi:
- env allineato (blocco
SPACES_*completo +STORAGE_PROVIDER=spaces, backup insonja-trekking.env.bak-20260703); - container riavviato e verificato (HTTP 200 su produzione);
- verificato via query diretta che il DB non contiene URL
blob.vercel-storage.comresidui (0 su 22 tour): nessuna migrazione necessaria, quella del 2026-07-01 era completa.
Nota: il BLOB_READ_WRITE_TOKEN residuo nell'env risulta scaduto/revocato
("Access denied" dall'API Vercel Blob): eventuali upload admin tentati tra il
cutover del 2026-07-01 e il 2026-07-03 sono falliti. Da oggi gli upload vanno
su Spaces. Al primo upload reale conviene una verifica manuale. Cleanup
futuro: rimuovere dall'env le variabili morte (BLOB_READ_WRITE_TOKEN,
VERCEL_*, NEON_PROJECT_ID) e sistemare il DATABASE_CA_CERT multilinea
non quotato.
Upload immagini admin: credenziali Spaces mancanti (risolto 2026-07-19)
La "verifica manuale al primo upload" preannunciata sopra ha confermato il
problema: gli upload immagine dall'admin fallivano con
Error: Missing required environment variable: SPACES_ACCESS_KEY_ID
(loggato dal container). Il blocco SPACES_* aggiunto il 2026-07-03 aveva
le chiavi presenti ma i valori delle credenziali vuoti (SPACES_ACCESS_KEY_ID
e SPACES_SECRET_ACCESS_KEY = ""): mai compilati. Tutte le altre variabili
Spaces (endpoint, region, bucket, base URL) erano corrette.
Le app Obelica condividono un unico bucket Spaces (obelica-assets-prod,
regione fra1), namespacato per app con SPACES_APP_PREFIX. Le credenziali
valide (già in uso da wash-dog-ferrara-admin) sono state riusate anche per
sonja-trekking. Interventi:
- popolate
SPACES_ACCESS_KEY_IDeSPACES_SECRET_ACCESS_KEYin/opt/obelica/secrets/apps/sonja-trekking.env(backupsonja-trekking.env.bak-20260719...); nessuna altra riga modificata; - container ricreato (
docker compose up -d --force-recreate --no-build), fix env-only (nessun rebuild/codice); - verifica E2E: replica locale con le stesse env (DB via tunnel SSH, Spaces
reali) → upload
200+ create escursione persistita; e upload reale suhttps://www.sonjatrekking.com/api/upload-image→200con URL Spaces pubblicamente raggiungibile (200 image/png).
Nota: tulpa-studio e alessandro-zucchini hanno lo stesso problema di
credenziali Spaces vuote nei rispettivi env (upload rotti se/quando usati).
Feature AI: traduzione admin (IT to EN, DE)
L'area admin ha un pulsante "Traduci IT to EN, DE" (route
app/api/translate/route.ts) che usa il Vercel AI Gateway via
createGateway dell'AI SDK, modello openai/gpt-4.1-mini. La route legge
la chiave da process.env.AI_GATEWAY_API_KEY.
Risolto il 2026-07-19: dopo la migrazione da Vercel a Forgejo la feature
dava "Errore durante la traduzione". Causa: in produzione AI_GATEWAY_API_KEY
non era mai stata impostata; il container si appoggiava al VERCEL_OIDC_TOKEN
residuo nell'env (token a vita breve iniettato dalla Vercel CLI, ora scaduto)
che su Vercel autenticava automaticamente il gateway. Fuori da Vercel quel
meccanismo non esiste piu'.
Interventi:
- aggiunta
AI_GATEWAY_API_KEY(API key Vercel AI Gateway, prefissovck_) a/opt/obelica/secrets/apps/sonja-trekking.env(backupsonja-trekking.env.bak-20260719...); nessuna variabile esistente rimossa; - container ricreato per applicare la nuova env;
- hardening della route (commit
52c2b3d): guard esplicito quando la chiave manca e dettaglio errore in risposta, per rendere diagnosticabile in futuro questo tipo di failure. Push sumainverificato via autodeploy (smoke 200); - verifica end-to-end: chiamata reale al gateway dall'interno del container
(
HTTP 200, output{"en":"mountain","de":"Berg"}).
Nota cleanup futuro: VERCEL_OIDC_TOKEN e le altre VERCEL_* restano nell'env
ma sono morte; vanno rimosse insieme alle variabili gia' segnalate sopra.
Fix admin del flusso escursioni (commit a780b81, 2026-07-19)
Durante la verifica end-to-end del flusso di creazione sono emersi e stati corretti alcuni bug preesistenti (non legati all'upload):
UpdateTournon salvavastarred: il toggle "In evidenza" in modifica veniva ignorato pur mostrando "Escursione aggiornata!". Ora persiste.CreateTour/UpdateTour/DeleteTourByID/SetFavouriteTourrivalidavano solo/admin/tours: le pagine pubbliche (home featured, listing, dettaglio, ISR 30-60 min) restavano stale. AggiuntorevalidatePath('/', 'layout').submitProgramTourpoteva restituiresuccesssenza creare eventi (tipo/campi incoerenti o nessuna data nel range): aggiunte guardie esplicite.GetTourByIdora selezionachildren; la edit page usa il valore reale.
Deploy via autodeploy (smoke 200). Verifica: UpdateTour persiste starred
senza toccare gli altri campi (test in locale con env di prod).
Verifiche
Produzione:
https://sonjatrekking.com/ 200 -> https://www.sonjatrekking.com/it
https://www.sonjatrekking.com/ 200 -> /itRunbook: Pre-cutover Sonja Trekking.