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_USERNAME и DEFAULT_PASSWORD.

СтолбецТипПримечания
iduuidПервичный ключ
usernamevarcharУникальный, обязательный
passwordHashvarcharscrypt-хеш
rolevarcharadmin, editor или user
mustChangePasswordbooleanФлаг принудительного сброса пароля
createdAttimestampВремя создания
updatedAttimestampВремя последнего обновления

sessions

Активные сессии входа. Каждая строка связывает токен сессии с пользователем.

СтолбецТипПримечания
idvarcharПервичный ключ (токен сессии)
userIduuidВнешний ключ к users.id
expiresAttimestampВремя истечения
createdAttimestampВремя создания

teams

Группы для организации пользователей. Администраторы могут назначать пользователей в команды.

СтолбецТипОписание
iduuidПервичный ключ
namevarchar (уникальный, макс. 50 символов)Название команды
createdAttimestampВремя создания

api_keys

API-ключи для программного доступа. Необработанный ключ показывается один раз при создании; хранится только хеш.

СтолбецТипПримечания
iduuidПервичный ключ
userIduuidВнешний ключ к users.id
keyHashvarcharscrypt-хеш ключа
namevarcharМетка, заданная пользователем
createdAttimestampВремя создания
lastUsedAttimestampОбновляется при каждом аутентифицированном запросе

Ключи имеют префикс si_, за которым следуют 96 hex-символов (48 случайных байт).

pipelines

Сохранённые цепочки инструментов, которые пользователи создают в интерфейсе.

СтолбецТипПримечания
iduuidПервичный ключ
namevarcharНазвание пайплайна
descriptionvarcharНеобязательное описание
stepsjsonbМассив объектов { toolId, settings }
createdAttimestampВремя создания

user_files

Постоянная библиотека файлов с отслеживанием цепочки версий. Каждый шаг обработки, сохраняющий результат, создаёт новую строку, связанную с родительской через parentId, образуя дерево версий.

СтолбецТипОписание
iduuidПервичный ключ
userIduuidFK к users (CASCADE DELETE)
originalNamevarcharИмя исходного загруженного файла
storedNamevarcharИмя файла на диске
mimeTypevarcharMIME-тип
sizeintegerРазмер файла в байтах
widthintegerШирина изображения в px
heightintegerВысота изображения в px
versionintegerНомер версии (1 = оригинал)
parentIduuid или nullFK к user_files (родительская версия)
toolChainjsonbID инструментов, применённых по порядку для создания этой версии
createdAttimestampВремя создания

jobs

Отслеживает задачи обработки для отчётности о прогрессе и очистки.

СтолбецТипПримечания
iduuidПервичный ключ
typevarcharИдентификатор инструмента или пайплайна
statusvarcharqueued, processing, completed или failed
progressrealДоля от 0.0 до 1.0
inputFilesjsonbМассив путей к входным файлам
outputPathvarcharПуть к файлу результата
settingsjsonbИспользованные настройки инструмента
errorvarcharСообщение об ошибке при сбое
createdAttimestampВремя создания
completedAttimestampВремя завершения

settings

Хранилище «ключ-значение» для общесерверных настроек, которые администраторы могут менять из интерфейса.

СтолбецТипПримечания
keyvarcharПервичный ключ
valuevarcharЗначение настройки
updatedAttimestampВремя последнего обновления

roles

Пользовательские роли с гранулярными разрешениями.

СтолбецТипПримечания
iduuidПервичный ключ
namevarcharУникальное имя роли
descriptionvarcharНеобязательное описание
permissionsjsonbМассив строк разрешений
createdAttimestampВремя создания

audit_log

Журнал действий, значимых для безопасности.

СтолбецТипПримечания
iduuidПервичный ключ
userIduuidFK к 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

В продакшене ожидающие миграции применяются автоматически при запуске.

Резервное копирование и восстановление

Реляционная база данных находится в томе SnapOtter-pgdata контейнера Postgres, а не в томе /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.