This page was machine-translated. Spotted a mistake?Help improve it.
Skip to content

Database

SnapOtter usa PostgreSQL 17 con Drizzle ORM (pg-core / node-postgres) per la persistenza dei dati. Lo schema è definito in apps/api/src/db/schema.ts.

La connessione è configurata tramite la variabile d'ambiente DATABASE_URL (predefinita postgres://snapotter:snapotter@postgres:5432/snapotter). In Docker Compose, il container Postgres memorizza i suoi dati nel volume denominato SnapOtter-pgdata.

Tabelle

users

Memorizza gli account utente. Creata automaticamente al primo avvio da DEFAULT_USERNAME e DEFAULT_PASSWORD.

ColonnaTipoNote
iduuidChiave primaria
usernamevarcharUnivoco, obbligatorio
passwordHashvarcharHash scrypt
rolevarcharadmin, editor o user
mustChangePasswordbooleanFlag di reimpostazione forzata della password
createdAttimestampData di creazione
updatedAttimestampData dell'ultimo aggiornamento

sessions

Sessioni di login attive. Ogni riga associa un token di sessione a un utente.

ColonnaTipoNote
idvarcharChiave primaria (token di sessione)
userIduuidChiave esterna verso users.id
expiresAttimestampData di scadenza
createdAttimestampData di creazione

teams

Gruppi per organizzare gli utenti. Gli amministratori possono assegnare gli utenti ai team.

ColonnaTipoDescrizione
iduuidChiave primaria
namevarchar (univoco, max 50 caratteri)Nome del team
createdAttimestampData di creazione

api_keys

Chiavi API per l'accesso programmatico. La chiave grezza viene mostrata una sola volta alla creazione; viene memorizzato solo l'hash.

ColonnaTipoNote
iduuidChiave primaria
userIduuidChiave esterna verso users.id
keyHashvarcharHash scrypt della chiave
namevarcharEtichetta fornita dall'utente
createdAttimestampData di creazione
lastUsedAttimestampAggiornata a ogni richiesta autenticata

Le chiavi hanno il prefisso si_ seguito da 96 caratteri esadecimali (48 byte casuali).

pipelines

Catene di strumenti salvate che gli utenti creano nell'interfaccia.

ColonnaTipoNote
iduuidChiave primaria
namevarcharNome della pipeline
descriptionvarcharDescrizione facoltativa
stepsjsonbArray di oggetti { toolId, settings }
createdAttimestampData di creazione

user_files

Libreria di file persistente con tracciamento della catena delle versioni. Ogni passaggio di elaborazione che salva un risultato crea una nuova riga collegata al suo genitore tramite parentId, formando un albero delle versioni.

ColonnaTipoDescrizione
iduuidChiave primaria
userIduuidFK verso users (CASCADE DELETE)
originalNamevarcharNome del file di caricamento originale
storedNamevarcharNome del file su disco
mimeTypevarcharTipo MIME
sizeintegerDimensione del file in byte
widthintegerLarghezza dell'immagine in px
heightintegerAltezza dell'immagine in px
versionintegerNumero di versione (1 = originale)
parentIduuid o nullFK verso user_files (versione genitore)
toolChainjsonbID degli strumenti applicati in ordine per produrre questa versione
createdAttimestampData di creazione

jobs

Traccia i job di elaborazione per la segnalazione dell'avanzamento e la pulizia.

ColonnaTipoNote
iduuidChiave primaria
typevarcharIdentificatore dello strumento o della pipeline
statusvarcharqueued, processing, completed o failed
progressrealFrazione 0.0-1.0
inputFilesjsonbArray dei percorsi dei file di input
outputPathvarcharPercorso del file risultato
settingsjsonbImpostazioni dello strumento utilizzate
errorvarcharMessaggio di errore in caso di fallimento
createdAttimestampData di creazione
completedAttimestampData di completamento

settings

Archivio chiave-valore per le impostazioni a livello di server che gli amministratori possono modificare dall'interfaccia.

ColonnaTipoNote
keyvarcharChiave primaria
valuevarcharValore dell'impostazione
updatedAttimestampData dell'ultimo aggiornamento

roles

Ruoli personalizzati con permessi granulari.

ColonnaTipoNote
iduuidChiave primaria
namevarcharNome univoco del ruolo
descriptionvarcharDescrizione facoltativa
permissionsjsonbArray di stringhe di permesso
createdAttimestampData di creazione

audit_log

Registro delle azioni rilevanti per la sicurezza.

ColonnaTipoNote
iduuidChiave primaria
userIduuidFK verso users
actionvarcharTipo di azione
detailsjsonbDati specifici dell'azione
createdAttimestampData dell'azione

Migrazioni

Drizzle gestisce le migrazioni dello schema. I file di migrazione risiedono in apps/api/drizzle/. Durante lo sviluppo:

bash
cd apps/api
npx drizzle-kit generate   # generate a migration from schema changes
npx drizzle-kit migrate    # apply pending migrations

In produzione, le migrazioni in sospeso vengono applicate automaticamente all'avvio.

Backup e ripristino

Il database relazionale risiede nel volume SnapOtter-pgdata del container Postgres, non nel volume /data dell'app.

Opzione 1: pg_dump (consigliata)

bash
# Dump the database while the stack is running
docker exec SnapOtter-postgres pg_dump -U snapotter snapotter > backup.sql

# Restore into a fresh database
cat backup.sql | docker exec -i SnapOtter-postgres psql -U snapotter snapotter

Opzione 2: Snapshot del volume

bash
# Stop the stack, then snapshot the pgdata volume
docker compose down
docker run --rm -v SnapOtter-pgdata:/data -v $(pwd)/backup:/backup \
  alpine tar czf /backup/snapotter-pgdata.tar.gz -C /data .

Migrazione dalla 1.x (SQLite)

L'aggiornamento da SnapOtter 1.x ha una guida dedicata: vedi Aggiornamento dalla 1.x alla 2.0. In breve, riutilizza il tuo volume /data esistente e la 2.0 rileva e importa automaticamente /data/snapotter.db al primo avvio (oppure imposta SQLITE_MIGRATE_PATH per puntarvi esplicitamente). Esegui prima il backup dell'intero volume /data, non solo di snapotter.db: la 1.x usa la modalità WAL di SQLite, quindi un container arrestato lascia spesso la maggior parte dei suoi dati in snapotter.db-wal accanto a un snapotter.db quasi vuoto.