Voice & Telecom / Built / deployed
Drachtio + FreeSWITCH SIP Edge
SIP edge and FreeSWITCH load-balancing layer with ESL health checks, REGISTER/INVITE proxying, round-robin routing, config reload and Prometheus health surfaces.
OVERVIEW
What I built.
SIP edge and FreeSWITCH load-balancing layer with ESL health checks, REGISTER/INVITE proxying, round-robin routing, config reload and Prometheus health surfaces.
Built a modern Drachtio-based SIP edge around a pool of FreeSWITCH nodes.
Added ESL health monitoring, REGISTER/INVITE proxying, round-robin target ordering and runtime node reload.
Exposed local health and Prometheus surfaces while keeping the Drachtio control port private.
SYSTEM ARCHITECTURE
How the system is divided.
SIP clients -> Drachtio server -> Node.js routing application -> healthy FreeSWITCH node.
ESL health checks determine eligible FreeSWITCH destinations.
Operational metrics are local/private while SIP 5060 is the intentionally published service surface.
NETWORK / DATA FLOW
What talks to what.
TECHNOLOGY STACK
The technical surface.
IMPLEMENTATION
How it works in practice.
- 01
SIP clients -> Drachtio server -> Node.js routing application -> healthy FreeSWITCH node.
- 02
ESL health checks determine eligible FreeSWITCH destinations.
- 03
Operational metrics are local/private while SIP 5060 is the intentionally published service surface.
TESTING & VALIDATION
How I know it works.
Docker Compose deployment check
Drachtio connectivity health
FreeSWITCH ESL health polling
Round-robin target ordering
Runtime node-config reconciliation
Prometheus/health endpoint validation
EXTERNAL SERVICES & DEPENDENCIES
What sits outside the core.
ENGINEERING EVIDENCE
Artifacts behind the claims.
BOUNDARIES / CONSTRAINTS
What the project does not pretend to solve.
—FreeSWITCH ESL must stay private
—Drachtio control port is not a public surface
—Routing eligibility depends on health evidence
RESULT / CURRENT STATE
What this produced.
A health-aware SIP ingress/load-balancing layer that can route around unhealthy FreeSWITCH nodes.