Obelica Docs
Applicazioni

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

VoceValore
Repo/opt/obelica/repos/sonja-trekking
Containersonja-trekking
StackNext.js
Porta interna3000
Env file/opt/obelica/secrets/apps/sonja-trekking.env
Deploynext-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 in sonja-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.com residui (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_ID e SPACES_SECRET_ACCESS_KEY in /opt/obelica/secrets/apps/sonja-trekking.env (backup sonja-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 su https://www.sonjatrekking.com/api/upload-image200 con 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, prefisso vck_) a /opt/obelica/secrets/apps/sonja-trekking.env (backup sonja-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 su main verificato 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):

  • UpdateTour non salvava starred: il toggle "In evidenza" in modifica veniva ignorato pur mostrando "Escursione aggiornata!". Ora persiste.
  • CreateTour/UpdateTour/DeleteTourByID/SetFavouriteTour rivalidavano solo /admin/tours: le pagine pubbliche (home featured, listing, dettaglio, ISR 30-60 min) restavano stale. Aggiunto revalidatePath('/', 'layout').
  • submitProgramTour poteva restituire success senza creare eventi (tipo/campi incoerenti o nessuna data nel range): aggiunte guardie esplicite.
  • GetTourById ora seleziona children; 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 -> /it

Runbook: Pre-cutover Sonja Trekking.

On this page