Skip to content

Architecture components

Keep the data plane independent

Do not route DNS queries, visitor HTTP/TLS traffic, certificate selection, security decisions, or raw telemetry through core. The components below are separated so a management outage cannot become a serving outage.

Control plane

ComponentImplementationResponsibility
corePHP 8.5, Laravel 13, Filament 5API, panels, policies, desired state
webNginxBrowser/API ingress to PHP-FPM
horizonLaravel HorizonFour isolated Redis queue lanes
schedulerLaravel schedulerPeriodic bounded dispatch, retention, heartbeat
control-dbPostgreSQL 18Authoritative desired and operational state
redisValkey 9Queues, sessions, cache, locks
edge-controlNginx plus the core imageMutual-TLS edge-agent ingress

core, Horizon, and the scheduler are independent processes. Application image startup creates writable directories but deliberately does not migrate.

DNS

ComponentResponsibility
dnsdistOnly public authoritative DNS endpoint, backend selection, bounded dnstap
pdns-authPrivate PowerDNS authoritative service
pdns-dbRebuildable PowerDNS runtime schema
pdns-migrateExplicit PowerDNS runtime migration tool
dns-apiSource-restricted TLS proxy for the private PowerDNS API in the dns profile

PowerAdmin exists only in the development-tools profile and is diagnostic. Direct edits are drift.

Edge

ComponentResponsibility
edge-agentEnrollment, signed artifacts, atomic activation, heartbeat, tasks
cell-01 through cell-08Stable bounded OpenResty slots; the control plane assigns each slot to a shared, quarantine, or exceptional pool
edge-gatewayHost-network service-address listener and destination/Host/SNI router to assigned cells
mmdb-updaterDownload, validate, and atomically activate the GeoIP database

OpenResty selects certificates and domain configuration from data-driven runtime JSON. It applies bounded request, connection, header, body, origin, and cache policies. No normal domain change generates an Nginx server block or reload.

Telemetry

ComponentResponsibility
vectorRedact, normalize, buffer, and deliver edge/DNS events
log-collectorOne per host; normalize/redact bounded operational container and optional journal logs
clickhouseRaw events plus hourly and daily materialized aggregates
lokiBounded retained operational logs using TSDB and filesystem object storage
prometheusMetrics and alert evaluation
alertmanagerAlert routing
node-exporterHost resource and clock metrics
grafanaExactly two provisioned read-only operations command centers
grafana-control-db-provisionIdempotent one-shot creation and restriction of the PostgreSQL Grafana role
Edge gatewayBinds configured service IPv4/IPv6 addresses and routes by destination plus validated Host/SNI; sends PROXY protocol version 2 to private cell listeners

The traffic Vector has separate 1 GiB disk buffers for edge and DNS sinks. The independent host collectors have 2 GiB production disk buffers. Both drop newest events when full, so Loki failure cannot disturb ClickHouse ingestion or serving. ClickHouse exposes private server metrics to Prometheus on port 9363. Grafana reads Prometheus, six CDNFoundry ClickHouse telemetry tables, three ClickHouse monitoring tables, four PostgreSQL domain inventory columns, and the sanitized grafana_domain_operational_metadata view, plus Loki. It has no write credential and no ingestion or serving role. Telemetry or observability loss is visible but never blocks serving.

Development-only components

Pebble provides a local ACME directory, two Nginx origin fixtures provide HTTP and HTTPS origins, dev-pki initializes persistent development certificates, and PowerAdmin provides runtime diagnostics. None belongs in production.

CDNFoundry documentation