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.
Architecture
Section titled “Architecture”| Component | Purpose | How Edka connects it |
|---|---|---|
| Strapi | Admin panel, REST and GraphQL API, on port 1337 | Installed from the Edka Strapi chart, running a starter or custom image |
| PostgreSQL | Content entries, users, and admin data | Select an installation, database, and user from the Databases workspace |
| Uploads volume | Media uploaded through the admin panel | Persistent volume with the selected storage class, mounted at /opt/app/public/uploads |
| Envoy Gateway | HTTPS access to the admin panel and API | Select a traffic class and hostname |
Prerequisites
Section titled “Prerequisites”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.
Install Strapi
Section titled “Install Strapi”- Open your cluster and select Apps.
- Find Strapi and select Install.
- 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. - 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.
- In Configuration, review Disable Telemetry (enabled by default). App keys and secrets are generated automatically; there is nothing to enter here.
- In Storage, set Uploads Storage (Gi) and the Storage Class.
- In Resources, review the CPU Request, Memory Request, CPU Limit, and Memory Limit.
- In Placement, optionally select a Node Pool and leave Tolerate Node Pool Taints enabled if that pool has taints.
- In Access, decide whether to expose Strapi via Gateway, then choose a Traffic Class and Hostname.
- 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.
Custom Content Types and Images
Section titled “Custom Content Types and Images”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:
- Model the content types locally against the Strapi project.
- Commit the generated schema files.
- Build a container image from the project.
- 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.
Runtime Secrets
Section titled “Runtime Secrets”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.
| Secret | Purpose | Handling |
|---|---|---|
| App Keys | Signs cookies and other Strapi secrets | Generated at install (64 characters), kept stable |
| API Token Salt | Salt used when creating API tokens | Generated at install (32 characters), kept stable |
| Admin JWT Secret | Signs JWT tokens in the Strapi admin panel | Generated at install (32 characters), kept stable |
| Transfer Token Salt | Salt used for data transfer tokens | Generated at install (32 characters), kept stable |
| Users JWT Secret | Signs JWT tokens for the Users & Permissions feature | Generated at install (32 characters), kept stable |
| Encryption Key | Encrypts values stored by Strapi features that need it | Generated at install (32 characters), kept stable |
| PostgreSQL password | Database connection | Resolved 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.
Database Configuration
Section titled “Database Configuration”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.
Storage, Resources, and Placement
Section titled “Storage, Resources, and Placement”| Option | Default | Notes |
|---|---|---|
| Uploads volume | 10Gi | Persistent volume for media uploaded through the admin panel, from 1 to 1000 Gi |
| Storage class | hcloud-volumes | Fixed at install time |
| CPU request | 250m | |
| Memory request | 512Mi | |
| CPU limit | 1000m | |
| Memory limit | 1Gi |
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).
Updates
Section titled “Updates”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.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Check |
|---|---|
| Strapi pod stays unready | Verify the selected PostgreSQL installation, database, and user, and review the pod Logs for connection errors |
| Namespace is rejected | Namespace must be a valid Kubernetes name |
| Hostname is rejected | Hostname must be a valid domain |
| Content-Type Builder is read-only in the admin panel | NODE_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 error | The 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 replica | The 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 |