Skip to content

Reference architecture

Everything inside your walls

One virtualised estate carries the whole platform. The application tier lives on a single node; live and video-on-demand are served from separate edge machines so a match-night surge cannot starve the back catalogue. Nothing about this design depends on a public cloud being reachable.

Diagram

How it fits together

Every tier named, every boundary drawn. Blue is capacity you own; grey is capacity you rent.

01Viewers

Untrusted — the public internet

  • Web playerHLS · AES-128
  • Mobile appsAndroid · iOS in development
  • TV appsAndroid TV · Tizen in development
  • Contributionbroadcaster RTMP in

02Edge zone — the only public addresses in the estate

TLS terminates here and nowhere else

  • traefik-edgeTLS · host and path routing
  • CrowdSecWAF and behavioural bans
  • Live pathlow-latency HLS
  • VOD pathrange-aware cache

03Application services — private VLAN, no public address

Reachable only through the edge, or through the bastion for operators

  • app-coreBFF aggregator
  • content-apicatalogue
  • search-apiindex-backed
  • session-authzsessions · entitlement
  • billingplans · payments · coupons
  • key-deliveryDRM keys, per segment
  • recommendationranking
  • bastionthe only way in, SSH only

04Media plane — live and on-demand are deliberately separate

A match-night surge cannot evict the back catalogue

  • live-transcodeFFmpeg, continuous
  • live-originHLS packaging
  • vod-transcode + GPUFFmpeg NVENC pool
  • vod-origin-cacheorigin pull and cache
  • upload-apiVOD ingest
  • job-schedulertranscode orchestration
  • RabbitMQjob queue
  • MinIOS3-compatible origin of record

05Data and messaging

State lives inside the perimeter

  • MariaDBprimary application store
  • Redissession and shared cache
  • Elasticsearchsearch index
  • ClickHouseper-session playback telemetry
  • Redpandaevent bus, Kafka API
  • OpenBaosecrets and transit encryption

06Virtualisation, delivery and observability

Declared entirely in code — the estate rebuilds from the repository

  • Proxmox VEisolated guest per service
  • Terraformguest lifecycle
  • Ansibleapplication delivery
  • Pipeline → registrybuild once, pull everywhere
  • Prometheusmetrics and cAdvisor
  • SigNozOpenTelemetry traces
  • Grafanadashboards and alerting
  • Lokifleet-wide logs
  • Yours — hardware you own
  • Rented — public cloud
  • Edge — faces the viewer
Live and VOD are deliberately separate machines. A stadium-scale live surge and a long-tail catalogue have opposite cache behaviour, and sharing one box means the surge evicts the catalogue.

Specification

Tier by tier

TierRuns onScales byFails over to
ApplicationIsolated guests on ProxmoxAdding guests, then nodesRestart on a peer node
Live edgeDedicated hostAdding edge hosts behind DNSVOD edge, degraded
VOD edgeDedicated hostAdding edge hosts behind DNSOrigin direct, degraded
OriginMinIO on local diskAdding drives, then nodesErasure-coded set
EncoderGPU passthrough guestQueue depth, then GPUsQueued, not dropped
Control planeTerraform + GitNot applicableState is in Git

Trade-offs

What it buys and what it costs

Every architecture pays for something. Here is the bill for this one.

What you gain

No egress meter, no per-minute transcode bill, no per-session analytics licence. The marginal cost of one more viewer approaches the cost of the bandwidth itself.

What you take on

Hardware, power, and a peering or transit relationship. This pattern rewards predictable regional traffic and punishes unpredictable global traffic.

Where it stops

Serving a distant continent from one region is a physics problem, not a software one. At that point the answer is the hybrid pattern, not a bigger box.

Fit

When this is the right pattern

You already have rack space, your traffic is regional, and metered egress is the line item you want to delete entirely.

Which one fits your estate?

Send what you have — hardware, cloud account, current bill, launch date. The answer is usually one of these three, and occasionally it is that you should change nothing.