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

Baza danych

SnapOtter używa PostgreSQL 17 z Drizzle ORM (pg-core / node-postgres) do trwałego przechowywania danych. Schemat jest zdefiniowany w apps/api/src/db/schema.ts.

Połączenie konfiguruje się za pomocą zmiennej środowiskowej DATABASE_URL (domyślnie postgres://snapotter:snapotter@postgres:5432/snapotter). W Docker Compose kontener Postgres przechowuje swoje dane w nazwanym wolumenie SnapOtter-pgdata.

Tabele

users

Przechowuje konta użytkowników. Tworzone automatycznie przy pierwszym uruchomieniu na podstawie DEFAULT_USERNAME i DEFAULT_PASSWORD.

KolumnaTypUwagi
iduuidKlucz główny
usernamevarcharUnikalna, wymagana
passwordHashvarcharHash scrypt
rolevarcharadmin, editor lub user
mustChangePasswordbooleanFlaga wymuszonego resetu hasła
createdAttimestampCzas utworzenia
updatedAttimestampCzas ostatniej aktualizacji

sessions

Aktywne sesje logowania. Każdy wiersz wiąże token sesji z użytkownikiem.

KolumnaTypUwagi
idvarcharKlucz główny (token sesji)
userIduuidKlucz obcy do users.id
expiresAttimestampCzas wygaśnięcia
createdAttimestampCzas utworzenia

teams

Grupy służące do organizowania użytkowników. Administratorzy mogą przypisywać użytkowników do zespołów.

KolumnaTypOpis
iduuidKlucz główny
namevarchar (unikalna, maks. 50 znaków)Nazwa zespołu
createdAttimestampCzas utworzenia

api_keys

Klucze API do dostępu programowego. Surowy klucz jest pokazywany jednorazowo podczas tworzenia; przechowywany jest tylko jego hash.

KolumnaTypUwagi
iduuidKlucz główny
userIduuidKlucz obcy do users.id
keyHashvarcharHash scrypt klucza
namevarcharEtykieta podana przez użytkownika
createdAttimestampCzas utworzenia
lastUsedAttimestampAktualizowany przy każdym uwierzytelnionym żądaniu

Klucze mają prefiks si_, po którym następuje 96 znaków szesnastkowych (48 losowych bajtów).

pipelines

Zapisane łańcuchy narzędzi, które użytkownicy tworzą w interfejsie.

KolumnaTypUwagi
iduuidKlucz główny
namevarcharNazwa potoku
descriptionvarcharOpcjonalny opis
stepsjsonbTablica obiektów { toolId, settings }
createdAttimestampCzas utworzenia

user_files

Trwała biblioteka plików ze śledzeniem łańcucha wersji. Każdy krok przetwarzania, który zapisuje wynik, tworzy nowy wiersz powiązany z rodzicem przez parentId, tworząc drzewo wersji.

KolumnaTypOpis
iduuidKlucz główny
userIduuidKlucz obcy do users (CASCADE DELETE)
originalNamevarcharOryginalna nazwa przesłanego pliku
storedNamevarcharNazwa pliku na dysku
mimeTypevarcharTyp MIME
sizeintegerRozmiar pliku w bajtach
widthintegerSzerokość obrazu w px
heightintegerWysokość obrazu w px
versionintegerNumer wersji (1 = oryginał)
parentIduuid lub nullKlucz obcy do user_files (wersja rodzica)
toolChainjsonbIdentyfikatory narzędzi zastosowane w kolejności, aby wytworzyć tę wersję
createdAttimestampCzas utworzenia

jobs

Śledzi zadania przetwarzania na potrzeby raportowania postępu i porządkowania.

KolumnaTypUwagi
iduuidKlucz główny
typevarcharIdentyfikator narzędzia lub potoku
statusvarcharqueued, processing, completed lub failed
progressrealUłamek 0.0-1.0
inputFilesjsonbTablica ścieżek plików wejściowych
outputPathvarcharŚcieżka do pliku wynikowego
settingsjsonbUżyte ustawienia narzędzia
errorvarcharKomunikat o błędzie w razie niepowodzenia
createdAttimestampCzas utworzenia
completedAttimestampCzas zakończenia

settings

Magazyn klucz-wartość dla ustawień obowiązujących w całym serwerze, które administratorzy mogą zmieniać z poziomu interfejsu.

KolumnaTypUwagi
keyvarcharKlucz główny
valuevarcharWartość ustawienia
updatedAttimestampCzas ostatniej aktualizacji

roles

Role niestandardowe z uprawnieniami o dużej szczegółowości.

KolumnaTypUwagi
iduuidKlucz główny
namevarcharUnikalna nazwa roli
descriptionvarcharOpcjonalny opis
permissionsjsonbTablica ciągów uprawnień
createdAttimestampCzas utworzenia

audit_log

Dziennik działań istotnych dla bezpieczeństwa.

KolumnaTypUwagi
iduuidKlucz główny
userIduuidKlucz obcy do users
actionvarcharTyp działania
detailsjsonbDane specyficzne dla działania
createdAttimestampCzas działania

Migracje

Drizzle zajmuje się migracjami schematu. Pliki migracji znajdują się w apps/api/drizzle/. Podczas developmentu:

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

W środowisku produkcyjnym oczekujące migracje są stosowane automatycznie przy uruchomieniu.

Kopia zapasowa i przywracanie

Relacyjna baza danych znajduje się w wolumenie SnapOtter-pgdata kontenera Postgres, a nie w wolumenie /data aplikacji.

Opcja 1: pg_dump (zalecana)

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

Opcja 2: Migawka wolumenu

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 .

Migracja z 1.x (SQLite)

Aktualizacja z SnapOtter 1.x ma własny przewodnik: zobacz Aktualizacja z 1.x do 2.0. W skrócie, użyj ponownie istniejącego wolumenu /data, a 2.0 automatycznie wykryje i zaimportuje /data/snapotter.db przy pierwszym uruchomieniu (lub ustaw SQLITE_MIGRATE_PATH, aby wskazać go jawnie). Najpierw utwórz kopię zapasową całego wolumenu /data, a nie tylko snapotter.db: 1.x używa trybu SQLite WAL, więc zatrzymany kontener często pozostawia większość swoich danych w snapotter.db-wal obok niemal pustego snapotter.db.