# DNS failover & traffic cutover

### Manual cutover

<span class="font-semibold" data-streamdown="strong">Make active</span> on a standby member → ServerCTL sets it as primary and updates the managed A record to its public IPv4.

<span class="font-semibold" data-streamdown="strong">Cut DNS to standby</span> on Overview → promotes next <span class="font-semibold" data-streamdown="strong">failover-ready</span> standby (same DNS update, overview-oriented workflow).

[![HAProxy-HM4.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/haproxy-hm4.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/haproxy-hm4.png)

### Automatic failover

Enable in <span class="font-semibold" data-streamdown="strong">Settings → Balancer failover</span>.

When enabled, ServerCTL periodically evaluates the active member. Promotion triggers when:

- Heartbeat age exceeds <span class="font-semibold" data-streamdown="strong">failover delay</span>, or
- HAProxy is monitored and <span class="font-semibold" data-streamdown="strong">inactive</span>

A healthy standby is promoted; DNS is updated; optional email alert fires.

### Failover delay

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-setting-range-recove"><div class="ui-scroll-area__viewport"><div class="ui-scroll-area__content"><table><thead class="bg-muted/80" data-streamdown="table-header"><tr class="border-border border-b" data-streamdown="table-row"><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Setting</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Range</th></tr></thead><tbody class="divide-y divide-border bg-muted/40" data-streamdown="table-body"><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">Recovery time</div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">10–120 seconds</span></div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">Community (free)</div></td><td><div class="md-table-cell-content">Fixed at <span class="font-semibold" data-streamdown="strong">120s</span></div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">Pro / trial</div></td><td><div class="md-table-cell-content">Faster presets (e.g. 10s, 30s)</div></td></tr></tbody></table>

</div></div></div>Agents' heartbeat independently (~1s); failover delay is <span class="font-semibold" data-streamdown="strong">not</span> the heartbeat interval.

### Failover-ready criteria

A standby is <span class="font-semibold" data-streamdown="strong">ready</span> when:

- Recent heartbeat within the failover window, <span class="font-semibold" data-streamdown="strong">and</span>
- HAProxy is not down (when monitored)

### Dynamic DNS Sync

Optional for HAProxy pools when the <span class="font-semibold" data-streamdown="strong">active</span> member’s WAN IPv4 changes (DHCP/ISP churn). Each heartbeat can push the new public IP to Cloudflare without manual DNS edits.

### Proxied vs DNS-only

- <span class="font-semibold" data-streamdown="strong">Orange cloud (proxied):</span> Traffic through Cloudflare; good for HTTP/S when origin IP hiding matters.
- <span class="font-semibold" data-streamdown="strong">DNS-only (grey cloud):</span> Clients connect directly to member IPv4 — required for raw TCP services (e.g. non-HTTP on custom ports).