# Linux Server Pools

**Generic Linux Server Pools** provide monitoring and management for a wide range of Linux infrastructure. They support OpenLiteSpeed, MariaDB, Galera Cluster, and other Linux-based services running on Ubuntu, Debian, Rocky Linux, AlmaLinux, CentOS, Red Hat Enterprise Linux (RHEL), and compatible distributions.

# 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.

# Part 2 - Member workspace (per-server tabs)

### Member tab bar (Generic Linux Server Pool)

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-tab-always-in-nav%3F-a"><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">Tab</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Always in nav?</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell">Active when</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">Control panel</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Always</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">Security</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Always</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</span></div></td><td><div class="md-table-cell-content">Yes (Generic)</div></td><td><div class="md-table-cell-content">Content when OpenLiteSpeed detected; else frosted <span class="font-semibold" data-streamdown="strong">not detected</span> overlay</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</span></div></td><td><div class="md-table-cell-content">Yes (Generic)</div></td><td><div class="md-table-cell-content">Content when MariaDB/MySQL detected or cPanel-managed MySQL</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">cPanel</span></div></td><td><div class="md-table-cell-content">Yes (Generic)</div></td><td><div class="md-table-cell-content">Content when cPanel detected else frosted overlay</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">Status</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Always — host/agent health summary</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">Cron &amp; Jobs</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Always</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">Restore Backups</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Always</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">Recipes</span></div></td><td><div class="md-table-cell-content">Yes</div></td><td><div class="md-table-cell-content">Always</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">Always</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">Always</div></td></tr></tbody></table>

</div></div></div>## Member Control Panel

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Host-level</span> operations on this Server — OS family, uptime, services, quick actions, TLS.

### What you see

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-heal"><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">Health strip</span></div></td><td><div class="md-table-cell-content">Agent version, heartbeat age, firewall summary</div></td></tr><tr><td><div class="md-table-cell-content"><span class="font-semibold" data-streamdown="strong">Console</span></div></td><td><div class="md-table-cell-content">Open a secure SSH session to the member</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">KPI row</span></div></td><td><div class="md-table-cell-content">CPU, memory, disk, load</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">Quick actions</span></div></td><td><div class="md-table-cell-content">Reboot, shutdown, install updates, backup (stack-aware), Let’s Encrypt (when applicable)</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">Services</span></div></td><td><div class="md-table-cell-content">Running units relevant to detected stacks</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">SSL / TLS</span></div></td><td><div class="md-table-cell-content">Certificate expiry, sync domain from 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">Recent activity</span></div></td><td><div class="md-table-cell-content">Latest completed jobs</div></td></tr></tbody></table>

</div></div></div>## Member Security

**<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Security</span>.**

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Host firewall and SSH</span> on this member.

### What you see

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-fire"><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">Firewall KPIs</span></div></td><td><div class="md-table-cell-content">Enabled/disabled, rule count, 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">Action tiles</span></div></td><td><div class="md-table-cell-content">Enable/disable firewall, add rule, manage rules, backup UFW 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">SSH access</span></div></td><td><div class="md-table-cell-content">Key-based access helpers</div></td></tr></tbody></table>

</div></div></div>## Member OpenLiteSpeed

**<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">OpenLiteSpeed</span>.  
Sub Tabs: Overview, Recovery Wizard**

<span class="font-semibold" data-streamdown="strong">For:</span> VMs where <span class="font-semibold" data-streamdown="strong">OpenLiteSpeed is the web server</span> — standalone OLS hosts.

<span class="font-semibold" data-streamdown="strong">Not for:</span> Default cPanel/Apache hosting — expect a <span class="font-semibold" data-streamdown="strong">not-detected</span> overlay on cPanel servers.

### Overview

Web admin (`:7080` link), KPIs, virtual hosts table, reload/restart/config test/backup/upgrade/LSPHP, logs.

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-"><div class="ui-scroll-area__viewport">[![OpenLitespeed-Overview.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/openlitespeed-overview.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/openlitespeed-overview.png)</div></div>### Recovery Wizard

