Ta strona została przetłumaczona maszynowo. Zauważyłeś błąd?Pomóż ją ulepszyć.
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. Zapisana edycja jest domyślnie wstawiana jako niezależny wiersz główny („zapisz jako nowy": version 1, parentId null, więc oryginał pozostaje na liście) albo jako wersja powiązana z rodzicem, gdy nadpisujesz oryginał (parentId ustawiony, version zwiększony, zastępując go). Kolumna toolChain zapisuje zastosowane narzędzia.

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

user_preferences

Stan interfejsu dla poszczególnych użytkowników, kluczowany nazwą preferencji. Przechowuje przypięte narzędzia strony głównej, zapisywane przez PUT /api/v1/preferences.

KolumnaTypUwagi
userIdtextKlucz obcy do users, kasowanie kaskadowe. Razem z key tworzy klucz główny
keytextNazwa preferencji. Razem z userId tworzy klucz główny
valuejsonbZawartość preferencji
updatedAttimestampOstatni zapis

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.

Utwórz kopię zapasową i przywróć

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

Logiczna kopia zapasowa z walidacją (zalecane)

bash
# Dump into PostgreSQL's portable custom archive format
docker exec SnapOtter-postgres \
  pg_dump --format=custom --no-owner -U snapotter snapotter > snapotter.dump
test -s snapotter.dump
docker exec -i SnapOtter-postgres pg_restore --list < snapotter.dump >/dev/null

# Restore into a fresh/disposable target first and fail on the first SQL error
docker exec -i SnapOtter-postgres \
  pg_restore --exit-on-error --clean --if-exists --no-owner \
  -U snapotter -d snapotter < snapotter.dump

Ten zrzut bazy danych nie zawiera zapisanych obiektów biblioteki w /data/files ani trwałego stanu BullMQ w Redis. Utwórz kopię zapasową i przywróć te dane, stosując skoordynowaną procedurę w Bezpieczeństwo i wzmacnianie.

Migawka zimnego woluminu

bash
# Stop every service first, then use your storage platform to snapshot the
# PostgreSQL, app-data, and Redis volumes as one crash-consistent set.
docker compose -f docker/docker-compose.yml stop

Nie kopiuj aktywnego katalogu danych PostgreSQL za pomocą tar. Twórz przedrostki nazw woluminów według projektu, więc rozpoznaj identyfikatory zamontowanych woluminów z docker inspect lub platformy pamięci masowej, zamiast przyjmować dosłowną etykietę SnapOtter-pgdata.

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.