# ตรวจสุขภาพระบบ {#health-checks}

::: info สิ่งที่จะได้เรียนรู้
กล่อง **ต้องดูแล** และ **ระบบ** บนแดชบอร์ดบอกอะไร admin บ้าง และวิธีแก้แต่ละปัญหาที่แจ้งมา

**อ่านก่อนหน้านี้:** [การ deploy](./deployment)
:::

<Screenshot name="dashboard" alt="แดชบอร์ด มีกล่องระบบอยู่ท้ายคอลัมน์ข้าง" />

admin จะเห็นสองกล่องบนแดชบอร์ดที่ editor ไม่เห็น:

- **ต้องดูแล** อยู่บนสุด แสดงเฉพาะเมื่อมีปัญหา แต่ละบรรทัดลิงก์มายังหัวข้อด้านล่าง
- **ระบบ** ท้ายคอลัมน์ข้าง: เวอร์ชัน Easy CMS, ฐานข้อมูล, ที่เก็บไฟล์, อีเมล, plugin พร้อมเวอร์ชัน และ
  [ชนิด field](./field-types) จากแพ็กเกจ ใช้ประกอบตอนแจ้งปัญหาหรือขอความช่วยเหลือ

ทั้งสองมาจาก `GET <api>/admin/status` เฉพาะ admin (API key ใช้ไม่ได้) Easy CMS ไม่เช็กเวอร์ชันใหม่ออกไปข้างนอกเอง

## webhook ส่งไม่สำเร็จ {#failed-webhooks}

**แสดงเมื่อ** มี [webhook](./webhooks) ที่ส่งไม่สำเร็จจนเลิกลองแล้วใน 7 วันล่าสุด คือลองซ้ำครบทุกครั้งตลอดราวหนึ่งวัน
แล้วยังได้ error กล่องจะบอกจำนวน และที่อยู่ที่ล้มบ่อยที่สุด

**ตรวจ:**

- service ปลายทางทำงานอยู่และตอบ `2xx` error ครั้งล่าสุดถูกเก็บไว้กับรายการนั้น
- URL ใน `webhooks` ยังถูกต้อง (build hook ที่ deploy ใหม่มักได้ที่อยู่ใหม่)
- ปลายทางตรวจลายเซ็นด้วย secret เดียวกัน

เมื่อปลายทางกลับมาทำงาน เปิด **ตั้งค่า → การส่ง** (แถบเตือนลิงก์มาที่นี่): แต่ละรายการบอกว่าเปลี่ยนอะไร ส่งไปที่ไหน
error ล่าสุด และ body ที่ส่ง พร้อมปุ่ม **ส่งซ้ำ** (ลองทันทีหนึ่งครั้ง ด้วย delivery id เดิมและลายเซ็นใหม่) และ **ลบ**
ทีละรายการหรือทั้งหมด รายการที่ล้มจะถูกลบอัตโนมัติเมื่อเกิน 30 วัน

## อีเมลยังส่งไม่ออก {#emails-not-sent}

