Sockudo
Reference

Config Reference

Complete JSON configuration reference with all options and defaults.

Full Configuration Template

Below is the complete config.json structure with all default values. Only include the sections you need to override.

config/config.json
{
  "debug": false,
  "host": "0.0.0.0",
  "port": 6001,
  "mode": "production",
  "path_prefix": "/",
  "activity_timeout": 120,
  "shutdown_grace_period": 10,
  "user_authentication_timeout": 3600,
  "websocket_max_payload_kb": 64,

  "instance": {
    "process_id": "<auto-generated-uuid>"
  },

  "adapter": {
    "driver": "local",
    "buffer_multiplier_per_cpu": 64,
    "enable_socket_counting": true,
    "redis": {
      "requests_timeout": 5000,
      "prefix": "sockudo_adapter:",
      "redis_pub_options": {},
      "redis_sub_options": {},
      "cluster_mode": false
    },
    "cluster": {
      "nodes": [],
      "prefix": "sockudo_adapter:",
      "request_timeout_ms": 1000,
      "use_connection_manager": true,
      "use_sharded_pubsub": false
    },
    "nats": {
      "servers": ["nats://localhost:4222"],
      "prefix": "sockudo_adapter:",
      "request_timeout_ms": 5000,
      "username": null,
      "password": null,
      "token": null,
      "connection_timeout_ms": 5000,
      "nodes_number": null
    },
    "cluster_health": {
      "enabled": true,
      "heartbeat_interval_ms": 10000,
      "node_timeout_ms": 30000,
      "cleanup_interval_ms": 10000
    }
  },

  "app_manager": {
    "driver": "memory",
    "array": {
      "apps": [
        {
          "id": "app-id",
          "key": "app-key",
          "secret": "app-secret",
          "enabled": true,
          "enable_client_messages": false,
          "max_connections": 100,
          "max_client_events_per_second": 100,
          "max_read_requests_per_second": 100,
          "max_backend_events_per_second": 100,
          "max_presence_members_per_channel": 100,
          "max_presence_member_size_in_kb": 100,
          "max_channel_name_length": 100,
          "max_event_channels_at_once": 100,
          "max_event_name_length": 100,
          "max_event_payload_in_kb": 100,
          "max_event_batch_size": 100,
          "enable_user_authentication": false,
          "enable_watchlist_events": false,
          "allowed_origins": null,
          "webhooks": null,
          "channel_delta_compression": null
        }
      ]
    },
    "cache": {
      "enabled": true,
      "ttl": 300
    },
    "scylladb": {
      "nodes": ["127.0.0.1:9042"],
      "keyspace": "sockudo",
      "table_name": "applications",
      "username": null,
      "password": null,
      "replication_class": "SimpleStrategy",
      "replication_factor": 3
    }
  },

  "cache": {
    "driver": "memory",
    "redis": {
      "prefix": "sockudo_cache:",
      "url_override": null,
      "cluster_mode": false
    },
    "memory": {
      "ttl": 300,
      "cleanup_interval": 60,
      "max_capacity": 10000
    }
  },

  "channel_limits": {
    "max_name_length": 200,
    "cache_ttl": 3600
  },

  "cors": {
    "credentials": true,
    "origin": ["*"],
    "methods": ["GET", "POST", "OPTIONS"],
    "allowed_headers": ["Authorization", "Content-Type", "X-Requested-With", "Accept"]
  },

  "database": {
    "mysql": {
      "host": "localhost",
      "port": 3306,
      "username": "root",
      "password": "",
      "database": "sockudo",
      "table_name": "applications",
      "connection_pool_size": 10,
      "pool_min": null,
      "pool_max": null,
      "cache_ttl": 300,
      "cache_cleanup_interval": 60,
      "cache_max_capacity": 100
    },
    "postgres": {
      "host": "localhost",
      "port": 3306,
      "username": "root",
      "password": "",
      "database": "sockudo",
      "table_name": "applications",
      "connection_pool_size": 10,
      "pool_min": null,
      "pool_max": null,
      "cache_ttl": 300,
      "cache_cleanup_interval": 60,
      "cache_max_capacity": 100
    },
    "redis": {
      "host": "127.0.0.1",
      "port": 6379,
      "db": 0,
      "username": null,
      "password": null,
      "key_prefix": "sockudo:",
      "sentinels": [],
      "sentinel_password": null,
      "name": "mymaster",
      "cluster": {
        "nodes": [],
        "username": null,
        "password": null,
        "use_tls": false
      },
      "cluster_nodes": []
    },
    "dynamodb": {
      "region": "us-east-1",
      "table_name": "sockudo-applications",
      "endpoint_url": null,
      "aws_access_key_id": null,
      "aws_secret_access_key": null,
      "aws_profile_name": null
    },
    "scylladb": {
      "nodes": ["127.0.0.1:9042"],
      "keyspace": "sockudo",
      "table_name": "applications",
      "username": null,
      "password": null,
      "replication_class": "SimpleStrategy",
      "replication_factor": 3
    }
  },

  "database_pooling": {
    "enabled": true,
    "min": 2,
    "max": 10
  },

  "event_limits": {
    "max_channels_at_once": 100,
    "max_name_length": 200,
    "max_payload_in_kb": 100,
    "max_batch_size": 10
  },

  "http_api": {
    "request_limit_in_mb": 10,
    "accept_traffic": {
      "memory_threshold": 0.90
    }
  },

  "logging": {
    "colors_enabled": true,
    "include_target": true
  },

  "metrics": {
    "enabled": true,
    "driver": "prometheus",
    "host": "0.0.0.0",
    "port": 9601,
    "prometheus": {
      "prefix": "sockudo_"
    }
  },

  "presence": {
    "max_members_per_channel": 100,
    "max_member_size_in_kb": 2
  },

  "queue": {
    "driver": "redis",
    "redis": {
      "concurrency": 5,
      "prefix": "sockudo_queue:",
      "url_override": null,
      "cluster_mode": false
    },
    "redis_cluster": {
      "concurrency": 5,
      "prefix": "sockudo_queue:",
      "nodes": ["redis://127.0.0.1:6379"],
      "request_timeout_ms": 5000
    },
    "sqs": {
      "region": "us-east-1",
      "queue_url_prefix": null,
      "visibility_timeout": 30,
      "endpoint_url": null,
      "max_messages": 10,
      "wait_time_seconds": 5,
      "concurrency": 5,
      "fifo": false,
      "message_group_id": "default"
    }
  },

  "rate_limiter": {
    "enabled": true,
    "driver": "memory",
    "api_rate_limit": {
      "max_requests": 100,
      "window_seconds": 60,
      "identifier": "api",
      "trust_hops": 0
    },
    "websocket_rate_limit": {
      "max_requests": 20,
      "window_seconds": 60,
      "identifier": "websocket_connect",
      "trust_hops": 0
    },
    "redis": {
      "prefix": "sockudo_rl:",
      "url_override": null,
      "cluster_mode": false
    }
  },

  "ssl": {
    "enabled": false,
    "cert_path": "",
    "key_path": "",
    "passphrase": null,
    "ca_path": null,
    "redirect_http": false,
    "http_port": 80
  },

  "unix_socket": {
    "enabled": false,
    "path": "/var/run/sockudo/sockudo.sock",
    "permission_mode": "660"
  },

  "webhooks": {
    "batching": {
      "enabled": true,
      "duration": 50
    }
  },

  "cleanup": {
    "async_enabled": true,
    "fallback_to_sync": true,
    "queue_buffer_size": 50000,
    "batch_size": 25,
    "batch_timeout_ms": 50,
    "worker_threads": "auto",
    "max_retry_attempts": 2
  },

  "cluster_health": {
    "enabled": true,
    "heartbeat_interval_ms": 10000,
    "node_timeout_ms": 30000,
    "cleanup_interval_ms": 10000
  },

  "delta_compression": {
    "enabled": true,
    "algorithm": "fossil",
    "full_message_interval": 10,
    "min_message_size": 100,
    "max_state_age_secs": 300,
    "max_channel_states_per_socket": 100,
    "max_conflation_states_per_channel": 100,
    "conflation_key_path": null,
    "cluster_coordination": false,
    "omit_delta_algorithm": false
  },

  "tag_filtering": {
    "enabled": false,
    "enable_tags": true
  },

  "websocket": {
    "max_messages": 1000,
    "max_bytes": null,
    "disconnect_on_buffer_full": true,
    "max_message_size": 67108864,
    "max_frame_size": 16777216,
    "write_buffer_size": 16384,
    "max_backpressure": 1048576,
    "auto_ping": true,
    "ping_interval": 30,
    "idle_timeout": 120,
    "compression": "disabled"
  }
}

