Sign inSign up

openvidu/local-meet:latest

Manifest digest

sha256:b17a116762bf396599255fa3587b2cc5cca2ef9352fb114ca608e95c7dcdbdce

Last pushed

2 months by openvidu

Type

Compose

Manifest digest

sha256:b17a116762bf396599255fa3587b2cc5cca2ef9352fb114ca608e95c7dcdbdce

Compose file content

services:

  generate-scripts:
    image: alpine:3.24.1
    entrypoint: ["/bin/sh", "-c"]
    restart: "no"
    user: root
    volumes:
      - scripts:/scripts
      - config:/config
    command:
      - |
        set -e
        # Check if /scripts and /config are empty, if not, skip script generation
        if [ "$(ls -A /scripts)" ] && [ "$(ls -A /config)" ]; then
          echo "/config and /scripts are not empty, skipping script generation."
          exit 0
        fi
        echo "Generating scripts..."
        echo "$${SETUP_SCRIPT}" > /scripts/setup.sh
        echo "$${UTILS_SCRIPT}" > /scripts/utils.sh
        echo "$${READY_CHECK_ENTRYPOINT}" > /scripts/entrypoint_ready_check.sh
        echo "$${CADDY_ENTRYPOINT}" > /scripts/entrypoint_caddy.sh
        echo "$${OPENVIDU_ENTRYPOINT}" > /scripts/entrypoint_openvidu.sh
        echo "$${OPENVIDU_MEET_ENTRYPOINT}" > /scripts/entrypoint_openvidu_meet.sh
        echo "$${OPENVIDU_CONFIG}" > /config/livekit.yaml
        echo "$${INGRESS_CONFIG}" > /config/ingress.yaml
        echo "$${EGRESS_CONFIG}" > /config/egress.yaml
        echo "Generating configuration files..."
        echo "Setting permissions..."
        chmod +x /scripts/setup.sh
        chmod +x /scripts/utils.sh
        chmod +x /scripts/entrypoint_ready_check.sh
        chmod +x /scripts/entrypoint_caddy.sh
        chmod +x /scripts/entrypoint_openvidu.sh
        chmod +x /scripts/entrypoint_openvidu_meet.sh
    environment:
      SETUP_SCRIPT: |
        #!/bin/sh
        echo "Setting up directories and permissions..."
        mkdir -p /minio/data/
        mkdir -p /mongo/data/
        mkdir -p /egress/home/egress
        chown 1001:1001 /minio /minio/data
        chown 1001:1001 /mongo /mongo/data
        chown 1001:1001 /egress
        chown 1001:1001 /egress/home
        chown 1001:1001 /egress/home/egress
        echo "Setup complete."
      UTILS_SCRIPT: |
        #!/bin/sh
        LAN_DOMAIN=openvidu-local.dev
        if [ "$$LAN_PRIVATE_IP" != "" ]; then
            export USE_HTTPS=true
            export LAN_MODE=true
        else
            export USE_HTTPS=false
            export LAN_MODE=false
        fi
        echo "Using LAN_PRIVATE_IP: $${LAN_PRIVATE_IP:-none}"
        echo "Using USE_HTTPS: $${USE_HTTPS}"
        echo "Using LAN_MODE: $${LAN_MODE}"
        getDeploymentUrl() {
            schema="$${1:-http}"
            URL="$$schema://localhost:7880"
            if [ "$${USE_HTTPS}" = 'true' ]; then
                URL="$${schema}s://localhost:7443"
            fi
            if [ "$${LAN_MODE}" = 'true' ]; then
                LAN_DOMAIN=$${LAN_DOMAIN:-"openvidu-local.dev"}
                if [ "$$LAN_PRIVATE_IP" != 'none' ] && [ "$${LAN_DOMAIN}" = 'openvidu-local.dev' ]; then
                    # Replace dots with dashes
                    LAN_DOMAIN="$$(echo "$$LAN_PRIVATE_IP" | sed 's/\./-/g').openvidu-local.dev"
                fi
                URL="$${schema}s://$${LAN_DOMAIN}:7443"
            fi
            echo "$$URL"
        }
      READY_CHECK_ENTRYPOINT: |
        #!/bin/sh
        set -e
        export LAN_DOMAIN=openvidu-local.dev
        if [ "$$LAN_PRIVATE_IP" != "" ]; then
          export USE_HTTPS=true
          export LAN_MODE=true
        else
          export USE_HTTPS=false
          export LAN_MODE=false
        fi
        echo "Using LAN_PRIVATE_IP: $${LAN_PRIVATE_IP:-none}"
        echo "Using LAN_DOMAIN: $${LAN_DOMAIN}"
        echo "Using USE_HTTPS: $${USE_HTTPS}"
        echo "Using LAN_MODE: $${LAN_MODE}"
        /bin/operator
      CADDY_ENTRYPOINT: |
        #!/bin/sh
        set -e
        export LAN_DOMAIN=openvidu-local.dev
        if [ "$$LAN_PRIVATE_IP" != "" ]; then
          export USE_HTTPS=true
          export LAN_MODE=true
        else
          export USE_HTTPS=false
          export LAN_MODE=false
        fi
        echo "Using LAN_PRIVATE_IP: $${LAN_PRIVATE_IP:-none}"
        echo "Using LAN_DOMAIN: $${LAN_DOMAIN}"
        echo "Using USE_HTTPS: $${USE_HTTPS}"
        echo "Using LAN_MODE: $${LAN_MODE}"
        /entrypoint.sh /usr/bin/caddy run --config /config/caddy/Caddyfile
      OPENVIDU_ENTRYPOINT: |
        #!/bin/sh
        set -e
        if [ "$$LAN_PRIVATE_IP" != "" ]; then
            echo "Using as NODE_IP: $$LAN_PRIVATE_IP"
            export NODE_IP="$$LAN_PRIVATE_IP"
        fi
        ./livekit-server "$@"
      OPENVIDU_MEET_ENTRYPOINT: |
        #!/bin/bash
        . /scripts/utils.sh

        URL=$(getDeploymentUrl ws)
        export LIVEKIT_URL="$${URL}"

        /usr/local/bin/entrypoint.sh
      OPENVIDU_CONFIG: |
        # OpenVidu configuration
        openvidu:
            analytics:
                enabled: true
                interval: 10s
                expiration: 768h # 32 days
                mongo_url: mongodb://${MONGO_ADMIN_USERNAME:-mongoadmin}:${MONGO_ADMIN_PASSWORD:-mongoadmin}@mongo:27017/?replicaSet=rs0&readPreference=primaryPreferred

        # LiveKit configuration
        port: 7880
        bind_addresses:
            - ""
        rtc:
            tcp_port: 7881
            port_range_start: 7900
            port_range_end: 7999
        redis:
            address: redis:6379
            username: ""
            password: ${REDIS_PASSWORD:-redispassword}
            db: 0
            use_tls: false
        turn:
            enabled: true
            udp_port: 3478
            relay_range_start: 40000
            relay_range_end: 50000
        keys:
            ${LIVEKIT_API_KEY:-devkey}: ${LIVEKIT_API_SECRET:-secret}
        webhook:
            api_key: ${LIVEKIT_API_KEY:-devkey}
            urls:
                - http://host.docker.internal:6080/livekit/webhook
                - http://openvidu-meet:6080/livekit/webhook
        ingress:
            rtmp_base_url: rtmp://localhost:1935/rtmp
            whip_base_url: http://localhost:8085/whip
        logging:
            # Logging level for the LiveKit server.
            # Values: debug, info, warn, error.
            # Default: info.
            level: info

            # Logging level for the Pion WebRTC engine.
            # Values: trace, debug, info, warn, error.
            # Default: error.
            pion_level: warn
      INGRESS_CONFIG: |
        redis:
            address: redis:6379
            username: ""
            password: ${REDIS_PASSWORD:-redispassword}
            db: 0
            use_tls: false
        api_key: ${LIVEKIT_API_KEY:-devkey}
        api_secret: ${LIVEKIT_API_SECRET:-secret}
        ws_url: ws://openvidu:7880
        rtmp_port: 1935
        whip_port: 8085
        http_relay_port: 9090
        health_port: 9091
        logging:
            json: false
            level: ""
        development: false
        rtc_config:
            udp_port: 7895
      EGRESS_CONFIG: |
        redis:
            address: redis:6379
            username: ""
            password: ${REDIS_PASSWORD:-redispassword}
            db: 0
            use_tls: false
        api_key: ${LIVEKIT_API_KEY:-devkey}
        api_secret: ${LIVEKIT_API_SECRET:-secret}
        ws_url: ws://openvidu:7880
        health_port: 9091

        # Files will be moved here when uploads fail.
        backup:
            prefix: /home/egress/backup_storage

        # Storage for recordings.
        storage:
            s3:
                access_key: ${MINIO_ACCESS_KEY:-minioadmin}
                secret: ${MINIO_SECRET_KEY:-minioadmin}
                # Default region for minio
                region: us-east-1
                endpoint: http://minio:9000
                bucket: openvidu-appdata
                force_path_style: true
            #azure:
            #    account_name: your_account_name
            #    account_key: your_account_key
            #    container_name: openvidu-appdata

        # CPU cost for each type of Egress operation.
        cpu_cost:
            max_cpu_utilization: 0.80
            room_composite_cpu_cost: 0.01
            audio_room_composite_cpu_cost: 0.01
            web_cpu_cost: 0.01
            audio_web_cpu_cost: 0.01
            participant_cpu_cost: 0.01
            track_composite_cpu_cost: 0.01
            track_cpu_cost: 0.01

        openvidu:
            # Allocation strategy for new egress requests
            # - cpuload: the node with the lowest CPU load will be selected. Distributes the CPU load evenly across all nodes.
            # - binpack: some node already hosting at least one egress will be selected. Fills up nodes before assigning work to new ones.
            allocation_strategy: cpuload
            # Whether to use system-wide CPU monitoring or egress process CPU monitoring. This affects the allocation of new egress requests.
            # It is preferable to set this value to:
            # - true: when the egress service is running in a shared server also hosting other CPU-intensive services.
            # - false: when the egress service is running in a dedicated server.
            use_global_cpu_monitoring: true
            # Disables the automatic killing of the most expensive egress when CPU is overloaded.
            # The default "false" value helps keeping the node stable, but may cause unexpected egress terminations under high load.
            disable_cpu_overload_killer: false
            # Minimum available disk space in MB required to accept new egress requests.
            # Default: 512 MB. Set to a negative value (e.g., -1) to disable disk space checking.
            min_disk_space_mb: 512

  setup:
    image: docker.io/busybox:1.38.0
    restart: "no"
    volumes:
      - minio-data:/minio
      - mongo-data:/mongo
      - egress-data:/egress
      - scripts:/scripts/
    user: root
    depends_on:
      generate-scripts:
        condition: service_completed_successfully
    command: /bin/sh /scripts/setup.sh