**แสดงเมื่อ** มีอีเมลรอในคิวเกิน 1 ชั่วโมง หรือส่งไม่สำเร็จจนเลิกลองแล้วใน 7 วันล่าสุด ดู[คิวและการส่งซ้ำ](./email#queued-and-retried)

**ตรวจ** การตั้งค่าด้วยปุ่ม **ตรวจการเชื่อมต่อ** และ **ส่งอีเมลทดสอบ** ที่[ตั้งค่า → อีเมล](./email#checking-the-settings) และอีเมลที่ล้มใน **ตั้งค่า → การส่ง → อีเมล** (ผู้รับ หัวเรื่อง และ error ไม่แสดงเนื้อความ) แล้วดู:

- ค่า SMTP (`SMTP_HOST`, `SMTP_USER`, `SMTP_PASSWORD`) และ server ยอมให้ส่งจากผู้ส่งนี้ error ถูกบันทึกใน log
  พร้อมคำตอบของ server
- บน serverless ต้องมีบางอย่างเรียกคิว: cron ที่เรียก `<api>/jobs/run` (เหมือน[การเผยแพร่ตามกำหนดเวลาล่าช้า](#late-scheduled-publishing))

จากนั้นกด **ส่งซ้ำ** ในหน้านั้น อีเมลที่ล้มจะถูกลบอัตโนมัติเมื่อเกิน 30 วัน

## การเผยแพร่ตามกำหนดเวลาล่าช้า {#late-scheduled-publishing}

**แสดงเมื่อ** การเผยแพร่หรือยกเลิกเผยแพร่ที่[กำหนดเวลา](./drafts#scheduled-publishing)ไว้ช้ากว่ากำหนดเกิน 10 นาที
แปลว่าไม่มีอะไรรันงานเหล่านี้

**วิธีแก้:** server ที่ทำงานต่อเนื่อง (Nuxt, `easy-cms serve`, Next.js ที่โฮสต์เอง) รันทุกนาทีอยู่แล้ว บน serverless ให้ cron
เรียก `<api>/jobs/run` ทุกนาทีพร้อม `Authorization: Bearer $CRON_SECRET` หรือให้ cron รัน `npx easy-cms run-scheduled`
งานที่ค้างจะทำในการเรียกครั้งถัดไป รวมถึงการส่ง webhook และอีเมลซ้ำด้วย

## Backups {#backups}

**แสดงเมื่อ** ตั้ง `backups.every` ไว้แล้ว backup ตามรอบครั้งล่าสุดไม่สำเร็จ หรือไม่มีชุดที่สำเร็จนานเกินสองรอบ (สองวัน หรือสองสัปดาห์)
ดู error ได้ที่ **ตั้งค่า → Backups** สาเหตุที่พบบ่อยคือดิสก์เต็ม ที่เก็บไม่รับไฟล์ ใช้ Postgres แต่ไม่ได้ตั้ง `backups.sqlite` หรือไม่มีอะไร
รันงานตามรอบ (เหมือน[การเผยแพร่ตามกำหนดเวลาล่าช้า](#late-scheduled-publishing)) จากนั้นกด **Backup ตอนนี้** เพื่อตรวจ
ดู [Backup](./backups#from-the-admin)

## login ไม่สำเร็จ {#failed-logins}

**แสดงเมื่อ** เปิด [audit log](./audit-log) และมีการเข้าสู่ระบบไม่สำเร็จในชั่วโมงที่ผ่านมามากกว่า `audit.failedLogins`
(ค่าเริ่มต้น 20) อาจมีคนพยายามเดารหัสผ่าน เปิด audit log ที่กรองเฉพาะการเข้าสู่ระบบเพื่อดูอีเมลและ IP address แล้วปิดใช้งาน
บัญชีที่ถูกโจมตี หรือบล็อก address ที่ผู้ให้บริการ hosting ส่วนแต่ละอีเมลและ IP ก็ถูกล็อกหลังผิดครบ `auth.maxLoginAttempts` อยู่แล้ว

## Audit log {#audit-log}

**แสดงเมื่อ** บันทึก audit log บางรายการไม่สำเร็จ (การแก้ไขเกิดขึ้นแล้ว ดูสาเหตุใน log ของ server ซึ่งมักเป็นที่ฐานข้อมูล)
หรือเมื่อการตรวจความถูกต้องครั้งล่าสุดพบรายการที่ถูกแก้ในฐานข้อมูล ดู [การตรวจการแก้ไข](./audit-log#tamper-evidence)

## ไม่มีอีเมล {#no-email}

**แสดงเมื่อ** config ไม่มี `email` ทำให้ไม่มีลิงก์ลืมรหัสผ่าน คำเชิญ และอีเมลแจ้งเตือนจากฟอร์ม ตั้งค่าได้ที่ [อีเมล](./email)

## ไม่มี serverURL {#no-serverurl}

**แสดงเมื่อ** เว็บทำงานบน production (`NODE_ENV=production`) โดยไม่มี `serverURL` ลิงก์ในอีเมล (ลืมรหัสผ่าน คำเชิญ)
ต้องใช้ที่อยู่สาธารณะของเว็บ และบน production Easy CMS ไม่เชื่อที่อยู่ที่มากับ request ให้ตั้ง
`serverURL: 'https://example.com'` ใน config

## ขั้นต่อไป {#next-steps}

- [การ deploy](./deployment): รายการตรวจก่อนเปิดใช้งานจริง
- [Plugin](./plugins#naming-your-plugin): plugin แสดงชื่อและเวอร์ชันของตัวเองที่นี่ได้อย่างไร
