UpdraftPlus (Premium)

Source

Private (Premium) — baked from the licensed zip

Purpose

Scheduled backup of database + uploads to offsite storage; restore

Special infra

Dedicated backup PVC; restore-staging emptyDir

Install

UpdraftPlus Premium is not on wordpress.org. Bake the licensed zip (root folder updraftplus/) into the image and activate it in bootstrap:

unzip -q packages/updraftplus-*.zip -d web/app/plugins

Licence activation

There is no licence file. The Premium code is the baked zip; activation is a one-time online connect in UpdraftPlus → Premium / Extensions — logging in with the account registers the site and stores the connection in the database, so it survives every pod restart. Do it once after first deploy. Remote-storage providers (OneDrive, S3, Dropbox, Google Drive, …) are likewise authorised once via OAuth in the settings and persisted in the DB.

Storage — the two directories that matter

UpdraftPlus touches two writable locations. Getting the volume types right is essential.

Backup directory — its own PVC

The backup directory defaults to wp-content/updraft. It must be its own PVC, mounted at web/app/updraft:

- name: updraft
  mountPath: /var/www/html/web/app/updraft   # own PVC, sibling of uploads

Do not implement it as a subPath of the uploads PVC. Doing so places the backups at the uploads-PVC root, where they surface as wp-content/uploads/updraft — inside the media tree. A media restore then collides with UpdraftPlus' own backup folder (Delete …​/uploads/updraft: Failed), and the uploads archive ends up containing the backup store recursively. A dedicated PVC makes updraft a true sibling of uploads. UpdraftPlus honours absolute paths too, but the default location on its own volume is the simplest correct answer.

Restore-staging directory — an emptyDir

Restores unpack archives into wp-content/upgrade. UpdraftPlus deletes and recreates that directory between steps, so it must be an emptyDir, not a PVC subPath — a subPath bind mount goes stale the moment the app `rmdir`s it (writes then fail with the directory reporting a link count of 0). See the writable-path traps.

- name: upgrade
  mountPath: /var/www/html/web/app/upgrade   # emptyDir

Schedule

Backups run on WordPress cron, which on an immutable site is driven by the out-of-band CronJob (see WP-Cron). The interval and report email can be seeded in bootstrap:

wp option update updraft_interval 'daily'
wp option update updraft_interval_database 'daily'
wp option update updraft_email '<ops-address>'

The exact time-of-day and the remote-storage connection are set once in the admin.

Immutability boundary

UpdraftPlus can restore the database and uploads — both are writable. It cannot restore plugins, themes or core: those directories are baked read-only. Recover code by redeploying the matching image tag, not through UpdraftPlus. Deselect the code components when restoring.

Backups taken before the backup dir was moved to its own PVC contain a nested uploads/updraft subtree in their uploads archive. They still restore, but leave harmless junk; take a fresh backup after the storage layout is correct for a clean restore.