Skip to content
Job kinds The catalog of job kinds the dashboard dispatches to a server's agent — grouped by domain, each mapping 1:1 to an mz command.

Job kinds

Almost everything the dashboard does to a server is a job: a named, whitelisted action the control plane dispatches to that server’s agent over the WebSocket link. This page is the map of the job-kind domains — what each family does, and where you drive it in the panel. It’s a reference, not a task page; for the invocation contract see The mz CLI.

Jobs are created with POST /v1/servers/:id/jobs, polled with GET /v1/jobs/:id, and streamed live with GET /v1/jobs/:id/stream (Server-Sent Events). The endpoint is the single funnel every server action flows through.

A job kind is a string like site.create or cron.run — a <domain>.<action> pair. When you click something in a server or site section, the panel:

  1. Validates your input against a per-kind schema (domain format, profile slug, port range, …). The API never accepts a raw command — you pick a kind from a fixed whitelist and the server builds the arguments.
  2. Builds the mz arguments for that kind (site.createsite create <domain> --profile … --json). This mapping is fixed in code.
  3. Checks your plan and role — the job’s domain decides which capability group and license tier it needs (see below).
  4. Dispatches the arguments to the agent over the WebSocket link. The agent runs them in its native Go engine — shelling out only to public tools (nginx, docker, wp-cli, certbot, systemctl…), never to mz itself.
  5. Streams stdout/stderr back as it runs, ending with an exit code. Read commands return JSON; long-running ones (deploys, updates, cron run) emit log lines.

The control plane stores the job row and its captured log lines (for the status + stream endpoints); the actual state lives on the box (nginx vhosts, /etc/cron.d, databases, containers). MZPanel doesn’t mirror server state — it reads and writes it through jobs.

Every job kind belongs to a domain. Each domain maps to the same-named mz command family and, usually, to one section of the dashboard.

DomainWhat it doesWhere in the panel
siteCreate, clone, delete, inspect, enable/disable, logs, env, per-site limitsServer Sites, per-site shell
appSingle-container Docker apps — create, build, releases, rollback, previews, envServer Apps
stackDocker Compose stacks — deploy, up/down, adopt, git-build, previewsServer Apps (stacks)
deployGit-deploy pipelines — init, run, rollback, PR previewsPer-site Deploy
dbMariaDB databases + users, dumps, tuning, phpMyAdmin magic linksServer Databases
pgPostgreSQL databases, tables, VACUUM, remote allowlist, pgvectorServer Databases (Postgres)
mongoMongoDB databases, collections, compact, mongo-expressServer Databases (MongoDB)
phpPHP versions, extensions, php.ini/FPM config, restart, optimizeServer PHP
sslIssue, renew, delete certificates; HTTPS redirect; auto-renewServer SSL, per-site SSL
dnsdig lookups + authoritative BIND9 zones/records on the boxServer DNS & TLS
mailMail server install, domains, mailboxes, aliases, queue, webmailServer Mail
dockerContainer lifecycle (start/stop/logs/exec/stats), engine df/pruneServer Docker
container, image, volume, networkDocker resource prune/create/remove/pull/scanServer Docker (Resources)
cronManaged cron jobs — add, run, pause, edit, logs; WP-cron dispatcherServer Cron jobs
daemonSupervisor-managed long-running processesServer Services (daemons)
serviceSystem service control (start/stop/restart/enable) + logsServer Services
security, wafUFW firewall, Fail2ban, SSH policy, ClamAV scans, WP integrity, ModSecurity WAFServer Security, per-site Security
userSystem users + SSH key management, lock, sudo, key auditServer Users
wp, cacheWordPress content, updates, tools, cache (page/object), optimize, SEOPer-site WP sections
ai, litellm, rag, mcpAI-on-VPS — model pull, LiteLLM keys/usage, RAG, MCP serversServer AI
systemTimezone, hostname, reboot, clear caches, LivepatchServer Settings
updatesOS package updates — list, apply, history, unattendedServer Updates
storageDisk usage, du drill-down, safe cleanupsServer Storage
quota, plan, tuningDisk-quota reporting, resource-plan packages, stack retuningServer settings / plans
extensionOptional server add-ons (apt/repo/docker) — install/remove/updateServer Extensions
lbLoad-balancer desired-state apply/remove on the nodeFleet Load balancers
migrateMigrate-in — scan, import, cross-server pull/receiveServer Migrate
logs, metricsLog tailing + metric snapshots (read-only)Terminal / Monitoring

Every job kind maps 1:1 to an mz command with identical arguments — the panel and the CLI share one dispatch. site.create builds exactly mz site create <domain> --profile <slug> --json; cron.run builds mz cron run <id>. There is no separate CLI implementation and no “CLI feature gap”: a new job kind is an mz command the moment it ships.

That equivalence is why the CLI and the dashboard can’t drift, and why an on-box AI (ClaudeCode / MCP) can drive the box with the same verbs the panel uses. See The mz CLI for how to invoke them and For AI agents for the machine-readable entry points.

  • Read kinds (site.list, db.status, ssl.list, metrics.get, …) collapse to the observe capability — any team member who can see the server can run them.
  • Mutations map to a capability group by domain: content (site, wp), infra (php, ssl, db, dns, docker, app, stack, …), or sysadmin (service, security, user, system, updates, storage, backup, migrate). Your role must hold that group.
  • Some kinds require a plan. Resource limits and plans, RAG/MCP AI, and several extensions are Pro+; LiteLLM keys are Plus+. Over-tier jobs are refused at the API with a tier_required error before anything reaches the box. See Plans & quotas.
  • Secrets are masked. Registry passwords, git tokens and Ubuntu Pro tokens are stripped from the persisted payload and the audit log.
  • Backups use a separate dispatch path. backup.* kinds (including Backup v2: backup.v2-run, backup.v2-list, backup.v2-restore, …) are not created through this generic /jobs endpoint — they’re driven by the dedicated backup routes so they can carry sealed destination credentials. They still run as jobs on the same agent; you just kick them off from Backups, not the raw jobs API.
  • The whitelist is the security boundary. The API refuses any kind or argument shape not in its schema — you cannot pass a free-form command. If a new action isn’t wired as a kind yet, it simply can’t be dispatched from the panel.
  • A missing native handler returns exit 127. The agent is native-only; if a kind has no Go handler on that agent version, the job fails with 127 rather than silently falling back. Updating the agent usually fixes it.
  • Jobs need the agent online. Dispatch requires a live WebSocket link. When a server is offline, mutation jobs can’t run and read views fall back to the last cached values.
  • Cross-org jobs 404, not 403. Requesting a job in another org returns not found so the panel never leaks that the job exists.