## 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" proxy_header: "" ## Set to X-Forwarded-For if needed. 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 plugNmeet' # Specify host information for accurate BBB join URLs when behind a load balancer. bbb_join_host: "http://localhost:3000" room_default_settings: max_duration: 0 # Duration in minutes. 0 means unlimited. max_participants: 0 # 0 means unlimited. # Limit the number of breakout rooms. Default is 6, maximum is 16. max_num_breakout_rooms: 6 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" 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 # 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" subjects: system_api_worker: "sysApiWorker" system_js_worker: "sysJsWorker" 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 shared_notepad: enabled: true # Multiple Etherpad hosts can be listed. Load balancing is based on server load. # Each host ID must be unique. etherpad_hosts: - # Refer to the note at the top of this file regarding valid IDs. id: "node_01" host: "http://host.docker.internal:9001" client_id: "plugNmeet" client_secret: "lmpGEH0MxrBg7ymsbSh9TU1d6VHRMk" 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" # 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