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

Database

SnapOtter menggunakan PostgreSQL 17 dengan Drizzle ORM (pg-core / node-postgres) untuk persistensi data. Skema didefinisikan di apps/api/src/db/schema.ts.

Koneksi dikonfigurasi melalui variabel lingkungan DATABASE_URL (default postgres://snapotter:snapotter@postgres:5432/snapotter). Di Docker Compose, kontainer Postgres menyimpan datanya di volume bernama SnapOtter-pgdata.

Tabel

users

Menyimpan akun pengguna. Dibuat otomatis pada saat pertama kali dijalankan dari DEFAULT_USERNAME dan DEFAULT_PASSWORD.

KolomTipeCatatan
iduuidPrimary key
usernamevarcharUnik, wajib
passwordHashvarcharhash scrypt
rolevarcharadmin, editor, atau user
mustChangePasswordbooleanFlag reset kata sandi paksa
createdAttimestampWaktu pembuatan
updatedAttimestampWaktu pembaruan terakhir

sessions

Sesi login aktif. Setiap baris mengaitkan token sesi ke seorang pengguna.

KolomTipeCatatan
idvarcharPrimary key (token sesi)
userIduuidForeign key ke users.id
expiresAttimestampWaktu kedaluwarsa
createdAttimestampWaktu pembuatan

teams

Grup untuk mengorganisasi pengguna. Admin dapat menetapkan pengguna ke tim.

KolomTipeDeskripsi
iduuidPrimary key
namevarchar (unik, maks 50 karakter)Nama tim
createdAttimestampWaktu pembuatan

api_keys

API key untuk akses secara programatik. Kunci mentah ditampilkan sekali saat pembuatan; hanya hash yang disimpan.

KolomTipeCatatan
iduuidPrimary key
userIduuidForeign key ke users.id
keyHashvarcharhash scrypt dari kunci
namevarcharLabel yang diberikan pengguna
createdAttimestampWaktu pembuatan
lastUsedAttimestampDiperbarui pada setiap permintaan terautentikasi

Kunci diberi awalan si_ diikuti oleh 96 karakter heksadesimal (48 byte acak).

pipelines

Rangkaian tool tersimpan yang dibuat pengguna di UI.

KolomTipeCatatan
iduuidPrimary key
namevarcharNama pipeline
descriptionvarcharDeskripsi opsional
stepsjsonbArray objek { toolId, settings }
createdAttimestampWaktu pembuatan

user_files

Pustaka file persisten dengan pelacakan rantai versi. Setiap langkah pemrosesan yang menyimpan hasil membuat baris baru yang tertaut ke induknya melalui parentId, membentuk sebuah pohon versi.

KolomTipeDeskripsi
iduuidPrimary key
userIduuidFK ke users (CASCADE DELETE)
originalNamevarcharNama file unggahan asli
storedNamevarcharNama file pada disk
mimeTypevarcharTipe MIME
sizeintegerUkuran file dalam byte
widthintegerLebar gambar dalam px
heightintegerTinggi gambar dalam px
versionintegerNomor versi (1 = asli)
parentIduuid atau nullFK ke user_files (versi induk)
toolChainjsonbID tool yang diterapkan secara berurutan untuk menghasilkan versi ini
createdAttimestampWaktu pembuatan

jobs

Melacak job pemrosesan untuk pelaporan progres dan pembersihan.

KolomTipeCatatan
iduuidPrimary key
typevarcharIdentifikasi tool atau pipeline
statusvarcharqueued, processing, completed, atau failed
progressrealFraksi 0.0-1.0
inputFilesjsonbArray path file input
outputPathvarcharPath ke file hasil
settingsjsonbPengaturan tool yang digunakan
errorvarcharPesan kesalahan jika gagal
createdAttimestampWaktu pembuatan
completedAttimestampWaktu penyelesaian

settings

Penyimpanan key-value untuk pengaturan seluruh server yang dapat diubah admin dari UI.

KolomTipeCatatan
keyvarcharPrimary key
valuevarcharNilai pengaturan
updatedAttimestampWaktu pembaruan terakhir

roles

Peran kustom dengan izin granular.

KolomTipeCatatan
iduuidPrimary key
namevarcharNama peran unik
descriptionvarcharDeskripsi opsional
permissionsjsonbArray string izin
createdAttimestampWaktu pembuatan

audit_log

Log aksi yang relevan dengan keamanan.

KolomTipeCatatan
iduuidPrimary key
userIduuidFK ke users
actionvarcharTipe aksi
detailsjsonbData khusus aksi
createdAttimestampWaktu aksi

Migrasi

Drizzle menangani migrasi skema. File migrasi berada di apps/api/drizzle/. Selama pengembangan:

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

Di produksi, migrasi yang tertunda diterapkan secara otomatis saat startup.

Pencadangan dan pemulihan

Database relasional berada di volume SnapOtter-pgdata kontainer Postgres, bukan di volume /data aplikasi.

Opsi 1: pg_dump (direkomendasikan)

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

Opsi 2: Snapshot 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 .

Migrasi dari 1.x (SQLite)

Memutakhirkan dari SnapOtter 1.x memiliki panduannya sendiri: lihat Memutakhirkan dari 1.x ke 2.0. Singkatnya, gunakan kembali volume /data Anda yang ada dan 2.0 otomatis mendeteksi serta mengimpor /data/snapotter.db pada boot pertama (atau atur SQLITE_MIGRATE_PATH untuk menunjuk ke sana secara eksplisit). Cadangkan seluruh volume /data terlebih dahulu, bukan hanya snapotter.db: 1.x menggunakan mode SQLite WAL, sehingga kontainer yang dihentikan sering meninggalkan sebagian besar datanya di snapotter.db-wal di samping snapotter.db yang hampir kosong.