> ## Documentation Index
> Fetch the complete documentation index at: https://supastack.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For the full documentation corpus in one file, fetch: https://supastack.dev/llms-full.txt

# Modulo storage

Un contratto ObjectStorage, adattatori memory e compatibile S3.

## Procedura dettagliata per principianti

Prerequisiti: leggi le due guide per principianti di seguito, completa la configurazione locale del Web e apri questo monorepo alla radice nel tuo editor. Le impostazioni Web appartengono a `apps/web/.env.local`; Next.js non legge la radice `.env`. `/dashboard` nella modalità falsa predefinita è una demo senza database; `/auth` necessita di un database migrato.

Termini rapidi: uno spazio di lavoro è costituito da utenti, dati e impostazioni separati di un team. Il server è il backend affidabile; mantenere le chiavi del provider fuori dal browser e dal codice del telefono. Una migrazione è una modifica del database con versione che crea o aggiorna tabelle. Un modello AI è il motore che risponde; il catalogo dei modelli è l'elenco del server degli ID e dei prezzi dei modelli disponibili. Un fornitore è un servizio esterno come un servizio di intelligenza artificiale, posta elettronica o fatturazione. Un diritto è una concessione che consente a un'area di lavoro di utilizzare una funzionalità. Un webhook è un messaggio che un servizio invia allo URL di un altro servizio.

1. Per una prova senza credenziali, mantenere `STORAGE_PROVIDER=memory`. Se questo pagamento non ha un controllo di caricamento visibile, chiedi al tuo agente di codifica di ispezionare `apps/web/app/api/storage/avatar/route.ts`, `apps/web/app/api/storage/logo/route.ts`, `apps/web/app/api/storage/organization-logo/route.ts` e la pagina delle impostazioni corrispondenti prima di collegare una piccola immagine di esempio.

2. Per verificare la persistenza, impostare `STORAGE_PROVIDER=s3`, `STORAGE_REGION` e `STORAGE_BUCKET` in `apps/web/.env.local`, aggiungere localmente le credenziali di test solo del server e riavviare.

3. L'immagine dovrebbe essere ricaricata dalla memoria. I file di memoria scompaiono al riavvio del processo; per gli errori S3, controlla il bucket, l'endpoint e la policy di accesso.

Per il codice personalizzato, inizia con `prompts/README.md` in dotazione e copia il prompt più vicino: `prompts/new-app-screen.md` per la schermata di un'app o `prompts/new-landing-page.md` per una pagina pubblica. Per il lavoro su server, database o provider, assegna al tuo agente di codifica il compito di questa guida e chiedigli di leggere `AGENTS.md`, `.ai/PROJECT_CONTEXT.md` e i mirror `.ai/` corrispondenti; controllare gli esatti file sorgente nominati qui; elencare file e controlli prima della modifica; preservare la proprietà dello spazio di lavoro e i segreti solo del server; e mostrarti la differenza. Indicagli il comportamento desiderato, i campi di input e output, i ruoli consentiti, i successi e gli errori previsti e l'account, il fornitore o il dispositivo di prova. Utilizzare valori campione; non incollare mai un vero segreto.

