fonoster/routr-one image on one host. It bundles the EdgePort, Message Dispatcher, Connect processor, Location Service, and an API Server backed by an internal PostgreSQL database.
Prerequisites
- Docker, and Docker Compose if you use the Compose variant. See Get Docker.
- The IP address your SIP clients use to reach the host (for example,
192.168.1.3on a LAN, or the public IP of a VM). - Node.js, if you want to manage resources with rctl.
Know the ports
The routr-one image listens on the following ports. Publish only the ones you use.Run the server
1
Pick your external address
Routr advertises the address in
EXTERNAL_ADDRS in the Via, Contact, and Record-Route headers it writes. Use an address your SIP clients can reach. Inside a container, Routr can’t discover the host address on its own, so this variable is required for calls to work.To advertise more than one address, separate them with commas, for example EXTERNAL_ADDRS=203.0.113.10,sip.example.com.2
Start the container
- Docker Compose
- docker run
Create a directory named Start the service in the background, replacing the address with your own.
routr and add a compose.yaml file with the following content. The named volume keeps the internal PostgreSQL data across restarts.compose.yaml
latest with a specific version for anything beyond a quick test. The available tags are listed on Docker Hub.3
Check the container status
Wait a few seconds for the container to initialize, then list your containers.The output looks similar to this:
If the status is
Up, the server is ready.4
Create your first resource
Install the command-line tool.Create a SIP Domain. The
--insecure flag is required because the API Server runs without TLS by default in this image.Configure the container
The routr-one image reads these environment variables. Set them withenvironment: in Compose or -e with docker run.
For the complete list across all components, see Environment variables.
To use an external PostgreSQL server instead of the internal one, set both variables. The following snippet shows the shape.
compose.yaml
Upgrade
The container applies pending database migrations every time it starts, so upgrading means replacing the container with a newer image while keeping the data volume.1
Back up your data
Copy the volume or dump the database before a major upgrade. Read the changelog for breaking changes.
2
Change the image tag
Set the new version in
compose.yaml, for example fonoster/routr-one:2.15.4.3
Recreate the container
Pull the new image and recreate the service. The With
shared volume is reused.docker run, stop and remove the old container, then run the same command with the new tag and the same -v routr-data:... volume.Restarting the container drops its SIP connections and registrations, because routr-one keeps registrations in memory. Clients register again on their next refresh.
Troubleshooting
- Calls connect but there is no audio, or replies never arrive.
EXTERNAL_ADDRSis missing or wrong. Set it to the address clients use to reach the host. rctlfails with a TLS or connection error. Add--insecurewhenTLS_ONisfalse, or pass--cacertwhen it istrue.- Data disappears after
docker compose down. Make sure the volume is mounted at/var/lib/postgresql/data, and don’t rundocker compose down -v, which deletes volumes. - Only UDP works. The examples publish only
5060/udp. Add5060:5060,5061:5061,5062:5062, or5063:5063for TCP, TLS, WS, or WSS.
Next steps
Set up a home or office phone system
Add Domains, Agents, and a Trunk.
Secure the server
Turn on TLS for the API and SIP signaling.
Deploy on Kubernetes
Run each component separately with Helm.
Deployment topologies
Compare routr-one with a split deployment.