System Page

The System page (System in the sidebar) provides operational tooling for inspecting and managing the runtime state of your coreX Platform deployment. It has seven tabs: Settings, Users, Features, Snapshots, Tables, Valkey, and High Availability.

This page documents the three operational tabs — Tables, Valkey, and High Availability. For Settings and Users, see Users & Settings. For Snapshots, see Audit & Snapshots.

Tables Tab (Stick-Table Viewer)

HAProxy stick-tables are in-memory data structures that track per-client state — IP addresses, request counts, rate-limit counters, connection counts, and more. They power rate limiting, connection tracking, source-IP stickiness, and the Page Protect beacon trust table. The Tables tab lets you inspect every stick-table in the running HAProxy instance, view their entries, and clear entries or entire tables.

What You See

The tab shows a list of all stick-tables, each with:

ColumnDescription
NameHAProxy stick-table name (e.g. frontend_ip_table, rl_rate_table)
TypeKey type — ip, string, binary
SizeMaximum entries the table can hold
UsedCurrent entry count

Click any table row to expand it and view the entries inside.

Entry View

Each expanded table shows a paginated entries table with:

ColumnDescription
KeyThe stick-table key — typically a client IP address or a composite key
UseNumber of times this entry has been referenced (lookups)
ExpireTime remaining before the entry expires (TTL). Formatted as a wall-clock time using your profile time format
Store columnsDynamic columns for each stored counter (e.g. gpc0, gpc0_rate(60s), gpt0). Columns are derived from the visible entries — if no entry uses a particular store, that column is hidden

Features

FeatureDescription
PaginationPage-size selector (50/100/200/500 entries per page) for large tables
SearchKey-substring search (debounced) — filters entries by key prefix or substring
Auto-refreshToggle to refresh the expanded table every 5 seconds. Useful for monitoring rate-limit counters in real time
Clear entryDelete a single entry (admin only). Removes the client’s state from the table — useful for unblocking a rate-limited IP without waiting for the TTL to expire
Clear allDelete all entries from a table (admin only). Resets the table to empty — all tracked state is lost
Clearing tables affects live traffic

Clearing a rate-limit table resets all counters — clients that were rate-limited will immediately be able to send requests again. Clearing the beacon trust table removes all trusted IPs. Only clear tables when you understand the impact.

Performance

Stick-tables can hold hundreds of thousands of entries. To keep the UI responsive:

  • The backend uses a 15-second timeout for show table commands (the default 5s stats-socket timeout is too short for large tables).
  • The full parsed entry list is cached in Valkey for 5 seconds (STICK_TABLE_CACHE_TTL_SECONDS), so repeated pagination clicks don’t re-dump the entire table from HAProxy.
  • The maximum page size is capped at 500 entries (STICK_TABLE_MAX_PAGE_SIZE).

Common Stick-Tables

TablePurpose
frontend_ip_tablePer-frontend client IP tracking (connection counts, request rates)
rl_rate_tableRate-limit counters (request counts, GPC events, block timers)
waf_rate_tableWAF per-client anomaly tracking
block_tableTemporarily blocked IPs (block duration timers)
response_code_tableResponse-code rate limiting (per-status counters)
beacon_trust_tablePage Protect beacon trust — IPs that have solved the beacon challenge
mcp_* tablesMCP gateway rate limiting and tracking

The exact set of tables depends on your configuration — tables are created on demand when the features that use them are enabled.

Valkey Tab (Valkey Inspector)

Valkey (a Redis-compatible in-memory data store) is coreX Platform’s shared state backend. It holds rate-limit counters, the task queue, token revocation lists, CAPTCHA challenge state, stick-table caches, and more. The Valkey tab is a read-only keyspace browser (with admin-only delete) for inspecting and debugging the live Valkey instance.

Server Info Card

The top of the tab shows a summary of the Valkey server:

FieldDescription
VersionValkey server version
Rolemaster or replica (in HA deployments)
UptimeServer uptime in seconds
Connected clientsActive client connections
Used memoryCurrent memory usage (humanized)
Peak memoryHighest memory usage since start (humanized)
Total keysTotal keys across all databases
DB countNumber of databases configured

If Valkey is unavailable, the card shows an error and the rest of the tab degrades gracefully.

Namespace Browser

Keys are grouped by namespace prefix — the substring before the first : in the key name. For example, rate_limit:192.168.1.1 is in the rate_limit namespace; cap:_cv:abc123 is in the cap namespace. Keys without a : are grouped under a sentinel group.