[Prima di iniziare](https://supastack.dev/it/docs/web/before-you-start.md)

[Nozioni di base sui terminali](https://supastack.dev/it/docs/web/terminal-basics.md)

[Configurazione locale Web](https://supastack.dev/it/docs/web/ship-in-5-minutes.md)

[Messaggi dell'agente e memoria del progetto](https://supastack.dev/it/docs/web/agents.md)


## Seleziona il backend di archiviazione

`STORAGE_PROVIDER=memory` è l’impostazione predefinita senza credenziali. `local` scrive gli oggetti su disco in `STORAGE_LOCAL_DIR` (`./.data/storage` per impostazione predefinita, richiesto esplicitamente in produzione) e li trasmette tramite URL firmati con HMAC a scadenza su `/api/storage/local/[...key]` (`STORAGE_LOCAL_SIGNING_SECRET`, con fallback su `AUTH_SECRET`) per i deployment su singolo server. `s3` usa `apps/web/src/storage-runtime.ts` per comporre il client AWS SDK sul contratto essenziale `@supastack/storage`, supportando Supabase Storage e MinIO con URL path-style abilitati per impostazione predefinita.

```
STORAGE_PROVIDER=s3
STORAGE_REGION=us-east-1
STORAGE_BUCKET=your-product-bucket
# Set STORAGE_ACCESS_KEY_ID and STORAGE_SECRET_ACCESS_KEY on the server.
# Optional: STORAGE_ENDPOINT, STORAGE_FORCE_PATH_STYLE, STORAGE_PUBLIC_BASE_URL
# Self-hosted single-server disk storage:
# STORAGE_PROVIDER=local
# STORAGE_LOCAL_DIR=./.data/storage
# STORAGE_LOCAL_SIGNING_SECRET=
```


## Riutilizzare i limiti di caricamento

I percorsi spediti coprono oggetti, avatar, loghi di profili e loghi di organizzazioni sotto `/api/storage/`. Risolvono le autorizzazioni di identità/area di lavoro e convalidano la forma di caricamento prima dell'archiviazione. Ispeziona la politica di dimensione/tipo del percorso scelto invece di accettare chiavi arbitrarie dell'oggetto client.

Gli URL pubblici sono presentazioni, non autorizzazioni. Mantieni i contenuti protetti entro il limite di lettura verificato dell'applicazione e configura la policy bucket/CDN per i dati del tuo prodotto.


## Testare il comportamento di archiviazione reale

Testare caricamenti consentiti/negati, MIME e rifiuto delle dimensioni, percorsi di aree di lavoro esterne, oggetti mancanti e errori del provider. La modalità memoria non persiste tra i processi; verificare l'archiviazione e il recupero rispetto al backend selezionato prima del rilascio.

[Configurazione archiviazione Supabase](https://supastack.dev/it/docs/web/project-structure.md)

[Carica inventario percorsi](https://supastack.dev/it/docs/web/project-structure.md)


## Installazione e configurazione

packages/storage definisce l'interfaccia ObjectStorage — putObject, getObject e deleteObject sui locator di oggetti — con MemoryObjectStorage per test deterministici e S3CompatibleObjectStorage per bucket di produzione.

Le chiavi oggetto sono costruite con buildWorkspaceObjectKey e controllate con assertWorkspaceObjectKey, così ogni file archiviato è namespacato per workspace e scopo (avatar, file, logo). WorkspaceScopedStorageError scatta quando una chiave sfugge al suo workspace.

```
interface ObjectStorage {
  putObject(input: PutObjectInput): Promise<StoredObject>
  getObject(locator: ObjectLocator): Promise<StoredObject | undefined>
  deleteObject(locator: ObjectLocator): Promise<boolean>
  getPublicUrl(locator: ObjectLocator): string
}

key = {workspaceId}/{purpose}/{safeName}
```


## Flusso di implementazione

Le route applicative risolvono il workspace, validano l'upload, costruiscono la chiave con scope e chiamano l'adattatore — lo storage non vede mai un percorso client grezzo. Seleziona l'adattatore nell'ambiente server tramite STORAGE_PROVIDER e le sue credenziali.

Esponi le letture attraverso lo stesso confine di autorizzazione; servi URL pubblici solo per oggetti che il prodotto pubblica deliberatamente.


## Verifica e risoluzione dei problemi

MemoryObjectStorage mantiene i test unitari deterministici — asserisci chiavi, content type e dinieghi cross-workspace lì. Verifica l'adattatore S3 tramite il percorso smoke opzionale contro un bucket reale prima di rilasciare gli upload.


## Successivo

[Modulo API](https://supastack.dev/it/docs/modules/api.md)
