From 3917b6d1ae02d64eb17da828fdf7a875abd3c38c Mon Sep 17 00:00:00 2001 From: Josh Knapp Date: Wed, 24 Jun 2026 13:40:11 -0700 Subject: [PATCH] feat(templates): add hap_backend_longlived override template Generic long-lived backend (template_override='hap_backend_longlived') for apps whose primary path holds connections open: streaming, large up/downloads, persistent sessions. Both primary and SSE backends tuned long-lived (no http-server-close, http-no-delay, 6h server/tunnel/keep-alive). Differs from hap_backend_websocket (which only long-lives the SSE variant). Co-Authored-By: Claude Opus 4.8 (1M context) --- templates/hap_backend_longlived.tpl | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 templates/hap_backend_longlived.tpl diff --git a/templates/hap_backend_longlived.tpl b/templates/hap_backend_longlived.tpl new file mode 100644 index 0000000..ba9df50 --- /dev/null +++ b/templates/hap_backend_longlived.tpl @@ -0,0 +1,41 @@ +# Long-lived backend for {{ name }} (template_override='hap_backend_longlived'). +# Use for apps whose PRIMARY traffic holds connections open: media streaming, +# large up/downloads, or persistent viewer/streaming sessions. Both the primary +# and the SSE backend are tuned long-lived here (no http-server-close, +# http-no-delay, 6h server/tunnel/keep-alive timeouts). +# +# Compare hap_backend_websocket.tpl, which keeps the PRIMARY backend standard +# and only makes the -sse-backend long-lived. Pick this one when the main path +# itself needs long-lived connections, not just an SSE side-channel. +backend {{ name }}-backend + no option http-server-close + option http-no-delay + timeout server 6h + timeout tunnel 6h + timeout http-keep-alive 6h + option forwardfor + http-request add-header X-CLIENT-IP %[var(txn.real_ip)] + http-request set-header X-Real-IP %[var(txn.real_ip)] + http-request set-header X-Forwarded-For %[var(txn.real_ip)] + http-request set-header X-Forwarded-Proto https if { ssl_fc } + http-request set-header X-Forwarded-Proto http if !{ ssl_fc } + {% for server in servers %} + server {{ server.server_name }} {{ server.server_address }}:{{ server.server_port }} {{ server.server_options }} resolvers docker_dns init-addr last,libc,none + {% endfor %} + +# SSE variant (Accept: text/event-stream / ?action=stream auto-routes here) +backend {{ name }}-sse-backend + no option http-server-close + option http-no-delay + timeout server 6h + timeout tunnel 6h + timeout http-keep-alive 6h + option forwardfor + http-request add-header X-CLIENT-IP %[var(txn.real_ip)] + http-request set-header X-Real-IP %[var(txn.real_ip)] + http-request set-header X-Forwarded-For %[var(txn.real_ip)] + http-request set-header X-Forwarded-Proto https if { ssl_fc } + http-request set-header X-Forwarded-Proto http if !{ ssl_fc } + {% for server in servers %} + server {{ server.server_name }} {{ server.server_address }}:{{ server.server_port }} {{ server.server_options }} resolvers docker_dns init-addr last,libc,none + {% endfor %}