Servizio di push relay per HomeSIP: quando arriva una chiamata per l'interno configurato e l'app potrebbe dover essere risvegliata da una VoIP push (era sospesa o terminata), Asterisk mette la chiamata in pausa in un'app Stasis (ARI) invece di tentare subito il collegamento con un timeout indovinato — questo relay invia la push, aspetta un segnale reale "il device si è ri-registrato", poi restituisce la chiamata al dialplan.
Containerizzato con Docker, pensato per girare sullo stesso router (NanoPi R6S / FriendlyWRT) che ospita Asterisk.
Per l'architettura completa del progetto e le altre milestone, vedi PIANO_SVILUPPO.md nel repo dell'app iOS.
- Si collega ad Asterisk REST Interface (ARI, WebSocket eventi + REST) e riceve l'evento
StasisStartquando un canale entra nell'apphomesip-wakeup(il dialplan ci arriva solo se un primo tentativo diretto è già fallito). - Manda un'indicazione di squillo (
ring) al chiamante, cosi' non sente silenzio durante l'attesa. - Invia una VoIP Push APNs (auth key
.p8, topic<bundle-id>.voip) al device registrato. - Aspetta (con timeout) che l'app segnali di essersi ri-registrata tramite
/device-ready, poi restituisce il canale al dialplan (continue) perché il veroDial()possa procedere. - Espone tre endpoint HTTP (
HTTP_PORT, in ascolto su tutte le interfacce — raggiungibile da LAN/WireGuard):POST /register-token— registra il device token dell'app, protetto da bearer secret (REGISTER_SHARED_SECRET)POST /device-ready— segnala che l'app si è ri-registrata (stesso bearer secret)GET /healthz— riflette lo stato della connessione ARI (200 se connesso, 503 altrimenti)
Copia .env.example in .env e compila i valori:
cp .env.example .env
Serve inoltre abilitare ARI su Asterisk (/etc/asterisk/ari.conf + http.conf, con un utente dedicato) e instradare il dialplan attraverso Stasis(homesip-wakeup,101) come fallback dopo un primo tentativo diretto fallito — vedi dettagli in PIANO_SVILUPPO.md.
go run ./cmd/pushrelay
docker compose up -d --build
network_mode: host è necessario per raggiungere ARI su 127.0.0.1 senza dover esporre porte o toccare il firewall del router.
Nota: su FriendlyWRT/OpenWrt la porta 8080 è tipicamente occupata da
uhttpd(interfaccia LuCI). Verificare conss -tlnpprima di scegliere le porte — su questo router sono in uso 8088 (HTTP del relay) e 8089 (HTTP/ARI di Asterisk).
Il router ha risorse limitate: conviene costruire l'immagine sul proprio Mac e trasferirla, invece di far scaricare a Docker sul router l'immagine builder golang:1.23-alpine:
docker build -t sip-phone-pushrelay:latest .
docker save sip-phone-pushrelay:latest -o pushrelay-image.tar
scp pushrelay-image.tar .env docker-compose.yml gateway.manuzzi.home:/root/PushRelay_app/
scp secrets/AuthKey.p8 gateway.manuzzi.home:/root/PushRelay_app/secrets/
ssh gateway.manuzzi.home "cd /root/PushRelay_app && docker load -i pushrelay-image.tar && docker compose up -d"
Sul router usare un docker-compose.yml con image: sip-phone-pushrelay:latest al posto di build: ..