Every setting can be passed as an option to Socketelx.start_link/1 (or as {Socketelx, opts} in a supervision tree) or set as an environment variable. An explicit option wins over the environment variable.

Environment variables are named SOCKETELX_*. The older PUSHER_* spelling of the same names (PUSHER_APP_ID, PUSHER_REDIS_URL, ...) is still accepted, so an existing deployment keeps working; if both are set, SOCKETELX_* wins.

OptionEnv varDefaultNotes
:app_idSOCKETELX_APP_ID"app-id"Must match what your backend's Pusher library uses. Also namespaces Redis keys.
:app_keySOCKETELX_APP_KEY"app-key"Public; used in the WebSocket URL /app/:app_key.
:app_secretSOCKETELX_APP_SECRET"app-secret"Keep private. The default is public and logs a warning.
:portPORT6001Plain HTTP/WS. Put TLS in front.
:webhook_urlSOCKETELX_WEBHOOK_URLnoneWhere webhooks are POSTed.
:client_messages_enabledSOCKETELX_ENABLE_CLIENT_MESSAGEStruefalse rejects all client-* events.
:redis_urlSOCKETELX_REDIS_URLnoneEnables multi-server mode. rediss:// for TLS.
:redis_optsnone[]Extra Redix options, e.g. ssl: true.
:webhook_retriesSOCKETELX_WEBHOOK_RETRIES3Retries after the first attempt. 0 turns retries off.
:webhook_retry_base_msnone1000First retry delay; doubles each time.
:rest_rate_limitSOCKETELX_REST_RATE_LIMITnoneMax REST API requests per second for the instance.
:client_event_rate_limitSOCKETELX_CLIENT_EVENT_RATE_LIMITnoneMax client events per second, per connection.
:max_connectionsSOCKETELX_MAX_CONNECTIONSnoneMax WebSocket connections on this node.
:batch_limitSOCKETELX_BATCH_LIMIT10Max events in one batch_events request. Pusher's own limit is 10.
:metricsSOCKETELX_METRICSfalseServe Prometheus metrics at GET /metrics.
:metrics_tokenSOCKETELX_METRICS_TOKENnoneRequire Authorization: Bearer <token> on /metrics.
:namenoneSocketelxEmbedded only. Unique per instance.

One app per instance

An instance serves exactly one app (one id, key and secret). To serve several apps, embed several named instances on different ports; see the Embedding guide.

Client events

Clients can send client-* events on private and presence channels, only to channels they are subscribed to, and never on public channels. Set SOCKETELX_ENABLE_CLIENT_MESSAGES=false to refuse them all (the client receives error 4301).

Webhooks

With SOCKETELX_WEBHOOK_URL set, the server POSTs JSON for these events:

  • channel_occupied, channel_vacated
  • member_added, member_removed (presence channels)
  • client_event

Each request carries X-Pusher-Key and X-Pusher-Signature (HMAC-SHA256 of the raw body with your app secret), the same as Pusher's webhooks. Verify the signature before trusting a request.

Delivery runs in the background and never blocks a connection. A failed delivery (network error, timeout, HTTP 5xx, 408 or 429) is retried up to SOCKETELX_WEBHOOK_RETRIES times (default 3) with a doubling delay: 1 s, 2 s, 4 s. Other 4xx responses are not retried, because the receiver rejected the payload. Two things to design for:

  • Retries are held in memory. If the node stops while a retry is pending, that webhook is lost.
  • Retried events can arrive after later events, so make your receiver idempotent and don't rely on order.

Rate limits and capacity

All are off by default.

  • SOCKETELX_REST_RATE_LIMIT=100 allows 100 REST API requests per second for the whole instance (the health check and /metrics are exempt). Extra requests get 429 with Retry-After: 1. Most server libraries treat that as a failed publish, so set it above your real peak.
  • SOCKETELX_CLIENT_EVENT_RATE_LIMIT=10 allows each connection 10 client events per second. Extra events are dropped and the client gets pusher:error 4301.
  • SOCKETELX_MAX_CONNECTIONS=10000 refuses new WebSocket connections on this node beyond that count with pusher:error 4004. Clients reconnect, and with a load balancer they may land on another node.

The limits are per instance and per node. With several nodes, each node applies its own limit.

Metrics

Set SOCKETELX_METRICS=true and scrape GET /metrics (Prometheus text format). Counters are per node and reset on restart; scrape every node.

MetricType
socketelx_connectionsgauge: open WebSocket connections on this node
socketelx_channelsgauge: channels with a subscriber on this node
socketelx_connections_total, socketelx_connections_rejected_totalcounter
socketelx_subscriptions_totalcounter
socketelx_events_triggered_totalcounter: events delivered via the REST API, one per channel
socketelx_client_events_total, socketelx_client_events_rate_limited_totalcounter
socketelx_rest_requests_total, socketelx_rest_rate_limited_totalcounter
socketelx_webhooks_sent_total, socketelx_webhook_retries_total, socketelx_webhooks_failed_totalcounter

Set SOCKETELX_METRICS_TOKEN to require Authorization: Bearer <token>. Without a token anyone who can reach the port can read /metrics, so block that path at your proxy.

Redis

See Multi-server. Redis is used only when :redis_url is set.