Each namespace row shows:

  • The prefix (e.g. rate_limit, cap, stick_table, valkey_inspect)
  • The key count in that namespace
  • Up to 5 sample key names

Click a namespace to expand it and view the keys inside.

Key View

Each expanded namespace shows a paginated keys table:

ColumnDescription
KeyFull key name
TypeValkey data type — string, list, hash, set, zset, stream (shown as a Badge)
TTLTime-to-live in seconds. means no expiry (persistent). - means the key doesn’t exist (already expired). Otherwise formatted as Xs, Xm, or Xh
SizeMemory usage from MEMORY USAGE (humanized to B/KB/MB/GB). - if unsupported
PreviewValue preview — strings truncated to 200 chars (JSON pretty-printed if parseable); lists/hashes/sets/zsets show cardinality + 3 sample members; streams show XLEN

Features

FeatureDescription
PaginationPage-size selector (50/100/200/500 keys per page)
SearchKey-substring search (debounced) within the selected namespace
Auto-refreshToggle to refresh every 5 seconds
Delete keyDelete a single key (admin only). Refuses to delete valkey_inspect:* keys (the inspector’s own cache)
Deleting keys affects live services

Valkey keys back critical functionality — rate limits, CAPTCHA challenges, token revocation, task queues. Deleting a key can unblock a rate-limited client, invalidate a CAPTCHA solve, or drop a queued config-apply task. Only delete keys when you understand what they do.

Common Namespaces

NamespaceWhat lives here
rate_limit:*Rate-limit counter keys (per-client request counts with TTL)
cap:*CAPTCHA state — cap:cid:<token> (challenge context), cap:_cv:<token> (solved-client cookies)
stick_table:*Stick-table entry caches (used by the Tables tab for pagination)
valkey_inspect:*The Valkey Inspector’s own cache (namespace lists, scan results)
token_blacklist:*Revoked JWT tokens (checked on every authenticated request)
haproxy_tasksThe task queue (config apply, certificate issuance jobs)
geoip:*GeoIP-related caches

Performance

  • Key scanning uses bounded SCAN operations (up to ~200,000 keys max via VALKEY_INSPECT_MAX_SCAN_BATCHES).
  • Scanned key lists are cached in Valkey for 5 seconds (VALKEY_INSPECT_CACHE_TTL_SECONDS).
  • The maximum page size is capped at 500 keys (VALKEY_INSPECT_MAX_PAGE_SIZE).

High Availability Tab

The High Availability (HA) tab is a health dashboard and configuration editor for multi-instance HA deployments. It is only visible when HA is enabled (HA_ENABLED=true). When HA is disabled, the tab shows a message indicating HA is not configured.

For the full HA deployment guide, see Docker Swarm or Kubernetes. This section documents the operational tab.

Health Dashboard

The top of the tab shows real-time health for all HA components, auto-refreshing every 5 seconds:

HAProxy Instances

Each configured HAProxy instance is shown with:

FieldDescription
NameInstance name (from the HA config)
URLData Plane API URL for the instance
StatusAvailable (green) or Error (red) badge
Keepalived stateVRRP state: MASTER (active, green), BACKUP (standby, blue), FAULT (red). In Swarm mode, shows “Swarm VIP” badge instead — the Swarm ingress mesh handles failover, not keepalived
VersionHAProxy version (from the Data Plane API)
ConnectionsCurrent connection count on this instance
ErrorError message if the instance is unreachable

The MASTER instance is the one receiving traffic (via the keepalived VIP or Swarm ingress). BACKUP instances are hot standbys that take over if MASTER fails.

Valkey Nodes

Each Valkey node is shown with:

FieldDescription
HostValkey host address
Rolemaster (green) or replica (blue)
StatusAvailable or Error badge
ErrorError message if the node is unreachable

In HA mode, Valkey runs as a primary + replica with Sentinel-managed failover. If the master fails, Sentinel promotes a replica to master automatically.

Coraza SPOA Instances

Each Coraza SPOA (WAF engine) instance is shown with:

FieldDescription
NameInstance name
StateUP (green) or DOWN (red) — HAProxy’s health-check verdict
ErrorError message if the instance is down

Coraza runs with 2 replicas in HA mode. HAProxy load-balances WAF evaluations across healthy instances — if one goes down, traffic shifts to the other.

Configuration Editor

Below the health dashboard is the configuration editor (admin only):

Topology Settings

