# Part 1 - Overview & Concepts

### What ServersCTL hosting pools are

<span class="font-semibold" data-streamdown="strong">ServersCTL</span> ([serversctl.com](https://serversctl.com/)) is the control plane for <span class="font-semibold" data-streamdown="strong">redundant server infrastructure</span>: enrol Linux VMs with the ServersCTL agent, monitor heartbeats, cut over DNS between peers, run stack backups, and (on the cPanel preset) orchestrate account replication and live WHM transfers.

A <span class="font-semibold" data-streamdown="strong">server pool</span> is one deployment in your dashboard — a set of members sharing failover DNS and pool-level settings. <span class="font-semibold" data-streamdown="strong">Members run what you actually install</span> on each host. The dashboard exposes member tabs for **<span class="font-semibold" data-streamdown="strong">OpenLiteSpeed</span>**, **<span class="font-semibold" data-streamdown="strong">MariaDB/MySQL</span>**, **<span class="font-semibold" data-streamdown="strong">Galera</span>**, and **<span class="font-semibold" data-streamdown="strong">cPanel/WHM</span>**; each tab fills in when the agent detects that stack on <span class="font-semibold" data-streamdown="strong">that</span> server.

<span class="font-semibold" data-streamdown="strong">ServersCTL does not host traffic.</span> It moves DNS, queues remote jobs, and calls APIs where configured.

[![PoolOverviewLinuxGeneric.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/pooloverviewlinuxgeneric.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/pooloverviewlinuxgeneric.png)

### Pool Presets

Server pools are created using a preset template in the UI. This chapter is for the **Generic Linux Server** Preset. For HAProxy Server Pools, see the [HAProxy chapter](https://docs.serversctl.com/books/getting-started/chapter/haproxy-server-pools).

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk--1"><div class="ui-scroll-area__viewport">  
</div></div>### What runs on a member (stack compatibility)

<span class="font-semibold" data-streamdown="strong">Do not assume one VM runs every stack.</span> Common deployments:

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-deployment-typical-m"><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">Deployment</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Typical member stacks</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Notes</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"><span class="font-semibold" data-streamdown="strong">cPanel / WHM hosting</span></div></td><td><div class="md-table-cell-content">cPanel tab + MariaDB tab (cPanel-managed MySQL)</div></td><td><div class="md-table-cell-content">Apache/httpd via cPanel — <span class="font-semibold" data-streamdown="strong">not</span> OpenLiteSpeed</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">OpenLiteSpeed web farm</span></div></td><td><div class="md-table-cell-content">OpenLiteSpeed tab only</div></td><td><div class="md-table-cell-content">Standalone OLS</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">MariaDB / Galera nodes</span></div></td><td><div class="md-table-cell-content">MariaDB tab + Galera readout</div></td><td><div class="md-table-cell-content">DNS swing ≠ Galera quorum</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Mixed pool</span></div></td><td><div class="md-table-cell-content">Different tabs per member</div></td><td><div class="md-table-cell-content">e.g. two cPanel standbys + one OLS edge — each member’s tabs reflect its OS</div></td></tr></tbody></table>

</div></div></div>### Core terminology

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-term-meaning-pool-on"><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">Term</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Meaning</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"><span class="font-semibold" data-streamdown="strong">Pool</span></div></td><td><div class="md-table-cell-content">One ServersCTL Pool.</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Member</span></div></td><td><div class="md-table-cell-content">One enrolled server (hostname, egress IP, enrollment secret)</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Active member</span></div></td><td><div class="md-table-cell-content">Host whose IPv4 receives the pool failover A record.</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Stack tab</span></div></td><td><div class="md-table-cell-content">Member workspace: OpenLiteSpeed, MariaDB, cPanel, etc.</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Protected account</span></div></td><td><div class="md-table-cell-content">cPanel account with a replication job.</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Agent</span></div></td><td><div class="md-table-cell-content">`<span class="md-inline-path-filename">balctl_heartbeat.py</span>` on each member — heartbeats to `<span class="md-inline-path-filename">serversctl.com</span>`</div></td></tr></tbody></table>

</div></div></div>### Architecture

<div class="composer-message-codeblock" id="bkmrk-clients-%E2%86%92-dns-%28cloud"><div class="ui-code-block"><div class="ui-code-block-content"><div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover"><div class="ui-scroll-area__viewport"><div class="ui-scroll-area__content"><div class="ui-default-code ui-code-block-default-code"><div class="ui-default-code__content"><div class="ui-default-code__line"><div class="ui-default-code__line-content">Clients → DNS (Cloudflare / WHM) → A record → Active member IPv4</div></div><div class="ui-default-code__line"><div class="ui-default-code__line-content">↑</div></div><div class="ui-default-code__line"><div class="ui-default-code__line-content">ServersCTL Worker (serversctl.com)</div></div><div class="ui-default-code__line"><div class="ui-default-code__line-content">↑</div></div><div class="ui-default-code__line"><div class="ui-default-code__line-content">Standby members' ← agent heartbeats (+ WHM replication on cPanel preset)</div></div></div></div></div></div></div></div></div></div><span class="font-semibold" data-streamdown="strong">Failover health:</span> missed heartbeat beyond <span class="font-semibold" data-streamdown="strong">failover delay</span> (10–120 s). No HAProxy systemd check on hosting presets.

<p class="callout info">All Linux Servers should use the Generic Server Preset when adding a pool. Only ever select the HAProxy Preset if HAProxy is installed on your server.</p>

### <span data-sd-animate="true">Create</span> <span data-sd-animate="true">a</span> <span data-sd-animate="true">Generic</span> <span data-sd-animate="true">Linux</span> <span data-sd-animate="true">pool</span>

1. - <span data-sd-animate="true">Sign</span> <span data-sd-animate="true">in</span> <span data-sd-animate="true">at</span> <span class="font-semibold" data-streamdown="strong">[<span data-sd-animate="true">serversctl.com</span>](https://serversctl.com/)</span> <span data-sd-animate="true">→</span> <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Pools</span></span> <span data-sd-animate="true">→</span> Create P<span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">ool.</span></span>

<span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">[![CreatePool.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/createpool.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/createpool.png)</span></span>

1. - <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Configuration</span> <span data-sd-animate="true">preset:</span></span> <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Generic</span> <span data-sd-animate="true">Linux</span> <span data-sd-animate="true">servers.</span></span>

<span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">[![CreatePool-1.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/createpool-1.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/createpool-1.png)</span></span>

1. - <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Name the Pool.</span></span>
    - <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Now, go to the pool. Pool Overview</span></span> <span data-sd-animate="true">→</span> <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Add</span> <span data-sd-animate="true">server. Choose </span></span><span data-sd-animate="true">— RHEL/Ubuntu - Enter </span><span data-sd-animate="true">hostname,</span> <span data-sd-animate="true">allowed</span> <span data-sd-animate="true">egress</span> <span data-sd-animate="true">IP.</span>

- <span data-sd-animate="true">[![CreateEnrollment.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/createenrollment.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/createenrollment.png)</span>
- 
- 
- 
- <span data-sd-animate="true">Click </span><span data-sd-animate="true">Create Enrollment" and copy the install command.</span>

<span data-sd-animate="true">[![CreateEnrollmentKey.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/createenrollmentkey.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/createenrollmentkey.png)</span>

1. <span data-sd-animate="true">On</span> the <span data-sd-animate="true">VM:</span>
    - <span data-sd-animate="true">Paste the install command into the console to install the agent. </span>
    - <span data-sd-animate="true">If you have existing installs of cPanel, OpenLiteSpeed, MariaDB etc. The agent will report this to the UI. </span>
    - <span data-sd-animate="true">When</span> <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">2+</span> <span data-sd-animate="true">members</span></span> <span data-sd-animate="true">run</span> <span data-sd-animate="true">cPanel:</span> <span data-sd-animate="true">pool</span> <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Protection</span></span> <span data-sd-animate="true">and</span> <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Managed</span> <span data-sd-animate="true">DNS</span></span> <span data-sd-animate="true">tabs</span> <span data-sd-animate="true">appear</span> <span data-sd-animate="true">(see</span> Chapter 1<span data-sd-animate="true">).</span>
    - <span data-sd-animate="true">Optional:</span> <span data-sd-animate="true">Configure</span> <span data-sd-animate="true">DNS </span><span data-sd-animate="true">on</span> <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true">Managed</span> <span data-sd-animate="true">DNS</span></span> <span data-sd-animate="true">for</span> <span data-sd-animate="true">account-level</span> <span data-sd-animate="true">cutover.</span>

#### <span data-sd-animate="true">Add further members to the Pool</span>

1. <span data-sd-animate="true">From the pool overview tab click "Add Member".</span>
2. <span data-sd-animate="true">Name the member and supply the member's egress IP.</span>
3. <span data-sd-animate="true">Copy the install command into the console of the server being added to the pool.</span>
4. <span data-sd-animate="true">Repeat the process to add further members. There are no limits to the number of pools or members you may have.</span>

## How pool navigation works

### Two layers on one screen

<div class="composer-message-codeblock" id="bkmrk-the-ui-is-split-into"><div class="ui-code-block"><div class="ui-code-block-content"><div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover"><div class="ui-scroll-area__viewport"><div class="ui-scroll-area__content"><div class="ui-default-code ui-code-block-default-code"><div class="ui-default-code__content"><div class="ui-default-code__line">  
</div><div class="ui-default-code__line">The UI is split into two sections. The top tabs manage overall pool settings and the lower tabs manage member settings.  
<div class="ui-default-code__line-content">  
</div></div></div></div></div></div></div></div></div></div><div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-layer-what-it-contro"><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">Layer</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">What it controls</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Examples</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"><span class="font-semibold" data-streamdown="strong">Pool tabs</span></div></td><td><div class="md-table-cell-content">Settings and services that span <span class="font-semibold" data-streamdown="strong">all members</span> or <span class="font-semibold" data-streamdown="strong">protected accounts</span> across members</div></td><td><div class="md-table-cell-content">Overview fleet, Protection replication, Managed DNS catalogue, pool Monitoring presets, pool Settings</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Member tabs</span></div></td><td><div class="md-table-cell-content">One enrolled <span class="font-semibold" data-streamdown="strong">Linux server</span> — host OS, detected stacks, jobs, and backups</div></td><td><div class="md-table-cell-content">Control panel, Security, cPanel, MariaDB, Cron &amp; Jobs</div></td></tr></tbody></table>

</div></div></div>[![Linux-Server-Pool-O2.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/linux-server-pool-o2.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/linux-server-pool-o2.png)

<span class="font-semibold" data-streamdown="strong">Protection</span> and <span class="font-semibold" data-streamdown="strong">Managed DNS</span> are <span class="font-semibold" data-streamdown="strong">pool settings</span>. They float in the top tab bar <span class="font-semibold" data-streamdown="strong">above</span> the member server tabs. They coordinate <span class="font-semibold" data-streamdown="strong">account replication</span>, <span class="font-semibold" data-streamdown="strong">DNS cutover</span>, and <span class="font-semibold" data-streamdown="strong">provider keys</span> across the fleet — not operations on a single box.

### Pool tab visibility (Generic Linux template)

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-pool-tab-always%3F-whe"><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">Pool tab</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Always?</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">When it appears</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"><span class="font-semibold" data-streamdown="strong">Overview</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Default landing</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Member tabs</span> (one per server)</div></td><td><div class="md-table-cell-content">When enrolled</div></td><td><div class="md-table-cell-content">Subtitle <span class="font-semibold" data-streamdown="strong">Member</span> on Generic pools (not Active/Standby)</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Protection</span></div></td><td><div class="md-table-cell-content">No</div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">2+ members</span> with cPanel detected</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Managed DNS</span></div></td><td><div class="md-table-cell-content">No</div></td><td><div class="md-table-cell-content">Same as Protection on Generic pools (2+ cPanel members)</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Monitoring</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Pool-wide alert presets</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Settings</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Pool name, API providers, delete pool</div></td></tr></tbody></table>

</div></div></div><span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Overview</span> (first pool tab).

<span class="font-semibold" data-streamdown="strong">Purpose:</span> Fleet-wide health — are agents reporting, are backups and jobs healthy across Linux servers?

#### What you see

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-flee"><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">Section</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Content</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"><span class="font-semibold" data-streamdown="strong">Fleet Status</span> header</div></td><td><div class="md-table-cell-content">KPI widgets: member count, healthy agents, last check-in, backup count, cron jobs, running jobs, outdated agents</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Fleet geography</span> map</div></td><td><div class="md-table-cell-content">Members plotted when geo is set on each member’s <span class="font-semibold" data-streamdown="strong">Settings</span> tab</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Server tiles</span></div></td><td><div class="md-table-cell-content">One tile per enrolled member — click to open that member’s workspace</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Actions</span></div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Add server</span>, <span class="font-semibold" data-streamdown="strong">Pool settings</span></div></td></tr></tbody></table>

</div></div></div>#### Operator actions

- <span class="font-semibold" data-streamdown="strong">Add server</span> — enroll another VM (see §18)
- Click a <span class="font-semibold" data-streamdown="strong">server tile</span> or <span class="font-semibold" data-streamdown="strong">member tab</span> — jump to that member’s Control panel
- <span class="font-semibold" data-streamdown="strong">Pool settings</span> — shortcut to pool <span class="font-semibold" data-streamdown="strong">Settings</span> tab

<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Protection</span> (pool tab bar).

<span class="font-semibold" data-streamdown="strong">When visible:</span> <span class="font-semibold" data-streamdown="strong">2+ pool members</span> where the agent reports cPanel.

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Account-level warm standby</span> — scheduled WHM backup → Secure Storage → restore on a standby server, with optional DNS cutover per protected account.

#### What you see

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-prot"><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">Section</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Content</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"><span class="font-semibold" data-streamdown="strong">Protection dashboard</span></div></td><td><div class="md-table-cell-content">KPIs: protected accounts, replication health, last sync</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Server cards</span></div></td><td><div class="md-table-cell-content">Each cPanel-eligible member — readiness, WHM link, geography</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Protected accounts</span></div></td><td><div class="md-table-cell-content">Per-account source → standby mapping, schedule, TTL, DNS provider</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Replication log</span></div></td><td><div class="md-table-cell-content">Sync, DNS cut, transfer, and failure events</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Geo map</span></div></td><td><div class="md-table-cell-content">Primary / standby geography when locations are set</div></td></tr></tbody></table>

</div></div></div>### Operator workflow

1. Ensure <span class="font-semibold" data-streamdown="strong">2+ cPanel members</span> and WHM API keys (<span class="font-semibold" data-streamdown="strong">Settings</span> or <span class="font-semibold" data-streamdown="strong">Managed DNS</span> → API providers).
2. <span class="font-semibold" data-streamdown="strong">Add protection</span> — pick source account, target standby member, schedule (`1h` … `1mo`), DNS TTL, DNS provider (Cloudflare or WHM).
3. <span class="font-semibold" data-streamdown="strong">Replicate now</span> / <span class="font-semibold" data-streamdown="strong">Replicate protected</span> (Pro) — on-demand sync.
4. <span class="font-semibold" data-streamdown="strong">Account Cut DNS</span> — per-account A record swing to standby (coordinates with <span class="font-semibold" data-streamdown="strong">Managed DNS</span>).
5. After DNS cut: <span class="font-semibold" data-streamdown="strong">post-failover hook</span> on standby.

### Relationship to member tabs

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-task-where-bulk-acco"><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">Task</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Where</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">Bulk account replication, schedules, protection DNS</div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Pool Protection</span></div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">Single-account migrate, live transfer sessions</div></td><td><div class="md-table-cell-content">Member <span class="font-semibold" data-streamdown="strong">cPanel</span> → <span class="font-semibold" data-streamdown="strong">Migrate &amp; Recovery</span></div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">WHM account CRUD, suspend, AutoSSL</div></td><td><div class="md-table-cell-content">Member <span class="font-semibold" data-streamdown="strong">cPanel</span> → <span class="font-semibold" data-streamdown="strong">Accounts</span></div></td></tr></tbody></table>

</div></div></div>Protection is <span class="font-semibold" data-streamdown="strong">pool-wide orchestration</span>; member <span class="font-semibold" data-streamdown="strong">cPanel</span> is <span class="font-semibold" data-streamdown="strong">per-server</span> WHM operations.

### Replication Transfer

Replication can take anywhere from a few minutes to several hours, depending on the size of the account.

[![ReplicationTopologySync.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/replicationtopologysync.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/replicationtopologysync.png)

The source agent will package the account and split it into multiple chunks, which are securely stored temporarily in D2 storage. Once all chunks have been uploaded, the UI instructs the receiving agent to download them and begin the restore process.

After the restore has completed successfully, all stored chunks are automatically removed from S3. As a guide, a **1.8GB backup typically takes around 5 minutes** to replicate. Please take replication time into account when configuring your schedule. If the account is large, you may need to replicate **once per day** or **every few days** to avoid overlap and ensure the process completes cleanly.

[![ReplicationTopology.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/replicationtopology.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/replicationtopology.png)

#### <span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Managed DNS</span> (pool tab bar).

<span class="font-semibold" data-streamdown="strong">When visible (Generic Linux):</span> <span class="font-semibold" data-streamdown="strong">2+ cPanel-detected members</span>

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Pool-level DNS catalogue</span> for protected accounts and optional dynamic DNS — WHM vs Cloudflare zones, record health, sync, import. The API keys listed here are for DNS only. Do not use your production WHM API key here. You must use Cloudflare or a cPanel DNS Cluster API Key.

#### What you see

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-dns-"><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">Section</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Content</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"><span class="font-semibold" data-streamdown="strong">DNS Health</span></div></td><td><div class="md-table-cell-content">Zone summary, provider linkage, drift, topology banner (DNS Provider → Primary → Standby) when Protection is active</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Protected account records</span></div></td><td><div class="md-table-cell-content">Per-FQDN proxied/DNS-only, enabled, active IP, cut actions</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">API providers</span></div></td><td><div class="md-table-cell-content">Cloudflare account keys (one <span class="font-semibold" data-streamdown="strong">Global</span>), per-member WHM keys</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Dynamic DNS card</span></div></td><td><div class="md-table-cell-content">Failover hostname and sync toggle (Generic pools — primary place for DNS failover config)</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Actions</span></div></td><td><div class="md-table-cell-content">Refresh DNS, Sync WHM→CF, Add record, Import from Cloudflare</div></td></tr></tbody></table>

</div></div></div>#### Operator actions

- Connect <span class="font-semibold" data-streamdown="strong">Cloudflare</span> and/or cPanel DNS API credentials
- <span class="font-semibold" data-streamdown="strong">Import</span> existing Cloudflare records into the catalogue
- <span class="font-semibold" data-streamdown="strong">Sync WHM→CF</span> after account changes on WHM
- <span class="font-semibold" data-streamdown="strong">Account Cut DNS</span> from record rows (also available on Protection cards)
- Set <span class="font-semibold" data-streamdown="strong">failover hostname</span> and enable DNS sync (when using pool-level cutover)

#### Protected DNS

The UI treats WHM servers as the **source of truth** and replicates changes to any linked DNS provider, as long as the account is marked as **Managed**. By default, the only record that will cut over automatically is the domain’s **A record**.

#### Multiple DNS Record Cut Over

You can configure the UI to cut over additional DNS records from the **Protected Account DNS** list. From here, you can specify **A**, **AAAA**, **MX**, and **SRV** records that should automatically cut to a standby server when the primary becomes unavailable.

#### Actions

The three‑dot menu under the **Action** column provides additional fine‑tuning options:

- **Disable Managed DNS** – When disabled, DNS records will not be updated or cut over during failover.
- **DNS Only** – During cutover, Cloudflare proxying will be disabled (grey cloud), ensuring a direct DNS‑level switch without CDN caching or WAF interference.
- **Sync to Cloudflare** – If you’ve added new DNS records in WHM’s DNS Manager, they will appear in the Protected DNS table and can be automatically pushed to Cloudflare.

[![ManagedDNSActions.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/manageddnsactions.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/manageddnsactions.png)

#### Pool vs member DNS

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-scope-tab-protected-"><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">Scope</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Tab</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">Protected accounts, zone catalogue, provider keys, and failover FQDN</div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Pool Managed DNS</span></div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">Per-member WHM key rotation</div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Pool Settings</span> or <span class="font-semibold" data-streamdown="strong">Managed DNS</span> API panel</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">Host TLS / Let’s Encrypt on a single VM</div></td><td><div class="md-table-cell-content">Member <span class="font-semibold" data-streamdown="strong">Control Panel</span> or <span class="font-semibold" data-streamdown="strong">Recipes</span></div></td></tr></tbody></table>

</div></div></div><span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Monitoring</span> (pool tab bar).

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Pool-wide</span> monitoring presets — distinct from per-member alerts on each server’s <span class="font-semibold" data-streamdown="strong">Monitoring</span> tab.

### Generic pool without Protection (0–1 cPanel members)

<span class="font-semibold" data-streamdown="strong">Infrastructure alerts</span> section:

- Heartbeat miss thresholds, CPU/disk/service alert toggles
- Optional alert email recipients (account + team inboxes)

### Generic pool with Protection (2+ cPanel members)

<span class="font-semibold" data-streamdown="strong">Protection DNS failover</span> section (in addition to or instead of infrastructure, depending on layout):

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-preset-meaning-failo"><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">Preset</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Meaning</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"><span class="font-semibold" data-streamdown="strong">Failover banner</span></div></td><td><div class="md-table-cell-content">How long pool header shows <span class="font-semibold" data-streamdown="strong">Failover active</span> after DNS cut (Community: 2 h max)</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Failover email</span></div></td><td><div class="md-table-cell-content">Notify when DNS moves to standby</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Failover alert recipients</span></div></td><td><div class="md-table-cell-content">Team inboxes for protection cutover</div></td></tr></tbody></table>

</div></div></div>#### Operator note

Configure <span class="font-semibold" data-streamdown="strong">per-member</span> heartbeat and resource alerts on each server’s member <span class="font-semibold" data-streamdown="strong">Monitoring</span> tab. Pool <span class="font-semibold" data-streamdown="strong">Monitoring</span> is for <span class="font-semibold" data-streamdown="strong">fleet-level</span> and <span class="font-semibold" data-streamdown="strong">protection DNS</span> behavior.

##### <span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Settings</span> (pool tab bar).

<span class="font-semibold" data-streamdown="strong">Purpose:</span> Pool identity, shared API credentials, danger zone.

#### What you see (Generic Linux)

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-card-content-pool-na"><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">Card</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Content</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"><span class="font-semibold" data-streamdown="strong">Pool name</span></div></td><td><div class="md-table-cell-content">Rename the pool</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">API providers</span></div></td><td><div class="md-table-cell-content">Cloudflare account keys (mark one <span class="font-semibold" data-streamdown="strong">Global</span>). Each cPanel server needs its <span class="font-semibold" data-streamdown="strong">own</span> WHM key (pool-level + per-member rows)</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Danger zone</span></div></td><td><div class="md-table-cell-content">Delete pool</div></td></tr></tbody></table>

</div></div></div>##### What is NOT on the Generic pool Settings

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-feature-where-instea"><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">Feature</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Where instead</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"><span class="font-semibold" data-streamdown="strong">Balancer failover</span> (auto-failover delay, make-active hostname)</div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Managed DNS</span> (when tab visible) or optional — Generic pools work without DNS</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Protection jobs</span></div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Protection</span> tab</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">DNS record catalog</span></div></td><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Managed DNS</span> tab</div></td></tr></tbody></table>

</div></div></div>HAProxy pools include <span class="font-semibold" data-streamdown="strong">Balancer failover</span> on Settings.