Replace the cluster-state backup policy.
curl --request PUT \ --url https://stratum.example.com/v1/backup/admin/config \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "enabled": true, "cadenceSeconds": 1, "retentionCount": 1, "targetKind": "directory", "targetPath": "example", "targetOptions": { "requireMountpoint": true, "s3Endpoint": "example", "s3Bucket": "example", "s3Prefix": "example", "s3Region": "example", "s3AccessKey": "example", "s3SecretKey": "example" }, "volumeTargetKind": "", "volumeTargetPath": "example", "volumeTargetOptions": { "requireMountpoint": true, "s3Endpoint": "example", "s3Bucket": "example", "s3Prefix": "example", "s3Region": "example", "s3AccessKey": "example", "s3SecretKey": "example" }, "ageRecipient": "example", "incrementalBackups": true }'Cedar action backup:Manage. Shape is validated at write time
(cadence >= 300s, retention >= 1, absolute target path, parseable
age1... recipient; enabling requires a recipient) so a bad policy
bounces here instead of failing the scheduled run.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”PUT body for the backup policy (operator-settable fields).
object
Per-kind target knobs. Only the fields for the active targetKind are meaningful; everything is optional.
object
Directory kind — refuse backup runs unless targetPath is a mountpoint (catches an unmounted NFS export before it silently collects bundles on the node’s own disk).
Http(s):// endpoint of any S3-compatible store (R2, garage, MinIO).
Bucket name; must already exist.
Optional key prefix for the bundles.
Region; defaults to “auto” (correct for R2).
Write-only - GET returns the mask (“********”); sending the mask back on PUT keeps the stored value.
Optional per-volume target; empty falls back to the cluster-state target.
Per-kind target knobs. Only the fields for the active targetKind are meaningful; everything is optional.
object
Directory kind — refuse backup runs unless targetPath is a mountpoint (catches an unmounted NFS export before it silently collects bundles on the node’s own disk).
Http(s):// endpoint of any S3-compatible store (R2, garage, MinIO).
Bucket name; must already exist.
Optional key prefix for the bundles.
Region; defaults to “auto” (correct for R2).
Write-only - GET returns the mask (“********”); sending the mask back on PUT keeps the stored value.
Opt volume backups into rbd export-diff chains. Omitted keeps the stored value; a new install starts false.
Responses
Section titled “Responses”The stored backup policy.
The cluster-state backup policy (v1,) — the core.backup_config singleton.
object
Seconds between scheduled backups; the control-plane RPO.
Keep-last-N verified-complete bundles on the target.
Directory kind — absolute path visible inside the control-plane container (mount an off-cluster NFS export there; an on-cluster path is not DR-valid). Ignored for s3.
Per-kind target knobs. Only the fields for the active targetKind are meaningful; everything is optional.
object
Directory kind — refuse backup runs unless targetPath is a mountpoint (catches an unmounted NFS export before it silently collects bundles on the node’s own disk).
Http(s):// endpoint of any S3-compatible store (R2, garage, MinIO).
Bucket name; must already exist.
Optional key prefix for the bundles.
Region; defaults to “auto” (correct for R2).
Write-only - GET returns the mask (“********”); sending the mask back on PUT keeps the stored value.
Optional separate target for per-volume tenant-data backups. Empty falls back to the cluster-state target above — e.g. cluster-state → s3/R2, tenant-data volumes → directory/NFS.
Per-kind target knobs. Only the fields for the active targetKind are meaningful; everything is optional.
object
Directory kind — refuse backup runs unless targetPath is a mountpoint (catches an unmounted NFS export before it silently collects bundles on the node’s own disk).
Http(s):// endpoint of any S3-compatible store (R2, garage, MinIO).
Bucket name; must already exist.
Optional key prefix for the bundles.
Region; defaults to “auto” (correct for R2).
Write-only - GET returns the mask (“********”); sending the mask back on PUT keeps the stored value.
Age X25519 recipient (age1…) the bundles are encrypted to.
Opt volume backups into rbd export-diff chains: a full base then diffs shipping only changed blocks. Default false (full exports).
Example
{ "targetKind": "directory", "volumeTargetKind": ""}Bad request.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}