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

資料庫

SnapOtter 使用 PostgreSQL 17 搭配 Drizzle ORM(pg-core/node-postgres)來持久化資料。結構定義於 apps/api/src/db/schema.ts

連線透過 DATABASE_URL 環境變數設定(預設為 postgres://snapotter:snapotter@postgres:5432/snapotter)。在 Docker Compose 中,Postgres 容器把資料儲存在 SnapOtter-pgdata 具名磁碟區。

資料表

users

儲存使用者帳號。首次執行時,會自動從 DEFAULT_USERNAMEDEFAULT_PASSWORD 建立。

欄位型別說明
iduuid主鍵
usernamevarchar唯一、必填
passwordHashvarcharscrypt 雜湊
rolevarcharadmineditoruser
mustChangePasswordboolean強制重設密碼旗標
createdAttimestamp建立時間
updatedAttimestamp最後更新時間

sessions

有效的登入工作階段。每一列把一個工作階段權杖繫結到一位使用者。

欄位型別說明
idvarchar主鍵(工作階段權杖)
userIduuid指向 users.id 的外鍵
expiresAttimestamp到期時間
createdAttimestamp建立時間

teams

用於組織使用者的群組。管理員可以把使用者指派到團隊。

欄位型別描述
iduuid主鍵
namevarchar(唯一,最多 50 個字元)團隊名稱
createdAttimestamp建立時間

api_keys

供程式化存取使用的 API 金鑰。原始金鑰只在建立時顯示一次;僅儲存其雜湊值。

欄位型別說明
iduuid主鍵
userIduuid指向 users.id 的外鍵
keyHashvarchar金鑰的 scrypt 雜湊
namevarchar使用者提供的標籤
createdAttimestamp建立時間
lastUsedAttimestamp每次通過驗證的請求時更新

金鑰以 si_ 為前綴,後接 96 個十六進位字元(48 個隨機位元組)。

pipelines

使用者在 UI 中建立的已儲存工具鏈。

欄位型別說明
iduuid主鍵
namevarchar管線名稱
descriptionvarchar選填的描述
stepsjsonb{ toolId, settings } 物件的陣列
createdAttimestamp建立時間

user_files

具有版本鏈追蹤的持久化檔案庫。每個儲存結果的處理步驟都會建立一個新列,透過 parentId 連結到它的父列,形成一棵版本樹。

欄位型別描述
iduuid主鍵
userIduuid指向 users 的外鍵(CASCADE DELETE)
originalNamevarchar原始上傳檔名
storedNamevarchar磁碟上的檔名
mimeTypevarcharMIME 類型
sizeinteger檔案大小(位元組)
widthinteger影像寬度(px)
heightinteger影像高度(px)
versioninteger版本編號(1 = 原始)
parentIduuid 或 null指向 user_files 的外鍵(父版本)
toolChainjsonb依序套用以產生此版本的工具 ID
createdAttimestamp建立時間

jobs

追蹤處理工作,以進行進度回報與清理。

欄位型別說明
iduuid主鍵
typevarchar工具或管線識別碼
statusvarcharqueuedprocessingcompletedfailed
progressreal0.0-1.0 的比例
inputFilesjsonb輸入檔案路徑的陣列
outputPathvarchar結果檔案的路徑
settingsjsonb使用的工具設定
errorvarchar失敗時的錯誤訊息
createdAttimestamp建立時間
completedAttimestamp完成時間

settings

供管理員可從 UI 變更的伺服器層級設定的鍵值儲存區。

欄位型別說明
keyvarchar主鍵
valuevarchar設定值
updatedAttimestamp最後更新時間

roles

具有細緻權限的自訂角色。

欄位型別說明
iduuid主鍵
namevarchar唯一角色名稱
descriptionvarchar選填的描述
permissionsjsonb權限字串的陣列
createdAttimestamp建立時間

audit_log

與安全性相關的動作記錄。

欄位型別說明
iduuid主鍵
userIduuid指向 users 的外鍵
actionvarchar動作類型
detailsjsonb動作特定的資料
createdAttimestamp動作時間

遷移

Drizzle 處理結構遷移。遷移檔案位於 apps/api/drizzle/。在開發期間:

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

在生產環境中,待處理的遷移會在啟動時自動套用。

備份與還原

關聯式資料庫位於 Postgres 容器的 SnapOtter-pgdata 磁碟區,而非應用程式的 /data 磁碟區。

選項 1:pg_dump(建議)

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

選項 2:磁碟區快照

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 .

從 1.x(SQLite)遷移

從 SnapOtter 1.x 升級有其專屬指南:見從 1.x 升級到 2.0。簡而言之,重複使用你既有的 /data 磁碟區,2.0 會在首次開機時自動偵測並匯入 /data/snapotter.db(或設定 SQLITE_MIGRATE_PATH 明確指向它)。請先備份整個 /data 磁碟區,而不只是 snapotter.db:1.x 使用 SQLite 的 WAL 模式,所以一個已停止的容器往往會把它大部分的資料留在 snapotter.db-wal 中,旁邊只有一個幾乎空白的 snapotter.db