Callr
Callr is a small service that, through the use of Twillo, can call an on-call list when an incident occurs. It is meant to be used in with together with another service that monitor uptime, eg. Statuscake, Pingdom or really anything that can perform a HTTP GET or POST when an call needs to be made.
Simply put, call and wake someone if things goes down.
Running on local
- Create a Twillo account and buy a phone number to be used.
- Run
ngrok http 8080
in a terminal (Twillo need to be able make requests to Callr) - Create a docker compose file containing the twillio and ngrok data
docker-compose up
$ git clone https://github.com/modfin/callr
$ cd callr
$ echo 'version: "3.0"
services:
callr:
build:
context: ./cmd/callrd
dockerfile: Dockerfile.dev
ports:
- "8080:8080"
environment:
- "PORT=8080"
- "TWIL_SID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
- "TWIL_TOKEN=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
- "TWIL_PHONE=+46123456789"
- "BASE_URL=https://<NGROK_ID>.ngrok.io"
- "DATA_PATH=/go/src/callr/store"
- "BASIC_AUTH_USER=admin"
- "BASIC_AUTH_PASS=qwerty"
- "INCIDENT_TOKEN=ABCDEFGHIJ"
- "INCIDENT_ROTTEN_DURATION=4h"
volumes:
- .:/go/src/callr:cached
- gopkg:/go/pkg:cached
volumes:
gopkg:
' > docker-compose.yml
$ docker-compose up
callr_1 | ---- API ----
callr_1 | Incident reporting: POST/GET: https://b94a4401.ngrok.io/incident?token=ABCDEFGHIJ
callr_1 | Incident is rotten after: 4h0m0s
callr_1 |
callr_1 | ---- GUI ----
callr_1 | Page at: https://b94a4401.ngrok.io
Production
Docker swarm example
- Create a small node on a VPS provider such as Digital Ocean or Linode
- Point a DNS
A
record to the IP of the node - Install docker on the node
- Run the following (with the correct credentials)
mkdir -p /root/callr
mkdir -p /root/callr-tls
echo '
version: "3.2"
services:
callr:
image: modfin/callrd:latest
ports:
- target: 80
published: 80
protocol: tcp
mode: host
- target: 443
published: 443
protocol: tcp
mode: host
environment:
- "AUTO_TLS=true"
- "AUTO_TLS_DIR=/callr-tls"
- "DEBUG=true"
- "TWIL_SID=XXXXXXXXXXXXXXXXXXXXXXXX"
- "TWIL_TOKEN=YYYYYYYYYYYYYYYYYYYYYYY"
- "TWIL_PHONE=+4612345678"
- "BASE_URL=https://callr.example.com"
- "DATA_PATH=/callr-data"
- "BASIC_AUTH_USER=aUser"
- "BASIC_AUTH_PASS=aPassword"
- "INCIDENT_TOKEN=ABCDEFGHIJ"
volumes:
- /root/callr:/callr-data
- /root/callr-tls:/callr-tls
' > docker-compose.yml
$ docker stack deploy callr -c ./docker-compose.yml
- Go to
https://callr.example.com
and add a on-call list - Add the post hook
https://callr.example.com/incident?token=ABCDEFGHIJ
to you monitoring service
TODO
- Testing
- Some clean up
- Add SQL based DAO
- Rewriting some stuff to be able to run as a cloud function.