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

Base de données

SnapOtter utilise PostgreSQL 17 avec Drizzle ORM (pg-core / node-postgres) pour la persistance des données. Le schéma est défini dans apps/api/src/db/schema.ts.

La connexion est configurée via la variable d'environnement DATABASE_URL (par défaut postgres://snapotter:snapotter@postgres:5432/snapotter). Dans Docker Compose, le conteneur Postgres stocke ses données dans le volume nommé SnapOtter-pgdata.

Tables

users

Stocke les comptes utilisateurs. Créé automatiquement au premier démarrage à partir de DEFAULT_USERNAME et DEFAULT_PASSWORD.

ColonneTypeNotes
iduuidClé primaire
usernamevarcharUnique, requis
passwordHashvarcharHachage scrypt
rolevarcharadmin, editor ou user
mustChangePasswordbooleanIndicateur de réinitialisation forcée du mot de passe
createdAttimestampDate de création
updatedAttimestampDate de dernière mise à jour

sessions

Sessions de connexion actives. Chaque ligne associe un jeton de session à un utilisateur.

ColonneTypeNotes
idvarcharClé primaire (jeton de session)
userIduuidClé étrangère vers users.id
expiresAttimestampDate d'expiration
createdAttimestampDate de création

teams

Groupes pour organiser les utilisateurs. Les administrateurs peuvent affecter des utilisateurs à des équipes.

ColonneTypeDescription
iduuidClé primaire
namevarchar (unique, 50 caractères max)Nom de l'équipe
createdAttimestampDate de création

api_keys

Clés API pour l'accès programmatique. La clé brute n'est affichée qu'une seule fois lors de la création ; seul le hachage est stocké.

ColonneTypeNotes
iduuidClé primaire
userIduuidClé étrangère vers users.id
keyHashvarcharHachage scrypt de la clé
namevarcharLibellé fourni par l'utilisateur
createdAttimestampDate de création
lastUsedAttimestampMise à jour à chaque requête authentifiée

Les clés sont préfixées par si_ suivi de 96 caractères hexadécimaux (48 octets aléatoires).

pipelines

Chaînes d'outils enregistrées que les utilisateurs créent dans l'interface.

ColonneTypeNotes
iduuidClé primaire
namevarcharNom du pipeline
descriptionvarcharDescription facultative
stepsjsonbTableau d'objets { toolId, settings }
createdAttimestampDate de création

user_files

Bibliothèque de fichiers persistante avec suivi de la chaîne de versions. Chaque étape de traitement qui enregistre un résultat crée une nouvelle ligne liée à son parent via parentId, formant un arbre de versions.

ColonneTypeDescription
iduuidClé primaire
userIduuidFK vers users (CASCADE DELETE)
originalNamevarcharNom de fichier d'envoi d'origine
storedNamevarcharNom de fichier sur le disque
mimeTypevarcharType MIME
sizeintegerTaille du fichier en octets
widthintegerLargeur de l'image en px
heightintegerHauteur de l'image en px
versionintegerNuméro de version (1 = original)
parentIduuid ou nullFK vers user_files (version parente)
toolChainjsonbID d'outils appliqués dans l'ordre pour produire cette version
createdAttimestampDate de création

jobs

Suit les tâches de traitement pour le rapport de progression et le nettoyage.

ColonneTypeNotes
iduuidClé primaire
typevarcharIdentifiant d'outil ou de pipeline
statusvarcharqueued, processing, completed ou failed
progressrealFraction 0.0-1.0
inputFilesjsonbTableau de chemins de fichiers d'entrée
outputPathvarcharChemin vers le fichier de résultat
settingsjsonbParamètres d'outil utilisés
errorvarcharMessage d'erreur en cas d'échec
createdAttimestampDate de création
completedAttimestampDate d'achèvement

settings

Magasin clé-valeur pour les paramètres à l'échelle du serveur que les administrateurs peuvent modifier depuis l'interface.

ColonneTypeNotes
keyvarcharClé primaire
valuevarcharValeur du paramètre
updatedAttimestampDate de dernière mise à jour

roles

Rôles personnalisés avec des permissions granulaires.

ColonneTypeNotes
iduuidClé primaire
namevarcharNom de rôle unique
descriptionvarcharDescription facultative
permissionsjsonbTableau de chaînes de permission
createdAttimestampDate de création

audit_log

Journal des actions pertinentes pour la sécurité.

ColonneTypeNotes
iduuidClé primaire
userIduuidFK vers users
actionvarcharType d'action
detailsjsonbDonnées spécifiques à l'action
createdAttimestampDate de l'action

Migrations

Drizzle gère les migrations de schéma. Les fichiers de migration se trouvent dans apps/api/drizzle/. Pendant le développement :

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

En production, les migrations en attente sont appliquées automatiquement au démarrage.

Sauvegarde et restauration

La base de données relationnelle se trouve dans le volume SnapOtter-pgdata du conteneur Postgres, et non dans le volume /data de l'application.

Option 1 : pg_dump (recommandé)

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

Option 2 : Instantané de 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 .

Migration depuis la 1.x (SQLite)

La mise à niveau depuis SnapOtter 1.x a son propre guide : voir Mise à niveau de la 1.x vers la 2.0. En bref, réutilisez votre volume /data existant et la 2.0 détecte automatiquement et importe /data/snapotter.db au premier démarrage (ou définissez SQLITE_MIGRATE_PATH pour le pointer explicitement). Sauvegardez d'abord l'intégralité du volume /data, pas seulement snapotter.db : la 1.x utilise le mode WAL de SQLite, donc un conteneur arrêté laisse souvent la plupart de ses données dans snapotter.db-wal à côté d'un snapotter.db presque vide.