GET /caddy/vhosts/example.com/logs?kind=requests&status=4xx&path=/login&ip=203.0.113.10&since=…&limit=200
Client certificates (mTLS)
POST /caddy/vhosts/{domain}/mtls/ca: org, validity_days (3650), force.
POST …/mtls/clients: common_name, email, validity_days (365). PEM + PKCS#12 returned once; key not stored.
Set mtls on, pick mtls_mode.
Revoke: POST …/mtls/clients/{serial}/revoke. Leaf allowlist; effective at once.
Global Caddy options
Operator only. GET/PUT /caddy/settings or Caddy → Settings. Validated with caddy validate, backed up, reloaded, restored on failure, then rendered by every node.
Redis storage · ratelimit · cache-handler (Souin) · Coraza · Brotli · geo-ip · layer4 · ozcapture. CrowdSec bouncer and replace-response compiled in, unused. No ACME DNS-provider module. GET /caddy/plugins.
Operator · Caddy settings.
Certificates
autoACME http-01; port 80 reachable. Held on an internal cert until DNS points at the cluster; recheck every 2 min (POST /caddy/tls/recheck, GET /caddy/tls/audit).
SharedRedis via Sentinel (one copy, one issuance per name, lock) or /mnt/cluster/caddy. Node-local disk: single node only.
Switch to RedisPOST /caddy/storage/redis/switch: copy, byte compare, record, roll. No re-issue.
Other services/var/lib/ozpanel/certs/<name>/fullchain.pem, privkey.pem, info.json for Postfix, Dovecot, panel.
InventoryGET /certs, POST /certs/sync, POST /certs/import (records a PEM; not served as a site cert). Health fails on expired public certs; warns at 14 days.
mail.<domain>Platform site per mail domain for the mail cert; redirects browsers.
FailoverStorage follows Sentinel; local mirror if Redis is down at start; SNI probe restarts a stuck Caddy (5 min cooldown).
Not availableCustom certificate per site · wildcard · DNS-01.
Domains and pages
Parent is
Kind
Counts against
Same account's domain
subdomain, parent's zone
subdomains
Another account's
refused
Not on the platform
apex, own zone
domains
Auto wwwRedirect block added when the zone publishes www at the same addresses.
Welcome pageWritten once into an empty root. GET/PUT/DELETE /caddy/welcome: brand_name, brand_url, headline, body, template. POST …/preview, …/rerender (signed pages only; dry run unless apply).
SuspendedEvery site answers 503, no-store. Files untouched.
DeleteSite: record, file, pool, client CA. Domain: plus logs, cert records.
Tenant · Domain.
Proxy target rules
Target
Result
Public host, private 10/8, 172.16/12, 192.168/16
Allowed
Loopback on the account's own app port
Allowed
Other loopback, mesh 100.64/10, 169.254/16, cluster nodes, unresolvable
Refused (super-admin: 409, retry with confirm_internal)
PHP
One PHP version installed (PHP-FPM 8.4). Per-site PHP version: not available. GET /phpfpm/versions.
PoolOne per site, account's user, own FPM master in the account's cgroup slice. ondemand, idle 30 s, 500 requests, max_children = plan php_workers (10, max 200).
Lockedopen_basedir home · per-account temp and session dirs · disable_functions exec, passthru, shell_exec, system, proc_*, popen, pcntl_exec, pcntl_fork, dl.
Month to date, all nodes: Caddy per-host metrics + nftables counters on published ports + Postfix bytes. Not counted: SFTP, DNS, IMAP/POP3, panel. bandwidth_gb_month reported, not capped. GET /stats/bandwidth/coverage, /tenants/{id}/usage.