Run your own edge network
on the hardware you already own.

DCPod (DC Pod) is a distributed content pod: geographic DNS steering, an L7 TLS balancer, a replicated CDN content plane, live streaming and an image pipeline — one Docker host per node, driven by a single deploy script.

GeoDNS anycast-style steering ACME auto Let's Encrypt TLS CDN plane master → edge sync Streaming RTMP·SRT·RTSP·WebRTC·LL-HLS CockroachDB replicated control data

What's inside the pod

Six cooperating services, all built from source by the deploy script. Every admin surface is unified behind a single console login; every data plane port is tuned for edge duty.

🌍 GeoDNS Master

Authoritative DNS that answers A-records by client geolocation, using a MaxMind GeoLite2 City database and radius-based edge groups. Clients land on the closest healthy edge, automatically.

Also hosts the edge registration API (TLS, bearer-token) and the CDN content store that distributes site files to every edge.

:53 udp/tcp · :8443 · :9090 CMS

⚖️ L7 Balancer

A reverse proxy with vhost routing, TLS termination and cache-tiering. It fronts all public traffic for the pod and issues certificates automatically via ACME — zero manual cert handling.

Define domains and backends from the console or CLI; the balancer reloads live.

:443 + :80 · ACME · disk cache

🕸️ GeoDNS Edges (type 1 / type 2)

Edge nodes register with the master, heartbeat every 15 s, and serve HTTPS for their assigned domains — synchronized CDN content included. Edges only answer for domains they actually serve; health is monitored end-to-end.

Type 1 registers a public IP; type 2 joins over a WireGuard tunnel behind NAT.

:443 HTTPS · 15 s heartbeat

📡 Edge Services

The content plane: live streaming server (ingest RTMP / SRT / RTSP / WebRTC, playback WebRTC + low-latency HLS), an image pipeline with on-the-fly resize and format conversion, and a cache tier with token authentication and signed URLs so private content stays private.

:8444 stream · :8445 image · :8446 cache

🗄️ CockroachDB Control Store

A 3-node, geo-replicated SQL cluster persists domains, edge registry state and service metadata. The master writes; edges read through a dedicated read-only SQL user — loss of any one node does not lose the state of the pod.

:26257 SQL · replication ×3

🎛️ Console + dcpodctl

One web console is the single front door to every admin API in the pod, and dcpodctl drives the same APIs from the shell for automation.

CMS panels stay localhost-bound per service; you manage everything through the console, over an SSH tunnel if you like.

:8080 console · dcpodctl CLI

How a request flows

DNS does the steering close to the client; the chosen edge serves cached content straight from disk. This very page is being served to you by that pipeline.

1DNS answermaster picks the nearest healthy edge by geo + radius
2Client connectsTCP/TLS to the edge the DNS reply pointed at
3TLS terminationACME certificate, SNI-selected per domain
4Content servefrom the edge's synchronized CDN store (hot disk cache)
5Purge fan-outupdates propagate master → all edges automatically

Public surface, exactly measured

Only what must be public is public. Everything else binds to loopback on the node — including every admin CMS.

PortServicePublicPurpose
443 + 80balanceryesall web traffic, ACME challenges
53 udp/tcpgeodns-masteryes*authoritative GeoDNS (*when NS is delegated)
8443geodns-masteryesedge registration API (TLS)
8080consoletunnelunified admin UI — bind to 127.0.0.1
9090 / 9091 / 9092CMS panelsnoper-service admin APIs, loopback only
26257cockroachdbnointernal SQL (in-pod network)

Deploy your own pod

One Linux host, Docker, one script. The same bundle deploys a central control host and can join remote edge nodes with a second command.

# central control host (master + balancer + console + DB cluster)
git clone https://github.com/andhysn/releases dcpod && cd dcpod/dcpod
sudo ./deploy.sh                          # interactively, or --non-interactive

# join a remote edge node (type 2, NAT-safe WireGuard)
sudo ./deploy-edge.sh --non-interactive \
  --master-url https://<control-host>:8443 --token <GEODNS_TOKEN> --ip <edge-ip>

Point your domain's DNS at the pod and define the vhost — certificates are issued automatically. Serve a static site on every edge at once: place it in the master's CDN store and the edges sync it and serve it.

Releases on GitHub Source repository