Install
Three ways to run it. All of them are one file.
The container, the compose file, or the binary itself. Whichever you choose, the server keeps everything in one data directory, the first start prints the administrator's token once, and the console is on the same port as the API.
The container quickest
The image is ghcr.io/enetideas/sidetone, built for amd64 and arm64. Host networking, because audio needs a wide range of UDP ports; a named volume for the data.
$ docker run -d --name sidetone \ --network host \ -v sidetone-data:/data \ ghcr.io/enetideas/sidetone $ docker logs sidetone
The token is in the log, once. The console is at http://127.0.0.1:8080/ of the host.
Docker Compose for keeps
The same image with a restart policy, so it comes back after a reboot, and the container locked down: read-only root filesystem, no capabilities. Save this as docker-compose.yml.
name: sidetone
services:
sidetone:
image: ghcr.io/enetideas/sidetone:latest
network_mode: host
restart: unless-stopped
read_only: true
tmpfs: [ /tmp ]
cap_drop: [ ALL ]
environment:
TZ: Europe/London
volumes:
- data:/data
volumes:
data:
$ docker compose up -d $ docker compose logs -f
Set TZ to where the office is: desk phones take their clocks from the server. The full file in the repository has every setting explained.
The binary no docker
A static executable: copy it to a machine, run it. Releases are published on GitHub once there is a tagged version; until then, build it, which needs Go and nothing else.
$ git clone https://github.com/eNetIdeas/sidetone $ cd sidetone && make build $ ./bin/sidetone -data-dir ./data
Flags and environment variables cover the listen addresses, the data directory and the first token; everything else is configured while it runs.
Then
What you will want to know on the first day.
- The token
- Printed once at the first start. Sign in to the console with it, or send it as
Authorization: Bearer. The server keeps only a hash: if you lose it, make another from the Security page while you can, or setSIDETONE_ADMIN_TOKENand start again. - Test mode
- A new server starts in test mode: the emergency numbers are refused, every attempt is logged, and the console says so above every page. Switch it off under Settings → Calls when the telephones are in service.
- Ports
- SIP on 5060 (UDP and TCP), and the audio range, 10000–20000 UDP unless you narrow it under Settings → Network. Open both in the firewall, and forward both if the server is behind a router.
- Behind NAT
- Nothing to set, usually: the server learns its public address from the provider the moment it registers. A server with no registering trunk needs
-external-ip. - Phones
- Any SIP phone or softphone registers with a user's extension and password. Yealink desk phones can be given one address and fetch everything else for themselves.
- Updating
- The container: pull the new image and start it again; the data is in the volume. The binary: replace the file and restart. Database migrations run on start.
- The rest
- The documentation on this site, or the operator guide in the repository: one page, and if something does not fit on it, that is a bug in the product.
Pre-release. It runs on a live instance with Yealink desk phones and a sipgate trunk, which is where the interop bugs have been found so far; expect more from hardware nobody has tried. There is no tagged release yet.