services:

  caddy-proxy:
    image: docker.io/openvidu/openvidu-caddy-local:3.8.0
    restart: unless-stopped
    extra_hosts:
      - host.docker.internal:host-gateway
    environment:
      - LAN_PRIVATE_IP=${LAN_PRIVATE_IP:-}
      - LIVEKIT_API_KEY=${LIVEKIT_API_KEY:-devkey}
      - LIVEKIT_API_SECRET=${LIVEKIT_API_SECRET:-secret}
      - DASHBOARD_ADMIN_USERNAME=${DASHBOARD_ADMIN_USERNAME:-admin}
      - DASHBOARD_ADMIN_PASSWORD=${DASHBOARD_ADMIN_PASSWORD:-admin}
      - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY:-minioadmin}
      - MINIO_SECRET_KEY=${MINIO_SECRET_KEY:-minioadmin}
      - MEET_INITIAL_ADMIN_USER=${MEET_INITIAL_ADMIN_USER:-admin}
      - MEET_INITIAL_ADMIN_PASSWORD=${MEET_INITIAL_ADMIN_PASSWORD:-admin}
      - MEET_INITIAL_API_KEY=${MEET_INITIAL_API_KEY:-meet-api-key}
      - MEET_BASE_PATH=${MEET_BASE_PATH:-/meet}
    volumes:
      - scripts:/scripts
      - /etc/localtime:/etc/localtime:ro
    entrypoint: /bin/sh /scripts/entrypoint_caddy.sh
    ports:
      - 5443:5443
      - 6443:6443
      - 7443:7443
      - 7880:7880
      - 9443:9443
      - 9080:9080
    depends_on:
      setup:
        condition: service_completed_successfully

  redis:
    image: docker.io/redis:8.6.4-alpine
    restart: unless-stopped
    ports:
      - 6379:6379
    volumes:
      - redis:/data
      - /etc/localtime:/etc/localtime:ro
    command: >
      redis-server
      --bind 0.0.0.0
      --requirepass ${REDIS_PASSWORD:-redispassword}
    depends_on:
      setup:
        condition: service_completed_successfully

  minio:
    image: docker.io/openvidu/minio:RELEASE.2026-06-04T00-54-11Z-r0
    restart: unless-stopped
    ports:
      - 9000:9000
    environment:
      - MINIO_ROOT_USER=${MINIO_ACCESS_KEY:-minioadmin}
      - MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY:-minioadmin}
      - MINIO_DEFAULT_BUCKETS=openvidu-appdata
      - MINIO_CONSOLE_SUBPATH=/minio-console
      - MINIO_BROWSER_REDIRECT_URL=http://localhost:7880/minio-console
      - MINIO_BROWSER=on
    volumes:
      - minio-data:/bitnami/minio/data
      - minio-certs:/certs
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      setup:
        condition: service_completed_successfully

  mongo:
    image: docker.io/openvidu/mongodb:8.0.26-r0
    restart: unless-stopped
    ports:
      - 27017:27017
    volumes:
      - mongo-data:/bitnami/mongodb
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MONGODB_ROOT_USER=${MONGO_ADMIN_USERNAME:-mongoadmin}
      - MONGODB_ROOT_PASSWORD=${MONGO_ADMIN_PASSWORD:-mongoadmin}
      - MONGODB_ADVERTISED_HOSTNAME=mongo
      - MONGODB_REPLICA_SET_MODE=primary
      - MONGODB_REPLICA_SET_NAME=rs0
      - MONGODB_REPLICA_SET_KEY=devreplicasetkey
    depends_on:
      setup:
        condition: service_completed_successfully

  dashboard:
    image: docker.io/openvidu/openvidu-dashboard:3.8.0
    restart: unless-stopped
    environment:
      - SERVER_PORT=5000
      - ADMIN_USERNAME=${DASHBOARD_ADMIN_USERNAME:-admin}
      - ADMIN_PASSWORD=${DASHBOARD_ADMIN_PASSWORD:-admin}
      - DATABASE_URL=mongodb://${MONGO_ADMIN_USERNAME:-mongoadmin}:${MONGO_ADMIN_PASSWORD:-mongoadmin}@mongo:27017/?replicaSet=rs0&readPreference=primaryPreferred
    volumes:
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      setup:
        condition: service_completed_successfully

  openvidu:
    image: docker.io/openvidu/openvidu-server:3.8.0
    restart: unless-stopped
    extra_hosts:
      - host.docker.internal:host-gateway
    environment:
      - LAN_PRIVATE_IP=${LAN_PRIVATE_IP:-}
    ports:
      - 3478:3478/udp
      - 7881:7881/tcp
      - 7900-7999:7900-7999/udp
    entrypoint: /bin/sh /scripts/entrypoint_openvidu.sh
    command: --config /config/livekit.yaml
    volumes:
      - scripts:/scripts
      - config:/config
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      setup:
        condition: service_completed_successfully

  ingress:
    image: docker.io/openvidu/ingress:3.8.0
    restart: unless-stopped
    extra_hosts:
      - host.docker.internal:host-gateway
    ports:
      - 1935:1935
      - 8085:8085
      - 7895:7895/udp
    environment:
      - INGRESS_CONFIG_FILE=/config/ingress.yaml
    volumes:
      - config:/config
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      setup:
        condition: service_completed_successfully

  egress:
    image: docker.io/openvidu/egress:3.8.0
    restart: unless-stopped
    extra_hosts:
      - host.docker.internal:host-gateway
    environment:
      - EGRESS_CONFIG_FILE=/config/egress.yaml
    volumes:
      - config:/config
      - egress-data:/home/egress/tmp
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      setup:
        condition: service_completed_successfully

  operator:
    image: docker.io/openvidu/openvidu-operator:3.8.0
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - agents-config:/agents-config
      - operator-deployment:/deployment
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MODE=agent-manager-local
      - DEPLOYMENT_FILES_DIR=/deployment
      - AGENTS_CONFIG_DIR=/agents-config
      - NETWORK_NAME=openvidu-community
      - AGENTS_CONFIG_VOLUME=openvidu-agents-config
      - LIVEKIT_URL=ws://openvidu:7880/
      - LIVEKIT_API_KEY=${LIVEKIT_API_KEY:-devkey}
      - LIVEKIT_API_SECRET=${LIVEKIT_API_SECRET:-secret}
      - REDIS_ADDRESS=redis:6379
      - REDIS_PASSWORD=${REDIS_PASSWORD:-redispassword}
    depends_on:
      setup:
        condition: service_completed_successfully

  openvidu-meet:
    image: docker.io/openvidu/openvidu-meet:3.8.0
    restart: on-failure
    extra_hosts:
      - host.docker.internal:host-gateway
    environment:
      - LAN_PRIVATE_IP=${LAN_PRIVATE_IP:-}
      - SERVER_PORT=6080
      - MEET_LOG_LEVEL=info
      - MEET_NAME_ID=openviduMeet-LOCAL
      - MEET_INITIAL_API_KEY=${MEET_INITIAL_API_KEY:-meet-api-key}
      - MEET_INITIAL_ADMIN_USER=${MEET_INITIAL_ADMIN_USER:-admin}
      - MEET_INITIAL_ADMIN_PASSWORD=${MEET_INITIAL_ADMIN_PASSWORD:-admin}
      - MEET_COOKIE_SECURE=false
      - MEET_INITIAL_WEBHOOK_ENABLED=true
      - MEET_INITIAL_WEBHOOK_URL=http://host.docker.internal:6080/webhook
      - LIVEKIT_URL_PRIVATE=ws://openvidu:7880/
      - LIVEKIT_API_KEY=${LIVEKIT_API_KEY:-devkey}
      - LIVEKIT_API_SECRET=${LIVEKIT_API_SECRET:-secret}
      - MEET_S3_BUCKET=openvidu-appdata
      - MEET_S3_SUBBUCKET=openvidu-meet
      - MEET_S3_SERVICE_ENDPOINT=http://minio:9000
      - MEET_S3_ACCESS_KEY=${MINIO_ACCESS_KEY:-minioadmin}
      - MEET_S3_SECRET_KEY=${MINIO_SECRET_KEY:-minioadmin}
      - MEET_AWS_REGION=us-east-1
      - MEET_S3_WITH_PATH_STYLE_ACCESS=true
      - MEET_REDIS_HOST=redis
      - MEET_REDIS_PORT=6379
      - MEET_REDIS_PASSWORD=${REDIS_PASSWORD:-redispassword}
      - MEET_REDIS_DB=0
      - MEET_MONGO_URI=mongodb://${MONGO_ADMIN_USERNAME:-mongoadmin}:${MONGO_ADMIN_PASSWORD:-mongoadmin}@mongo:27017/?replicaSet=rs0&readPreference=primaryPreferred
      - MEET_BASE_PATH=${MEET_BASE_PATH:-/meet}
    volumes:
      - scripts:/scripts
      - /etc/localtime:/etc/localtime:ro
    entrypoint: /bin/sh /scripts/entrypoint_openvidu_meet.sh
    depends_on:
      setup:
        condition: service_completed_successfully

  openvidu-meet-init:
    image: docker.io/openvidu/openvidu-operator:3.8.0
    restart: on-failure
    environment:
      - MODE=local-ready-check
      - OPENVIDU_ENVIRONMENT=local-meet
      - LAN_PRIVATE_IP=${LAN_PRIVATE_IP:-}
      - DASHBOARD_ADMIN_USERNAME=${DASHBOARD_ADMIN_USERNAME:-admin}
      - DASHBOARD_ADMIN_PASSWORD=${DASHBOARD_ADMIN_PASSWORD:-admin}
      - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY:-minioadmin}
      - MINIO_SECRET_KEY=${MINIO_SECRET_KEY:-minioadmin}
      - LIVEKIT_API_KEY=${LIVEKIT_API_KEY:-devkey}
      - LIVEKIT_API_SECRET=${LIVEKIT_API_SECRET:-secret}
      - MEET_INITIAL_ADMIN_USER=${MEET_INITIAL_ADMIN_USER:-admin}
      - MEET_INITIAL_ADMIN_PASSWORD=${MEET_INITIAL_ADMIN_PASSWORD:-admin}
      - MEET_INITIAL_API_KEY=${MEET_INITIAL_API_KEY:-meet-api-key}
    volumes:
      - scripts:/scripts
      - /etc/localtime:/etc/localtime:ro
    entrypoint: /bin/sh /scripts/entrypoint_ready_check.sh
    depends_on:
      - caddy-proxy
      - redis
      - minio
      - mongo
      - dashboard
      - openvidu
      - ingress
      - egress
      - operator
      - openvidu-meet