Section Reference

adapter

Controls the pub/sub transport used for horizontal scaling.

FieldTypeDefaultDescription
driverstringlocallocal, redis, redis-cluster, nats
buffer_multiplier_per_cpunumber64Concurrent operations per CPU core
enable_socket_countingbooltrueTrack socket counts across cluster nodes

adapter.redis

FieldTypeDefaultDescription
requests_timeoutnumber5000Request timeout in ms
prefixstringsockudo_adapter:Redis key prefix
redis_pub_optionsobject{}Extra options for pub connection
redis_sub_optionsobject{}Extra options for sub connection
cluster_modeboolfalseUse cluster-aware connections

adapter.cluster (Redis Cluster)

FieldTypeDefaultDescription
nodesstring[][]Cluster seed node URLs
prefixstringsockudo_adapter:Key prefix
request_timeout_msnumber1000Request timeout in ms
use_connection_managerbooltrueUse connection manager
use_sharded_pubsubboolfalseUse SSUBSCRIBE/SPUBLISH (Redis 7.0+)

adapter.nats

FieldTypeDefaultDescription
serversstring[]["nats://localhost:4222"]NATS server URLs
prefixstringsockudo_adapter:Subject prefix
request_timeout_msnumber5000Request timeout in ms
usernamestring?nullNATS username
passwordstring?nullNATS password
tokenstring?nullNATS auth token
connection_timeout_msnumber5000Connection timeout in ms
nodes_numbernumber?nullExpected cluster size

