Skip to main content

What you’ll build

You create a k3s cluster on Civo with the civo CLI, install the routr-connect Helm chart, and expose EdgePort through a cloud load balancer so SIP clients on the internet can reach it. You finish by connecting rctl to the API and registering a softphone.

Prerequisites

  • A Civo account and an API key
  • The civo CLI, logged in with your API key (civo apikey add and civo apikey current)
  • kubectl and Helm 3
  • Node.js and npm, to install rctl
  • A SIP softphone

Steps

1

Create the cluster

Create a Kubernetes cluster named routr and wait until it’s ready.
This uses your account’s default region, node size, and node count. Add --nodes, --size, or --region to change them.
Civo’s flags and defaults change over time. Run civo kubernetes create --help to see the options your CLI version supports.
2

Point kubectl at the cluster

Save the cluster’s kubeconfig into your local configuration.
Switch to the new context if the CLI didn’t do it for you, then check the nodes.
kubectl get nodes lists your Civo nodes with status Ready.
3

Add the Helm repository and a namespace

Add the Routr chart repository, refresh it, and create a namespace for the release.
4

Install the chart with a public EdgePort

Create a values.yaml file that exposes EdgePort’s UDP Service through a load balancer. Leave externalAddrs empty for now, because you don’t know the public address yet.Filename: values.yaml
Install the chart as a release named routr.
Civo creates a load balancer for the routr-routr-edgeport-udp Service. Wait until it has an external IP.
The chart only sets the Service type; the cloud provider creates the load balancer. Confirm in the Civo dashboard that the load balancer forwards UDP port 5060. If your region or plan doesn’t support UDP load balancing, keep the default NodePort type and point clients at a node’s public IP and the assigned node port instead.
5

Set the external address

Add the load balancer’s IP to values.yaml so EdgePort advertises it in SIP headers.Filename: values.yaml
Apply the change.
Check that every pod is running.
All pods show Running, including two EdgePort pods (routr-routr-edgeport-0 and routr-routr-edgeport-1).
6

Verify with rctl

Install rctl.
The API Server stays private. Forward its port in a separate terminal.
Create a Domain, credentials, and an Agent. Answer the prompts as you did in the intercom tutorial.
List the Agents to confirm the API works end to end.
7

Register a softphone

Configure a softphone with the Agent’s username and password, sip.local as the domain, and the load balancer IP (for example, 74.220.20.115:5060) as the outbound proxy over UDP.
The softphone shows the account as registered. Register a second Agent on another device and call between them to confirm signaling works over the internet.
Routr carries signaling only. If your softphones sit behind different NATs and you hear no audio, add RTPEngine and enable RTPRelay. See Enable WebRTC for the rtprelay values.
This setup has TLS turned off on the API and accepts SIP over plain UDP. Before you put real users on it, follow Secure the server.

Clean up

Delete the release, then the cluster. Deleting the cluster also removes its load balancer.

Next steps

Deploy on Kubernetes

Production settings for the Helm chart.

Helm values

Every value the chart accepts.

Secure the server

Turn on TLS for the API and the signaling.

Deployment topologies

When to choose routr-one or routr-connect.