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 шістнадцяткових символів (48 випадкових байтів).

pipelines

Збережені ланцюжки інструментів, які користувачі створюють в інтерфейсі.

СтовпецьТипПримітки
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Ідентифікатори інструментів, застосовані по порядку для створення цієї версії
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Первинний ключ
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

У продакшені відкладені міграції застосовуються автоматично під час запуску.

Резервне копіювання та відновлення

Реляційна база даних знаходиться в томі 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.