app_manager

FieldTypeDefaultDescription
driverstringmemorymemory, mysql, postgres, dynamodb, scylladb
array.appsApp[][]In-memory app definitions
cache.enabledbooltrueCache app lookups
cache.ttlnumber300Cache TTL in seconds

app_manager.scylladb

FieldTypeDefaultDescription
nodesstring[]["127.0.0.1:9042"]ScyllaDB contact points
keyspacestringsockudoKeyspace name
table_namestringapplicationsTable name
usernamestring?nullAuth username
passwordstring?nullAuth password
replication_classstringSimpleStrategyReplication strategy
replication_factornumber3Replication factor

cache

FieldTypeDefaultDescription
driverstringmemorymemory, redis, redis-cluster, none

cache.redis

FieldTypeDefaultDescription
prefixstring?sockudo_cache:Redis key prefix
url_overridestring?nullOverride Redis URL
cluster_modeboolfalseUse cluster mode

cache.memory

FieldTypeDefaultDescription
ttlnumber300TTL in seconds
cleanup_intervalnumber60Cleanup interval in seconds
max_capacitynumber10000Max cache entries

channel_limits

FieldTypeDefaultDescription
max_name_lengthnumber200Max channel name length
cache_ttlnumber3600Channel cache TTL in seconds

cors

FieldTypeDefaultDescription
credentialsbooltrueAllow credentials
originstring[]["*"]Allowed origins
methodsstring[]["GET","POST","OPTIONS"]Allowed methods
allowed_headersstring[]["Authorization","Content-Type","X-Requested-With","Accept"]Allowed headers

database

database.mysql / database.postgres

