Skip to main content

Helm (Kubernetes)

The official SolidInvoice Helm chart deploys the application, a background worker, and a scheduler to any Kubernetes cluster. It can also bring up MySQL, PostgreSQL, and Redis via Bitnami subcharts.

Prerequisitesโ€‹

  • Kubernetes 1.23+
  • Helm 3.2+
  • A StorageClass that supports ReadWriteOnce PersistentVolumeClaims (required for the application's secrets vault at /etc/solidinvoice)

Add the Helm repositoryโ€‹

helm repo add solidinvoice https://charts.solidinvoice.co
helm repo update
Discover on Artifact Hub

The chart is also indexed on Artifact Hub, where you can browse all available versions, read the full values reference, and copy install commands.

Quick start with MySQLโ€‹

helm install solidinvoice solidinvoice/solidinvoice \
--set mysql.enabled=true \
--set mysql.auth.password="your-mysql-password" \
--set mysql.auth.rootPassword="your-root-password" \
--set app.secret="your-secret-key"

This brings up SolidInvoice with a bundled MySQL instance. Browse to the pod's URL and complete the installation wizard.

Quick start with PostgreSQLโ€‹

helm install solidinvoice solidinvoice/solidinvoice \
--set postgresql.enabled=true \
--set postgresql.auth.password="your-pg-password" \
--set app.secret="your-secret-key"

External databaseโ€‹

Pass a full DATABASE_URL to skip the bundled database subcharts:

helm install solidinvoice solidinvoice/solidinvoice \
--set externalDatabase.url="mysql://user:password@host:3306/solidinvoice" \
--set app.secret="your-secret-key"

Enable async messaging with Redisโ€‹

Redis is required for asynchronous background jobs (sending emails, processing payments). When redis.enabled=true the chart configures the Messenger transport automatically:

helm install solidinvoice solidinvoice/solidinvoice \
--set mysql.enabled=true \
--set mysql.auth.password="your-mysql-password" \
--set redis.enabled=true \
--set redis.auth.password="your-redis-password" \
--set app.secret="your-secret-key"

Automated install (skip the web wizard)โ€‹

Set install.enabled=true to run the installer as a Kubernetes Job during the first deploy, so the wizard step is skipped entirely:

helm install solidinvoice solidinvoice/solidinvoice \
--set mysql.enabled=true \
--set mysql.auth.password="your-mysql-password" \
--set app.secret="your-secret-key" \
--set install.enabled=true \
--set install.adminEmail="admin@example.com" \
--set install.adminPassword="your-admin-password"

Expose via Ingressโ€‹

helm install solidinvoice solidinvoice/solidinvoice \
--set mysql.enabled=true \
--set mysql.auth.password="your-mysql-password" \
--set app.secret="your-secret-key" \
--set ingress.enabled=true \
--set ingress.hosts[0].host="invoices.example.com" \
--set ingress.tls[0].secretName="solidinvoice-tls" \
--set "ingress.tls[0].hosts[0]=invoices.example.com"

OCI registry (alternative)โ€‹

The chart is also published to GitHub Container Registry as an OCI artifact. Use this if you prefer OCI-native installs or want to pin to an exact version without adding a repo:

helm install solidinvoice oci://ghcr.io/solidinvoice/charts/solidinvoice --version 3.0.0

Key values referenceโ€‹

ValueDefaultDescription
app.secret(auto-generated if empty)Application secret โ€” save this; changing it invalidates all sessions and API tokens
app.localeenDefault locale
app.allowRegistrationfalseAllow public self-registration
app.workerModefalseEnable FrankenPHP persistent worker mode
install.enabledfalseRun the CLI installer as a Job (skips web wizard)
install.adminEmailโ€”Admin user email (used when install.enabled=true)
install.adminPasswordโ€”Admin user password (used when install.enabled=true)
worker.enabledtrueDeploy the Messenger consumer worker
worker.replicaCount1Number of worker pods
scheduler.enabledtrueDeploy the cron scheduler
persistence.enabledtrueCreate a PVC for /etc/solidinvoice
persistence.size1GiPVC size
ingress.enabledfalseCreate an Ingress resource

Upgradingโ€‹

Always pass --reuse-values (or re-specify app.secret) so the secret doesn't change between releases:

helm repo update solidinvoice
helm upgrade solidinvoice solidinvoice/solidinvoice --reuse-values

Database migrations run automatically as a pre-upgrade Job before the new pods start.

Persistenceโ€‹

/etc/solidinvoice stores the application's Symfony secrets vault. The PVC is annotated with helm.sh/resource-policy: keep so it is not deleted when you run helm uninstall. Back it up before migrating clusters.

warning

For multi-replica deployments (replicaCount > 1), the PVC must use a ReadWriteMany StorageClass so all pods can share the vault. A ReadWriteOnce PVC only works with a single replica.