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图像宽度(像素)
heightinteger图像高度(像素)
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