FieldTypeDefaultDescription
hoststringlocalhostDatabase host
portnumber3306Database port
usernamestringrootUsername
passwordstring""Password
databasestringsockudoDatabase name
table_namestringapplicationsTable name
connection_pool_sizenumber10Connection pool size
pool_minnumber?nullMin pool connections
pool_maxnumber?nullMax pool connections
cache_ttlnumber300Query cache TTL in seconds
cache_cleanup_intervalnumber60Cache cleanup interval
cache_max_capacitynumber100Max cached entries

database.redis

FieldTypeDefaultDescription
hoststring127.0.0.1Redis host
portnumber6379Redis port
dbnumber0Database index
usernamestring?nullACL username
passwordstring?nullPassword
key_prefixstringsockudo:Key prefix
sentinelsSentinel[][]Sentinel nodes
sentinel_passwordstring?nullSentinel auth password
namestringmymasterSentinel master name
database.redis.cluster
FieldTypeDefaultDescription
nodesClusterNode[][]Cluster seed nodes
usernamestring?nullCluster auth username
passwordstring?nullCluster auth password
use_tlsboolfalseEnable TLS for cluster

database.dynamodb

FieldTypeDefaultDescription
regionstringus-east-1AWS region
table_namestringsockudo-applicationsTable name
endpoint_urlstring?nullCustom endpoint
aws_access_key_idstring?nullAWS access key
aws_secret_access_keystring?nullAWS secret key
aws_profile_namestring?nullAWS profile name

database_pooling

Global pool settings (can be overridden per-database).

FieldTypeDefaultDescription
enabledbooltrueEnable connection pooling
minnumber2Min connections
maxnumber10Max connections

event_limits

FieldTypeDefaultDescription
max_channels_at_oncenumber100Max channels per event
max_name_lengthnumber200Max event name length
max_payload_in_kbnumber100Max payload size in KB
max_batch_sizenumber10Max events per batch

http_api

FieldTypeDefaultDescription
request_limit_in_mbnumber10Max request body in MB
accept_traffic.memory_thresholdnumber0.90Reject traffic above this memory usage ratio

presence

FieldTypeDefaultDescription
max_members_per_channelnumber100Max presence members per channel
max_member_size_in_kbnumber2Max member info size in KB

queue

FieldTypeDefaultDescription
driverstringredismemory, redis, redis-cluster, sqs, none

queue.redis

FieldTypeDefaultDescription
concurrencynumber5Concurrent workers
prefixstring?sockudo_queue:Key prefix
url_overridestring?nullOverride Redis URL
cluster_modeboolfalseUse cluster mode

queue.redis_cluster

FieldTypeDefaultDescription
concurrencynumber5Concurrent workers
prefixstring?sockudo_queue:Key prefix
nodesstring[]["redis://127.0.0.1:6379"]Cluster node URLs
request_timeout_msnumber5000Request timeout in ms

queue.sqs

FieldTypeDefaultDescription
regionstringus-east-1AWS region
queue_url_prefixstring?nullSQS queue URL prefix
visibility_timeoutnumber30Visibility timeout in seconds
endpoint_urlstring?nullCustom endpoint
max_messagesnumber10Max messages per poll
wait_time_secondsnumber5Long polling wait
concurrencynumber5Concurrent workers
fifoboolfalseUse FIFO queue
message_group_idstring?defaultFIFO message group ID

rate_limiter

FieldTypeDefaultDescription
enabledbooltrueEnable rate limiting
driverstringmemoryBackend: memory, redis, redis-cluster, none

rate_limiter.api_rate_limit / rate_limiter.websocket_rate_limit

FieldTypeDefault (API / WS)Description
max_requestsnumber100 / 20Max requests per window
window_secondsnumber60 / 60Window duration
identifierstring?api / websocket_connectRate limit identifier
trust_hopsnumber?0 / 0Trusted proxy hops

rate_limiter.redis

FieldTypeDefaultDescription
prefixstring?sockudo_rl:Redis key prefix
url_overridestring?nullOverride Redis URL
cluster_modeboolfalseUse cluster mode

ssl

FieldTypeDefaultDescription
enabledboolfalseEnable TLS
cert_pathstring""Certificate file path
key_pathstring""Private key file path
passphrasestring?nullKey passphrase
ca_pathstring?nullCA certificate path
redirect_httpboolfalseRedirect HTTP to HTTPS
http_portnumber?80HTTP port for redirect

