Documentation Index
Fetch the complete documentation index at: https://docs.frankenpress.com/llms.txt
Use this file to discover all available pages before exploring further.
charts ships site —
a Helm chart that deploys a single FrankenPress WordPress site to
Kubernetes. Bitnami chart style throughout: every value annotated with
## @param, naming + labels via the bitnami/common library, optional
subchart deps via the Bitnami OCI registry.
Install
The chart is published as an OCI artifact on GHCR:What gets deployed
The install Job is new in chart v0.2.0 — fresh deploys produce a usable site without manualkubectl exec ... wp core install. The
sync-admin-credentials initContainer (chart v0.4.0+) reconciles
wp_users from the install Secret on every Pod start. See
First install for credentials and
Operations → Admin credential rotation
for the rotation flow.
Subchart dependencies
| Subchart | Default | Purpose |
|---|---|---|
bitnami/common | always loaded | Library helpers (fullname, labels, image templating) |
bitnami/mariadb | enabled | In-cluster DB for instant deploy. Not for production. |
bitnami/redis | enabled | Souin HTTP cache backend. Production: swap to DragonflyDB Operator. |
bitnami/minio | enabled | S3-compatible object storage. Production: swap to AWS S3 / R2 / GCS. |
Values reference
The full annotated values reference is incharts/site/values.yaml;
the most-used keys:
| Key | Default | Purpose |
|---|---|---|
image.repository | frankenpress/site-template | Your site image |
image.tag | "" (chart appVersion) | Pin per release |
site.url | http://site.localhost | WP_HOME — must match your access URL |
site.env | production | Selects config/environments/<env>.php |
keysSalts.autoGenerate | true | Off → set keysSalts.existingSecret |
siteInstall.enabled | true | Off → skip auto wp core install (use for DB-restore deploys) |
siteInstall.adminUser | admin | Auto-generated path |
siteInstall.existingSecret | "" | BYO Secret (key names configurable) |
syncAdminCredentials | true | InitContainer that reconciles wp_users from the install Secret on every Pod start (idempotent, multi-replica safe). Pair with Reloader for self-driving rotation. Set false to skip — see Admin credential rotation. |
replicaCount | 1 | Deployment replicas (HPA optional) |
revisionHistoryLimit | 3 | Old ReplicaSets retained for kubectl rollout undo. Lower than the k8s default of 10 since helm rollback and image-tag-pinned re-deploys are the canonical rollback paths in this stack. Chart v0.4.1+. |
ingress.enabled / httpRoute.enabled | false / false | Pick one for external routing |
mariadb.enabled / redis.enabled / minio.enabled | true / true / true | Bundled subcharts (kind dev) |
externalDatabase.host | "" | Used when mariadb.enabled=false |
externalCache.host | "" | Used when redis.enabled=false |
externalS3.bucket | site-media | Used when minio.enabled=false |
wpCron.enabled | true | Run a CronJob that fires wp cron event run --due-now. When true, the chart also sets DISABLE_WP_CRON=true on the site so WP’s in-process pseudo-cron doesn’t fire alongside it (the two settings are coupled). Disable to fall back to WP’s request-triggered cron. |
wpCron.schedule | */5 * * * * | wp-cron CronJob frequency |
serviceMonitor.enabled | false | Render a prometheus-operator ServiceMonitor for the :9145/metrics endpoint. Self-gates on the monitoring.coreos.com/v1 CRD — leaving on for clusters without it is safe (renders nothing). Set serviceMonitor.labels to whatever your Prometheus’s serviceMonitorSelector expects. |
smtp.enabled | false | Wire wp_mail() through SMTP. Inject 5 FP_SMTP_* env vars + 2 secretKeyRef env entries into the Deployment, wpcron CronJob, and install Job. Pairs with the SMTPMailer mu-plugin component. Transport-agnostic — Postmark, SendGrid, Mailgun, AWS SES, in-cluster relay. See Operations → Email for provider recipes. Requires site-template v0.2.4+. |
smtp.host / smtp.port / smtp.encryption | "" / 587 / tls | SMTP server, TCP port, transport encryption (tls for STARTTLS, ssl for implicit TLS, "" for plaintext local-dev only). |
smtp.auth.existingSecret | "" | Required when smtp.enabled=true and the server requires auth. Secret keys default to username / password; override via smtp.auth.usernameKey / passwordKey. Leave empty for unauthenticated in-cluster relays. |
tmpfsSize.tmp / data / config | 256Mi / 64Mi / 16Mi | tmpfs sizes for the read-only-root pod |
First install
The chart runswp core install and wp core update-db from a
post-install/post-upgrade Helm hook Job — a fresh helm install
produces a usable WordPress site without any manual kubectl exec.
The install step is idempotent (wp core is-installed short-circuits
re-runs), so the Job is safe across helm upgrades.
Default behavior
By default, the chart creates a<release>-site-install Secret with
a random 32-char admin password. Retrieve it after install:
Bring-your-own Secret
Point at a pre-existing Secret with the admin credentials:The chart doesn’t care how the Secret got there —
kubectl create secret,
External Secrets Operator (any provider: AWS Secrets Manager, GCP Secret
Manager, Vault, 1Password), Sealed Secrets, SOPS-decrypted, anything
works. The configurable key names let the Secret use whatever schema
the source system produces.Password rotation
WordPress stores a hash of the admin password inwp_users, so simply
updating the Secret value won’t change the live login. The chart’s
sync-admin-credentials initContainer (default on) handles this on
every Pod start — pair it with
Stakater Reloader
so the Pod actually rolls when the Secret changes:
wp user update; subsequent Pods see the DB in sync and short-circuit.
One DB write, one WP “Password Changed” notification per rotation,
regardless of replica count.
Full setup, verification, failure modes, and the
syncAdminCredentials: false opt-out are in
Operations → Admin credential rotation.
The database password rotates differently — the Deployment, wpcron
CronJob, and install Job all read DB_PASSWORD from secretKeyRef, so
when the Secret value changes, restarting pods picks up the new value
automatically. No chart-side reconciliation needed (and Reloader handles
the restart trigger).
Skipping install
For sites being restored from an existing database dump:wp core update-db is skipped too, so make sure your dump is
schema-compatible with the WP core version baked into the site image.
If it isn’t, re-enable the Job after restore — wp core is-installed
will short-circuit and only update-db will run.
Production overrides example
CI / publishing
lint.yml—helm lint+helm template+chart-testing ct linton every push and PR.release.yml— onv*.*.*tag push,helm package+ push tooci://ghcr.io/frankenpress/charts/site:<version>. Tag-driven, never push-to-main-driven, soChart.yamlversionand the git tag move together. OCI is the canonical channel — nogh-pagesfallback.