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:
| Column | Description |
|---|---|
| Name | HAProxy stick-table name (e.g. frontend_ip_table, rl_rate_table) |
| Type | Key type — ip, string, binary |
| Size | Maximum entries the table can hold |
| Used | Current 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:
| Column | Description |
|---|---|
| Key | The stick-table key — typically a client IP address or a composite key |
| Use | Number of times this entry has been referenced (lookups) |
| Expire | Time remaining before the entry expires (TTL). Formatted as a wall-clock time using your profile time format |
| Store columns | Dynamic 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
| Feature | Description |
|---|---|
| Pagination | Page-size selector (50/100/200/500 entries per page) for large tables |
| Search | Key-substring search (debounced) — filters entries by key prefix or substring |
| Auto-refresh | Toggle to refresh the expanded table every 5 seconds. Useful for monitoring rate-limit counters in real time |
| Clear entry | Delete 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 all | Delete all entries from a table (admin only). Resets the table to empty — all tracked state is lost |
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 tablecommands (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
| Table | Purpose |
|---|---|
frontend_ip_table | Per-frontend client IP tracking (connection counts, request rates) |
rl_rate_table | Rate-limit counters (request counts, GPC events, block timers) |
waf_rate_table | WAF per-client anomaly tracking |
block_table | Temporarily blocked IPs (block duration timers) |
response_code_table | Response-code rate limiting (per-status counters) |
beacon_trust_table | Page Protect beacon trust — IPs that have solved the beacon challenge |
mcp_* tables | MCP 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:
| Field | Description |
|---|---|
| Version | Valkey server version |
| Role | master or replica (in HA deployments) |
| Uptime | Server uptime in seconds |
| Connected clients | Active client connections |
| Used memory | Current memory usage (humanized) |
| Peak memory | Highest memory usage since start (humanized) |
| Total keys | Total keys across all databases |
| DB count | Number 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:
| Column | Description |
|---|---|
| Key | Full key name |
| Type | Valkey data type — string, list, hash, set, zset, stream (shown as a Badge) |
| TTL | Time-to-live in seconds. ∞ means no expiry (persistent). - means the key doesn’t exist (already expired). Otherwise formatted as Xs, Xm, or Xh |
| Size | Memory usage from MEMORY USAGE (humanized to B/KB/MB/GB). - if unsupported |
| Preview | Value preview — strings truncated to 200 chars (JSON pretty-printed if parseable); lists/hashes/sets/zsets show cardinality + 3 sample members; streams show XLEN |
Features
| Feature | Description |
|---|---|
| Pagination | Page-size selector (50/100/200/500 keys per page) |
| Search | Key-substring search (debounced) within the selected namespace |
| Auto-refresh | Toggle to refresh every 5 seconds |
| Delete key | Delete a single key (admin only). Refuses to delete valkey_inspect:* keys (the inspector’s own cache) |
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
| Namespace | What 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_tasks | The task queue (config apply, certificate issuance jobs) |
geoip:* | GeoIP-related caches |
Performance
- Key scanning uses bounded
SCANoperations (up to ~200,000 keys max viaVALKEY_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:
| Field | Description |
|---|---|
| Name | Instance name (from the HA config) |
| URL | Data Plane API URL for the instance |
| Status | Available (green) or Error (red) badge |
| Keepalived state | VRRP 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 |
| Version | HAProxy version (from the Data Plane API) |
| Connections | Current connection count on this instance |
| Error | Error 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:
| Field | Description |
|---|---|
| Host | Valkey host address |
| Role | master (green) or replica (blue) |
| Status | Available or Error badge |
| Error | Error 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:
| Field | Description |
|---|---|
| Name | Instance name |
| State | UP (green) or DOWN (red) — HAProxy’s health-check verdict |
| Error | Error 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
| Setting | Description |
|---|---|
| Topology | single (one HAProxy), multi-host (multiple HAProxy instances on different hosts), or single-host (multiple instances on the same host) |
| Peer port | TCP port for HAProxy stick-table peer synchronization (default 10000). All instances must use the same port |
| HAProxy replicas | Number of HAProxy instances in the HA cluster |
| Valkey replicas | Number of Valkey instances (primary + replicas) |
| Coraza replicas | Number of Coraza SPOA instances |
Valkey Sentinel
| Setting | Description |
|---|---|
| Sentinel enabled | Toggle Valkey Sentinel for automatic master failover |
| Sentinel service | The Sentinel service name (used by clients to discover the current master) |
| Sentinel hosts | Comma-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:
| Field | Description |
|---|---|
| Name | Instance identifier (used in health display) |
| URL | Data Plane API base URL (e.g. https://haproxy:5555/v3) |
| User | Data Plane API username (optional) |
| Password | Data 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).
| Setting | Description |
|---|---|
| VIP | Virtual IP address that clients connect to (floats to the MASTER instance) |
| Interface | Network interface for VRRP advertisements (e.g. eth0) |
| Virtual Router ID | VRRP router ID (1–255). Must be unique on the network segment |
| Priority | VRRP priority (higher = more likely to become MASTER). Set higher on the primary instance |
| Advert interval | VRRP advertisement interval in seconds (default 1) |
| Auth password | VRRP authentication password (must match on all peers) |
| Peer addresses | Comma-separated IP addresses of keepalived peers |
| Track script | Optional health-check script path. If the script fails, the instance transitions to FAULT state |
| Preempt | If 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:
- Generates keepalived config (if not Swarm mode) and restarts keepalived on each HAProxy instance
- Generates the HAProxy peers section for stick-table replication
- Pushes the HAProxy config to every instance’s Data Plane API
- Reloads HAProxy on every instance
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.corexDNS name for peer discovery (Swarm’s DNS round-robin) - HAProxy instances use
endpoint_mode: dnsrrfor direct instance-to-instance stick-table sync
Verification
Stick-Tables
- Navigate to System > Tables
- Verify the rate-limit and frontend tables appear with non-zero
Usedcounts after sending traffic - Expand a table and verify entries appear with keys (IPs), expire times, and store counters
- Send a request that triggers a rate limit, then check the
rl_rate_table— the counter should increment - Clear the entry (admin) and verify the client is no longer rate-limited
Valkey
- Navigate to System > Valkey
- Verify the server info card shows the correct version, role (
master), and non-zero key count - Expand the
rate_limitnamespace and verify rate-limit keys appear with TTLs - Trigger a CAPTCHA challenge and verify a
cap:cid:*key appears in thecapnamespace - Delete a key (admin) and verify it disappears on refresh
High Availability
- Navigate to System > High Availability
- Verify all HAProxy instances show as Available with the correct keepalived state (one MASTER, rest BACKUP)
- Verify Valkey nodes show master + replica roles
- Verify Coraza instances show UP state
- Stop the MASTER HAProxy instance and verify a BACKUP takes over (state changes to MASTER)
- Verify stick-tables stay in sync across instances (same entry counts in the Tables tab)
Next Steps
- Docker Swarm — HA deployment with the Swarm ingress mesh
- Kubernetes — HA deployment with Helm and sidecar pods
- Architecture — HA topologies diagram and explanation
- Rate Limiting — What the stick-tables track