unix_socket

FieldTypeDefaultDescription
enabledboolfalseEnable Unix socket
pathstring/var/run/sockudo/sockudo.sockSocket path (must be absolute)
permission_modestring660Octal permissions

webhooks

FieldTypeDefaultDescription
batching.enabledbooltrueEnable webhook batching
batching.durationnumber50Batch window in ms

cleanup

FieldTypeDefaultDescription
async_enabledbooltrueEnable async disconnect processing
fallback_to_syncbooltrueFall back to sync if async fails
queue_buffer_sizenumber50000Queue buffer size
batch_sizenumber25Batch size
batch_timeout_msnumber50Max batch wait time in ms
worker_threadsstring|number"auto"Worker count: "auto" or a number
max_retry_attemptsnumber2Max retries for failed cleanups

cluster_health

FieldTypeDefaultDescription
enabledbooltrueEnable health monitoring
heartbeat_interval_msnumber10000Heartbeat interval
node_timeout_msnumber30000Dead node timeout
cleanup_interval_msnumber10000Dead node check interval
heartbeat_interval_ms must be at most node_timeout_ms / 3 to avoid false positive dead node detection.

delta_compression

FieldTypeDefaultDescription
enabledbooltrueEnable delta compression
algorithmstringfossilAlgorithm: fossil or xdelta3
full_message_intervalnumber10Full message every N messages
min_message_sizenumber100Min bytes to apply delta
max_state_age_secsnumber300Max delta state age in seconds
max_channel_states_per_socketnumber100Max tracked channels per socket
max_conflation_states_per_channelnumber?100Max conflation groups (entities) per channel
conflation_key_pathstring?nullGlobal JSON path for conflation key extraction (e.g., "asset", "data.symbol")
cluster_coordinationboolfalseCoordinate deltas across cluster nodes
omit_delta_algorithmboolfalseOmit algorithm field from delta messages to save bandwidth

Conflation Configuration

Conflation keys group messages by entity for improved compression. Set globally with conflation_key_path or per-channel via channel_delta_compression.

Global default:

{
  "delta_compression": {
    "conflation_key_path": "asset"
  }
}

Per-channel override (in app config):

{
  "channel_delta_compression": {
    "market:*": {
      "enabled": true,
      "conflation_key": "symbol",
      "max_messages_per_key": 100,
      "max_conflation_keys": 1000
    }
  }
}
Per-Channel FieldTypeDescription
conflation_keystring?JSON path to extract entity identifier (overrides conflation_key_path)
max_messages_per_keynumberNumber of messages to cache per entity
max_conflation_keysnumberMaximum entities to track simultaneously

See Delta Compression for detailed conflation documentation.

tag_filtering

FieldTypeDefaultDescription
enabledboolfalseEnable tag-based message filtering
enable_tagsbooltrueInclude tags in messages

websocket

FieldTypeDefaultDescription
max_messagesnumber?1000Max buffered messages (null to disable)
max_bytesnumber?nullMax buffered bytes (null to disable)
disconnect_on_buffer_fullbooltrueDisconnect vs drop on buffer full
max_message_sizenumber67108864Max message size (64 MB)
max_frame_sizenumber16777216Max frame size (16 MB)
write_buffer_sizenumber16384Write buffer size (16 KB)
max_backpressurenumber1048576Max backpressure (1 MB)
auto_pingbooltrueEnable automatic pings
ping_intervalnumber30Ping interval in seconds
idle_timeoutnumber120Idle timeout in seconds (0 disables)
compressionstringdisabledCompression: disabled, dedicated, shared, window256b, window1kb, window2kb, window4kb, window8kb, window16kb, window32kb

logging

Optional section. If omitted, defaults apply.

FieldTypeDefaultDescription
colors_enabledbooltrueEnable colored log output
include_targetbooltrueInclude target module in log lines
Treat the full template as a baseline profile and override per environment with env vars. Only include sections you need to customize.
Copyright © 2026