Skip to main content
Version: 2026.05.1

Media Processing Helm Chart

Version: 2.0.0-helm Type: application AppVersion: 2.0.0

Phonexia Media Processing microservice (CPU only) converting audio streams, splitting or mixing channels, and merging multiple streams into multichannel output

Maintainers

NameEmailUrl
Phonexiasupport@phonexia.comhttps://www.phonexia.com

Helm: >= 3.2.0

Values

KeyTypeDefaultDescription
affinityobject{}Affinity for pod assignment (node/pod affinity rules)
annotationsobject{}Annotations of deployment (custom metadata for the deployment)
config.instancesPerDeviceint1Number of instances per device. Microservice can process requests concurrently if value is >1.
config.keepAliveTimeint60Time between 2 consecutive keep-alive messages, that are sent if there is no activity from the client. If set to 0, the default gRPC configuration (2hr) will be set (note, that this may get the microservice into unresponsive state).
config.keepAliveTimeoutint20Time to wait for keep alive acknowledgement until the connection is dropped by the server.
config.listeningAddressstring""Address on which the server will be listening. Address '[::]' also accepts IPv4 connections.
config.logLevelstring""Logging level. Possible values: error, warning, info, debug, trace.
config.maxAudioLengthint0Maximum length of input audio in seconds. 0 means no limit.
config.portint8080Port where the service will listen (must match service.port)
extraEnvVarslist[]Extra environment variables for media-processing container
fullnameOverridestring""String to fully override media-processing.fullname template
global.image.registrystring""Global image registry (overrides local image.registry and global.imageRegistry) For backward compatibility, if both global.imageRegistry and image.registry are set, image.registry takes precedence.
global.imagePullSecretslist[]Global image pull secrets (overrides local imagePullSecrets)
global.imageRegistrystring""Global image registry (overrides local image.registry)
image.pullPolicystring"IfNotPresent"Image pull policy (Always, IfNotPresent, Never)
image.registrystring"registry.phonexia.com"Image registry URL
image.repositorystring"phonexia/dev/technologies/services-monorepo/media-processing"Image repository path
image.tagstring""Image tag (defaults to appVersion from Chart.yaml)
image.useFreeFFmpegbooltrueUse free ffmpeg version (adds -free suffix to tag) Ignored if image.tag is set
imagePullSecretslist[]Specify docker-registry secret names as an array
ingress.annotationsobject{}Ingress annotations (e.g., nginx ingress class, TLS settings)
ingress.classNamestring""Ingress class name (e.g., "nginx")
ingress.enabledboolfalseEnable ingress resource creation
ingress.hostslist[{"host":"media-processing.example.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}]Ingress host configuration
ingress.tlslist[]TLS configuration for ingress
initContainerslist[]Init containers (evaluated as template, can be used to prepare environment)
livenessProbeobject{"failureThreshold":3,"initialDelaySeconds":0,"periodSeconds":30,"successThreshold":1,"timeoutSeconds":5}Liveness probe settings (checks if container is alive)
nameOverridestring""String to partially override media-processing.fullname template
nodeSelectorobject{}Node labels for pod assignment (node selector)
onDemand.cooldownPeriodint300Cooldown period in seconds after scaling down
onDemand.enabledboolfalseEnable on-demand scaling with KEDA
onDemand.idleReplicaCountint0Number of replicas when idle (usually 0 for cost savings)
onDemand.maxReplicaCountint1Maximum number of replicas to scale up to
onDemand.minReplicaCountint1Minimum number of replicas to maintain
onDemand.pollingIntervalint30How often KEDA checks metrics (seconds)
onDemand.schedule.desiredReplicasstring"1"Desired number of replicas during the period
onDemand.schedule.enabledboolfalseEnable schedule for scaling pods
onDemand.schedule.periodEndstring""End of the period Example: "0 19 * * 1-5" run on Monday-Friday until 7pm
onDemand.schedule.periodStartstring""Start of the period Example: "0 6 * * 1-5" run on Monday-Friday from 6am
onDemand.schedule.timezonestring"Europe/Prague"Timezone which to base the schedule on
onDemand.trigger.activationThresholdint5Threshold to activate scaling (minimum metric value to start scaling)
onDemand.trigger.querystring"sum(increase(nginx_ingress_controller_requests{ exported_namespace=\"{{ .Release.Namespace }}\", exported_service=\"{{ include \"media-processing.fullname\" . }}\", method=\"POST\"}[5m]))"Prometheus query to determine scaling metrics
onDemand.trigger.serverAddressstring"http://kube-prometheus-stack-prometheus.monitoring:9090/prometheus"Prometheus server address for metrics collection
onDemand.trigger.thresholdint100Threshold value for scaling decisions
podAnnotationsobject{}Annotations for pods (custom metadata for pods)
podSecurityContextobject{}Security context for pods (fsGroup, etc.)
readinessProbeobject{"failureThreshold":3,"initialDelaySeconds":0,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":5}Readiness probe settings (checks if container is ready to serve traffic)
replicaCountint1Number of replicas to deploy
resourcesobject{}The resources limits/requests for the media-processing container
runtimeClassNamestring""Specify runtime class (e.g., for specific container runtimes)
securityContextobject{}Security context for media-processing container
service.clusterIPstring""Service Cluster IP (use None for headless service)
service.portint8080Service port (must match config.port)
service.typestring"ClusterIP"Service type (ClusterIP, NodePort, LoadBalancer)
serviceAccount.annotationsobject{}Annotations to add to the service account
serviceAccount.createbooltrueSpecifies whether a service account should be created
serviceAccount.namestring""The name of the service account to use
startupProbeobject{"failureThreshold":30,"initialDelaySeconds":0,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":5}Startup probe settings (checks if container has started successfully)
tmpdir.mountPathstring"/tmp"Mount path for temporary directory inside the container
tmpdir.optionsobject{}Mount options for temporary directory (e.g., size limits, permissions)
tolerationslist[]Tolerations for pod assignment (allows pods on tainted nodes)
updateStrategyobject{"type":"RollingUpdate"}Deployment update strategy (RollingUpdate, Recreate)

Installation

Installing the Chart

Run the following command to install the chart with the release name my-release. Use --version parameter to install specific version. Available versions can be found on docker hub.

helm install my-release oci://registry-1.docker.io/phonexia/media-processing --version 1.0.0-helm

This command deploys media-processing on the Kubernetes cluster in the default configuration.

Exposing the service

To expose the service outside of kubernetes cluster follow Using a Service to Expose Your App.

Ingress

Media Processing service is using GRPC protocol which can be exposed by some ingress controllers. For example nginx-ingress controller support this. To expose media-processing service via ingress use following configuration:

ingress:
# Deploy ingress object
enabled: true
# Ingress class name
className: "nginx"
annotations:
# Force redirect to SSL
nginx.ingress.kubernetes.io/ssl-redirect: "true"

# Tell nginx that backend service use GRPC
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
hosts:
# Hostnames
- host: media-processing.example.com
paths:
- path: /
pathType: ImplementationSpecific
# Use tls
tls:
# Secret containing TLS certificate
- secretName: media-processing-tls
# TLS hostnames
hosts:
- media-processing.example.com

Use grpcurl to check if everything works as expected. Output of the following command

$ grpcurl --insecure media-processing.example.com:443 grpc.health.v1.Health/Check

should be

{
"status": "SERVING"
}

Uninstalling the Chart

To uninstall/delete the my-release release:

helm delete my-release

The command removes all the Kubernetes components associated with the chart and deletes the release.