Skip to content

Configuration

This page documents PalfreyConfig and key interactions.

Programmatic setup example:

from __future__ import annotations

from palfrey.config import PalfreyConfig
from palfrey.runtime import run

config = PalfreyConfig(
    app="docs_src.reference.programmatic_run:app",
    host="0.0.0.0",
    port=9000,
    workers=1,
    proxy_headers=True,
    limit_concurrency=100,
    timeout_keep_alive=10,
)

run(config)

Core fields

Field Default Meaning
app required ASGI app or import string
factory False treat app target as factory
app_dir cwd import search path
interface auto auto, asgi3, asgi2, wsgi
lifespan auto startup/shutdown protocol mode

Binding and sockets

Field Default Meaning
host 127.0.0.1 bind host
port 8000 bind port
uds None unix socket path
fd None inherited socket descriptor
backlog 2048 kernel listen queue

Protocol selection

Field Default Meaning
loop auto event loop policy
http auto HTTP implementation (auto, h11, httptools, h2, h3)
ws auto websocket implementation
h11_max_incomplete_event_size None h11 incomplete event cap

WebSocket controls

Field Default Meaning
ws_max_size 16777216 max websocket payload
ws_max_queue 32 websocket queue cap
ws_ping_interval 20.0 ping interval seconds
ws_ping_timeout 20.0 ping timeout seconds
ws_per_message_deflate True compression behavior

Reload and workers

Field Default Meaning
reload False enable reload supervisor
reload_dirs [] explicit watch roots
reload_includes [] include patterns
reload_excludes [] exclude patterns
reload_delay 0.25 watch delay
workers None worker process count
timeout_worker_healthcheck 5 worker health timeout

Request and process limits

Field Default Meaning
limit_concurrency None active in-flight cap
limit_max_requests None worker recycle threshold
limit_max_requests_jitter 0 randomized recycle offset
timeout_keep_alive 5 keep-alive idle timeout
timeout_graceful_shutdown None graceful drain timeout

Logging and headers

Field Default Meaning
log_config internal dict config logging setup
log_level None logger level override
access_log True access log toggle
use_colors None colorized log output toggle
server_header True inject Server header
date_header True inject Date header
headers [] extra default headers

Header example:

from __future__ import annotations

from palfrey.config import PalfreyConfig

config = PalfreyConfig(
    app="docs_src.reference.programmatic_run:app",
    headers=["x-service-name: billing-api", "x-environment: staging"],
    server_header=False,
)

print(config.normalized_headers)

Proxy and TLS

Field Default Meaning
proxy_headers True parse forwarded headers
forwarded_allow_ips env/default trusted proxy sources
ssl_keyfile None TLS key
ssl_certfile None TLS cert
ssl_keyfile_password None key passphrase
ssl_version ssl.PROTOCOL_TLS_SERVER TLS protocol selection
ssl_cert_reqs ssl.CERT_NONE client cert requirement
ssl_ca_certs None CA path
ssl_ciphers TLSv1 cipher policy

Important interactions

  • reload=True requires app import string target.
  • workers>1 requires app import string target.
  • wsgi interface disables websocket support (effective_ws = none).
  • http="h3" disables websocket runtime (effective_ws = none).
  • http="h3" requires TLS cert+key and does not support uds/fd.
  • explicit backend selection requires corresponding dependency installed.

Environment defaults

  • workers may default from WEB_CONCURRENCY
  • forwarded_allow_ips may default from FORWARDED_ALLOW_IPS
  • reload dirs default to current working directory when reload is enabled and none supplied

Plain-language summary

Configuration is a contract for how your service should behave in every environment. Keep it explicit and versioned.