Configurazione di Vault per il Self-Hosting
Switchbord memorizza i segreti per singolo workspace in Supabase Vault — un’estensione Postgres che cifra i segreti a livello di database. Questa pagina copre ciò che chi effettua il self-hosting deve sapere per far funzionare correttamente il vault, specialmente quando si gestiscono più workspace.Panoramica: Due Modalità di Risoluzione dei Segreti
Switchbord supporta due approcci per fornire segreti a runtime come il token di accesso Meta: Modalità Vault (predefinita, consigliata) I segreti sono memorizzati per singolo workspace invault.secrets, collegati a ciascun workspace tramite app_private.workspace_secret_bindings. Il worker li legge a runtime usando funzioni RPC di Supabase. Questo è l’approccio corretto per qualsiasi deployment con più di un workspace.
Fallback su variabile d’ambiente (solo workspace singolo)
Se SELF_HOSTED=true è impostato e una lettura del vault fallisce, il worker ricorre a WHATSAPP_META_ACCESS_TOKEN dall’ambiente. Questa è una comodità per gli operatori che gestiscono un singolo workspace e vogliono saltare del tutto la configurazione del vault.
Perché i Deployment Multi-Tenant Devono Usare Vault
Quando il worker elabora un messaggio in uscita, risolve il token di accesso Meta cercando il workspace che possiede la conversazione. In modalità vault, chiamasb_read_workspace_secret(workspace_id, 'meta-access-token') — una ricerca delimitata che restituisce solo il segreto appartenente a quel workspace.
Con SELF_HOSTED=true, la ricerca viene saltata del tutto e il valore della variabile d’ambiente viene restituito indipendentemente da quale workspace stia effettuando la richiesta. Non c’è alcun isolamento per singolo workspace. Un secondo workspace aggiunto successivamente utilizzerà silenziosamente il token del primo workspace, il che fallirà oppure — peggio — avrà successo con l’account sbagliato.
Se hai inizialmente effettuato il deployment con
SELF_HOSTED=true per un singolo workspace e ora stai aggiungendo un secondo workspace, devi rimuovere quel flag, configurare i segreti del vault per entrambi i workspace e riavviare il worker prima che il secondo workspace funzioni correttamente.Come i Segreti Fluiscono Attraverso il Sistema
1
L'operatore salva una credenziale in Settings
L’operatore apre Settings → Provider e inserisce un token di accesso Meta (o una API key per un provider AI). L’app web Switchbord lo invia a
/api/settings/secrets.2
L'API memorizza il segreto in Supabase Vault
La route API chiama
storeWorkspaceSecret(workspaceId, secretKind, value), che chiama vault.create_secret() e inserisce una riga in app_private.workspace_secret_bindings che mappa l’ID workspace e il tipo di segreto all’ID del segreto nel vault.3
Il worker legge il segreto al momento dell'invio
Quando il worker è sul punto di inviare un messaggio, chiama la funzione RPC di Supabase
sb_read_workspace_secret con l’ID workspace e il tipo di segreto. La funzione viene eseguita con privilegi SECURITY DEFINER, legge da vault.secrets e restituisce il valore decifrato. Non è richiesta alcuna connessione diretta al database dal worker.Requisiti di Configurazione Supabase
Estensione Vault
Supabase Vault è abilitata per impostazione predefinita su tutti i progetti Supabase Cloud. Se stai eseguendo un’istanza Supabase self-hosted, conferma che l’estensione sia abilitata:Le migrazioni di Switchbord creano automaticamente anche lo schema
app_private e la tabella workspace_secret_bindings quando esegui supabase db push o applichi le migrazioni. Non è necessario crearle manualmente.Funzioni RPC
Il worker usa due funzioni wrapper RPC pubbliche che devono essere presenti nel tuo database:sb_read_workspace_secret(p_workspace_id uuid, p_kind text)— restituisce il valore decifrato del segreto per un workspace e un tipo di segretosb_resolve_workspace_by_verify_token(p_verify_token text)— restituisce l’ID workspace corrispondente a un dato verify token Meta
function does not exist, ri-esegui le tue migrazioni sul database target:
Memorizzazione dei Segreti
Ci sono due modi per popolare i segreti del vault per un workspace: Interfaccia Settings (consigliata) Apri Settings → Provider nell’app web Switchbord e inserisci le credenziali direttamente. L’interfaccia chiama automaticamente l’API di scrittura del vault. Non è richiesto alcun accesso diretto al database. Editor SQL della Dashboard Supabase Per la configurazione iniziale o il caricamento massivo, puoi inserire i segreti direttamente:Variabili d’Ambiente del Worker
Il worker necessita solo di una chiave service role di Supabase per leggere dal vault. Non è richiesta alcuna connessione diretta al database per le letture. Obbligatorie:
Opzionali:
Riferimento dei Tipi di Segreto
Risoluzione dei Problemi
vault_unavailable
L’estensione vault non è abilitata oppure lo schema app_private è assente.
- Conferma che l’estensione vault esista (vedi il controllo SQL sopra)
- Ri-esegui le migrazioni di Switchbord:
supabase db push - Conferma che
SUPABASE_SECRET_KEYdel worker sia una chiave service role valida, non la chiave anon
vault_read_error
La funzione RPC esiste ma ha restituito un errore durante il tentativo di leggere un segreto.
- Controlla che
sb_read_workspace_secretsia stata creata con successo dalle tue migrazioni - Conferma che
SUPABASE_SECRET_KEYabbia i permessi service role (la chiave anon non può chiamare funzioniSECURITY DEFINERche verificanoservice_role) - Nell’editor SQL di Supabase, verifica che la funzione esista:
\df sb_read_workspace_secret
vault_secret_missing
La funzione è stata eseguita con successo ma non ha trovato alcun binding per il workspace e il tipo di segreto richiesti. Il segreto non è mai stato memorizzato.
- Apri Settings → Provider per il workspace interessato e salva la credenziale mancante
- Oppure inserisci il binding manualmente usando l’SQL sopra
- Verifica che l’ID workspace in
app_private.workspace_secret_bindingscorrisponda al workspace che effettua la richiesta
Il worker invia messaggi con l’account sbagliato
Questo è un sintomo diSELF_HOSTED=true impostato in un deployment multi-workspace. Viene usata la credenziale di fallback della variabile d’ambiente invece dei segreti del vault per singolo workspace. Rimuovi SELF_HOSTED=true dall’ambiente del worker e assicurati che tutti i workspace abbiano i propri segreti configurati nel vault.
Guide Correlate
- Vault Architecture — dettagli interni, design dello schema e specifiche di cifratura
- Secrets and Encryption — policy di sicurezza e controlli di accesso
- Meta Credential Setup — come ottenere le credenziali che memorizzerai nel vault
- Webhooks — configurazione del token di verifica del webhook Meta