volumes:
  scripts:
    name: openvidu-scripts
  config:
    name: openvidu-config
  agents-config:
    name: openvidu-agents-config
  minio-certs:
    name: openvidu-minio-certs
  mongodb-config:
    name: openvidu-mongodb-config
  redis:
    name: openvidu-redis
  minio-data:
    name: openvidu-minio-data
  mongo-data:
    name: openvidu-mongo-data
  egress-data:
    name: openvidu-egress-data
  operator-deployment:
    name: openvidu-operator-deployment

Docker commands

docker compose -f oci://openvidu/local-meet:latest up

Use the above command to pull and run the Compose file. Learn more.

Images used

Image

A minimal Docker image based on Alpine Linux with a complete package index and only 5 MB in size!


Pulls

1B+

Stars

11551

Last Updated

about 1 month

Image

This image is part of a complete deployment of OpenVidu. Check README.


Pulls

500K+

Stars

11

Last Updated

about 8 hours

Image

This image is part of a complete deployment of OpenVidu. Check README.


Pulls

100K+

Stars

0

Last Updated

about 12 hours

Image

This image is part of a complete deployment of OpenVidu. Check README.


Pulls

100K+

Stars

0

Last Updated

about 12 hours

Image


Pulls

50K+

Stars

0

Last Updated

about 12 hours

Image

This image is part of a complete deployment of OpenVidu. Check README.


Pulls

50K+

Stars

1

Last Updated

9 minutes

Image

OpenVidu Meet image is part of a complete deployment of OpenVidu. Check README.


Pulls

10K+

Stars

0

Last Updated

about 5 hours

Image

This image is part of a complete deployment of OpenVidu. Check README.


Pulls

10K+

Stars

1

Last Updated

19 minutes

Image


Pulls

10K+

Stars

0

Last Updated

14 days

Image


Pulls

10K+

Stars

0

Last Updated

14 days