ข้ามไปยังเนื้อหา

Backup และการกู้ข้อมูล

Backup รายวัน PITR สำเนานอกระบบ และการซ้อมกู้ข้อมูล

  • แผน Pro ขึ้นไปมี backup รายวันอัตโนมัติ — ตรวจที่ Dashboard → Database → Backups
  • เปิด Point-in-Time Recovery (PITR) สำหรับ production (add-on) เพื่อกู้ย้อนไปเวลาใดก็ได้ภายในช่วงที่เลือก (แนะนำ 7 วัน)
  • ไฟล์ (รูปมิเตอร์ รูปงานซ่อม เอกสารผู้เช่า โลโก้ — เก็บใน Cloudflare R2) ไม่อยู่ใน backup ของฐานข้อมูล — ดูหัวข้อสุดท้าย
Terminal window
# Dashboard → Connect → Session pooler (ใส่รหัสผ่านฐานข้อมูล) — เก็บใน shell เท่านั้น
export SUPABASE_DB_URL='postgresql://postgres.<ref>:<password>@<host>:5432/postgres'
pnpm db:backup # → backups/<เวลา>.dump (git ไม่เก็บ)

ต้องมี pg_dump เวอร์ชันเดียวกับ Postgres ของ Supabase หรือใหม่กว่า แนะนำทำก่อนทุกครั้งที่ db:push กับ production และเก็บไฟล์ไว้ในที่เข้ารหัส (มีข้อมูลส่วนตัวผู้เช่า)

  1. สร้าง project ชั่วคราว (หรือใช้ staging)
  2. pg_restore --no-owner --dbname "$STAGING_DB_URL" backups/<ไฟล์>.dump (หรือ Restore จาก Dashboard ไป project ใหม่)
  3. เปิดแอปชี้ project นั้น ตรวจยอดค้าง เงินประกัน และใบแจ้งหนี้ล่าสุดกับ production
  4. บันทึกเวลาที่ใช้กู้ แล้วลบ project ชั่วคราว

ไฟล์ของหอจริงอยู่ใน bucket am-files (หอเดโม่อยู่ am-files-demo ไม่ต้องสำรอง) แต่ละหออยู่ใต้ <org_id>/

  • สำรองเป็นระยะด้วย rclone (ตั้ง remote แบบ S3 provider Cloudflare ด้วย token อ่านอย่างเดียว แยกจากของระบบ): rclone sync r2:am-files /ที่เก็บสำรอง/am-files — เก็บสำเนาในที่เข้ารหัส (มีรูปบัตรประชาชนและข้อมูลส่วนตัวผู้เช่า)
  • ไฟล์ที่ระบบลบเอง (ไฟล์ของหอที่ถูกลบ, อัปโหลดไม่เสร็จ, รูปมิเตอร์/งานซ่อมเกิน 1 ปี) จะหายจากสำเนาด้วยเมื่อ sync รอบถัดไป ถ้าต้องการเก็บย้อนหลังให้ใช้ rclone copy แทน sync
  • ไฟล์ก่อนย้ายมา R2 และรูปหน้าห้องว่างยังอยู่ใน Supabase Storage (bucket org-files, listing-photos) — สำรองด้วยสคริปต์ที่ list/download ตามเดิม