Skip to content

Health checks ​

What you'll learn

What the dashboard's Needs attention and System panels tell admins, and how to fix each problem they report.

Before this page: Deployment.

The dashboard, with the System panel at the bottom of the side column

Admins see two panels on the dashboard that editors don't:

  • Needs attention, at the top, only when something is wrong. Each line links to its section below.
  • System, at the bottom of the side column: the Easy CMS version, the database, where files are stored, the email adapter, the plugins with their versions and the field types from packages. Handy when you report a problem or ask for help.

Both come from GET <api>/admin/status, for admins only (not for API keys). Easy CMS never checks for new versions on its own.

Failed webhooks ​

Shown when a webhook delivery failed for good in the last 7 days: every retry, over about a day, got an error. The panel shows how many, and the address that failed most.

Check:

  • The receiving service is up and answers 2xx. Its last error is kept with the delivery.
  • The URL in webhooks is still right (a redeployed build hook often gets a new address).
  • The receiver checks the signature with the same secret.

Once the receiver works, open Settings → Deliveries (the banner links there): each failed delivery shows what changed, the address, its last error and the body it sent, with Retry (one attempt now, with the same delivery id and a fresh signature) and Delete, one at a time or all at once. Failed deliveries are deleted after 30 days.

Emails not sent ​

Shown when an email has waited in the queue for over an hour, or failed for good in the last 7 days. See queued and retried.

Check the settings with Check the connection and Send test email on Settings → Email, and the failed emails in Settings → Deliveries → Emails (who to, the subject and the error; not the content), then:

  • The SMTP settings (SMTP_HOST, SMTP_USER, SMTP_PASSWORD) and that the server accepts this sender. Failures are logged with the server's answer.
  • On serverless hosts, that something runs the queue: a cron calling <api>/jobs/run (as for late scheduled publishing).

Then Retry them there. Failed emails are deleted after 30 days.

Late scheduled publishing ​

Shown when a scheduled publish or unpublish is more than 10 minutes late. Nothing is running the jobs.

Fix: long-running servers (Nuxt, easy-cms serve, a self-hosted Next.js) run them every minute. On serverless platforms, call <api>/jobs/run every minute from a cron with Authorization: Bearer $CRON_SECRET, or run npx easy-cms jobs:run from one. The late jobs run on the next call, and so do webhook and email retries.

Backups ​

Shown when backups.every is set and the last scheduled backup failed, or no backup finished in two periods (two days, or two weeks). See its error on Settings → Backups; the usual causes are a full disk, storage that refuses the file, Postgres without backups.sqlite, or nothing running the jobs (as for late scheduled publishing). Then Back up now to check. See Backups.

Failed logins ​

Shown when the audit log is on and more sign-ins failed within the last hour than audit.failedLogins (default 20). Someone may be guessing passwords. Open the audit log filtered by sign-ins to see which emails and IP addresses; deactivate accounts under attack, or block the addresses at your host. Each email and IP is also locked after auth.maxLoginAttempts.

Audit log ​

Shown when audit log entries could not be written (the change went through; see the server log for why, often the database), or when the last integrity check found entries changed in the database. See tamper evidence.

No email ​

Shown when the config has no email. Without it there are no forgotten-password links, no invitations and no form notifications. Set one up: Email.

No serverURL ​

Shown when the site runs in production (NODE_ENV=production) without serverURL. Links in emails (forgotten password, invitations) need the site's public address, and in production Easy CMS doesn't trust the address in the request. Set serverURL: 'https://example.com' in the config.

Next steps ​

  • Deployment: the checklist before going live.
  • Plugins: how a plugin shows its name and version here.

Released under the MIT License.