--- title: 'Configuration' description: 'config.json reference for self-hosted Fluxer.' --- ## Table of contents **Root configuration** - [Root properties](#root-properties) **Sections** - [alerts](#alerts) - [app_public](#app-public) - [auth](#auth) - [cookie](#cookie) - [csam](#csam) - [database](#database) - [dev](#dev) - [discovery](#discovery) - [domain](#domain) - [endpoint_overrides](#endpoint-overrides) - [federation](#federation) - [geoip](#geoip) - [instance](#instance) - [integrations](#integrations) - [internal](#internal) - [proxy](#proxy) - [s3](#s3) - [sentry](#sentry) - [services](#services) - [telemetry](#telemetry) ## Field notation Configuration tables use a compact notation: | Notation | Meaning | |----------|----------| | `property` | Required property | | `property?` | Optional property (may be omitted) | Default values are shown in the Description column when applicable. ## Root properties These are the top-level configuration options in your `config.json`. | Property | Type | Description | |----------|------|-------------| | $schema? | string | Optional reference to this JSON Schema for tooling support. | | alerts? | [alerts](#alerts) | System alerting configuration. | | app_public? | [app_public](#app-public) | Public client-side configuration exposed to the frontend. Default: `{}` | | attachment_decay_enabled? | boolean | Whether to automatically delete old attachments. Default: `true` | | auth | [auth](#auth) | Authentication and security settings. | | cookie? | [cookie](#cookie) | HTTP cookie settings. Default: `{}` | | csam? | [csam](#csam) | CSAM (Child Sexual Abuse Material) detection and reporting policies. Default: `{}` | | database | [database](#database) | Primary database configuration. Selects the backend (Cassandra vs SQLite) and provides connection details. | | deletion_grace_period_hours? | number | Grace period in hours before soft-deleted items are permanently removed. Default: `72` | | dev? | [dev](#dev) | Development-only overrides and flags. These should generally be disabled in production. Default: `{}` | | discovery? | [discovery](#discovery) | Guild discovery listing configuration. Default: `{}` | | domain | [domain](#domain) | Global domain and port configuration used to derive public endpoints for all services. | | endpoint_overrides? | [endpoint_overrides](#endpoint-overrides) | Manual overrides for specific public endpoints. If set, these take precedence over automatically derived URLs. | | env | enum<`development`, `production`, `test`> | Runtime environment for the application. Controls behavior such as logging verbosity, error details, and optimization levels. | | federation? | [federation](#federation) | Federation configuration for connecting with other Fluxer instances. Default: `{}` | | geoip? | [geoip](#geoip) | GeoIP database configuration. Default: `{}` | | inactivity_deletion_threshold_days? | number | Days of inactivity after which data may be subject to deletion. Default: `365` | | instance? | [instance](#instance) | Instance-specific settings and policies. Default: `{}` | | integrations? | [integrations](#integrations) | Third-party service integrations. Default: `{}` | | internal? | [internal](#internal) | Internal network endpoints for service-to-service communication. Only required for microservices mode. Default: `{}` | | proxy? | [proxy](#proxy) | Reverse proxy and IP resolution settings. Default: `{}` | | s3? | [s3](#s3) | S3-compatible object storage configuration. | | sentry? | [sentry](#sentry) | Sentry error reporting configuration. Default: `{}` | | services | [services](#services) | Configuration for individual Fluxer services. | | telemetry? | [telemetry](#telemetry) | OpenTelemetry configuration. Default: `{}` | When `instance.deployment_mode` = `microservices`, the following properties are required: `internal`, `services.app_proxy` --- ## alerts JSON path: `alerts` Alerting settings. | Property | Type | Description | |----------|------|-------------| | webhook_url? | string | Webhook URL for system alerts. Default: `""` | ```json { "webhook_url": "" } ``` --- ## app_public JSON path: `app_public` Public configuration exposed to the frontend application. | Property | Type | Description | |----------|------|-------------| | api_version? | number | API Version. Default: `1` | | bootstrap_api_endpoint? | string | Bootstrap API endpoint. Default: `""` | | bootstrap_api_public_endpoint? | string | Public Bootstrap API endpoint. Default: `""` | | sentry_dsn? | string | Frontend Sentry DSN. Default: `""` | ```json { "api_version": 1, "bootstrap_api_endpoint": "", "bootstrap_api_public_endpoint": "", "sentry_dsn": "" } ``` --- ## auth JSON path: `auth` Global authentication configuration. | Property | Type | Description | |----------|------|-------------| | bluesky? | [bluesky](#bluesky) | Bluesky OAuth client configuration. Default: `{"enabled":true,"client_name":"Fluxer","client_uri":"","logo_uri":"https://fluxerstatic.com/web/apple-touch-icon.png","tos_uri":"https://fluxer.app/terms","policy_uri":"https://fluxer.app/privacy","keys":[]}` | | connection_initiation_secret | string | Secret key for signing connection initiation tokens. | | passkeys? | [passkeys](#passkeys) | Passkey configuration. Default: `{}` | | sudo_mode_secret | string | Secret key for verifying sudo mode tokens. | | vapid | [vapid](#vapid) | Web Push VAPID configuration. | ```json { "connection_initiation_secret": "your_connection_initiation_secret", "sudo_mode_secret": "your_sudo_mode_secret" } ``` ### passkeys JSON path: `auth.passkeys` WebAuthn/Passkeys relying party settings. | Property | Type | Description | |----------|------|-------------| | additional_allowed_origins? | array<string> | List of allowed origins for WebAuthn registration/authentication. Default: `["https://web.fluxer.app","https://web.canary.fluxer.app"]` | | rp_id? | string | Relying Party ID (domain) for WebAuthn credentials. Default: `fluxer.app` | | rp_name? | string | Relying Party name displayed to users. Default: `Fluxer` | ```json { "additional_allowed_origins": [ "https://web.fluxer.app", "https://web.canary.fluxer.app" ], "rp_id": "fluxer.app", "rp_name": "Fluxer" } ``` ### vapid JSON path: `auth.vapid` VAPID keys for Web Push notifications. | Property | Type | Description | |----------|------|-------------| | email? | string | Contact email included in push service requests. Default: `""` | | private_key | string | VAPID Private Key. | | public_key | string | VAPID Public Key. | ```json { "private_key": "your_private_key", "public_key": "your_public_key", "email": "" } ``` ### bluesky JSON path: `auth.bluesky` Bluesky OAuth client configuration. | Property | Type | Description | |----------|------|-------------| | client_name? | string | Human-readable client name exposed to Bluesky. Default: `Fluxer` | | client_uri? | string | URI describing the client application. Default: `""` | | enabled? | boolean | Whether Bluesky OAuth connections are enabled. Default: `true` | | keys? | array<[bluesky_key](#bluesky-key)> | Key definitions used to sign private key JWT assertions. Default: `[]` | | logo_uri? | string | Optional logo presented during authorization. Default: `https://fluxerstatic.com/web/apple-touch-icon.png` | | policy_uri? | string | Privacy policy URI exposed to Bluesky. Default: `https://fluxer.app/privacy` | | tos_uri? | string | Terms of service URI exposed to Bluesky. Default: `https://fluxer.app/terms` | ```json { "client_name": "Fluxer", "client_uri": "", "enabled": true, "keys": [], "logo_uri": "https://fluxerstatic.com/web/apple-touch-icon.png", "policy_uri": "https://fluxer.app/privacy", "tos_uri": "https://fluxer.app/terms" } ``` --- ## cookie JSON path: `cookie` Session cookie configuration. | Property | Type | Description | |----------|------|-------------| | domain? | string | Domain attribute for cookies. Leave empty for host-only. Default: `""` | | secure? | boolean | If true, sets the Secure flag on cookies. Default: `false` | ```json { "domain": "", "secure": false } ``` --- ## csam JSON path: `csam` CSAM compliance configuration. | Property | Type | Description | |----------|------|-------------| | cleanup_batch_size? | number | Batch size for cleanup operations. Default: `100` | | evidence_retention_days? | number | Days to retain evidence. Default: `730` | | job_retention_days? | number | Days to retain reporting jobs. Default: `365` | | queue? | object | CSAM scan queue configuration. | ```json { "cleanup_batch_size": 100, "evidence_retention_days": 730, "job_retention_days": 365 } ``` #### queue CSAM scan queue configuration. | Property | Type | Description | |----------|------|-------------| | consumer_lock_ttl_seconds? | number | TTL for consumer lock (seconds). Default: `5` | | max_entries_per_batch? | number | Maximum queue entries to process per consumer run. Default: `5` | | timeout_ms? | number | Maximum time to wait for a scan result (ms). Default: `30000` | --- ## database JSON path: `database` Database backend selection and configuration. | Property | Type | Description | |----------|------|-------------| | backend | enum<`cassandra`, `sqlite`> | Selected database backend. 'sqlite' is for dev/single-node, 'cassandra' for production. | | cassandra? | [cassandra](#cassandra) | Configuration settings for Cassandra backend. | | sqlite_path? | string | Filesystem path to the SQLite database file. Default: `./data/fluxer.db` | ```json { "backend": "cassandra", "sqlite_path": "./data/fluxer.db" } ``` ### cassandra JSON path: `database.cassandra` Cassandra connection details. | Property | Type | Description | |----------|------|-------------| | hosts | array<string> | Array of Cassandra contact points (hostnames or IPs). | | keyspace | string | Cassandra keyspace name. | | local_dc | string | Local Data Center name for topology awareness. | | password | string | Cassandra authentication password. | | username | string | Cassandra authentication username. | ```json { "hosts": [], "keyspace": "your_keyspace", "local_dc": "your_local_dc", "password": "your_password", "username": "your_username" } ``` --- ## dev JSON path: `dev` Development environment flags. | Property | Type | Description | |----------|------|-------------| | disable_rate_limits? | boolean | Disable all rate limits. Default: `false` | | relax_registration_rate_limits? | boolean | Relax rate limits for registration. Default: `false` | | test_harness_token? | string | Token for the test harness. Default: `""` | | test_mode_enabled? | boolean | Enable test mode behaviors. Default: `false` | ```json { "disable_rate_limits": false, "relax_registration_rate_limits": false, "test_harness_token": "", "test_mode_enabled": false } ``` --- ## discovery JSON path: `discovery` Guild discovery listing configuration. | Property | Type | Description | |----------|------|-------------| | enabled? | boolean | Whether guild discovery is enabled on this instance. Default: `true` | | min_member_count? | number | Minimum number of members a guild needs before it can apply for discovery listing. Default: `1` | ```json { "enabled": true, "min_member_count": 1 } ``` --- ## domain JSON path: `domain` Configuration for domains and ports used to construct public URLs. | Property | Type | Description | |----------|------|-------------| | base_domain | string | The primary domain name (e.g., example.com, localhost). | | gift_domain? | string | Domain for gift links (optional). Default: `""` | | internal_port? | number | The internal port number. Default: `8088` | | internal_scheme? | enum<`http`, `https`> | The URL scheme for internal endpoints. Default: `http` | | invite_domain? | string | Domain for short invite links (optional). Default: `""` | | public_port? | number | The public-facing port number. Default: `8088` | | public_scheme? | enum<`http`, `https`> | The URL scheme for public endpoints. Default: `http` | | static_cdn_domain? | string | Separate domain for static CDN assets (optional). Default: `fluxerstatic.com` | ```json { "base_domain": "your_base_domain", "gift_domain": "", "internal_port": 8088, "internal_scheme": "http", "invite_domain": "", "public_port": 8088, "public_scheme": "http", "static_cdn_domain": "fluxerstatic.com" } ``` --- ## endpoint_overrides JSON path: `endpoint_overrides` Explicit overrides for service endpoints. Use these if derived URLs are incorrect. | Property | Type | Description | |----------|------|-------------| | admin? | string | Full URL override for the Admin Panel endpoint. | | api? | string | Full URL override for the API endpoint. | | api_client? | string | Full URL override for the client-facing API endpoint. | | app? | string | Full URL override for the Web App endpoint. | | gateway? | string | Full URL override for the Gateway (WebSocket) endpoint. | | gift? | string | Full URL override for Gift links. | | invite? | string | Full URL override for Invite links. | | marketing? | string | Full URL override for the Marketing Site endpoint. | | media? | string | Full URL override for the Media endpoint. | | static_cdn? | string | Full URL override for the Static CDN endpoint. | ```json { "admin": "", "api": "", "api_client": "", "app": "", "gateway": "", "gift": "", "invite": "", "marketing": "", "media": "", "static_cdn": "" } ``` --- ## federation JSON path: `federation` Federation configuration for connecting with other Fluxer instances. | Property | Type | Description | |----------|------|-------------| | enabled? | boolean | Enable federation with other Fluxer instances. Default: `false` | ```json { "enabled": false } ``` --- ## geoip JSON path: `geoip` GeoIP database settings. | Property | Type | Description | |----------|------|-------------| | maxmind_db_path? | string | Path to MaxMind GeoIP database. Default: `""` | ```json { "maxmind_db_path": "" } ``` --- ## instance JSON path: `instance` Specific settings for this Fluxer instance. | Property | Type | Description | |----------|------|-------------| | auto_join_invite_code? | string | Invite code to auto-join users to a guild upon registration. Default: `""` | | deployment_mode? | enum<`monolith`, `microservices`> | Deployment mode. 'monolith' runs all services in one process (fluxer_server). 'microservices' requires separate processes/ports. Default: `monolith` | | operators_guild_id? | string | Guild ID for Operators. Default: `""` | | private_key_path? | string | Path to the x25519 private key for E2E encryption (generated on first startup if missing). Default: `""` | | self_hosted? | boolean | Indicates if this is a self-hosted instance. Default: `true` | | visionaries_guild_id? | string | Guild ID for Visionary members. Default: `""` | ```json { "auto_join_invite_code": "", "deployment_mode": "monolith", "operators_guild_id": "", "private_key_path": "", "self_hosted": true, "visionaries_guild_id": "" } ``` --- ## integrations JSON path: `integrations` Collection of all external service integrations. | Property | Type | Description | |----------|------|-------------| | captcha? | [captcha_integration](#captcha-integration) | Default: `{}` | | clamav? | [clamav_integration](#clamav-integration) | Default: `{}` | | cloudflare? | [cloudflare](#cloudflare) | Default: `{}` | | email? | [email_integration](#email-integration) | Default: `{}` | | gif? | [gif](#gif) | Default: `{}` | | klipy? | [klipy](#klipy) | Default: `{}` | | ncmec? | [ncmec_integration](#ncmec-integration) | Default: `{}` | | photo_dna? | [photo_dna_integration](#photo-dna-integration) | Default: `{}` | | search? | [search_integration](#search-integration) | Default: `{}` | | sms? | [sms_integration](#sms-integration) | Default: `{}` | | stripe? | [stripe_integration](#stripe-integration) | Default: `{}` | | tenor? | [tenor](#tenor) | Default: `{}` | | voice? | [voice_integration](#voice-integration) | Default: `{}` | | youtube? | [youtube](#youtube) | Default: `{}` | ### email_integration JSON path: `integrations.email` Email delivery service integration. When `enabled` = `true` and `provider` = `smtp`, the following properties are required: `smtp` | Property | Type | Description | |----------|------|-------------| | enabled? | boolean | Enable email sending. Default: `false` | | from_email? | string | Default sender email address. Default: `""` | | from_name? | string | Default sender name. Default: `Fluxer` | | provider? | enum<`smtp`, `none`> | Email provider selection. Default: `none` | | smtp? | [smtp_email](#smtp-email) | | | webhook_secret? | string | Sweego webhook signing secret (base64-encoded). | ```json { "enabled": false, "from_email": "", "from_name": "Fluxer", "provider": "none", "webhook_secret": "" } ``` ### smtp_email JSON path: `integrations.email.smtp` SMTP transport configuration for email delivery. | Property | Type | Description | |----------|------|-------------| | host | string | SMTP server hostname. | | password | string | SMTP authentication password. | | port | number | SMTP port number. Default: `587` | | secure? | boolean | Use TLS when connecting to the SMTP server. Default: `true` | | username | string | SMTP authentication username. | ```json { "host": "your_host", "password": "your_password", "port": 587, "username": "your_username", "secure": true } ``` ### sms_integration JSON path: `integrations.sms` SMS service integration. When `enabled` = `true`, the following properties are required: `account_sid`, `auth_token`, `verify_service_sid` | Property | Type | Description | |----------|------|-------------| | account_sid? | string | Twilio account SID. | | auth_token? | string | Twilio auth token. | | enabled? | boolean | Enable SMS sending. Default: `false` | | verify_service_sid? | string | Twilio Verify service SID. | ```json { "account_sid": "", "auth_token": "", "enabled": false, "verify_service_sid": "" } ``` ### captcha_integration JSON path: `integrations.captcha` CAPTCHA service integration. | Property | Type | Description | |----------|------|-------------| | enabled? | boolean | Enable CAPTCHA verification. Default: `false` | | hcaptcha? | [captcha_provider](#captcha-provider) | hCaptcha settings. Default: `{}` | | provider? | enum<`hcaptcha`, `turnstile`, `none`> | Selected CAPTCHA provider. Default: `none` | | turnstile? | [captcha_provider](#captcha-provider) | Cloudflare Turnstile settings. Default: `{}` | ```json { "enabled": false, "provider": "none" } ``` ### captcha_provider JSON path: `integrations.captcha.hcaptcha` Configuration for a specific CAPTCHA provider. | Property | Type | Description | |----------|------|-------------| | secret_key? | string | Secret key for server-side verification. Default: `""` | | site_key? | string | Public site key. Default: `""` | ```json { "secret_key": "", "site_key": "" } ``` ### voice_integration JSON path: `integrations.voice` Real-time voice/video integration (LiveKit). When `enabled` = `true` and `default_region` is present, the following properties are required: `api_key`, `api_secret` | Property | Type | Description | |----------|------|-------------| | api_key? | string | LiveKit API Key used for config-driven default_region bootstrap. Optional when voice topology is managed in the admin panel. | | api_secret? | string | LiveKit API Secret used for config-driven default_region bootstrap. Optional when voice topology is managed in the admin panel. | | default_region? | object | Default voice region to create on startup if none exist. When provided, automatically creates this region and a server pointing to the configured LiveKit URL. | | enabled? | boolean | Enable voice/video features. Default: `false` | | url? | string | LiveKit Server URL (client signal endpoint for WebSocket connections). Default: `""` | | webhook_url? | string | URL for LiveKit webhooks. Default: `""` | ```json { "api_key": "", "api_secret": "", "enabled": false, "url": "", "webhook_url": "" } ``` #### default_region Default voice region to create on startup if none exist. When provided, automatically creates this region and a server pointing to the configured LiveKit URL. | Property | Type | Description | |----------|------|-------------| | emoji | string | Emoji icon for the region (e.g. '🌐', '🇪🇺'). | | id | string | Unique identifier for the region (e.g. 'default', 'eu-west'). | | latitude | number | Latitude coordinate for the region. | | longitude | number | Longitude coordinate for the region. | | name | string | Display name for the region. | ### search_integration JSON path: `integrations.search` Search engine integration (Meilisearch). Fluxer always uses Meilisearch for indexing and querying. | Property | Type | Description | |----------|------|-------------| | api_key | string | Meilisearch API key used by the API for index management and writes. Use a key with access to documents and settings. | | url | string | Meilisearch HTTP API URL. Default: `http://127.0.0.1:7700` | ```json { "api_key": "your_api_key", "url": "http://127.0.0.1:7700" } ``` ### stripe_integration JSON path: `integrations.stripe` Stripe payments integration. When `enabled` = `true`, the following properties are required: `secret_key`, `webhook_secret` | Property | Type | Description | |----------|------|-------------| | enabled? | boolean | Enable Stripe payments. Default: `false` | | prices? | [stripe_prices](#stripe-prices) | Stripe Price ID configuration. | | secret_key? | string | Stripe Secret Key. | | webhook_secret? | string | Stripe Webhook Signing Secret. | ```json { "enabled": false, "secret_key": "", "webhook_secret": "" } ``` ### stripe_prices JSON path: `integrations.stripe.prices` Stripe Price IDs for subscription products. | Property | Type | Description | |----------|------|-------------| | gift_1_month_eur? | string | Gift 1 Month EUR price ID. Default: `""` | | gift_1_month_usd? | string | Gift 1 Month USD price ID. Default: `""` | | gift_1_year_eur? | string | Gift 1 Year EUR price ID. Default: `""` | | gift_1_year_usd? | string | Gift 1 Year USD price ID. Default: `""` | | gift_visionary_eur? | string | Gift Visionary EUR price ID. Default: `""` | | gift_visionary_usd? | string | Gift Visionary USD price ID. Default: `""` | | monthly_eur? | string | Monthly subscription EUR price ID. Default: `""` | | monthly_usd? | string | Monthly subscription USD price ID. Default: `""` | | visionary_eur? | string | Visionary tier EUR price ID. Default: `""` | | visionary_usd? | string | Visionary tier USD price ID. Default: `""` | | yearly_eur? | string | Yearly subscription EUR price ID. Default: `""` | | yearly_usd? | string | Yearly subscription USD price ID. Default: `""` | ```json { "gift_1_month_eur": "", "gift_1_month_usd": "", "gift_1_year_eur": "", "gift_1_year_usd": "", "gift_visionary_eur": "", "gift_visionary_usd": "", "monthly_eur": "", "monthly_usd": "", "visionary_eur": "", "visionary_usd": "", "yearly_eur": "", "yearly_usd": "" } ``` ### photo_dna_integration JSON path: `integrations.photo_dna` PhotoDNA integration for hash matching. | Property | Type | Description | |----------|------|-------------| | enabled? | boolean | Enable PhotoDNA. Default: `false` | | hash_service_timeout_ms? | number | Timeout for hash generation. Default: `15000` | | hash_service_url? | string | URL for the hash generation service. Default: `""` | | match_endpoint? | string | URL for the match service. Default: `""` | | match_enhance? | boolean | Enable enhanced matching. Default: `false` | | rate_limit_rps? | number | Rate limit requests per second. Default: `5` | | subscription_key? | string | Subscription key for the match service. Default: `""` | ```json { "enabled": false, "hash_service_timeout_ms": 15000, "hash_service_url": "", "match_endpoint": "", "match_enhance": false, "rate_limit_rps": 5, "subscription_key": "" } ``` ### ncmec_integration JSON path: `integrations.ncmec` NCMEC CyberTipline integration. | Property | Type | Description | |----------|------|-------------| | base_url? | string | Base URL for the CyberTipline Reporting API (e.g., https://report.cybertip.org/ispws). Default: `""` | | enabled? | boolean | Enable NCMEC reporting. Default: `false` | | password? | string | Password for CyberTipline basic authentication. Default: `""` | | username? | string | Username for CyberTipline basic authentication. Default: `""` | ```json { "base_url": "", "enabled": false, "password": "", "username": "" } ``` ### clamav_integration JSON path: `integrations.clamav` ClamAV antivirus integration. | Property | Type | Description | |----------|------|-------------| | enabled? | boolean | Enable ClamAV scanning. Default: `false` | | fail_open? | boolean | If true, allow files if scanning fails. Default: `true` | | host? | string | ClamAV host. Default: `clamav` | | port? | number | ClamAV port. Default: `3310` | ```json { "enabled": false, "fail_open": true, "host": "clamav", "port": 3310 } ``` ### gif JSON path: `integrations.gif` GIF provider selection for the client-facing GIF picker. | Property | Type | Description | |----------|------|-------------| | provider? | enum<`klipy`, `tenor`> | GIF provider to use for GIF search and sharing. Default: `klipy` | ```json { "provider": "klipy" } ``` ### klipy JSON path: `integrations.klipy` KLIPY GIF API integration. | Property | Type | Description | |----------|------|-------------| | api_key? | string | KLIPY API Key. Default: `""` | ```json { "api_key": "" } ``` ### tenor JSON path: `integrations.tenor` Tenor GIF API integration. | Property | Type | Description | |----------|------|-------------| | api_key? | string | Tenor API key. Default: `""` | ```json { "api_key": "" } ``` ### youtube JSON path: `integrations.youtube` YouTube API integration. | Property | Type | Description | |----------|------|-------------| | api_key? | string | YouTube API Key. Default: `""` | ```json { "api_key": "" } ``` ### cloudflare JSON path: `integrations.cloudflare` Cloudflare integration. | Property | Type | Description | |----------|------|-------------| | api_token? | string | Cloudflare API token for cache purge. Default: `""` | | purge_enabled? | boolean | Enable automatic cache purging. Default: `false` | | zone_id? | string | Cloudflare Zone ID. Default: `""` | ```json { "api_token": "", "purge_enabled": false, "zone_id": "" } ``` --- ## internal JSON path: `internal` Direct internal endpoints for backend services. In monolith mode these are served via paths on the main server. | Property | Type | Description | |----------|------|-------------| | kv? | string | Internal Valkey/Redis URL for key-value operations. Default: `redis://localhost:6379/0` | | media_proxy? | string | Internal URL for the Media Proxy service. Default: `http://localhost:8088/media` | | queue? | string | Internal URL for the Queue service. Default: `http://localhost:8088/queue` | ```json { "kv": "redis://localhost:6379/0", "media_proxy": "http://localhost:8088/media", "queue": "http://localhost:8088/queue" } ``` --- ## proxy JSON path: `proxy` Proxy configuration. | Property | Type | Description | |----------|------|-------------| | trust_cf_connecting_ip? | boolean | Trust Cloudflare's CF-Connecting-IP header. Default: `false` | ```json { "trust_cf_connecting_ip": false } ``` --- ## s3 JSON path: `s3` S3 connection configuration. | Property | Type | Description | |----------|------|-------------| | access_key_id | string | S3 Access Key ID. | | buckets? | [s3_buckets](#s3-buckets) | Mapping of logical buckets to actual S3 bucket names. Default: `{}` | | endpoint? | string | S3 service endpoint URL. Default: `http://localhost:3900` | | presigned_url_base? | string | Base URL for presigned download URLs. If not set, defaults to the endpoint value. Set this to a public URL when the endpoint is internal. | | region? | string | S3 region. Default: `local` | | secret_access_key | string | S3 Secret Access Key. | ```json { "access_key_id": "your_access_key_id", "secret_access_key": "your_secret_access_key", "endpoint": "http://localhost:3900", "presigned_url_base": "", "region": "local" } ``` ### s3_buckets JSON path: `s3.buckets` Configuration of specific S3 bucket names. | Property | Type | Description | |----------|------|-------------| | cdn? | string | Bucket for CDN assets. Default: `fluxer` | | downloads? | string | Bucket for downloads. Default: `fluxer-downloads` | | harvests? | string | Bucket for data harvests. Default: `fluxer-harvests` | | reports? | string | Bucket for report data. Default: `fluxer-reports` | | static? | string | Bucket for static site assets. Default: `fluxer-static` | | uploads? | string | Bucket for user uploads. Default: `fluxer-uploads` | ```json { "cdn": "fluxer", "downloads": "fluxer-downloads", "harvests": "fluxer-harvests", "reports": "fluxer-reports", "static": "fluxer-static", "uploads": "fluxer-uploads" } ``` --- ## sentry JSON path: `sentry` Sentry configuration. | Property | Type | Description | |----------|------|-------------| | dsn? | string | Sentry DSN. Default: `""` | | enabled? | boolean | Enable Sentry reporting. Default: `false` | ```json { "dsn": "", "enabled": false } ``` --- ## services JSON path: `services` Container for all service-specific configurations. | Property | Type | Description | |----------|------|-------------| | admin | [admin_service](#admin-service) | | | api? | [api_service](#api-service) | Default: `{}` | | app_proxy? | [app_proxy_service](#app-proxy-service) | | | gateway | [gateway_service](#gateway-service) | | | marketing? | [marketing_service](#marketing-service) | | | media_proxy | [media_proxy_service](#media-proxy-service) | | | nats? | [nats_services](#nats-services) | Default: `{}` | | queue? | [queue_service](#queue-service) | Default: `{}` | | s3? | [s3_service](#s3-service) | Default: `{}` | | server? | [server_service](#server-service) | Default: `{}` | ### s3_service JSON path: `services.s3` Configuration for the S3-compatible storage service. | Property | Type | Description | |----------|------|-------------| | data_dir? | string | Filesystem path to store S3 data objects. Default: `./data/s3` | | export_timeout? | number | Timeout in milliseconds for data export operations. Default: `30000` | | host? | string | Network interface to bind to. Default: `0.0.0.0` | | port? | number | Port to listen on. Default: `3900` | | rate_limit? | [rate_limit](#rate-limit) | Rate limiting configuration for the S3 service. | ```json { "data_dir": "./data/s3", "export_timeout": 30000, "host": "0.0.0.0", "port": 3900 } ``` ### rate_limit JSON path: `services.s3.rate_limit` Rate limiting parameters. | Property | Type | Description | |----------|------|-------------| | limit? | number | Maximum number of requests allowed within the window. | | window_ms? | number | Time window in milliseconds. | ```json { "limit": 0, "window_ms": 0 } ``` ### nats_services JSON path: `services.nats` Configuration for NATS messaging. | Property | Type | Description | |----------|------|-------------| | auth_token? | string | Authentication token for NATS connections. Default: `""` | | core_url? | string | NATS Core server URL for RPC. Default: `nats://127.0.0.1:4222` | | jetstream_url? | string | NATS JetStream server URL for job queues. Default: `nats://127.0.0.1:4223` | ```json { "auth_token": "", "core_url": "nats://127.0.0.1:4222", "jetstream_url": "nats://127.0.0.1:4223" } ``` ### queue_service JSON path: `services.queue` Configuration for the Job Queue service. | Property | Type | Description | |----------|------|-------------| | concurrency? | number | Number of concurrent worker threads. Default: `1` | | data_dir? | string | Filesystem path to store queue data. Default: `./data/queue` | | default_visibility_timeout_ms? | number | Default time in milliseconds a message remains invisible after being received. Default: `30000` | | port? | number | Port to listen on. Default: `8088` | | secret? | string | Secret for queue API authentication. Default: `""` | | snapshot_after_ops? | number | Number of operations after which to take a queue snapshot. Default: `10000` | | snapshot_every_ms? | number | Interval in milliseconds to take queue snapshots. Default: `60000` | | snapshot_zstd_level? | number | Zstd compression level for snapshots (1-22). Default: `3` | ```json { "concurrency": 1, "data_dir": "./data/queue", "default_visibility_timeout_ms": 30000, "port": 8088, "secret": "", "snapshot_after_ops": 10000, "snapshot_every_ms": 60000, "snapshot_zstd_level": 3 } ``` ### media_proxy_service JSON path: `services.media_proxy` Configuration for the Media Proxy service. | Property | Type | Description | |----------|------|-------------| | host? | string | Network interface to bind to. Default: `0.0.0.0` | | port? | number | Port to listen on. Default: `8080` | | rate_limit? | [rate_limit](#rate-limit) | Rate limiting configuration for the Media Proxy. | | require_cloudflare_edge? | boolean | If true, strictly requires requests to originate from Cloudflare edge IPs. Default: `false` | | secret_key | string | Secret key used to sign and verify media URLs. | | static_mode? | boolean | If true, enables serving static files directly. Default: `false` | ```json { "secret_key": "your_secret_key", "host": "0.0.0.0", "port": 8080, "require_cloudflare_edge": false, "static_mode": false } ``` ### admin_service JSON path: `services.admin` Configuration for the Admin Panel service. | Property | Type | Description | |----------|------|-------------| | base_path? | string | URL base path for the admin interface. Default: `/admin` | | oauth_client_secret | string | OAuth Client Secret for admin authentication. | | port? | number | Port to listen on. Default: `3001` | | rate_limit? | [rate_limit](#rate-limit) | Rate limiting configuration for the Admin service. | | secret_key_base | string | Base secret key for signing admin session tokens. | ```json { "oauth_client_secret": "your_oauth_client_secret", "secret_key_base": "your_secret_key_base", "base_path": "/admin", "port": 3001 } ``` ### marketing_service JSON path: `services.marketing` Configuration for the Marketing site service. | Property | Type | Description | |----------|------|-------------| | base_path? | string | URL base path for the marketing site. Default: `/marketing` | | enabled? | boolean | Whether to enable the Marketing service within fluxer_server. Default: `false` | | host? | string | Network interface to bind to. Default: `0.0.0.0` | | port? | number | Port to listen on. Default: `8774` | | secret_key_base | string | Base secret key for marketing site sessions/tokens. | ```json { "secret_key_base": "your_secret_key_base", "base_path": "/marketing", "enabled": false, "host": "0.0.0.0", "port": 8774 } ``` ### api_service JSON path: `services.api` Configuration for the main API service. | Property | Type | Description | |----------|------|-------------| | host? | string | Network interface to bind to. Default: `0.0.0.0` | | port? | number | Port to listen on. Default: `8080` | | unfurl_ignored_hosts? | array<string> | List of hostnames or IPs to ignore when unfurling URLs. Default: `["localhost","127.0.0.1"]` | ```json { "host": "0.0.0.0", "port": 8080, "unfurl_ignored_hosts": [ "localhost", "127.0.0.1" ] } ``` ### app_proxy_service JSON path: `services.app_proxy` Configuration for the App Proxy service (frontend server). | Property | Type | Description | |----------|------|-------------| | assets_dir? | string | Filesystem directory containing static assets. Default: `./assets` | | port? | number | Port to listen on. Default: `8773` | | static_cdn_endpoint? | string | URL endpoint for serving static assets via CDN. Default: `""` | ```json { "assets_dir": "./assets", "port": 8773, "static_cdn_endpoint": "" } ``` ### gateway_service JSON path: `services.gateway` Configuration for the Gateway service (WebSocket). | Property | Type | Description | |----------|------|-------------| | admin_reload_secret | string | Secret used to trigger code hot-swapping/reloads. | | gateway_metrics_enabled? | boolean | Enable collection of gateway metrics. Default: `false` | | gateway_metrics_report_interval_ms? | number | Interval in milliseconds to report gateway metrics. Default: `30000` | | guild_shards? | number | Number of shards for guild handling. Default: `1` | | identify_rate_limit_enabled? | boolean | Enable rate limiting for Gateway IDENTIFY opcodes. Default: `false` | | logger_level? | string | Logging level (e.g., debug, info, warn, error). Default: `info` | | media_proxy_endpoint | string | Endpoint URL of the Media Proxy service. | | port? | number | Port to listen on. Default: `8771` | | presence_bus_shards? | number | Number of shards for presence message bus. Default: `1` | | presence_cache_shards? | number | Number of shards for presence cache. Default: `1` | | presence_shards? | number | Number of shards for presence handling. Default: `1` | | push_badge_counts_cache_mb? | number | Memory cache size (MB) for badge counts. Default: `256` | | push_badge_counts_cache_ttl_seconds? | number | TTL in seconds for badge counts cache. Default: `60` | | push_blocked_ids_cache_mb? | number | Memory cache size (MB) for blocked user IDs. Default: `1024` | | push_enabled? | boolean | Enable push notification delivery. Default: `true` | | push_subscriptions_cache_mb? | number | Memory cache size (MB) for push subscriptions. Default: `1024` | | push_user_guild_settings_cache_mb? | number | Memory cache size (MB) for user guild settings. Default: `1024` | | release_node? | string | Erlang node name for the release. Default: `fluxer_gateway@gateway` | ```json { "admin_reload_secret": "your_admin_reload_secret", "media_proxy_endpoint": "your_media_proxy_endpoint", "gateway_metrics_enabled": false, "gateway_metrics_report_interval_ms": 30000, "guild_shards": 1, "identify_rate_limit_enabled": false, "logger_level": "info", "port": 8771, "presence_bus_shards": 1, "presence_cache_shards": 1, "presence_shards": 1, "push_badge_counts_cache_mb": 256, "push_badge_counts_cache_ttl_seconds": 60, "push_blocked_ids_cache_mb": 1024, "push_enabled": true, "push_subscriptions_cache_mb": 1024, "push_user_guild_settings_cache_mb": 1024, "release_node": "fluxer_gateway@gateway" } ``` ### server_service JSON path: `services.server` Configuration for the main Fluxer Server. | Property | Type | Description | |----------|------|-------------| | host? | string | Network interface to bind to. Default: `0.0.0.0` | | port? | number | Port to listen on. Default: `8772` | | static_dir? | string | Path to static assets directory for the web app. Required in production. | ```json { "host": "0.0.0.0", "port": 8772, "static_dir": "" } ``` --- ## telemetry JSON path: `telemetry` OpenTelemetry observability settings. | Property | Type | Description | |----------|------|-------------| | api_key? | string | API Key for telemetry service. Default: `""` | | enabled? | boolean | Enable OpenTelemetry. Default: `false` | | environment? | string | Environment name (dev, prod, etc). Default: `development` | | export_timeout? | number | Timeout in milliseconds for exporting telemetry data. Default: `30000` | | ignore_incoming_paths? | array<string> | HTTP paths to exclude from tracing. Default: `["/_health"]` | | metric_export_interval_ms? | number | Interval in milliseconds between metric exports. Default: `60000` | | otlp_endpoint? | string | OTLP collector endpoint. Default: `""` | | service_name? | string | Service name reported to telemetry. Default: `fluxer` | | trace_sampling_ratio? | number | Sampling ratio for traces (0.0 to 1.0). Default: `1` | ```json { "api_key": "", "enabled": false, "environment": "development", "export_timeout": 30000, "ignore_incoming_paths": [ "/_health" ], "metric_export_interval_ms": 60000, "otlp_endpoint": "", "service_name": "fluxer", "trace_sampling_ratio": 1 } ```