Also known as **Cross‑Member Restore**, this feature allows you to automatically take a full backup of an OpenLiteSpeed account, including SSL certificates and the database\*. The backup is stored within your **Pool API Storage**, and the **Recovery Wizard** allows you to restore that backup to a different OpenLiteSpeed server.

If you have a DNS API Key scoped for the domain, DNS records can be updated automatically during the recovery process. Simply select the appropriate API Key when using the Recovery Wizard.

\* **Database restoration requires that no additional MySQL/MariaDB password is set when accessing** `mysql` **from the command line.** If an additional password has been configured, the automated restore process cannot proceed, and the database will need to be restored manually.

### Recipes &amp; backups

<span class="font-semibold" data-streamdown="strong">Install OpenLiteSpeed</span>, <span class="font-semibold" data-streamdown="strong">Harden OpenLiteSpeed</span> on <span class="font-semibold" data-streamdown="strong">Recipes</span>. Restore on <span class="font-semibold" data-streamdown="strong">Restore Backups</span> (`backup_openlitespeed`, Pro).

## Member MariaDB

**<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">MariaDB</span>.  
Subtabs: Overview, Databases**

<span class="font-semibold" data-streamdown="strong">For:</span> Dedicated DB servers <span class="font-semibold" data-streamdown="strong">or</span> cPanel-managed MySQL on WHM hosts.

### Standalone database server

#### Overview

Health, KPIs, schema cards, restart, config test, flush privileges, logical backup, harden, logs.

