2026-05-13 16:05:56 +07:00
# Discord Bot Configuration
2026-06-10 20:56:16 +07:00
# =============================================================================
2026-07-31 20:08:46 +07:00
#
# 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.
2026-05-13 16:05:56 +07:00
2026-06-10 20:56:16 +07:00
# === 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
2026-05-13 16:05:56 +07:00
2026-06-10 20:56:16 +07:00
# === Voice Channels ===
# VOICE_GUILD_ID= # Guild for voice connection (optional)
# VOICE_CHANNEL_ID= # Channel for voice connection (optional)
2026-05-13 16:05:56 +07:00
2026-06-10 20:56:16 +07:00
# === Recording ===
RECORDINGS_DIR = ./recordings # Audio file output directory (default: ./recordings)
RECORDING_SEGMENT_MS = 5000 # OGG segment duration in ms (default: 5000)
2026-05-13 16:05:56 +07:00
2026-06-10 20:56:16 +07:00
# === Decoder ===
DECODER_ROTATE_MS = 5000 # Opus decoder rotation interval in ms (default: 5000)
DECODER_COOLDOWN_MS = 30000 # Decoder error cooldown in ms (default: 30000)
2026-05-13 16:05:56 +07:00
2026-06-10 20:56:16 +07:00
# === 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)
2026-05-13 16:57:07 +07:00
2026-06-10 20:56:16 +07:00
# === Webserver ===
2026-08-02 14:30:54 +07:00
WEBSERVER_PORT = 4001 # Backend HTTP/WS server port (default: 4001)
2026-05-15 15:58:38 +07:00
2026-06-10 20:56:16 +07:00
# === Connection ===
VOICE_CONNECTION_TIMEOUT_MS = 15000 # Voice connection timeout in ms (default: 15000)
RECONNECT_TIMEOUT_MS = 5000 # Reconnect timeout in ms (default: 5000)
2026-05-13 16:57:07 +07:00
2026-06-10 20:56:16 +07:00
# === 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)
2026-05-13 17:06:22 +07:00
2026-06-10 20:56:16 +07:00
# === Admin ===
2026-07-26 11:33:45 +07:00
# ADMIN_PASSWORD removed — dashboard is public
2026-06-09 10:16:04 +07:00
2026-06-10 20:56:16 +07:00
# === Database (PostgreSQL) ===
# Option 1: Connection string (overrides individual params)
2026-05-14 14:44:01 +07:00
# DATABASE_URL=postgresql://user:password@localhost:5432/discord_bot
2026-06-10 20:56:16 +07:00
# 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)
2026-05-14 14:44:01 +07:00
2026-06-10 20:56:16 +07:00
# === Redis ===
REDIS_URL = redis://localhost:6379 # Redis connection string (default: redis://localhost:6379)
2026-05-31 14:21:43 +07:00
2026-06-14 00:57:08 +07:00
# === 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
2026-06-10 20:56:16 +07:00
# === 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)
2026-05-14 14:44:01 +07:00
2026-06-10 20:56:16 +07:00
# === 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
2026-07-31 21:11:39 +07:00
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)
2026-06-10 20:56:16 +07:00
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)
2026-07-31 19:37:53 +07:00
# 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)
2026-07-31 21:30:43 +07:00
# 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)
2026-06-10 20:56:16 +07:00
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)
2026-07-31 23:09:00 +07:00
AI_LLM_TEXT_ANALYSIS_TIMEOUT_MS = 30000 # Timeout in ms for text-only analysis calls (default: 30000)
2026-06-09 10:16:04 +07:00
2026-06-10 20:56:16 +07:00
# === 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)
2026-05-30 15:35:07 +07:00
2026-06-10 20:56:16 +07:00
# === 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)