SettingDescription
Topologysingle (one HAProxy), multi-host (multiple HAProxy instances on different hosts), or single-host (multiple instances on the same host)
Peer portTCP port for HAProxy stick-table peer synchronization (default 10000). All instances must use the same port
HAProxy replicasNumber of HAProxy instances in the HA cluster
Valkey replicasNumber of Valkey instances (primary + replicas)
Coraza replicasNumber of Coraza SPOA instances

Valkey Sentinel

SettingDescription
Sentinel enabledToggle Valkey Sentinel for automatic master failover
Sentinel serviceThe Sentinel service name (used by clients to discover the current master)
Sentinel hostsComma-separated list of Sentinel host:port pairs (e.g. sentinel1:26379,sentinel2:26379)

When Sentinel is enabled, the Valkey client uses Sentinel.master_for() to discover and connect to the current master. If Sentinel fails, it falls back to direct mode.

HAProxy Instances Editor

Add, edit, or remove HAProxy instance entries. Each instance has:

FieldDescription
NameInstance identifier (used in health display)
URLData Plane API base URL (e.g. https://haproxy:5555/v3)
UserData Plane API username (optional)
PasswordData Plane API password (optional)

The provider pushes generated HAProxy config to every instance in this list. In single-instance mode, this list contains one entry (the local instance).

Keepalived Editor

VRRP configuration for IP failover. In Swarm mode, this section shows a hint that keepalived is not used (the Swarm ingress mesh provides VIP and failover instead).

SettingDescription
VIPVirtual IP address that clients connect to (floats to the MASTER instance)
InterfaceNetwork interface for VRRP advertisements (e.g. eth0)
Virtual Router IDVRRP router ID (1–255). Must be unique on the network segment
PriorityVRRP priority (higher = more likely to become MASTER). Set higher on the primary instance
Advert intervalVRRP advertisement interval in seconds (default 1)
Auth passwordVRRP authentication password (must match on all peers)
Peer addressesComma-separated IP addresses of keepalived peers
Track scriptOptional health-check script path. If the script fails, the instance transitions to FAULT state
PreemptIf true, a higher-priority instance that recovers will take over as MASTER. If false, the current MASTER keeps the VIP until it fails

Apply Button

The Apply button pushes the HA configuration to all instances. This:

  1. Generates keepalived config (if not Swarm mode) and restarts keepalived on each HAProxy instance
  2. Generates the HAProxy peers section for stick-table replication
  3. Pushes the HAProxy config to every instance’s Data Plane API
  4. Reloads HAProxy on every instance
HA apply is separate from config apply

The HA Apply button is different from the main Apply Changes button on the Dashboard. The HA apply distributes the HA topology configuration (keepalived, peers, instances) across the cluster. The main config apply generates and pushes the HAProxy routing/WAF/security configuration. Both need to be run after changing HA settings — the HA apply first (to set up the cluster), then the main config apply (to push the routing config to all instances).

Swarm Mode Differences

When SWARM_MODE=true:

  • Keepalived is not used — the Swarm ingress routing mesh provides VIP load balancing and automatic failover
  • The keepalived state badge shows “Swarm VIP” instead of MASTER/BACKUP
  • The keepalived editor shows a hint but the values are ignored
  • Stick-table peers still use the tasks.corex DNS name for peer discovery (Swarm’s DNS round-robin)
  • HAProxy instances use endpoint_mode: dnsrr for direct instance-to-instance stick-table sync

Verification

Stick-Tables

  1. Navigate to System > Tables
  2. Verify the rate-limit and frontend tables appear with non-zero Used counts after sending traffic
  3. Expand a table and verify entries appear with keys (IPs), expire times, and store counters
  4. Send a request that triggers a rate limit, then check the rl_rate_table — the counter should increment
  5. Clear the entry (admin) and verify the client is no longer rate-limited

Valkey

  1. Navigate to System > Valkey
  2. Verify the server info card shows the correct version, role (master), and non-zero key count
  3. Expand the rate_limit namespace and verify rate-limit keys appear with TTLs
  4. Trigger a CAPTCHA challenge and verify a cap:cid:* key appears in the cap namespace
  5. Delete a key (admin) and verify it disappears on refresh

High Availability

  1. Navigate to System > High Availability
  2. Verify all HAProxy instances show as Available with the correct keepalived state (one MASTER, rest BACKUP)
  3. Verify Valkey nodes show master + replica roles
  4. Verify Coraza instances show UP state
  5. Stop the MASTER HAProxy instance and verify a BACKUP takes over (state changes to MASTER)
  6. Verify stick-tables stay in sync across instances (same entry counts in the Tables tab)

Next Steps