<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Proxy Hosts on PosternProxy Documentation</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/</link><description>Recent content in Proxy Hosts on PosternProxy Documentation</description><generator>Hugo</generator><language>en-US</language><atom:link href="https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/index.xml" rel="self" type="application/rss+xml"/><item><title>Load Balancing</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/load-balancing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/load-balancing/</guid><description>&lt;h1 id="load-balancing"&gt;Load Balancing&lt;a class="anchor" href="#load-balancing"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PosternProxy supports distributing traffic across multiple upstream backends for a single proxy host. Configuration is on the &lt;strong&gt;Upstreams&lt;/strong&gt; tab of the Add/Edit Proxy Host modal.&lt;/p&gt;
&lt;h2 id="adding-backends"&gt;Adding backends&lt;a class="anchor" href="#adding-backends"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first upstream is always the &lt;strong&gt;Primary&lt;/strong&gt; backend (set on the &lt;strong&gt;Details&lt;/strong&gt; tab). Additional backends are added on the &lt;strong&gt;Upstreams&lt;/strong&gt; tab. Each extra backend requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Host / IP&lt;/strong&gt; — the internal address of the backend server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt; — the port the backend listens on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no enforced limit on the number of backends.&lt;/p&gt;</description></item><item><title>Health Checks</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/health-checks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/health-checks/</guid><description>&lt;h1 id="health-checks"&gt;Health Checks&lt;a class="anchor" href="#health-checks"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PosternProxy exposes Caddy&amp;rsquo;s built-in health-check machinery through the &lt;strong&gt;Health&lt;/strong&gt; tab of the proxy host form. Health checks keep your load balancer from routing traffic to backends that are down or degraded.&lt;/p&gt;
&lt;h2 id="active-health-checks"&gt;Active health checks&lt;a class="anchor" href="#active-health-checks"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Active checks probe each upstream on a schedule by sending an HTTP request and evaluating the response.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Setting&lt;/th&gt;
					&lt;th&gt;Default&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Path&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;URL path Caddy requests on each backend&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Interval&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;30s&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;How often to run the check&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Timeout&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;5s&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Maximum time to wait for a response&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Expected status&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;HTTP status code that counts as healthy&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Enable active checks with the &lt;strong&gt;Enable health checks&lt;/strong&gt; toggle on the Health tab.&lt;/p&gt;</description></item><item><title>SSL / TLS</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/ssl-tls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/ssl-tls/</guid><description>&lt;h1 id="ssl--tls"&gt;SSL / TLS&lt;a class="anchor" href="#ssl--tls"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PosternProxy leverages Caddy&amp;rsquo;s automatic HTTPS to handle TLS with minimal configuration. The &lt;strong&gt;SSL&lt;/strong&gt; tab controls certificate selection and security options.&lt;/p&gt;
&lt;h2 id="automatic-lets-encrypt-default"&gt;Automatic Let&amp;rsquo;s Encrypt (default)&lt;a class="anchor" href="#automatic-lets-encrypt-default"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Leave the &lt;strong&gt;SSL Certificate&lt;/strong&gt; field set to &lt;strong&gt;None / Caddy automatic&lt;/strong&gt;. Caddy will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Obtain a certificate from Let&amp;rsquo;s Encrypt the first time a request arrives for the domain&lt;/li&gt;
&lt;li&gt;Store the certificate in its managed certificate store&lt;/li&gt;
&lt;li&gt;Renew automatically before expiry&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Requirements for automatic certificates:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Rate Limiting</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/rate-limiting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/rate-limiting/</guid><description>&lt;h1 id="rate-limiting"&gt;Rate Limiting&lt;a class="anchor" href="#rate-limiting"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PosternProxy can cap the number of requests a single IP address can make to a proxy host within a sliding time window. Rate limiting is configured on the &lt;strong&gt;Security&lt;/strong&gt; tab.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;a class="anchor" href="#how-it-works"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Rate limiting is implemented via the &lt;a href="https://github.com/mholt/caddy-ratelimit"&gt;caddy-ratelimit&lt;/a&gt; Caddy plugin, which is included in the PosternProxy Caddy build.&lt;/p&gt;
&lt;p&gt;When a client exceeds the limit, Caddy returns a &lt;code&gt;429 Too Many Requests&lt;/code&gt; response. The limit resets on a sliding window basis — it is not a hard per-minute bucket.&lt;/p&gt;</description></item><item><title>TLS Passthrough</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/tls-passthrough/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/tls-passthrough/</guid><description>&lt;h1 id="tls-passthrough"&gt;TLS Passthrough&lt;a class="anchor" href="#tls-passthrough"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;TLS Passthrough lets Caddy forward encrypted TLS connections directly to an upstream without terminating (decrypting) them. The upstream handles TLS itself — Caddy never sees the plaintext.&lt;/p&gt;
&lt;h2 id="when-to-use-it"&gt;When to use it&lt;a class="anchor" href="#when-to-use-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Use TLS Passthrough when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The upstream requires &lt;strong&gt;mutual TLS (mTLS)&lt;/strong&gt; / client certificates that Caddy cannot forward&lt;/li&gt;
&lt;li&gt;The upstream is a &lt;strong&gt;database&lt;/strong&gt; or other service presenting its own TLS certificate&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;end-to-end encryption&lt;/strong&gt; between client and upstream with no proxy in the middle&lt;/li&gt;
&lt;li&gt;The upstream uses a &lt;strong&gt;private CA&lt;/strong&gt; certificate that Caddy cannot validate&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-to-enable"&gt;How to enable&lt;a class="anchor" href="#how-to-enable"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On the &lt;strong&gt;Details&lt;/strong&gt; tab, toggle &lt;strong&gt;TLS Passthrough&lt;/strong&gt; on. When enabled:&lt;/p&gt;</description></item><item><title>Custom Error Pages</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/custom-error-pages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/custom-error-pages/</guid><description>&lt;h1 id="custom-error-pages"&gt;Custom Error Pages&lt;a class="anchor" href="#custom-error-pages"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PosternProxy can serve custom HTML pages when a proxy host returns a 404, 502, or 503 status code. This replaces Caddy&amp;rsquo;s default plain-text error responses with your own branded or user-friendly HTML.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration&lt;a class="anchor" href="#configuration"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Open the &lt;strong&gt;Errors&lt;/strong&gt; tab of the Add/Edit Proxy Host modal. You will see three panels, one for each supported status code:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Code&lt;/th&gt;
					&lt;th&gt;Meaning&lt;/th&gt;
					&lt;th&gt;Common cause&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;404&lt;/td&gt;
					&lt;td&gt;Not Found&lt;/td&gt;
					&lt;td&gt;Route exists but upstream returned 404; or path not matched&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;502&lt;/td&gt;
					&lt;td&gt;Bad Gateway&lt;/td&gt;
					&lt;td&gt;Upstream is down or returned an invalid response&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;503&lt;/td&gt;
					&lt;td&gt;Service Unavailable&lt;/td&gt;
					&lt;td&gt;Upstream is overloaded or in maintenance mode&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Paste your HTML into the relevant textarea. Leave a field blank to use Caddy&amp;rsquo;s default behaviour for that code.&lt;/p&gt;</description></item><item><title>Custom Headers</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/custom-headers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/custom-headers/</guid><description>&lt;h1 id="custom-headers"&gt;Custom Headers&lt;a class="anchor" href="#custom-headers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PosternProxy can inject, modify, or remove HTTP headers on requests sent to your upstream and on responses returned to clients. Header rules are configured on the &lt;strong&gt;Headers&lt;/strong&gt; tab.&lt;/p&gt;
