Backup และการกู้ข้อมูล
Backup รายวัน PITR สำเนานอกระบบ และการซ้อมกู้ข้อมูล
Backup หลัก (Supabase)
หัวข้อที่มีชื่อว่า “Backup หลัก (Supabase)”- แผน Pro ขึ้นไปมี backup รายวันอัตโนมัติ — ตรวจที่ Dashboard → Database → Backups
- เปิด Point-in-Time Recovery (PITR) สำหรับ production (add-on) เพื่อกู้ย้อนไปเวลาใดก็ได้ภายในช่วงที่เลือก (แนะนำ 7 วัน)
- ไฟล์ (รูปมิเตอร์ รูปงานซ่อม เอกสารผู้เช่า โลโก้ — เก็บใน Cloudflare R2) ไม่อยู่ใน backup ของฐานข้อมูล — ดูหัวข้อสุดท้าย
สำเนานอกระบบ (pnpm db:backup)
หัวข้อที่มีชื่อว่า “สำเนานอกระบบ (pnpm db:backup)”# 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 และเก็บไฟล์ไว้ในที่เข้ารหัส (มีข้อมูลส่วนตัวผู้เช่า)
ซ้อมกู้ข้อมูล (ทุก 3 เดือน)
หัวข้อที่มีชื่อว่า “ซ้อมกู้ข้อมูล (ทุก 3 เดือน)”- สร้าง project ชั่วคราว (หรือใช้ staging)
pg_restore --no-owner --dbname "$STAGING_DB_URL" backups/<ไฟล์>.dump(หรือ Restore จาก Dashboard ไป project ใหม่)- เปิดแอปชี้ project นั้น ตรวจยอดค้าง เงินประกัน และใบแจ้งหนี้ล่าสุดกับ production
- บันทึกเวลาที่ใช้กู้ แล้วลบ project ชั่วคราว
ไฟล์ (Cloudflare R2)
หัวข้อที่มีชื่อว่า “ไฟล์ (Cloudflare R2)”ไฟล์ของหอจริงอยู่ใน 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 ตามเดิม