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 จะเก็บข้อมูลไว้ใน named volume SnapOtter-pgdata

ตาราง

users

เก็บบัญชีผู้ใช้ สร้างขึ้นโดยอัตโนมัติเมื่อรันครั้งแรกจาก DEFAULT_USERNAME และ DEFAULT_PASSWORD

คอลัมน์ชนิดหมายเหตุ
iduuidคีย์หลัก
usernamevarcharไม่ซ้ำ จำเป็น
passwordHashvarcharscrypt hash
rolevarcharadmin, editor หรือ user
mustChangePasswordbooleanธงบังคับรีเซ็ตรหัสผ่าน
createdAttimestampเวลาที่สร้าง
updatedAttimestampเวลาที่อัปเดตล่าสุด

sessions

เซสชันการเข้าสู่ระบบที่ใช้งานอยู่ แต่ละแถวผูกโทเคนเซสชันกับผู้ใช้

คอลัมน์ชนิดหมายเหตุ
idvarcharคีย์หลัก (โทเคนเซสชัน)
userIduuidคีย์นอกไปยัง users.id
expiresAttimestampเวลาหมดอายุ
createdAttimestampเวลาที่สร้าง

teams

กลุ่มสำหรับจัดระเบียบผู้ใช้ ผู้ดูแลสามารถกำหนดผู้ใช้ให้กับทีมได้

คอลัมน์ชนิดคำอธิบาย
iduuidคีย์หลัก
namevarchar (ไม่ซ้ำ สูงสุด 50 อักขระ)ชื่อทีม
createdAttimestampเวลาที่สร้าง

api_keys

คีย์ API สำหรับการเข้าถึงแบบโปรแกรม คีย์ดิบจะแสดงเพียงครั้งเดียวตอนสร้าง เก็บเฉพาะ hash เท่านั้น

คอลัมน์ชนิดหมายเหตุ
iduuidคีย์หลัก
userIduuidคีย์นอกไปยัง users.id
keyHashvarcharscrypt hash ของคีย์
namevarcharป้ายชื่อที่ผู้ใช้กำหนด
createdAttimestampเวลาที่สร้าง
lastUsedAttimestampอัปเดตทุกครั้งที่มีการร้องขอที่ผ่านการยืนยันตัวตน

คีย์จะขึ้นต้นด้วย si_ ตามด้วยอักขระเลขฐานสิบหก 96 ตัว (สุ่ม 48 ไบต์)

pipelines

ชุดเครื่องมือที่บันทึกไว้ซึ่งผู้ใช้สร้างขึ้นใน UI

คอลัมน์ชนิดหมายเหตุ
iduuidคีย์หลัก
namevarcharชื่อ pipeline
descriptionvarcharคำอธิบายที่ไม่บังคับ
stepsjsonbอาร์เรย์ของอ็อบเจกต์ { toolId, settings }
createdAttimestampเวลาที่สร้าง

user_files

คลังไฟล์ถาวรพร้อมการติดตามสายเวอร์ชัน แต่ละขั้นตอนการประมวลผลที่บันทึกผลลัพธ์จะสร้างแถวใหม่ที่เชื่อมโยงกับแถวแม่ผ่าน parentId กลายเป็นต้นไม้เวอร์ชัน

คอลัมน์ชนิดคำอธิบาย
iduuidคีย์หลัก
userIduuidFK ไปยัง users (CASCADE DELETE)
originalNamevarcharชื่อไฟล์อัปโหลดต้นฉบับ
storedNamevarcharชื่อไฟล์บนดิสก์
mimeTypevarcharชนิด MIME
sizeintegerขนาดไฟล์เป็นไบต์
widthintegerความกว้างของภาพเป็นพิกเซล
heightintegerความสูงของภาพเป็นพิกเซล
versionintegerหมายเลขเวอร์ชัน (1 = ต้นฉบับ)
parentIduuid หรือ nullFK ไปยัง user_files (เวอร์ชันแม่)
toolChainjsonbรหัสเครื่องมือที่นำมาใช้ตามลำดับเพื่อสร้างเวอร์ชันนี้
createdAttimestampเวลาที่สร้าง

jobs

ติดตามงานประมวลผลสำหรับการรายงานความคืบหน้าและการล้างข้อมูล

คอลัมน์ชนิดหมายเหตุ
iduuidคีย์หลัก
typevarcharตัวระบุเครื่องมือหรือ pipeline
statusvarcharqueued, processing, completed หรือ failed
progressrealเศษส่วน 0.0-1.0
inputFilesjsonbอาร์เรย์ของพาธไฟล์อินพุต
outputPathvarcharพาธไปยังไฟล์ผลลัพธ์
settingsjsonbการตั้งค่าเครื่องมือที่ใช้
errorvarcharข้อความข้อผิดพลาดหากล้มเหลว
createdAttimestampเวลาที่สร้าง
completedAttimestampเวลาที่เสร็จสิ้น

settings

ที่เก็บแบบคีย์-ค่าสำหรับการตั้งค่าทั้งเซิร์ฟเวอร์ที่ผู้ดูแลสามารถเปลี่ยนได้จาก UI

คอลัมน์ชนิดหมายเหตุ
keyvarcharคีย์หลัก
valuevarcharค่าการตั้งค่า
updatedAttimestampเวลาที่อัปเดตล่าสุด

roles

บทบาทกำหนดเองพร้อมสิทธิ์แบบละเอียด

คอลัมน์ชนิดหมายเหตุ
iduuidคีย์หลัก
namevarcharชื่อบทบาทที่ไม่ซ้ำ
descriptionvarcharคำอธิบายที่ไม่บังคับ
permissionsjsonbอาร์เรย์ของสตริงสิทธิ์
createdAttimestampเวลาที่สร้าง

audit_log

บันทึกการกระทำที่เกี่ยวข้องกับความปลอดภัย

คอลัมน์ชนิดหมายเหตุ
iduuidคีย์หลัก
userIduuidFK ไปยัง users
actionvarcharชนิดการกระทำ
detailsjsonbข้อมูลเฉพาะการกระทำ
createdAttimestampเวลาที่กระทำ

การย้ายข้อมูล (Migrations)

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

ในโปรดักชัน การย้ายข้อมูลที่ค้างอยู่จะถูกนำมาใช้โดยอัตโนมัติเมื่อเริ่มต้น

การสำรองและกู้คืนข้อมูล

ฐานข้อมูลเชิงสัมพันธ์อยู่ใน volume SnapOtter-pgdata ของคอนเทนเนอร์ Postgres ไม่ใช่ volume /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: Volume snapshot

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 สรุปสั้นๆ ให้ใช้ volume /data ที่มีอยู่เดิมซ้ำ และ 2.0 จะตรวจจับและนำเข้า /data/snapotter.db โดยอัตโนมัติเมื่อบูตครั้งแรก (หรือกำหนด SQLITE_MIGRATE_PATH เพื่อชี้ไปยังไฟล์นั้นอย่างชัดเจน) สำรอง volume /data ทั้งหมดก่อน ไม่ใช่แค่ snapotter.db: 1.x ใช้โหมด SQLite WAL ดังนั้นคอนเทนเนอร์ที่หยุดทำงานมักจะทิ้งข้อมูลส่วนใหญ่ไว้ใน snapotter.db-wal ข้างๆ snapotter.db ที่แทบจะว่างเปล่า