symfony
Helm chart for Symfony PHP applications.
- Workload kind:
StatefulSet - Container port: 80
- Probes: required, always on (
/healthstartup + liveness,/readyreadiness) - Init container: runs
./.container-init.shif present in the image - Migrations:
component-tasks.migrations.commandsrun once per deploy as an ArgoCDSynchook Job
Dependencies
component-traefik-ingresscomponent-pdbcomponent-external-secretcomponent-rediscomponent-databasecomponent-tasks
Defaults worth knowing
replicaCount: 2
terminationGracePeriodSeconds: 30
container:
port: 80
probes:
startup: { path: /health, periodSeconds: 2, failureThreshold: 60 }
readiness: { path: /ready, periodSeconds: 5, failureThreshold: 3 }
liveness: { path: /health, periodSeconds: 10, failureThreshold: 3 }
Probes are not toggleable on this chart — if your image doesn't expose them, use php-generic instead.
Minimum project values
global:
projectSlug: my-project
environmentSlug: staging
image:
repository: registry.gitlab.com/onyourmarks/k8s/my-project/app
tag: abc123-staging
component-traefik-ingress:
enabled: true
hosts:
- host: my-project.staging.k8s.instance.onyourmarks.tech
paths: [{ path: /, pathType: Prefix }]
tls:
- secretName: traefik-ingress-tls
hosts: [my-project.staging.k8s.instance.onyourmarks.tech]
component-database:
enabled: true
Shared volumes (RWX)
Cross-pod shared storage is opt-in via global.sharedVolumes. Each entry creates an nfs-backed ReadWriteMany PVC and mounts one or more paths from it into the app container.
global:
sharedVolumes:
- name: shared
size: 2Gi
mounts:
- path: /var/app/var/cache
subPath: cache
- path: /var/app/public/cache
subPath: public-cache
See component-shared-volume for the full schema and Shared storage for cluster-level context.
Migrations
Database migrations run once per deploy as an ArgoCD Sync hook Job, after the app secrets and database are ready and before any new pod of the app, its workers or its cron jobs starts:
component-tasks:
migrations:
commands:
- ["bin/console", "doctrine:migrations:migrate", "--no-interaction", "--allow-no-migration"]
.container-init.sh then holds only per-pod steps, or goes away entirely. Fields and behaviour: component-tasks → Migrations.