Skip to content
SYS.DOCS // DOCS

Deploy and Operate Strapi

Strapi is an open-source headless CMS that models content, exposes it over REST and GraphQL, and manages media from an admin panel. Edka deploys it as a managed app in your Kubernetes cluster, connects it to a managed PostgreSQL database, and publishes it on a Gateway hostname.

ComponentPurposeHow Edka connects it
StrapiAdmin panel, REST and GraphQL API, on port 1337Installed from the Edka Strapi chart, running a starter or custom image
PostgreSQLContent entries, users, and admin dataSelect an installation, database, and user from the Databases workspace
Uploads volumeMedia uploaded through the admin panelPersistent volume with the selected storage class, mounted at /opt/app/public/uploads
Envoy GatewayHTTPS access to the admin panel and APISelect a traffic class and hostname

Before installing Strapi, prepare:

  • an Edka cluster with an Envoy Gateway traffic class and managed TLS if you plan to expose Strapi publicly
  • a DNS hostname for the Strapi admin panel and API
  • a managed PostgreSQL installation with an empty database and a user that can connect to it
  • a container image if you intend to run your own Strapi project instead of the Edka starter image, and an image pull Secret in the target namespace if that image lives in a private registry

See Databases, Gateway API, and Container Registry Integrations if these are not ready yet.

  1. Open your cluster and select Apps.
  2. Find Strapi and select Install.
  3. In General, choose the Namespace (default strapi), set the Strapi Image Repository and Strapi Image Tag, optionally set an Image Pull Secret, and decide whether Edka may automatically apply compatible chart and image updates.
  4. In Database, select the PostgreSQL Installation, PostgreSQL Database, and PostgreSQL User prepared for Strapi. Edka resolves the host, port, schema, and SSL settings from the selected installation, and the password from the selected user’s Secret.
  5. In Configuration, review Disable Telemetry (enabled by default). App keys and secrets are generated automatically; there is nothing to enter here.
  6. In Storage, set Uploads Storage (Gi) and the Storage Class.
  7. In Resources, review the CPU Request, Memory Request, CPU Limit, and Memory Limit.
  8. In Placement, optionally select a Node Pool and leave Tolerate Node Pool Taints enabled if that pool has taints.
  9. In Access, decide whether to expose Strapi via Gateway, then choose a Traffic Class and Hostname.
  10. Select Install App and follow the operation progress until Strapi is ready.

Namespace, Storage Class, and whether Strapi is exposed via Gateway (Expose Strapi via Gateway) are fixed once the app is installed.

Strapi content types are schema files inside the project, not database rows. Creating a collection type in the admin panel writes schema files to the container filesystem, which works in development but not in production: the chart sets NODE_ENV to production, and Strapi’s admin panel does not let you edit content types while running in that mode.

Edka starts you on the Strapi Image Repository default ghcr.io/edkaio/strapi-starter at tag 5.46.0-edka.2, so the admin panel is usable immediately after install. To add custom content types or plugins:

  1. Model the content types locally against the Strapi project.
  2. Commit the generated schema files.
  3. Build a container image from the project.
  4. Set Strapi Image Repository and Strapi Image Tag to that image.

Content entries, users, and uploaded media stay in PostgreSQL and the uploads volume, so they persist across image changes.

Strapi’s secrets live in a runtime Secret in the app namespace (existingSecret on the chart release). Edka generates them once during installation and preserves them across configuration updates; the fields are not editable afterward.

SecretPurposeHandling
App KeysSigns cookies and other Strapi secretsGenerated at install (64 characters), kept stable
API Token SaltSalt used when creating API tokensGenerated at install (32 characters), kept stable
Admin JWT SecretSigns JWT tokens in the Strapi admin panelGenerated at install (32 characters), kept stable
Transfer Token SaltSalt used for data transfer tokensGenerated at install (32 characters), kept stable
Users JWT SecretSigns JWT tokens for the Users & Permissions featureGenerated at install (32 characters), kept stable
Encryption KeyEncrypts values stored by Strapi features that need itGenerated at install (32 characters), kept stable
PostgreSQL passwordDatabase connectionResolved from the selected user’s password Secret

If the runtime Secret is missing during a configuration update and no replacement value is supplied, the update fails rather than silently generating new values, since rotating any of these secrets invalidates existing admin sessions and issued tokens.

Strapi connects to PostgreSQL with DATABASE_CLIENT=postgres. Edka builds the remaining connection settings from your selections: host, port, database name, username, and schema (default public), plus SSL enablement and certificate verification inherited from the selected PostgreSQL installation. The database must already exist and be empty; Strapi initializes its schema on first start.

OptionDefaultNotes
Uploads volume10GiPersistent volume for media uploaded through the admin panel, from 1 to 1000 Gi
Storage classhcloud-volumesFixed at install time
CPU request250m
Memory request512Mi
CPU limit1000m
Memory limit1Gi

The uploads volume uses the ReadWriteOnce access mode and the chart runs a single replica; there is no field to scale Strapi beyond one pod. Configuring an S3-compatible upload provider inside your Strapi project image, instead of the local uploads volume, is outside the scope of the Edka chart’s inputs. You can also place Strapi on a selected node pool, with automatic tolerations for that pool’s taints (enabled by default).

Chart and image auto-updates are opt-in and share one policy: patch, minor, major, all, or a custom tag pattern using a glob: or regexp: prefix. Choose a check interval from every 5 minutes to daily.

Auto-updates apply to both the Edka Strapi chart version and the Strapi Image Tag in the configured Strapi Image Repository. If you have replaced the starter image with your own project image, enabling auto-update also lets Edka pick up new tags pushed to that repository, so set the policy and pattern to match how you tag releases.

SymptomCheck
Strapi pod stays unreadyVerify the selected PostgreSQL installation, database, and user, and review the pod Logs for connection errors
Namespace is rejectedNamespace must be a valid Kubernetes name
Hostname is rejectedHostname must be a valid domain
Content-Type Builder is read-only in the admin panelNODE_ENV is fixed to production by the chart; model content types locally, commit the schema files, and rebuild the image instead
Configuration update fails with a missing Secret errorThe runtime Secret <release>-config was not found in the app namespace; restore it or reinstall rather than editing the generated fields
Cannot add a second replicaThe uploads volume is ReadWriteOnce and the chart is fixed at one replica; configure Strapi’s own S3-compatible upload provider in your project image if you need to scale out