Openvidu-init restart looping after upgrade to 3.6.0

After upgrade to 3.6.0 the openvidu-init docker process restarts every app 5 seconds and only 3 docker processes starts ever.

root@meet:~# systemctl status openvidu
● openvidu.service - OpenVidu Community - Single Node
Loaded: loaded (/etc/systemd/system/openvidu.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-03-10 14:56:15 UTC; 1min 4s ago
Process: 4817 ExecStartPre=/usr/local/bin/docker-compose down (code=exited, status=0/SUCCESS)
Main PID: 4826 (docker-compose)
Tasks: 9 (limit: 6841)
Memory: 12.1M (peak: 13.9M)
CPU: 666ms
CGroup: /system.slice/openvidu.service
└─4826 /usr/local/bin/docker-compose up

Mar 10 14:57:10 meet docker-compose[4826]: openvidu-init | 2026-03-10T14:57:10Z | FATAL | main | Error initializing single node: configuration errors:
Mar 10 14:57:10 meet docker-compose[4826]: openvidu-init |
Mar 10 14:57:10 meet docker-compose[4826]: openvidu-init | service ‘caddy’: Failed to process config file ‘/opt/openvidu/config/caddy.yaml’: Errors found:
Mar 10 14:57:10 meet docker-compose[4826]: openvidu-init |
Mar 10 14:57:10 meet docker-compose[4826]: openvidu-init | * Error at line 43: Environment variable ‘openvidu.CADDY_TCP_DEMUX_PORT’: mandatory
Mar 10 14:57:10 meet docker-compose[4826]: openvidu-init | * Error at line 62: Environment variable ‘openvidu.CADDY_TCP_DEMUX_PORT’: mandatory
Mar 10 14:57:10 meet docker-compose[4826]: openvidu-init |
Mar 10 14:57:10 meet docker-compose[4826]: openvidu-init |
Mar 10 14:57:10 meet docker-compose[4826]: [49B blob data]
Mar 10 14:57:19 meet docker-compose[4826]: mongo | {“t”:{“$date”:“2026-03-10T14:57:19.785+00:00”},“s”:“I”, “c”:“WTCHKPT”, “id”:22430, “ctx”:“Checkpointer”,“msg”:“WiredTiger message”,“attr”:{"m>
lines 1-21/21 (END)

Previous upgrades has succeded without problems.

Any hints ?

Thanks.

Hello @hvillemoes

Add to openvidu.env the following environment variable:

CADDY_TCP_DEMUX_PORT=5656

And let me know if it starts correctly.

Can you send me (with secrets and domain removed of course), the content of:

  • deployment-info.yaml
  • openvidu.env

Just to see what edge case I’ve missed to fix it in the updater.

Hi

Adding CADDY_TCP_DEMUX_PORT=5656 to openvidu.env did the trick - now startup worked flawless.

The 2 requested files from before upgrade are attached.

Thanks again for a great product and swift support.

(Attachment 3.5.0_deployment-info.yaml is missing)

(Attachment 3.5.0_openvidu.env is missing)

1 Like

A quick add-on question:

How do I enable captions in the OpenVidu Single Node Community version ?

I tried to set MEET_CAPTIONS_ENABLED=true and reboot, but the Captions button stays grey with popup msg: “Live captions are disabled by admin”.

Is this feature only available in paid versions ?

It seems that your email filter don’t like conf files, now trying with tgz

(Attachment OpenVidu Meet.tar.gz is missing)

root@meet:~# cat /opt/openvidu/deployment-info.yaml

# This file is autogenerated. Do not edit it manually
# It contains information about the deployment
# It can be used by OpenVidu Support team to help you
# and for upgrade purposes
openvidu-deployment:
version: “3.5.0”
edition: “COMMUNITY”
certificateType: “owncert”
deploymentType: “single_node”
environment: “on_premise”
nodeRole: “”
usingTurnDomain: false
externalProxy: false
internalTLSTermination: false
experimentalTurnTLSWithMainDomain: false
forceUTCTimezone: false
root@meet:\~#

root@meet:~# cat /opt/openvidu/config/openvidu.env

# OpenVidu Community Configuration File
# ------------------------------------
# NOTES:
# ------------------------------------
# The parameters defined here are global and can be utilized by any configuration
# file within this directory.
# 
# No need to quote assignment values, even if they contain spaces.
# Values are stored exactly as written, so avoid using quotes.
# ------------------------------------

# ------------------------------------
# Domain name configuration
# ------------------------------------

# The domain name for the deployment. Use this domain name to access
# OpenVidu APIs and services.
DOMAIN_NAME=xxxxxxxxxxxxxx

# ------------------------------------
# LiveKit Global Configuration
# ------------------------------------

# Global LiveKit API Key and Secret used for apps to connect to OpenVidu.
LIVEKIT_API_KEY=xxxxxxx
LIVEKIT_API_SECRET=xxxxxxxxxxxxxx

# ------------------------------------
# Redis Global Configuration
# -----------------------------------
# Redis password.
REDIS_PASSWORD=xxxxxxxxxxxxxx

# ------------------------------------
# Minio Global Configuration
# ------------------------------------

# Minio access key and secret key.
MINIO_ACCESS_KEY=xxxxxxxxxxxxxxxx
MINIO_SECRET_KEY=xxxxxxxxxxxxxx

# ------------------------------------
# MongoDB Global Configuration
# ------------------------------------

# MongoDB admin username and password.

MONGO_ADMIN_USERNAME=xxxxxxxxxxx
MONGO_ADMIN_PASSWORD=xxxxxxxxxxxxxxx

# Enable or disable MongoDB service. If diabled, the following services
# won’t be available:
# - OpenVidu Dashboard
# - OpenVidu Meet
# - OpenVidu server will run without analytics sending.
MONGO_ENABLED=true

# External MongoDB connection URI.
# If not provided, a local MongoDB instance will be used.
EXTERNAL_MONGO_URI=

# Database names.
MONGO_DATABASE_ANALYTICS=openvidu
MONGO_DATABASE_MEET=openvidu-meet

# ------------------------------------
# Dashboard Global Configuration
# ------------------------------------

# Dashboard admin username and password.

DASHBOARD_ADMIN_USERNAME=xxxxxxxxxxxxxxxxxxx
DASHBOARD_ADMIN_PASSWORD=xxxxxxxxxxxxxxxxxxx

# ------------------------------------
# Observability Global Configuration
# ------------------------------------

# Grafana admin username and password.
GRAFANA_ADMIN_USERNAME=
GRAFANA_ADMIN_PASSWORD=

# ------------------------------------
# External S3 configuration
# ------------------------------------

# By default OpenVidu works with Minio as the S3 provider.
# If you want to use an external S3 provider, you need
# to provide the following configuration
# and the bucket names you want to use.
# External S3 Endpoint URL.
# Example: https://s3.us-east-2.amazonaws.com
# Note that in AWS S3, the endpoint URL is different for each region.
# Check: https://docs.aws.amazon.com/general/latest/gr/s3.html

EXTERNAL_S3_ENDPOINT=
# External S3 Access Key and Secret Key.

EXTERNAL_S3_ACCESS_KEY=
EXTERNAL_S3_SECRET_KEY=

# External S3 Region.
EXTERNAL_S3_REGION=
# Use path style access for S3.
# Valid values are: true, false
EXTERNAL_S3_PATH_STYLE_ACCESS=

# Application data bucket.
# It will be used by:
# - Egress service to store recordings.
# - OpenVidu Meet to store preferences and recordings.

EXTERNAL_S3_BUCKET_APP_DATA=

# ------------------------------------
# OpenVidu Enabled Modules
# ------------------------------------

# List of enabled modules.
# All values are:
# ENABLED_MODULES=app,observability
ENABLED_MODULES=openviduMeet

# ------------------------------------------------------

# ------------------------------------------------------
# !!!
# !!! DANGER ZONE !!! DANGER ZONE !!! DANGER ZONE !!!
# !!! DANGER ZONE !!! DANGER ZONE !!! DANGER ZONE !!!
# !!! DANGER ZONE !!! DANGER ZONE !!! DANGER ZONE !!!
# !!!
# ------------------------------------------------------

# ------------------------------------------------------
# The following parameters are used to configure
# infrastructure related parameters. Changing these
# parameters may involve changing the configuration
# of more than one service and may lead to unexpected
# behavior. Only change these parameters if you know
# what you are doing.
# ------------------------------------------------------

# ------------------------------------
# MongoDB Replica Set Key
# ------------------------------------

# This key is used internally by MongoDB for replication.
MONGO_REPLICA_SET_KEY=xxxxxxxxxxxxxx

# ------------------------------------
# Caddy proxy related ports
# ------------------------------------
# This port is used by caddy to serve all the services
# at the specified port through HTTPS and to expose RTMPS and TURN with TLS.
# If you change it, you must also change the port binding
# in the docker-compose file of the Caddy service.

CADDY_HTTPS_PUBLIC_PORT=443
# This port is used by caddy to redirect from HTTP to HTTPS.
# If you change it, you must also change the port binding
# in the docker-compose file of the Caddy service.

CADDY_HTTP_PUBLIC_PORT=80

# This port is used by caddy to serve as RTMPS.
# It is used when you create an Ingress for RTMP.
# If you change it, you must also change the port binding
# in the docker-compose file of the Caddy service.

CADDY_RTMPS_PUBLIC_PORT=1935

# This port is used by caddy to serve MinIO API
# at the specified port through HTTPS using the DOMAIN_NAME.
# If you change it, you must also change the port binding
# in the docker-compose file of the Caddy service.

CADDY_MINIO_PUBLIC_PORT=9000

# This port is used internally by caddy to serve all the services
# at the specified port through HTTP.
# If you change it, you must change the following:
# 1. Update the port binding in the docker-compose file
# of the Caddy service if the port is changed.
# 2. Change the port of LIVEKIT_URL_PRIVATE if you are using
# the OpenVidu Meet at meet.env
CADDY_HTTP_INTERNAL_PORT=7880

# ------------------------------------
# OpenVidu LiveKit WebRTC related ports
# ------------------------------------
# This port is used by LiveKit to serve TURN over UDP.
LIVEKIT_TURN_PUBLIC_UDP_PORT=443

# This port is used by LiveKit to serve TURN over TLS.
# It is reverse proxied by Caddy to serve it
# at the TURN_DOMAIN_NAME with TLS.
# When TURN over UDP is not possible, TURN with TLS is used.
LIVEKIT_TURN_TLS_INTERNAL_PORT=5349

# This port is used by LiveKit to serve WebRTC over TCP
# When a UDP connection is not possible, TCP may be used.
LIVEKIT_WEBRTC_PUBLIC_TCP_PORT=7881

# This range port is used by LiveKit to serve TURN relay ports
# for relay candidates.

LIVEKIT_TURN_RELAY_INTERNAL_PORT_RANGE_START=40000
LIVEKIT_TURN_RELAY_INTERNAL_PORT_RANGE_END=50000

# This range port is used by LiveKit to serve WebRTC over UDP

LIVEKIT_WEBRTC_PUBLIC_UDP_PORT_RANGE_START=50000
LIVEKIT_WEBRTC_PUBLIC_UDP_PORT_RANGE_END=60000

# ------------------------------------
# Other OpenVidu LiveKit related ports
# ------------------------------------

# This port is used by LiveKit to serve the API.
# It is reverse proxied by Caddy to serve it
# at CADDY_HTTP_INTERNAL_PORT with HTTP and
# at CADDY_HTTPS_PUBLIC_PORT with HTTPS.
LIVEKIT_API_INTERNAL_PORT=7780

# This port is used to configure Egress, Ingress and Agent services
# They need to connect via Caddy so they can reach any Media Node.
LIVEKIT_API_INTERNAL_PORT_WS=7880

# This port is used by LiveKit to serve RTMP.
# It is reverse proxied by Caddy to serve it
# at the DOMAIN_NAME with TLS (RTMPS).
LIVEKIT_RTMP_INTERNAL_PORT=1945

# This port is used by LiveKit to serve WHIP.
# It is reverse proxied by Caddy to serve it
# at the DOMAIN_NAME with HTTPS.
LIVEKIT_WHIP_INTERNAL_PORT=8080

# This port is used by LiveKit to serve prometheus metrics.
# It is used internally by the Prometheus service.
LIVEKIT_PROMETHEUS_INTERNAL_PORT=6789

# This port is internally by the Ingress service to itself.
# It is used for internal communication.
LIVEKIT_INGRESS_HTTP_RELAY_INTERNAL_PORT=9091

# Port used by the Ingress service. Can be used to
# check if the service is healthy.
LIVEKIT_INGRESS_HEALTH_INTERNAL_PORT=9092
# This port is used by the Ingress service to announce itself
# for WHIP Ingress. When Ingress is used with WHIP, this port
# will handle the WEBRTC traffic.
LIVEKIT_INGRESS_RTC_UDP_PORT=7885

# Port used by the Egress service. Can be used to
# check if the service is healthy.
LIVEKIT_EGRESS_HEALTH_INTERNAL_PORT=9093

# ------------------------------------
# Other OpenVidu services ports
# ------------------------------------
# This port is used by Redis to serve itself at the specified port.
# It is used internally by OpenVidu LiveKit, Ingress and Egress services.
# If you change it, you must also change the port binding
# in the docker-compose file of the Redis service.
REDIS_INTERNAL_PORT=7000

# This port is used by Minio to serve its API.
# It is used internally by the Egress service to
# connect to MinIO and reverse proxied by Caddy
# to serve it at CADDY_MINIO_PUBLIC_PORT with HTTPS.
# If you change it, you must also change the port binding
# in the docker-compose file of the Minio service.
MINIO_API_INTERNAL_PORT=9100

# This port is used by Minio to serve its WEB GUI console.
# It is reverse proxied by Caddy to serve it
# at the DOMAIN_NAME with HTTPS.
MINIO_CONSOLE_INTERNAL_PORT=9101

# This port is used by MongoDB to serve itself.
# It is used internally by the Dashboard service and OpenVidu LiveKit.
# If you change it, you must also change the port binding
# in the docker-compose file of the MongoDB service.
MONGO_INTERNAL_PORT=20000

# This port is used by OpenVidu Dashboard to serve itself.
# It is reverse proxied by Caddy to serve it
# at the DOMAIN_NAME with HTTPS.
DASHBOARD_INTERNAL_PORT=5000

# This port is used by Grafana to serve itself.
# It is reverse proxied by Caddy to serve it
# at the DOMAIN_NAME with HTTPS.
GRAFANA_INTERNAL_PORT=3000

# This port is used by Loki to serve itself.
# It is used internally by the Grafana service.
LOKI_INTERNAL_HTTP_PORT=3100

# This port is used by Loki to serve itself via gRPC.
# It is used internally by the service itself.

LOKI_INTERNAL_GRPC_PORT=9095

# This port is used by OpenVidu Meet
# to serve itself. It is reverse proxied by Caddy to serve it
# at the DOMAIN_NAME with HTTPS.
# If you change it, you must also change the port binding

# in the docker-compose override file of the OpenVidu Meet service.
MEET_INTERNAL_PORT=6080

root@meet:\~#

Take a look to this guide: How to Enable Live Captions in OpenVidu Meet | Real-time Transcription Guide - OpenVidu

You need to configure these parameters in the agent-speech-processing.yaml:

docker_image: docker.io/openvidu/agent-speech-processing-vosk:3.6.0
enabled: true 
live_captions:
  processing: manual