PearlPBX2
← Всі дописи

Asterisk у Docker чи install.sh: NAT, TLS і WebRTC

Обидві команди дають один і той самий PearlPBX2 — ту саму адмінку, ті самі черги, той самий дашборд. Різниця не в продукті, а в усьому, що навколо нього: TLS, бекапи, фаєрвол, крон і те, як медіа-трафік дістається до вашого телефона.

Дві команди

# Пісочниця в Docker — клонує в ./PearlPBX2
curl -fsSL https://pearlpbx2.com/quickstart-docker.sh | bash

# Production-встановлення — клонує в /opt/PearlPBX2
curl -fsSL https://pearlpbx2.com/quickstart-install.sh | sudo bash

Перша займає стільки, скільки Docker тягтиме образи. Друга — 15–30 хвилин, бо Asterisk 22 збирається з джерел. Обидві наприкінці друкують логін і згенерований пароль адміністратора.

Що насправді ставить кожен шлях

quickstart-install.sh — це обгортка над Ansible. Дев’ять ролей ставлять PostgreSQL, Redis, Asterisk 22, nginx із TLS, systemd-юніти для сервісів, правила nftables і крон. Встановлення повністю автономне: воно визначає SSH-порт і записує його в лог перед застосуванням правил фаєрвола, без підтвердження.

quickstart-docker.sh перевіряє, що Docker і Compose v2 на місці, генерує .env і піднімає стек: Django, andrius/asterisk:22, PostgreSQL 17, Redis 7, FastAGI і dashboard-listener. Django слухає порт 8000 без nginx і без TLS, у режимі DEVMODE=Development. Asterisk отримує опубліковані порти 5060/udp, 5060/tcp, 10000-10099/udp і 8088/tcp у bridge-мережі. Демо-дані вже засіяні: користувачі 201–210, ехо-тест 130, IVR 140, черги 141 і 142.

SIP, NAT і чому це залежить від вашої ОС

Тут проходить головна лінія розлому, і вона не про PearlPBX2, а про те, як влаштований сам Docker на різних системах.

На Linux мережа контейнерів — звичайний інтерфейс на хості. Підмережа 172.x маршрутизована, софтфон на тій самій машині достукається до Asterisk і напряму, і через опубліковані порти.

На macOS і Windows Docker Desktop тримає контейнери у прихованій Linux-VM. Підмережі контейнерів з хоста не видно взагалі — працює лише те, що опубліковано на localhost. Сигналізація SIP через це проходить, порт 5060 опублікований. А от медіа ламається в класичний спосіб: Asterisk кладе в SDP ту адресу, яку бачить у себе, тобто адресу контейнера, і софтфон намагається слати RTP у нікуди.

Лікується це тим самим, чим і будь-який NAT перед Asterisk: у транспорті PJSIP задати external_media_address і external_signaling_address на адресу, до якої клієнт справді достукається, і покластися на симетричний RTP, щоб Asterisk відповідав туди, звідки прийшли пакети. Тобто «SIP у Docker на ноутбуці» — це не «не працює», а «потребує тих самих налаштувань NAT, що й будь-яка інсталяція за роутером».

Побічний ефект, про який варто знати заздалегідь: сотня опублікованих UDP-портів під RTP на Docker Desktop помітно сповільнює docker compose up.

Чому WebRTC поводиться інакше

WebRTC у цю пастку не потрапляє, і саме тому Docker-пісочниця добре підходить, щоб показати браузерні дзвінки.

Браузер не покладається на адресу з SDP так само сліпо: він збирає ICE-кандидатів, шле медіа першим, а Asterisk відповідає на адресу, з якої пакети прийшли. Зовнішню адресу вручну задавати не доводиться. До того ж медіа в WebRTC зашифроване завжди — DTLS-SRTP не можна «забути ввімкнути», це вимога специфікації.

Одне уточнення: compose публікує порт 8088, а це ws, не wss. На localhost цього достатньо, бо браузери вважають localhost безпечним контекстом і дають доступ до мікрофона. Щойно ви захочете зайти з іншої машини, знадобиться WSS-транспорт і справжній сертифікат — тобто те, що production-шлях налаштовує сам.

Чого в Docker немає взагалі: крон

Це найменш очевидна відмінність і водночас та, яку найдорожче виявити через півроку. Ansible ставить сім періодичних задач, у Docker-стеку немає жодної:

  • Бекап PostgreSQL — щодня о 01:30.
  • Бекап /etc/asterisk — щодня о 02:30.
  • Конвертація записів wav → mp3 — кожні 15 хвилин.
  • Вивантаження mp3 — щодня о 03:00.
  • Моніторинг системи — кожні 15 хвилин.
  • Ротація логів Asterisk — щодня.
  • Поштовий звіт про найдовші дзвінки — щодня о 06:00, якщо задані отримувачі.

На практиці це означає, що в пісочниці записи розмов лишаються у wav і диск росте лінійно від кількості дзвінків, бекапів бази немає, а логи Asterisk ніхто не підрізає. Для тижневого тесту це не має значення. Для системи, якою хтось користується щодня, — має.

Дрібніші відмінності, які все одно варто знати

  • Таймзона. Ansible виставляє Europe/Kyiv, контейнери за замовчуванням у UTC — це видно в CDR і звітах.
  • Демон зворотних дзвінків у Docker вимкнений за замовчуванням: він робить справжні вихідні дзвінки, тому вмикається окремо через --profile callback.
  • Дані живуть у named volumes. docker compose down їх зберігає, down -v стирає все, включно з базою.
  • Оновлюватись і відкочуватись нічим: update.sh і rollback.sh -n спираються на журнал розгортань, якого в Docker-шляху просто немає.

Що обрати

Подивитись, як воно виглядає, зібрати схему дзвінків, показати WebRTC колезі, погратися з dialplan — Docker. Він для цього й зроблений, і працює на будь-якій ОС.

Приймати справжні дзвінки, зберігати записи, спати спокійно — install.sh на чистій Debian або Ubuntu. Різниця не в самому PearlPBX2, а в тому, що навколо нього хтось має стежити за бекапами, диском і сертифікатами. У production-шляху це вже налаштовано.