&lt;h2 id="adding-a-rule"&gt;Adding a rule&lt;a class="anchor" href="#adding-a-rule"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Each rule has four fields:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Field&lt;/th&gt;
					&lt;th&gt;Options&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Direction&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Request / Response&lt;/td&gt;
					&lt;td&gt;Whether the rule applies to the upstream request or the downstream response&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Operation&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Set / Add / Delete&lt;/td&gt;
					&lt;td&gt;What to do with the header&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Any string&lt;/td&gt;
					&lt;td&gt;The header name (case-insensitive)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Any string&lt;/td&gt;
					&lt;td&gt;The header value (not used for Delete)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Click &lt;strong&gt;+ Add Rule&lt;/strong&gt; to insert a new row. Rows with an empty Name are ignored on save.&lt;/p&gt;</description></item><item><title>Custom Locations</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/locations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/locations/</guid><description>&lt;h1 id="custom-locations"&gt;Custom Locations&lt;a class="anchor" href="#custom-locations"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Custom locations let you override proxy behaviour for specific URL paths within a proxy host. They are configured on the &lt;strong&gt;Locations&lt;/strong&gt; tab.&lt;/p&gt;
&lt;h2 id="what-locations-do"&gt;What locations do&lt;a class="anchor" href="#what-locations-do"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By default, a proxy host forwards all paths to the same upstream. Locations allow you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Send &lt;code&gt;/api/*&lt;/code&gt; to a different backend than &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Apply different &lt;code&gt;forward_scheme&lt;/code&gt; per path&lt;/li&gt;
&lt;li&gt;Set path-specific Caddy directives using &lt;strong&gt;Advanced Config&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="adding-a-location"&gt;Adding a location&lt;a class="anchor" href="#adding-a-location"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Click &lt;strong&gt;+ Add Location&lt;/strong&gt; on the Locations tab. Each location has:&lt;/p&gt;</description></item><item><title>Config History</title><link>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/config-history/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://d8f649ee.posternproxydocs.pages.dev/proxy-hosts/config-history/</guid><description>&lt;h1 id="config-history"&gt;Config History&lt;a class="anchor" href="#config-history"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PosternProxy records a snapshot of every proxy host&amp;rsquo;s configuration before each change. You can browse the history and roll back to any previous state.&lt;/p&gt;
&lt;h2 id="viewing-history"&gt;Viewing history&lt;a class="anchor" href="#viewing-history"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Open the &lt;strong&gt;⋮&lt;/strong&gt; menu on any proxy host row in the table and click &lt;strong&gt;History&lt;/strong&gt;. A drawer slides open showing the last 100 snapshots in reverse chronological order.&lt;/p&gt;
&lt;p&gt;Each entry shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Timestamp of the change&lt;/li&gt;
&lt;li&gt;The user who made it&lt;/li&gt;
&lt;li&gt;A brief diff of what changed&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- TODO: Screenshot — Config History drawer with several entries --&gt;
&lt;h2 id="rolling-back"&gt;Rolling back&lt;a class="anchor" href="#rolling-back"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Click &lt;strong&gt;Restore&lt;/strong&gt; on any snapshot to revert the proxy host to that state. PosternProxy will:&lt;/p&gt;</description></item></channel></rss>