[![MariaDB-MySQL-Overview.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/mariadb-mysql-overview.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/mariadb-mysql-overview.png)

#### Databases

The **Databases** tab lists all databases discovered on the OpenLiteSpeed server. Databases are detected by scanning for common configuration files such as `wp-config.php` and parsing their contents.

Databases can be backed up individually or via cron. For a full account backup, use the **Recovery Wizard**.

[![MariaDB-MySQL-Databases.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/mariadb-mysql-databases.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/mariadb-mysql-databases.png)

### cPanel-managed MySQL

If cPanel is on the same host: MariaDB tab shows a <span class="font-semibold" data-streamdown="strong">cPanel host</span> notice — use member <span class="font-semibold" data-streamdown="strong">cPanel</span> (§11) for account-level DB ops.

[![MariaDB-MySQL-cPanel.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/mariadb-mysql-cpanel.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/mariadb-mysql-cpanel.png)

### Galera (`wsrep`) (In Alpha)

When Galera is enabled, the agent will report the wsrep state. <span class="font-semibold" data-streamdown="strong">ServersCTL does not</span> run quorum, SST, or writer election. <span class="font-semibold" data-streamdown="strong">DNS is active ≠ Galera primary.</span>

### Recipes &amp; backups

<span class="font-semibold" data-streamdown="strong">Install MariaDB/MySQL</span>, <span class="font-semibold" data-streamdown="strong">Harden the database</span>. Restore Backups. Advanced recipes require Pro.

[![Member-Recepies.png](https://docs.serversctl.com/uploads/images/gallery/2026-06/scaled-1680-/member-recepies.png)](https://docs.serversctl.com/uploads/images/gallery/2026-06/member-recepies.png)

## Member cPanel

**<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">cPanel</span>.**

<span class="font-semibold" data-streamdown="strong">For:</span> WHM servers — the most common ServersCTL hosting workload.

<span class="font-semibold" data-streamdown="strong">Inner tabs:</span> <span class="font-semibold" data-streamdown="strong">Overview</span> · <span class="font-semibold" data-streamdown="strong">Operations</span> · <span class="font-semibold" data-streamdown="strong">Accounts</span> · <span class="font-semibold" data-streamdown="strong">Migrate &amp; Recovery</span>

### Overview (inner)

DNS banner, protection topology (when account is protected), service badges, WHM audit summary.

### Operations (inner)

Restart web/mail/cPanel, config check, WHM backup, harden, WHM API status, listeners, disk, metrics.

### Accounts (inner) *(Pro)*

CRUD, suspend, terminate, backups, AutoSSL, one-time login. Free: read-only, 5 accounts cap.

### Live Migrate &amp; Recovery (inner) (Pro)

Live transfer, sessions, push copy. <span class="font-semibold" data-streamdown="strong">Bulk</span> replication and schedules: pool <span class="font-semibold" data-streamdown="strong">Protection</span> (§3), not this inner tab alone.

### WHM Binding

Full WHM API when member matches pool `host`. Run <span class="font-semibold" data-streamdown="strong">WHM link check</span> recipe after DNS connect.

## Member Status

**<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Status</span>.**

<span class="font-semibold" data-streamdown="strong">Purpose:</span> Read-only <span class="font-semibold" data-streamdown="strong">health and readiness</span> snapshot for this member.

### Generic Linux member

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-os-%2F"><div class="ui-scroll-area__viewport"><div class="ui-scroll-area__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"><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">OS / agent</span></div></td><td><div class="md-table-cell-content">OS family, agent version (outdated warning), generic probe template</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">Live stats</span></div></td><td><div class="md-table-cell-content">CPU, memory, disk from last heartbeat</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">Updates</span></div></td><td><div class="md-table-cell-content">Pending package updates</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">Firewall</span></div></td><td><div class="md-table-cell-content">Summary from heartbeat</div></td></tr></tbody></table>

</div></div></div></div></div></div>## Member Cron &amp; Jobs

**<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Cron &amp; Jobs</span>.**

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Scheduled tasks</span> on this member and visibility into recent job activity.

### What you see

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-kpi-"><div class="ui-scroll-area__viewport"><div class="ui-scroll-area__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"><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">KPI row</span></div></td><td><div class="md-table-cell-content">Cron count, backup schedules, last run</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">Schedules</span></div></td><td><div class="md-table-cell-content">Enable/disable, edit schedule (UTC), add from 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">Recent jobs</span></div></td><td><div class="md-table-cell-content">Timeline of agent and worker jobs</div></td></tr></tbody></table>

</div></div></div></div></div></div>### Common presets

Stack backups (`<span class="md-inline-path-filename">backup.cpanel</span>`, `<span class="md-inline-path-filename">backup.database</span>`, etc.), `<span class="md-inline-path-filename">failover.evaluate</span>` where applicable.

## Member Restore Backups

<p class="callout info">We are developing off-site backups. We currently only backup configuration unless stated in the UI. Contact us if you have questions.</p>

<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Restore Backups</span>.

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Snapshot catalog</span> for this member — run backup, restore, delete.

### Modes

Tab adapts to detected stack: `cpanel`, `openlitespeed`, `database`, or `mixed`.

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-kpi--1"><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">KPI row</span></div></td><td><div class="md-table-cell-content">Snapshot count, total size, last backup</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">Calendar</span></div></td><td><div class="md-table-cell-content">Backup history</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">Snapshot cards</span></div></td><td><div class="md-table-cell-content">Restore or delete individual snapshots</div></td></tr></tbody></table>

</div></div></div><span class="font-semibold" data-streamdown="strong">Pro</span> required for restore actions on stack backups.

## Member Recipes

<p class="callout info">In development - Only ever use recipes on clean servers. </p>

**<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Recipes</span>.**

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Guided install and harden flows</span> — one-click enqueue of multi-step agent jobs.

### Examples by stack

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-recipe-stack-install"><div class="ui-scroll-area__viewport"><div class="ui-scroll-area__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"><table style="width: 39.6429%; height: 238.172px;"><thead class="bg-muted/80" data-streamdown="table-header"><tr class="border-border border-b" data-streamdown="table-row" style="height: 29.7969px;"><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell" style="width: 62.6506%; height: 29.7969px;">Recipe</th><th class="whitespace-nowrap px-4 py-2 text-left font-semibold text-sm" data-streamdown="table-header-cell" style="width: 37.3494%; height: 29.7969px;">Stack</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" style="height: 29.7969px;"><td style="width: 62.6506%; height: 29.7969px;"><div class="md-table-cell-content">Install cPanel / harden</div></td><td style="width: 37.3494%; height: 29.7969px;"><div class="md-table-cell-content">cPanel</div></td></tr><tr class="border-border border-b" data-streamdown="table-row" style="height: 29.5938px;"><td style="width: 62.6506%; height: 29.5938px;"><div class="md-table-cell-content">Install OpenLiteSpeed / harden</div></td><td style="width: 37.3494%; height: 29.5938px;"><div class="md-table-cell-content">OLS</div></td></tr><tr class="border-border border-b" data-streamdown="table-row" style="height: 29.7969px;"><td style="width: 62.6506%; height: 29.7969px;"><div class="md-table-cell-content">Install MariaDB / harden</div></td><td style="width: 37.3494%; height: 29.7969px;"><div class="md-table-cell-content">MariaDB</div></td></tr><tr class="border-border border-b" data-streamdown="table-row" style="height: 29.7969px;"><td style="width: 62.6506%; height: 29.7969px;"><div class="md-table-cell-content">Galera cluster (read-only)</div></td><td style="width: 37.3494%; height: 29.7969px;"><div class="md-table-cell-content">MariaDB + wsrep</div></td></tr><tr class="border-border border-b" data-streamdown="table-row" style="height: 29.7969px;"><td style="width: 62.6506%; height: 29.7969px;"><div class="md-table-cell-content">SSH hardening, agent update</div></td><td style="width: 37.3494%; height: 29.7969px;"><div class="md-table-cell-content">Host</div></td></tr><tr class="border-border border-b" data-streamdown="table-row" style="height: 29.7969px;"><td style="width: 62.6506%; height: 29.7969px;"><div class="md-table-cell-content">WHM link check</div></td><td style="width: 37.3494%; height: 29.7969px;"><div class="md-table-cell-content">cPanel + DNS</div></td></tr><tr class="border-border border-b" data-streamdown="table-row" style="height: 29.7969px;"><td style="width: 62.6506%; height: 29.7969px;"><div class="md-table-cell-content">Let’s Encrypt (host or HAProxy)</div></td><td style="width: 37.3494%; height: 29.7969px;"><div class="md-table-cell-content">Host / edge</div></td></tr></tbody></table>

</div></div></div></div></div></div>## Member Monitoring

**<span class="font-semibold" data-streamdown="strong">Tab:</span> <span class="font-semibold" data-streamdown="strong">Monitoring</span>**

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Per-member</span> alert settings.

### What you configure

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-setting-meaning-hear"><div class="ui-scroll-area__viewport"><div class="ui-scroll-area__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"><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">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">Heartbeat miss alerts</div></td><td><div class="md-table-cell-content">Email when agent stops checking in</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">CPU / disk / service thresholds</div></td><td><div class="md-table-cell-content">Resource alerts for this server</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">Alert recipients</div></td><td><div class="md-table-cell-content">Account email + optional team inboxes</div></td></tr><tr class="border-border border-b" data-streamdown="table-row"><td><div class="md-table-cell-content">Recovery notifications</div></td><td><div class="md-table-cell-content">Notify when member recovers</div></td></tr></tbody></table>

</div></div></div></div></div></div>## Member Settings

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

<span class="font-semibold" data-streamdown="strong">Purpose:</span> <span class="font-semibold" data-streamdown="strong">Identity and location</span> for this enrolled server.

### What you see

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk-section-content-disp"><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">Display name / hostname</span></div></td><td><div class="md-table-cell-content">Must match agent JSON; `BALCTL_HOSTNAME` to override</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">Allowed source IPs</span></div></td><td><div class="md-table-cell-content">Member egress IPv4 allowed to call `<span class="md-inline-path-filename">serversctl.com</span>`</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 location</span></div></td><td><div class="md-table-cell-content">Geo for pool Overview map and Protection geo map</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">Monitor settings</span></div></td><td><div class="md-table-cell-content">Member-level alert toggles (overlaps with <span class="font-semibold" data-streamdown="strong">Monitoring</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">Remove member</span></div></td><td><div class="md-table-cell-content">Detach server from pool</div></td></tr></tbody></table>

</div></div></div>WHM API keys for cPanel: prefer <span class="font-semibold" data-streamdown="strong">pool Settings</span> / <span class="font-semibold" data-streamdown="strong">Managed DNS</span> API providers; per-member WHM edit is available there.

<div class="ui-scroll-area" data-direction="horizontal" data-scroll-padding="4" data-visibility="hover" id="bkmrk--5"><div class="ui-scroll-area__viewport"><div class="ui-scroll-area__content">  
</div></div></div>