Skip to content

How the components connect

A repeater sends a registration to the HTTP or IAX registrar. The registrar checks its credentials, then publishes a timestamped node update to Kafka. Each DNS instance reads every partition of the registration topic and builds a local in-memory directory. Clients query that directory for a node's IPv4 address and IAX port.

flowchart LR
  Repeater[Repeater] -->|HTTPS| Proxy[Reverse proxy] --> HTTP[HTTP registrar]
  Repeater -->|UDP| IAX[IAX registrar]
  Repeater -->|UDP| TrustedProxy[Trusted UDP proxy]
  TrustedProxy -->|PROXY v2 / UDP4| IAX

  HTTP -->|timestamped node updates| Kafka[(Kafka)]
  IAX -->|timestamped node updates| Kafka
  Kafka -->|full topic replay| DNS[DNS instances]

  HTTP --> HttpCredentialSource{HTTP credential source}
  HttpCredentialSource -->|local CSV at startup| HttpCSV[(HTTP local CSV)]
  HttpCredentialSource -->|gRPC password lookup| Auth[Central Auth]
  IAX --> IaxCredentialSource{IAX credential source}
  IaxCredentialSource -->|local CSV at startup| IaxCSV[(IAX local CSV)]
  IaxCredentialSource -->|gRPC password lookup| Auth

Both registrars use the same credential-provider contract. They read a local CSV at startup or retrieve passwords through gRPC. The central credential service is implemented for review; it does not perform the IAX challenge exchange.

Dependencies and boundaries

Kafka and the HTTPS proxy are infrastructure you supply. The repositories do not provide a production Kafka cluster or an authentication database. Services expose Kafka bootstrap, topic, and timeout/group settings, but currently expose no Kafka SASL or TLS settings. Deploy Kafka on an appropriately restricted network.

The shared library contains schemas and generated Python bindings. It runs inside the service images and has no network endpoint. Service builds follow its main branch; each CI run resolves that branch once for its test and image jobs. Use a versioned image or image digest when repeatable deployment of one built artifact is required. Schemas and generated bindings belong in the shared library repository.

Lifetimes and restarts

Registrars default to a 60-second refresh and a 180-second registration lifetime. DNS expires each entry using the original event timestamp plus that lifetime. Answers cache for at most 60 seconds and never beyond the entry's remaining validity. Replaying an event does not renew it.

DNS starts by replaying Kafka, rejects expired events, and rebuilds its memory cache. Each replica needs the whole topic; consumer-group load balancing would leave replicas with incomplete directories. Kafka retention must cover the registrations you expect to recover. No DNS cache volume is required.

All services currently support IPv4 registrations. Use synchronized clocks on registrar and DNS hosts: DNS rejects updates too far in the future.