Skip to content

Deployment · on-premises

The whole platform, on hardware you own

Application, origin, encoding and delivery, all inside your own perimeter. No metered egress, no per-minute transcoding, no vendor holding the keys to your catalogue. Declared in Terraform from the first commit, so the estate is reproducible before it is live.

When on-premises is the right answer

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

Streaming has an unusual cost shape: the expensive parts are the predictable ones. Egress, transcoding and storage grow smoothly with your audience, which is exactly the profile that suits owned capacity and exactly the profile that public-cloud pricing punishes. Elasticity is worth paying for when load is spiky and cheap when it is steady — and steady is what a catalogue is.

This pattern puts every tier on your own hardware, virtualised with Proxmox, with live and video-on-demand served from separate edge machines. That split matters more than it sounds: a live surge and a long-tail catalogue want opposite cache behaviour, and sharing one machine means the surge evicts everything the catalogue needs.

Reference architecture

How it fits together

The estate as delivered — every tier named, every boundary drawn.

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.

Detail

What is actually delivered

Not a licence and a wiki page. A running system, in your estate, with the people who own it trained on it.

Platform

The full OTT service

Catalogue, search, recommendations, entitlements, billing, pay-per-view, live channels and the native apps for web, phone and television.

  • Adaptive HLS with AES-128
  • Subscription, PPV and free tiers
  • Live channels and VOD on one pipeline

Infrastructure

The virtualised estate

A Proxmox platform with isolated guests per service, GPU passthrough for encoding, S3-compatible object storage and a full observability stack.

  • Isolated guest per service
  • GPU passthrough for transcode
  • Metrics, logs and traces from day one

Delivery

The edge, compiled for the job

Range-aware caching so a mid-film seek is served from disk, geographic awareness, HTTP/3, and a token check on every single segment.

  • Separate live and VOD edges
  • Per-segment authorisation
  • HTTP/2 and HTTP/3 termination

Control

Everything as code

The whole estate in Terraform and a GitOps pipeline. There is no manual console step anywhere in the delivery path, by design.

  • Terraform for every resource
  • Merge request is the only change path
  • Rebuild the estate from Git alone

Security

Content and secret containment

Encrypted streams, expiring signed tokens re-checked at the edge, and secrets in a vault rather than in a config file or a wiki.

  • Keys released against signed tokens
  • OpenBao vault, no plaintext secrets
  • Audited administrative access

Handover

A team that can run it

Runbooks written against your estate, a walkthrough of every failure mode we designed for, and a support line that stays open afterwards.

  • Runbooks per service
  • Failure-mode walkthrough
  • Support retainer optional

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
Scaling is adding capacity, never re-architecting — because the estate was declared in code before it was built.

Detail

The honest trade-offs

Every architecture buys something and 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.

Questions

The things people ask first

How much hardware does this actually need to start?

Less than most people expect. The reference estate runs eighteen isolated guests on a single 2U node, with delivery on separate machines. The right starting size depends on your concurrency and bitrate ladder, which is the first thing a discovery call establishes.

What happens when one server is not enough?

You add a node. Every service is containerised behind its own address and the estate is declared in Terraform, so capacity is a variable rather than a redesign. Object storage is already S3-compatible for exactly this reason.

Who operates it after handover?

Your team, if you want that — that is what the runbooks and the training are for. Or we keep operating it under a managed agreement. Both are supported and the technical delivery is identical either way.

Can we move to the hybrid pattern later?

Yes, and this is a common path. Because the whole estate is Terraform, moving the application tier to AWS is a change of provider target for that tier, not a rewrite of the platform.

Show us the rack

Send the hardware you already have and the traffic you already serve. The first thing you get back is an architecture and an honest answer about whether this pattern fits.