Мини-АТС в docker-compose. При входящем GSM-звонке → webhook в LoNGFW → попап с карточкой абонента у всех операторов. Параллельно дозвон по 3 SIP-extensions.
| Хост | 10.0.0.13, /opt/LoSIP/ |
| Compose | losip-asterisk + losip-awg (network_mode shared) |
| Сети | losip (внутренняя) + longfw_longfw (external, для webhook'а) |
| Запись звонков | volume /opt/LoSIP/recordings/ (mount'ится в LoNGFW web read-only для стрима) |
chan_dongle (собран из wdoekes/asterisk-chan-dongle, master)recordings/ (WAV)notify_longfw.py — fire-and-forget POST в /api/notify/incominglosip-awg) — отдельный контейнер с AWG-туннелем, losip-asterisk использует через network_mode: service:losip-awgasterisk/config/sip.conf ⚠️ СМЕНИТЬ из CHANGEME-* перед боевым запускомAT^CVOICE=0).⚠️ Сейчас (на 2026-04-30): physical dongle подключён, но без работающей SIM (Beeline IMSI 250-99 в зоне нет покрытия — +CREG: 0,3 registration denied). Нужна SIM МегаФон или Tele2.
В compose:
losip-asterisk:
devices:
- /dev/ttyUSB1:/dev/ttyUSB1 # data port chan_dongle
- /dev/ttyUSB2:/dev/ttyUSB2 # voice port
При входящем GSM-звонке:
Клиент звонит → GSM SIM → chan_dongle → context [from-gsm]
↓
AGI вызов notify_longfw.py incoming <phone>
↓
POST http://longfw-web:8080/api/notify/incoming
body: {kind: "call", direction: "in", phone, source: "losip"}
header: X-Notify-Token: ${NOTIFY_API_TOKEN}
↓
LoNGFW резолвит абонента 3-tier (IP → contract_phones → subscribers.phone)
↓
Публикация в Redis ZSET notify:events (TTL 120с)
↓
Polling /api/notify/pending раз в 2с от всех открытых вкладок операторов
↓
Попап bottom-right с ФИО/договором/тарифом/балансом
(или orange попап с формой поиска если unknown caller)
↓
Параллельно Asterisk Dial SIP/101&SIP/102&SIP/103 — ring всем операторам
При hangup AGI шлёт kind=call_end с duration + recording_file.
/opt/LoSIP/
├── docker-compose.yml
├── awg-sidecar/ # AmneziaWG-контейнер (для Telegram-обхода и SIP)
│ ├── Dockerfile # builder amneziawg-go + awg-tools
│ └── entrypoint.sh
├── awg0.conf # AWG конфиг для losip-awg
├── asterisk/
│ ├── Dockerfile # autodetect Asterisk-версии, chan_dongle build
│ ├── config/ # sip.conf, dongle.conf, extensions.conf, modules.conf, rtp.conf, logger.conf, manager.conf, asterisk.conf
│ └── agi/notify_longfw.py # AGI webhook (timeout 3с)
├── recordings/ # MixMonitor output (WAV)
└── docs/SETUP.md # подключение dongle (usb_modeswitch, udev, disable ModemManager)
/opt/LoSIP/.env:
MYSQL_PASSWORD=<...>
NOTIFY_API_TOKEN=<тот же что в /opt/LoNGFW/.env>
docker logs losip-asterisk, tcpdump на awg0 в losip-awgdocker exec losip-asterisk asterisk -rx 'dongle show devices', проверить dmesg на host для USBdocker logs longfw-web | grep notify/opt/LoSIP/recordings/<date>/ (формат WAV, имя = unique_id Asterisk)Changelog