On this page0
Unfamiliar word? See Glossary: words used in these docs. Looking for the tasks in order? Begin at Start Here.
Reference
Included in: All plans. Which Plan Includes What
System Health Screen Reference
Every gauge, card and status on System → System Health, the rule that sets it, and the read behind it.
Every Element On The Screen
Labels are the words on the screen. The response field each one is drawn from is in the technical part below.
Header
| On screen | What it means |
|---|---|
| N/M UP | Containers that are running and not unhealthy, out of all containers listed. |
| N UNHEALTHY | Shown only when at least one container is unhealthy. |
| next in Ns | Seconds until the next automatic reading. The screen reads every 30 seconds. |
| Refresh now | Reads at once and restarts the 30-second countdown. Because of the 25-second server cache, the figures may be the same reading. |
| LIVE / STALE | LIVE while the last reading succeeded. STALE when it failed: the figures on screen are then the previous reading, and "Could not reach the health service." is shown. |
Gauges
| On screen | What it means |
|---|---|
| CPU | Share of all processor cores in use, measured over a 200-millisecond sample. Below it: the core count and the 1, 5 and 15-minute load averages. If the sample cannot be taken, the gauge shows the 1-minute load per core instead. |
| MEMORY | Memory in use as a share of the total, with used and total below. |
| SWAP | Swap in use as a share of the total. Reads "no swap configured" when the server has none. |
| DISK | Space used on the root filesystem. Reads "unavailable" when it cannot be measured. |
| Gauge colour | Green below 70%, amber from 70%, red from 90%. The same bands colour the CPU and memory figures in the container table. |
Heavy-load banner
| On screen | What it means |
|---|---|
| The VPS is under heavy load. | Shown when CPU, memory or disk is at 90% or more, or swap is at 50% or more. It adds one sentence per cause: "Memory is nearly exhausted.", "Heavy swap use means RAM pressure — the box will feel slow.", "CPU is saturated." or "Disk is almost full." |
Containers card
| On screen | What it means |
|---|---|
| Healthy / Degraded | Degraded when at least one container is unhealthy, otherwise Healthy. |
| unhealthy | A container whose status reports unhealthy, restarting or dead, or one that is not running and did not exit cleanly (exit code other than 0). |
| running | A container that is running and is not unhealthy. |
| completed | Everything else: one-time jobs that ran and exited with code 0. Listed as "exited · one-time". |
| View all N | Opens the table: CONTAINER (short name, image below), STATUS, CPU and MEM. Click CONTAINER, CPU or MEM to sort; the default is highest CPU first. Memory excludes file cache and is also shown as a share of the container’s own limit. |
| Docker socket warning | When the container list cannot be read, a warning says so and the card lists no containers, so its Healthy chip means nothing then. The gauges are still live. |
App version card
| On screen | What it means |
|---|---|
| Up to date | The update check answered and nothing newer is waiting. |
| N behind | N newer releases exist. Amber, or red when at least one of them is a security release. |
| Unknown | The check could not run or has not reported yet. The reason is printed under the title. |
| Checking… | The first read has not come back yet. |
| Running, Deployed | The release name and the first seven characters of its commit, and when it was deployed. |
| Licenses | A link to the open-source notices bundled with the app. |
Backups (same card)
| On screen | What it means |
|---|---|
| Restore points | How many restore points are listed and their total size. Reads "could not load" after a failed read. |
| Last backup | The newest modified time among the restore points. |
| Off-box copies | "configured ✓" when an off-box destination is set, "0 — local only" when it is not. |
| View backups → | Opens System → Backups & Recovery. |
What This Screen Does Not Do
- The read sends no notification. The heavy-load banner and the Degraded chip are drawn by the screen from the latest reading, so they exist only while someone has the screen open.
- The read keeps no history. Each reading replaces the last one in memory and is not written to the database.
- It cannot restart a service. Updates are applied, and the automatic schedule is set, on System → Updates; restores are run from System → Backups & Recovery (see Backup, Restore & Updates).
What each kind of outage looks like from the API and from this screen is on Failure Modes.
If something here is not working as you expect, start with When something goes wrong.
The plain explanation is above. This part is for IT and developers: the exact settings, permission names, API addresses and data fields behind it. Closed: select the heading above to open it. While it is closed, your browser’s find-on-page (Ctrl+F or Cmd+F) does not search this part.
The menu item is shown to administrators and to anyone whose role includes view_system. The same permission is required by every read below, so a person who cannot see the screen cannot call its API either.
The Reads Behind The Screen
The screen makes four reads and no writes. All four are answered by the compliance service and are gated on view_system alone, not on a plan.
| Method | Path | Purpose | Auth |
|---|---|---|---|
| GET | /api/v1/compliance/reports/system-health | Server load and the container list. Feeds the four gauges, the Containers card, the header chips and the heavy-load banner. The answer is cached on the server for 25 seconds. | view_system |
| GET | /api/v1/compliance/reports/patch-status | The running release and how far behind it is. Feeds the App version card. The screen re-reads it every 5 minutes, or after 15 seconds when a read failed. | view_system |
| GET | /api/v1/compliance/reports/backups | The restore points. Feeds Restore points and Last backup. | view_system |
| GET | /api/v1/compliance/reports/update-status | The host updater agent’s status, including whether an off-box destination is configured. Feeds Off-box copies. | view_system |
# $ZX_TOKEN is a personal API token whose owner holds view_system.
curl -H "Authorization: Bearer $ZX_TOKEN" https://<your-instance>-api.zonitix.com/api/v1/compliance/reports/system-health
# 200
{
"at": "2026-10-10T09:15:02.118Z",
"host": { "cpuCores": 4, "cpuPct": 12.4, "load1": 0.5, "load5": 0.4, "load15": 0.4, "loadPct": 12.5,
"memTotal": 8323072000, "memUsed": 5120000000, "memPct": 61.5,
"swapTotal": 0, "swapUsed": 0, "swapPct": 0,
"disk": { "totalBytes": 160000000000, "usedBytes": 48000000000, "usedPct": 30 } },
"dockerAvailable": true,
"containerCount": 2, "runningCount": 2, "unhealthyCount": 0,
"containers": [ { "name": "…", "image": "…", "state": "running", "status": "Up 3 hours (healthy)",
"cpuPct": 1.2, "memBytes": 210000000, "memPct": 20.5, "unhealthy": false }, … ]
}
# The values above are an illustration of the shape, not a measurement.
- Sizes are bytes; host percentages are 0 to 100 with one decimal place. A container’s
cpuPctis a share of one core, so it can exceed 100 on a multi-core server.host.cpuPctisnullwhen the sample could not be taken, andhost.diskisnullwhen the disk could not be measured. - Containers are sorted by
cpuPct, highest first. Only the containers of your own instance are listed. runningCountcounts every running container, including one that is failing its health check and is therefore also inunhealthyCount. The screen counts from the rows instead, so its three numbers never overlap.- When the container list cannot be read the reply is still
200, withdockerAvailable: false, an emptycontainersarray and the host figures filled in. - Caching. A reading is reused for 25 seconds, and callers that arrive while one is being taken share it. Polling faster than that returns the same reading.
Response Field Behind Each Element
This table gives the response field each element on the screen is drawn from. What each element means is in the plain part above, under Every Element On The Screen; fields under host and containers are in the reply shown above.
| Area | On screen | Drawn from |
|---|---|---|
| Header | N/M UP | containers[] |
| Header | N UNHEALTHY | containers[].unhealthy |
| Header | next in Ns | set by the screen |
| Header | Refresh now | set by the screen |
| Header | LIVE / STALE | set by the screen |
| Gauges | CPU | host.cpuPct, host.loadPct, host.cpuCores, host.load1 / load5 / load15 |
| Gauges | MEMORY | host.memPct, host.memUsed, host.memTotal |
| Gauges | SWAP | host.swapPct, host.swapUsed, host.swapTotal |
| Gauges | DISK | host.disk.usedPct, usedBytes, totalBytes |
| Gauges | Gauge colour | set by the screen |
| Heavy-load banner | The VPS is under heavy load. | host.cpuPct, memPct, disk.usedPct, swapPct |
| Containers card | Healthy / Degraded | containers[].unhealthy |
| Containers card | unhealthy | containers[].unhealthy, status |
| Containers card | running | containers[].state |
| Containers card | completed | containers[].state, status |
| Containers card | View all N | containers[].name, image, state, cpuPct, memBytes, memPct |
| Containers card | Docker socket warning | dockerAvailable: false |
| App version card | Up to date | upToDate, behind |
| App version card | N behind | behind, securityBehind |
| App version card | Unknown | error |
| App version card | Checking… | set by the screen |
| App version card | Running, Deployed | current.tag, current.commit, current.deployedAt |
| App version card | Licenses | set by the screen |
| Backups (same card) | Restore points | the backups list |
| Backups (same card) | Last backup | modifiedAt |
| Backups (same card) | Off-box copies | backupConfig.offboxConfigured |
| Backups (same card) | View backups → | set by the screen |