หน้านี้แปลด้วยเครื่อง พบข้อผิดพลาดใช่ไหมช่วยกันปรับปรุง
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

คลังไฟล์ถาวร โดยค่าเริ่มต้น การแก้ไขที่บันทึกไว้จะถูกแทรกเป็นแถวรากอิสระ ("บันทึกเป็นไฟล์ใหม่": version 1, parentId เป็น null ดังนั้นไฟล์ต้นฉบับยังคงอยู่ในรายการ) หรือเป็นเวอร์ชันที่เชื่อมโยงกับแถวแม่เมื่อคุณเขียนทับไฟล์ต้นฉบับ (กำหนด parentId, เพิ่มค่า version และแทนที่ไฟล์เดิม) คอลัมน์ toolChain บันทึกเครื่องมือที่นำมาใช้

คอลัมน์ชนิดคำอธิบาย
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เวลาที่กระทำ

user_preferences

สถานะ UI ของผู้ใช้แต่ละคน โดยใช้ชื่อการตั้งค่าเป็นคีย์ เก็บเครื่องมือที่ปักหมุดบนหน้าหลัก ซึ่งเขียนผ่าน PUT /api/v1/preferences

คอลัมน์ชนิดหมายเหตุ
userIdtextFK ไปยัง users ลบแบบต่อเนื่อง เป็นคีย์หลักร่วมกับ key
keytextชื่อการตั้งค่า เป็นคีย์หลักร่วมกับ userId
valuejsonbข้อมูลของการตั้งค่า
updatedAttimestampเวลาที่เขียนล่าสุด

การย้ายข้อมูล (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

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

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

ฐานข้อมูลเชิงสัมพันธ์อยู่ในโวลุ่ม SnapOtter-pgdata ของคอนเทนเนอร์ Postgres ไม่ใช่โวลุ่ม /data ของแอป

การสำรองข้อมูลแบบลอจิคัลพร้อมการตรวจสอบความถูกต้อง (แนะนำ)

bash
# Dump into PostgreSQL's portable custom archive format
docker exec SnapOtter-postgres \
  pg_dump --format=custom --no-owner -U snapotter snapotter > snapotter.dump
test -s snapotter.dump
docker exec -i SnapOtter-postgres pg_restore --list < snapotter.dump >/dev/null

# Restore into a fresh/disposable target first and fail on the first SQL error
docker exec -i SnapOtter-postgres \
  pg_restore --exit-on-error --clean --if-exists --no-owner \
  -U snapotter -d snapotter < snapotter.dump

ดัมพ์ฐานข้อมูลนี้ไม่มีอ็อบเจ็กต์ไลบรารีที่บันทึกไว้ใน /data/files หรือสถานะ BullMQ แบบทนทานใน Redis สำรองและกู้คืนข้อมูลเหล่านั้นด้วยขั้นตอนการประสานงานใน Security & Hardening

สแนปชอตวอลุ่มเย็น

bash
# Stop every service first, then use your storage platform to snapshot the
# PostgreSQL, app-data, and Redis volumes as one crash-consistent set.
docker compose -f docker/docker-compose.yml stop

อย่าคัดลอกไดเร็กทอรีข้อมูล PostgreSQL แบบสดด้วย tar เขียนคำนำหน้าชื่อวอลุ่มตามโปรเจ็กต์ ดังนั้นแก้ไข ID วอลุ่มที่ติดตั้งจาก docker inspect หรือแพลตฟอร์มพื้นที่จัดเก็บข้อมูลของคุณ แทนที่จะใช้ป้ายกำกับตัวอักษร SnapOtter-pgdata

การย้ายข้อมูลจาก 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 ที่แทบจะว่างเปล่า