Задача звучала невинно: два браузера, кнопка «Call», голос в обе стороны. Под капотом — Asterisk 22 в Docker, Coturn, JsSIP и SIP поверх WebSocket. На деле — пять разных багов с одним и тем же симптомом «нет звука»: заблокированный STUN, зависший ICE gathering, забытый event.ready() на 40 секунд…