# Discord Bot Configuration # ============================================================================= # # PRODUCTION ENV IS DECLARATIVE: # The runtime env files on the VPS (/etc/gmw/backend.env, # /etc/gmw/discord-gateway.env) are WRITTEN BY CI from Gitea Actions secrets # (BACKEND_ENV, GATEWAY_ENV) — see .gitea/workflows/deploy.yml. # To change production env: update the secret in Gitea repo settings # (Settings → Actions → Secrets), then push any commit to main. Never # SSH into the VPS to edit env files by hand — CI will overwrite them. # # This file documents every variable; values for production live in the # secrets, not here. # === Discord === DISCORD_TOKEN=your_bot_token_here # REQUIRED MONITOR_GUILD_ID=your_guild_id_here # Target guild for text monitoring TEXT_GUILD_ID=optional_text_guild_id # Override text capture guild (falls back to MONITOR_GUILD_ID) TEXT_CHANNEL_ID=optional_text_channel_id # Restrict text capture to a single channel # === Voice Channels === # VOICE_GUILD_ID= # Guild for voice connection (optional) # VOICE_CHANNEL_ID= # Channel for voice connection (optional) # === Recording === RECORDINGS_DIR=./recordings # Audio file output directory (default: ./recordings) RECORDING_SEGMENT_MS=5000 # OGG segment duration in ms (default: 5000) # === Decoder === DECODER_ROTATE_MS=5000 # Opus decoder rotation interval in ms (default: 5000) DECODER_COOLDOWN_MS=30000 # Decoder error cooldown in ms (default: 30000) # === Audio === AUDIO_STREAM_SILENCE_DURATION_MS=3000 # Silence threshold in ms before stopping stream (default: 3000) PACKET_FILTER_MIN_SIZE=8 # Minimum Opus packet size in bytes (default: 8) OPUS_FRAME_SIZE=960 # Opus frame size in samples (default: 960) AUDIO_SAMPLE_RATE=48000 # Audio sample rate in Hz (default: 48000) AUDIO_CHANNELS=2 # Number of audio channels (default: 2) AVATAR_SIZE=64 # User avatar size in pixels (default: 64) # === Webserver === WEBSERVER_PORT=3001 # Backend HTTP/WS server port (default: 3001) # === Connection === VOICE_CONNECTION_TIMEOUT_MS=15000 # Voice connection timeout in ms (default: 15000) RECONNECT_TIMEOUT_MS=5000 # Reconnect timeout in ms (default: 5000) # === Logging === LOG_LEVEL=info # Pino log level: error|warn|info|http|verbose|debug|silly (default: info) NODE_ENV=development # Environment: development|production|test (default: development) VERBOSE=false # Enable verbose/debug logging (default: false) # === Admin === # ADMIN_PASSWORD removed — dashboard is public # === Database (PostgreSQL) === # Option 1: Connection string (overrides individual params) # DATABASE_URL=postgresql://user:password@localhost:5432/discord_bot # Option 2: Individual connection parameters POSTGRES_HOST=localhost # PostgreSQL host (default: localhost) POSTGRES_PORT=5432 # PostgreSQL port (default: 5432) POSTGRES_USER=postgres # PostgreSQL user (optional if DATABASE_URL provided) POSTGRES_PASSWORD=your_password_here # PostgreSQL password (optional if DATABASE_URL provided) POSTGRES_DB=discord_bot # PostgreSQL database name (optional if DATABASE_URL provided) POSTGRES_POOL_MIN=2 # Minimum pool connections (default: 2) POSTGRES_POOL_MAX=10 # Maximum pool connections (default: 10) # === Redis === REDIS_URL=redis://localhost:6379 # Redis connection string (default: redis://localhost:6379) # === Voice PCM WebSocket (direct gateway→backend, bypasses Redis) === VOICE_PCM_WS_ENABLED=true # Use direct WS for PCM audio (default: true) BACKEND_WS_URL=ws://backend:3000/ws # Backend WebSocket URL for gateway PCM streaming BACKEND_WS_TOKEN= # REQUIRED if VOICE_PCM_WS_ENABLED=true. Internal shared secret # === Attachments === TELE_UPLOAD_URL=https://upload.asepharyana.my.id/api/upload # Attachment upload endpoint (default) ATTACHMENT_UPLOAD_TIMEOUT_MS=30000 # Upload timeout in ms (default: 30000) ATTACHMENT_MAX_SIZE_MB=100 # Max attachment size in MB (default: 100) ATTACHMENT_RETRY_ATTEMPTS=3 # Upload retry count (default: 3) BACKLOG_SYNC_HOURS=24 # Backlog sync lookback window in hours (default: 24) BACKLOG_SYNC_BATCH_SIZE=100 # Messages per backlog batch, max 100 (default: 100) # === AI Analysis === AI_ANALYSIS_ENABLED=false # Enable AI content moderation (default: false) # AI_LLM_API_KEY= # REQUIRED if AI_ANALYSIS_ENABLED=true. LLM API key AI_LLM_BASE_URL=http://100.121.180.82:20128/api/v1 # LLM API base URL (omniroute on imrnes; /api/v1 exposes OpenAI-compatible chat+embeddings) AI_LLM_MODEL=text # LLM text model name (default: text) # AI_LLM_VISION_MODEL= # Vision model for image analysis (falls back to AI_LLM_MODEL) # AI_LLM_EMBEDDING_MODEL= # Embedding model for semantic moderation cache (optional; enables near-duplicate text reuse to save LLM calls) # AI_LLM_EMBEDDING_MIN_SIMILARITY=0.97 # Min cosine similarity to reuse a cached verdict (default: 0.97) # QDRANT_URL=http://100.121.180.82:6333/ # Qdrant vector store for embeddings (semantic cache); when set, vectors are stored/searched in Qdrant instead of Postgres # QDRANT_COLLECTION=gmw_text_moderation # Qdrant collection name (default: gmw_text_moderation) # QDRANT_API_KEY= # Qdrant API key (optional) AI_LLM_MAX_CONCURRENT=5 # Max concurrent LLM API calls (default: 5) AI_LLM_IMAGE_MAX_DIMENSION=1024 # Max image dimension in pixels before resize (default: 1024) AI_LLM_TEXT_BATCH_SIZE=20 # Max messages per text-only moderation batch (default: 20) AI_LLM_MEDIA_ANALYSIS_TIMEOUT_MS=60000 # Timeout in ms for media analysis calls (default: 60000) AI_LLM_TEXT_ANALYSIS_TIMEOUT_MS=30000 # Timeout in ms for text-only analysis calls (default: 30000) # === AI Analysis Tuning === AI_ANALYSIS_DEBOUNCE_MS=500 # Debounce window for batching messages in ms (default: 500) AI_ANALYSIS_RECOVERY_INTERVAL_MS=15000 # Recovery interval after errors in ms (default: 15000) AI_ANALYSIS_ERROR_COOLDOWN_MS=30000 # Cooldown period after consecutive errors in ms (default: 30000) AI_ANALYSIS_MAX_BATCH_SIZE=200 # Max messages fetched per conversation batch (default: 200) AI_ANALYSIS_MAX_CONTEXT_TOKENS=8000 # Token budget for context window (default: 8000) AI_ANALYSIS_MAX_TARGET_TOKENS=4000 # Token budget for target messages (default: 4000) AI_ANALYSIS_CONTEXT_MESSAGE_LIMIT=20 # Max messages in context window (default: 20) AI_ANALYSIS_PROCESSING_TIMEOUT_MS=120000 # Conversation lock timeout in ms (default: 120000) AI_ANALYSIS_INDIVIDUAL_MAX_CONCURRENT=50 # Max concurrent individual-fallback jobs (default: 50) AI_ANALYSIS_INDIVIDUAL_CB_THRESHOLD=50 # Consecutive errors before circuit breaker trips (default: 50) # === Auto-Delete === AUTO_DELETE_FLAGGED_ENABLED=true # Enable auto-deletion of flagged messages (default: true) AUTO_DELETE_FLAGGED_DRY_RUN=true # Dry-run mode: log but do not delete (default: false) AUTO_DELETE_FLAGGED_DELAY_MS=0 # Delay before auto-delete in ms (default: 0) AUTO_DELETE_MIN_CONFIDENCE=0.5 # Minimum AI confidence threshold 0-1 (default: 0.5) AUTO_DELETE_ALLOWED_SEVERITIES=critical,high,medium,low # Comma-separated severities (default) AUTO_DELETE_ALLOWED_CATEGORIES= # Comma-separated category filter (empty = all) AUTO_DELETE_EXCLUDED_CHANNEL_IDS= # Comma-separated channel IDs to exclude AUTO_DELETE_EXCLUDED_USER_IDS= # Comma-separated user IDs to exclude AUTO_DELETE_NOTIFY_USER=false # Notify user when their message is auto-deleted (default: false) AUTO_DELETE_LOG_CHANNEL_ID= # Channel ID to log auto-delete actions # === Retention (0 = disabled) === RETENTION_MESSAGES_DAYS=0 # Message retention in days (default: 0 = off) RETENTION_ATTACHMENTS_DAYS=0 # Attachment retention in days (default: 0 = off) RETENTION_VOICE_DAYS=0 # Voice recording retention in days (default: 0 = off) RETENTION_CLEANUP_INTERVAL_MS=86400000 # Cleanup interval in ms (default: 24h) RETENTION_DRY_RUN=true # Dry-run: log but do not delete (default: true) # === Migration === AUTO_MIGRATE_ON_STARTUP=true # Run database migrations on startup (default: true) # === Worker Pool === # PISCINA_MAX_THREADS=4 # Worker thread pool size (optional, defaults to CPU cores)