Configuration Reference¶
All MDP server containers are configured exclusively via environment variables. No configuration files are required at runtime.
All MDP data plane server images are published in the kuhl-haus-mdp-servers packages on GHCR.
The SCP/Web Application server images are published in the kuhl-haus-mdp-app packages on GHCR.
Common Variables¶
These variables are supported by all servers.
Variable |
Default |
Description |
|---|---|---|
|
|
Logging level: |
|
|
IP address to bind the HTTP server |
|
(server-specific) |
TCP port for the HTTP server (see per-server defaults below) |
|
|
Image name injected at deploy time (informational) |
|
|
Image version injected at deploy time (informational) |
OpenTelemetry (OTEL-enabled images)¶
The MDP data plane servers have two image variants for each server type.
These variables are only available on *-otel-server image variants.
OTEL-enabled images are separate packages from the standard server images —
the -otel designation is part of the image name, not the tag.
For example, the OTEL-enabled Market Data Listener is pulled as:
docker pull ghcr.io/kuhl-haus/kuhl-haus-mdl-otel-server:latest
or in a Dockerfile:
FROM ghcr.io/kuhl-haus/kuhl-haus-mdl-otel-server:latest
All OTEL-enabled images are published in the kuhl-haus-mdp-servers packages on GHCR.
The variables below are a subset of the standard OpenTelemetry SDK environment variables. For the full reference and to understand how OTEL actually works under the hood, see:
Note
These images provide no defaults for any of these variables. If they are not set, OpenTelemetry is not configured. All variables should be set together — a partial configuration will produce no telemetry output.
Variable |
Default |
Description |
|---|---|---|
|
(none) |
Arbitrary name attached to all traces, metrics, and logs emitted by this instance. The value is your choice — use whatever is meaningful to you. It should be distinct per server type so you can tell services apart in your observability backend. |
|
(none) |
Exporter for trace data. Options: |
|
(none) |
Exporter for metrics data. Same options as |
|
(none) |
Exporter for log data. Same options as |
|
(none) |
Wire protocol used by the OTLP exporter. Options: |
|
(none) |
Base URL of the OTLP collector endpoint
(e.g. |
|
(none) |
Comma-separated |
|
(none) |
Internal log level for the OpenTelemetry SDK itself — controls SDK
diagnostic output, not application log output (see |
|
(none) |
Comma-separated URL path patterns excluded from FastAPI auto-
instrumentation. Set to |
Finlight Data Listener (FDL)¶
Default port: 4203
The FDL connects to the Finlight news WebSocket API and routes articles to the
RabbitMQ news queue.
The FDL supports two listener implementations selected via
FINLIGHT_DATA_LISTENER_CLASS. FinlightSimpleListener (default) is a
lightweight listener with minimal filtering. FinlightDataListener is a
fully-featured listener that supports query, ticker, source, and language
filtering. Some variables below are only relevant to one implementation — see
the per-row notes.
Variable |
Default |
Description |
|---|---|---|
|
|
Listener implementation to use. Valid values: |
|
(required) |
Finlight API key for WebSocket authentication |
|
(none) |
Full-text query filter for incoming articles (e.g. |
|
(none) |
JSON array of ticker symbols to filter (e.g. |
|
(none) |
JSON array of news source names to filter. Only used by |
|
|
ISO 639-1 language code to filter (e.g. |
|
|
Subscribe to raw (unprocessed) article feed instead of enriched feed. Only
used by |
|
|
Maximum WebSocket reconnection attempts before giving up. Only used by
|
|
|
RabbitMQ connection URL (AMQP) |
|
|
RabbitMQ message TTL in milliseconds (15 minutes) |
|
|
Enable RabbitMQ publisher confirms ( |
|
|
Automatically connect to Finlight on startup. When |
Finlight Data Processor (FDP)¶
Default port: 4204
The FDP consumes articles from the RabbitMQ news queue and processes them
through a pluggable analyzer, writing results to Redis.
Variable |
Default |
Description |
|---|---|---|
|
|
RabbitMQ connection URL (AMQP) |
|
|
Market Data Cache Redis URL. Used by Analyzers via |
|
|
Widget Data Cache Redis URL. Used by Processors to store analyzer results. |
|
|
RabbitMQ queue to consume from |
|
|
RabbitMQ prefetch count (messages delivered before ACK required) |
|
|
Maximum concurrent async processing tasks (semaphore limit) |
|
(empty) |
Finlight API key. Passed to |
|
|
Maximum number of articles retained in the news feed Redis list cache
( |
|
|
Maximum number of articles retained per ticker Redis list cache
( |
|
|
Redis TTL in seconds for the news feed list cache ( |
|
|
Redis TTL in seconds for per-ticker news list caches
( |
Leaderboard Analyzer (LBA)¶
Default port: 4210
The LBA subscribes to Redis pub/sub channels and runs leaderboard and trade analyzers sequentially.
Variable |
Default |
Description |
|---|---|---|
|
(required) |
Massive.com API key. Same resolution chain as MDL. |
|
|
RabbitMQ connection URL (AMQP) |
|
|
Market Data Cache Redis URL. Used by Analyzers via |
|
|
Widget Data Cache Redis URL. Used by Processors to store analyzer results. |
|
|
Number of parallel processor workers |
|
|
RabbitMQ prefetch count per worker |
|
|
Maximum concurrent async tasks per worker (semaphore limit) |
Massive Data Listener (MDL)¶
Default port: 4200
The MDL connects to the Massive.com WebSocket API and routes tick data events to per-type RabbitMQ queues.
Variable |
Default |
Description |
|---|---|---|
|
(required) |
Massive.com API key. Resolved in order: |
|
|
Massive.com feed type: |
|
|
Massive.com market: |
|
|
JSON array of WebSocket subscription patterns |
|
|
Subscribe to raw feed instead of typed events |
|
|
Enable verbose Massive SDK logging |
|
|
Use TLS for Massive.com WebSocket connection |
|
|
Maximum WebSocket reconnection attempts before giving up |
|
|
RabbitMQ connection URL (AMQP) |
|
|
RabbitMQ message TTL in milliseconds |
|
|
Enable RabbitMQ publisher confirms ( |
|
|
Automatically connect to Massive.com on startup. When |
Market Data Processor (MDP)¶
Default port: 4201
The MDP runs parallel MassiveDataProcessor workers consuming from
multiple RabbitMQ queues and writing results to Redis.
Variable |
Default |
Description |
|---|---|---|
|
(required) |
Massive.com API key. Same resolution chain as MDL. |
|
|
RabbitMQ connection URL (AMQP) |
|
|
Market Data Cache Redis URL. Used by Analyzers via |
|
|
Widget Data Cache Redis URL. Used by Processors to store analyzer results. |
|
|
Number of parallel processor workers per queue type |
|
|
RabbitMQ prefetch count per worker |
|
|
Maximum concurrent async tasks per worker (semaphore limit) |
Market Data Scanner (MDS)¶
Default port: 4205
The MDS subscribes to Redis pub/sub channels and runs pluggable analyzers on enriched market data for event correlation, alert generation, and trend analysis. It operates entirely within Redis and does not consume from RabbitMQ.
Variable |
Default |
Description |
|---|---|---|
|
(empty) |
Massive.com API key. Passed to |
|
|
Widget Data Cache Redis URL. MDS reads from and writes to WDC only; it never connects to MDC. |
|
|
Maximum number of HOD/LOD alert events retained in the
|
Widget Data Service (WDS)¶
Default port: 4202
The WDS bridges Redis pub/sub to client WebSocket connections with fan-out.
Variable |
Default |
Description |
|---|---|---|
|
|
Widget Data Cache Redis URL. Read by WDS to deliver scanner results and quote feeds to connected WebSocket clients. |
|
|
Enable API key authentication for WebSocket connections |
|
|
API key required when |