config_sample.yaml
Rama main · réplica de lectura del repositorio original.
## Note: All IDs must contain only valid characters.
## Otherwise, issues may occur with NATS (https://docs.nats.io/nats-concepts/subjects#characters-allowed-and-recommended-for-subject-names)
## Permitted characters: (a - z), (A - Z), (0 - 9), hyphen (-), and underscore (_)
client:
port: 8080
debug: true
path: "./client/dist"
# To serve static assets (JS, CSS) from a CDN, uncomment and set this to your CDN's base URL.
# This URL will be sent as the 'static_assets_path' field in the /getClientFiles API response.
# The client is responsible for using this path to construct the final asset URLs.
# e.g., "https://my-cdn.com/plugnmeet-assets"
#asset_host: ""
## Required for authentication. Use a securely generated random secret.
# Example:
# Openssl rand -hex 32
# OR
# cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 36 | head -n 1
api_key: "plugnmeet"
secret: "zumyyYWqv7KR2kUqvYdq4z4sXg7XTBD2ljT6"
# Token validity duration in minutes. Default is 10 minutes.
# The client will automatically renew the token.
token_validity: 10m
webhook_conf:
# Enable webhook to receive event responses.
enable: false
# Optional global webhook URL.
url: ""
# Optionally enable per-meeting webhook URL.
# If enabled, additional responses will be sent to the specified address.
enable_for_per_meeting: false
prometheus:
enable: false
metrics_path: "/metrics"
username: ""
password: ""
# proxy_conf is used to get the real client IP when behind a reverse proxy.
proxy_conf:
# Set to true to enable proxy support.
enabled: false
# Header field for the real client IP. Common values: "X-Forwarded-For", "X-Real-IP".
proxy_header: "X-Forwarded-For"
# A list of trusted proxy IP addresses or CIDR ranges.
trusted_proxy_ips: [ "127.0.0.0/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "::1/128" ]
copyright_conf:
# If true, copyright info can be modified via API.
allow_override: false
# If true, copyright text will be displayed.
display: true
# Keep the text concise; only limited HTML tags are supported: 'b', 'i', 'em', 'strong', 'a'
text: 'Powered by <a href="https://www.plugnmeet.org" target="_blank">plugNmeet</a>'
# Specify host information for accurate BBB join URLs when behind a load balancer.
bbb_join_host: "http://localhost:3000"
# auto_client_download:
# # Set to true to enable automatic client download at server startup.
# # This is highly recommended for containerized deployments (Docker, k8s).
# enabled: false
# # The public-facing URL of your plugNmeet server.
# # This is REQUIRED if enabled=true, as it will be injected into the client's
# # configuration file during the download process.
# server_url: "" # e.g., "https://plugnmeet.example.com"
# # To use a custom build, provide the full, direct URL to the client.zip file.
# # If this is set, 'from_release' will be ignored.
# from_custom_url: "" # e.g., "https://my-cdn.com/builds/client.zip"
# # (Optional) To use a specific official release, specify the version tag.
# # If left empty or omitted, it will default to "latest".
# from_release: "" # e.g., "v2.1.4"
room_default_settings:
# Duration in minutes. 0 = unlimited.
max_duration: 0
# Maximum number of participants. 0 = unlimited.
max_participants: 0
# Limit the number of breakout rooms. Default is 6, maximum is 16.
max_num_breakout_rooms: 6
# Maximum preloaded file size for whiteboard in kb,mb. Default is 5mb.
max_preloaded_wb_file_size: 5mb
log_settings:
log_file: "./log/plugNmeet.log"
# Maximum log file size in MB.
maxsize: 20
# Number of backup log files to retain.
maxbackups: 4
# Maximum age of log files before rotation, in days.
maxage: 2
# Log levels: info, warn, error, fatal, debug, or panic.
log_level: "debug"
livekit_info:
host: "http://host.docker.internal:7880"
# Optional client-facing URL; falls back to host when unset.
#client_host: "https://livekit.example.com"
api_key: "APIiYAA5w37Cfo2"
secret: "6aNur7qqupeZhFYNOJVUyeXxXhVw8f4lm13pEDUx8SgB"
livekit_sip_info:
enabled: true
trunk_name: "pnm-inbound-trunk"
# List of allowed inbound phone numbers.
phone_numbers: ["+12674777275","+441883778715"]
# allowed_ip_addresses: []
# auth_username: "auth"
# auth_password: "password"
# # Media encryption (SRTP) policy for SIP calls.
# # 0 = Disabled: No encryption.
# # 1 = Allowed: Encrypt if supported, otherwise fallback to unencrypted.
# # 2 = Required: Encrypt always, reject call if not supported.
# # Default: 0
# media_encryption: 0
redis_info:
host: redis:6379
username: ""
password: ""
db: 0
default_ttl: 24h # default TTL for redis keys
# use_tls: false
# To use Redis Sentinel, remove the 'host' key above and configure the following:
# sentinel_master_name: plugnmeet
# sentinel_addresses:
# - redis-sentinel-host-1:26379
# - redis-sentinel-host-2:26379
# - redis-sentinel-host-3:26379
# If Sentinel uses different credentials, specify them here:
# sentinel_username: user
# sentinel_password: pass
database_info:
# Currently supports only MySQL/MariaDB. More options may be added in the future.
driver_name: mysql
host: db
port: 3306
username: "root"
password: "12345"
db: "plugnmeet"
prefix: "pnm_"
# Character set: https://github.com/go-sql-driver/mysql?tab=readme-ov-file#charset
charset: "utf8mb4"
# Time zone: https://github.com/go-sql-driver/mysql?tab=readme-ov-file#loc
loc: "UTC"
# Maximum connection lifetime. Default is 4 minutes.
conn_max_lifetime: 4m
# Maximum number of open connections. Default is 10.
max_open_conns: 10
# Optional Read Replicas
# replicas:
# - host: "replica-db-host-1"
# port: 3306
# username: "user"
# password: "password"
# - host: "replica-db-host-2"
# port: 3306
# username: "user"
# password: "password"
nats_info:
nats_urls:
- "nats://host.docker.internal:4222"
# WebSocket URL required for plugNmeet client connectivity.
# If the client cannot connect, users will be unable to join.
nats_ws_urls:
- "http://localhost:8222"
account: PNM
nkey: "SUAGSRI6D537QEHEK7G5KAN4KINSL77FTRTAJGA2KTFRR7AIOMA43P4PRE"
auth_callout_issuer_private: "SAAMTMBUANSRW3XDXZBIBF4JYRRUMWGV2GZT5MQ54VNWNRPN2Y4J46NQSA"
auth_callout_xkey_private: "SXAMBYY64TKXZCLFQGWDATGPIPURA4SIV3GDCSGG7A74USK6XDO6WQTIUU"
num_replicas: 1 # Acceptable values: 1, 3, or 5
room_stream_name: "pnm-room-stream"
default_ttl: 24h # room KV bucket TTL
subjects:
system_api_worker: "sysApiWorker"
system_js_worker: "sysJsWorker" # for JetStream
system_core_worker: "sysCoreWorker" # for Core pub/sub
system_public: "sysPublic"
system_private: "sysPrivate"
chat: "chat"
whiteboard: "whiteboard"
# Used for data exchange between plugNmeet clients.
data_channel: "dataChannel"
recorder:
recorder_channel: "recorderChannel"
recorder_info_kv: "pnm-recorderInfo"
transcoding_jobs_subject: "pnm-RecorderTranscoderJobs"
upload_file_settings:
# If multiple plugNmeet servers are used, ensure all can access this directory.
# Otherwise, file retrieval may fail. This path can be an NFS or other network-accessible location.
path: "./upload"
# Maximum file size for chat uploads in MB. Default is 50MB.
max_size: 50
# Maximum file size for whiteboard uploads in MB. Default is 30MB.
max_size_whiteboard_file: 30
# If true, uploaded files will not be deleted after the session ends.
keep_forever: false
allowed_types: ["jpg","png","jpeg","svg","pdf","docx","txt","xlsx","pptx","zip","mp4","webm","mp3"]
recorder_info:
# This path must match the recorder's copy_to_dir > main_path setting.
recording_files_path: "./recording_files"
# How long generated token will valid to download the file
token_validity: 30m
# How long to wait before considering a recorder inactive. default: 8 seconds
ping_timeout: 8s
# If true, deleted recordings will be moved to a backup directory instead of being immediately removed.
# But it will be removed from the database only.
# This allows recovery in case of accidental deletion.
enable_del_recording_backup: true
# Optional: Specify a separate path for deleted recording backups.
# Uses os.Rename for fast path changes. Ensure both paths are on the same disk to avoid cross-device errors.
del_recording_backup_path: "./recording_files/del_backup"
# Duration to retain deleted recordings in backup, in hours. Default is 72 hours (3 days).
del_recording_backup_duration: 72h
analytics_settings:
# Enable to generate a detailed analytics file after each session.
# This file contains valuable metadata about user engagement, such as join/leave times,
# feature usage, and total speaking duration, helping you understand how your
# platform is being used.
enabled: true
artifacts_settings:
# The root path where all generated artifacts (summaries, etc.) will be stored.
# Each room will have its own subdirectory: {storage_path}/{service_type}/{room_id}/
storage_path: "./artifacts"
# Download token validity duration in minutes. Default is 10 minutes.
token_validity: 10m
# If true, deleted artifacts will be moved to a backup directory instead of being immediately removed.
enable_del_artifacts_backup: true
# Optional: Specify a separate path for deleted artifact backups.
# Default is a "trash" folder inside the main storage_path.
del_artifacts_backup_path: "./artifacts/trash"
# Duration to retain deleted artifacts in backup, in hours. Default is 72 hours (3 days).
del_artifacts_backup_duration: 72h
insights:
enabled: true
# 1. Define all available provider accounts ONCE.
# The key ("azure", "google") is the provider TYPE.
providers:
azure:
# A list of uniquely identified accounts for this provider.
- id: "eastus_standard" # A unique name you choose for this account
credentials:
api_key: "YOUR_AZURE_KEY_1"
region: "eastus"
# options: {} # Generic options for this provider account, e.g., custom endpoints
- id: "transGlobal"
credentials:
api_key: "YOUR_AZURE_KEY_1"
region: "global"
options:
endpoint: "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0"
google:
- id: "default-gemini-creds"
credentials:
api_key: "YOUR_GEMINI_API_KEY_HERE"
openai:
- id: "default-openai"
credentials:
api_key: "YOUR_OPENAI_API_KEY"
options:
endpoint: "https://api.openai.com/v1" # Optional: Override default endpoint
# 2. Define the services that USE the providers.
# The key ("transcription", "translation", "ai_text_chat", "meeting_summarizing") is the service name.
services:
transcription:
provider: "azure" # The provider TYPE to use
id: "eastus_standard" # The specific account ID to use from the list above
options:
model: "default" # A model ID specific to this service
max_selected_trans_langs: 2
pricing:
default: # Corresponds to the model name in options
price_per_hour: 1.00
translation:
provider: "azure"
id: "transGlobal"
options:
max_selected_trans_langs: 5
pricing:
default: # A generic key for services with one pricing model
price_per_million_characters: 10.00 # Example for Standard tier
speech-synthesis:
provider: "azure"
id: "eastus_standard"
options:
voice-en: "en-US-JennyNeural"
voice-bn: "bn-IN-TanishaaNeural"
voice-fr: "fr-FR-DeniseNeural"
voice-de: "de-DE-KatjaNeural"
voice-es: "es-ES-ElviraNeural"
pricing:
default: # A generic key for services with one pricing model
price_per_million_characters: 16.00 # Example for Neural voice
ai_text_chat:
provider: "google"
id: "default-gemini-creds"
options:
chat_model: "gemini-2.5-pro"
summarize_model: "gemini-2.0-flash"
context_window: 5 # Number of recent messages to keep before summarizing
pricing:
gemini-2.5-pro:
input_price_per_million_tokens: 3.50
output_price_per_million_tokens: 10.50
gemini-2.0-flash:
input_price_per_million_tokens: 0.35
output_price_per_million_tokens: 0.70
meeting_summarizing:
provider: "google"
id: "default-gemini-creds"
options:
# The model to be used for the final summarization.
summarize_model: "gemini-2.0-flash"
pricing:
gemini-2.0-flash:
input_price_per_million_tokens: 0.35
output_price_per_million_tokens: 0.70
# Custom TURN Server (Optional)
#turn_server:
# # Set to true to use a custom TURN provider instead of LiveKit's default.
# enabled: false
# # If true, forces all clients to use the TURN server for media.
# force_turn: false
# # If true, client will fallback to TURN if direct connection is poor.
# # (This has no effect if force_turn is true).
# fallback_turn: false
# # The duration to wait with a poor connection before triggering the fallback.
# # Examples: "30s", "1m". Default: "30s" (client mirrors the same default)
# fallback_timer_duration: "30s"
# # Fallback on flapping connection
# fallback_on_flapping:
# enabled: false
# # max number of times connection can be poor
# max_poor_conn_count: 3
# # duration in seconds to check for poor connections
# check_duration_in_sec: 120
# # The provider to use from the 'providers' map below.
# provider: "coturn"
#
# providers:
# coturn:
# options:
# shared_secret: "YOUR_COTURN_SHARED_SECRET"
# uris:
# - "turn:turn.your-domain.com:3478?transport=udp"
# (Optional) Hooks for Advanced File Management
# These hooks allow you to override the default local file storage and integrate
# with an external storage provider (e.g., S3, Google Cloud Storage) using custom scripts.
# This is ideal for cloud-native or multi-server deployments where centralized storage is required.
#
# If this section is omitted, the server will store all files on the local disk
# in the paths defined under 'recorder_info' and 'artifacts_settings'.
#hooks:
# upload_hook:
# pool_size: 2
# hook_timeout: 5m
# scripts:
# - script: "/path/to/your/script.sh"
# is_one_shot: false
# - script: "http-request http://localhost:8090/your/endpoint"
# is_one_shot: true
# download_hook:
# pool_size: 2
# hook_timeout: 5m
# scripts:
# - script: "/path/to/your/script.sh"
# is_one_shot: false
# delete_hook:
# pool_size: 2
# hook_timeout: 5m
# scripts:
# - script: "/path/to/your/script.sh"
# is_one_shot: false
# resumable_upload_hook:
# pool_size: 2
# hook_timeout: 5m
# scripts:
# - script: "/path/to/your/script.sh"
# is_one_shot: false
# room_end_hook:
# pool_size: 2
# hook_timeout: 5m
# scripts:
# - script: "/path/to/your/script.sh"
# is_one_shot: false