Proxmox VEXXII · Operating as a Business ServiceChecklists
Operational checklists: daily, weekly, monthly, quarterly, annual
What you'll learn
- Define an operational checklist for each cadence, with a command behind every line
- Distinguish a check that can fail from one that cannot, and discard the second kind
- Automate the daily check so that a human only sees exceptions
- Recognise checklist theatre and the false confidence it produces
Prerequisites
None — start here.
Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
Why this matters in production
Without regular checks, problems accumulate until they become incidents. A daily 5-minute check catches what automation misses.
Daily
5 minutes. The first operator on shift:
- Check the cluster dashboard for HEALTH_OK.
- Check recent backup status.
- Check the alerts inbox.
- Glance at capacity warnings.
Written so each one can fail:
set -euo pipefail
FAIL=0
note() { echo "CHECK-FAIL: $*"; FAIL=1; }
# 1. Quorum. Expected: Quorate: Yes, total votes equal to expected votes.
pvecm status | grep -q 'Quorate:.*Yes' || note 'cluster is not quorate'
# 2. Every node online. Expected: no node missing from the membership.
expected_nodes=3
seen=$(pvecm nodes | awk 'NR>3' | wc -l)
[ "$seen" -eq "$expected_nodes" ] || note "only $seen of $expected_nodes nodes in membership"
# 3. Storage. Expected: every configured storage active.
pvesm status | awk 'NR>1 && $3 != "active" {print}' | grep -q . \
&& note 'a storage is not active' || true
# 4. Ceph, where present. Expected: HEALTH_OK, or a documented HEALTH_WARN.
if command -v ceph >/dev/null; then
ceph health | grep -q '^HEALTH_OK' || note "ceph: $(ceph health)"
fi
# 5. Backups. Expected: no failed task in the last 24 hours.
pvesh get /cluster/tasks --output-format json \
| grep -o '"status":"[^"]*"' | grep -v '"status":"OK"' | grep -q . \
&& note 'a cluster task ended in a non-OK state in the recent window' || true
# 6. HA. Expected: no service in an error state.
if command -v ha-manager >/dev/null; then
ha-manager status | grep -qi 'error' && note 'an HA service is in error' || true
fi
exit "$FAIL"Weekly
30 minutes. Includes:
- Review backup verification results.
- Review Ceph HEALTH and capacity.
- Review cluster alerts from the past week.
- Confirm monitoring notifications work (fire a test).
- Verify the on-call rotation.
Monthly
2 hours. Includes:
- Review the workload inventory against reality.
- Review capacity trends; plan additions.
- Run a DR tabletop exercise.
- Review change requests from the past month.
- Update runbooks based on recent incidents.
Quarterly
Half day. Includes:
- Capacity review; trigger procurement if utilisation > 70 %.
- Review and update the hardening checklist.
- Review and test the DR plan.
- Review access controls (admin accounts, RBAC, TFA).
- Update the production reference architecture document.
Annual
1-2 days. Includes:
- Full DR exercise (live drill, not just tabletop).
- Review Proxmox subscriptions and support contracts.
- Hardware lifecycle review (replacement schedule).
- Review the course curriculum (yes, this very course).
- Compliance audit if applicable.
The cadence
flowchart LR
A[Daily 5min] --> B[Weekly 30min]
B --> C[Monthly 2h]
C --> D[Quarterly 0.5day]
D --> E[Annual 1-2d]
E --> A
Production considerations
The checks that only a human can do
Automation covers the daily cadence well and covers the longer cadences badly, because the questions get less mechanical as the interval lengthens.
| Cadence | Automatable | Needs a person |
|---|---|---|
| Daily | Quorum, storage, Ceph health, task failures, HA state | Nothing, if the script is good |
| Weekly | Verify-job results, backup freshness per group, capacity trend | Whether last week’s alerts were the right alerts |
| Monthly | Inventory reconciliation, tag compliance | Whether a capacity trend needs procurement, whether a runbook is still true |
| Quarterly | Certificate expiry, account and token age | Whether the DR plan still matches the architecture |
| Annual | Subscription and support expiry, hardware age | Whether the platform is still the right shape for the business |
The pattern is that automation answers is it as configured and a human is needed for is it configured correctly. Both matter and only one of them scales.
Common mistakes
- Checks with no defined expected outcome, which cannot fail and therefore mean nothing.
- “I’ll do it later”, after which no check happens.
- A checklist that grows and is never pruned, until completing it honestly costs more than the time available.
- Automating the daily check and not alerting on it failing to run, so silence is ambiguous.
- Verifying backups and never restoring one.
- An annual restore test, which is too infrequent for the skill to survive.
- Skipping quarterly and annual reviews under pressure, which is exactly when the platform is drifting fastest.
Key takeaways
- Daily 5 min, weekly 30 min, monthly 2 h, quarterly 0.5 day, annual 1–2 d.
- Every line needs a command and an expected answer, or it is not a check.
- Automate the daily cadence, exit non-zero on failure, and alert separately on the check not running.
- Automation answers is it as configured; a person is needed for is it configured correctly.
- Restore a real guest quarterly and time it against your published RTO.
- Prune checks that have never failed; a short list is followed and a long one is faked.
Knowledge check
Knowledge check · 5 questions
Q1. Which of these is written as a check that can actually fail?
Q2. A daily check script runs from cron and exits non-zero on failure, with output suppressed on success. What else is needed for it to be trustworthy? Select all that apply.
Q3. A PBS verification job confirms that a backup will restore successfully.
Q4. A team notices its daily checklist is being ticked without being performed. What is most likely to fix it?
Q5. Why should a full restore test be quarterly rather than annual?
Passing score: 75%. Answers are checked in this browser.