PearlPBX2
← Всі дописи

PearlPBX2 2.7.3: AGPL-3.0, оновлення Asterisk на льоту, TLS для WebRTC

Версія 2.7.3 — велике оновлення: нова ліцензія, безпечне оновлення самого Asterisk без переустановки, автоматичний TLS для WebRTC і суттєве розширення REST API.

Ліцензія: перехід на GNU AGPL-3.0

PearlPBX2 більше не розповсюджується за PolyForm Shield License 1.0.0 — тепер це GNU Affero General Public License v3.0-or-later, визнана OSI відкрита ліцензія. Заборону на конкурентне використання скасовано, натомість діє мережевий copyleft: змінену версію, розгорнуту як мережевий сервіс, потрібно розкривати користувачам цього сервісу. Детальний розбір — в окремому пості про зміну ліцензії.

Оновлення Asterisk без переустановки: update-asterisk.sh

До цього релізу зміна asterisk_version в ansible/group_vars/all.yml нічого не робила на вже встановленому хості — блок збірки в ролі asterisk запускався лише за відсутності /usr/sbin/asterisk. Новий update-asterisk.sh (роль asterisk_update) закриває цю прогалину: робить бекап /etc/asterisk, бінарників, модулів і /var/lib/asterisk у позначений часом каталог з журналом у state.json; компілює нову версію, поки поточний Asterisk продовжує обслуговувати дзвінки; плавно завершує активні виклики (core stop gracefully, таймаут налаштовується, --no-wait для миттєвої зупинки); запускає лише make install, не чіпаючи конфігурацію, звуки, логи, спул і записи; і перезапускає Asterisk та AMI-сервіси, перевіряючи версію після старту. update-asterisk.sh --rollback повертає попередні бінарники з бекапу, -l/--list показує історію оновлень.

Автоматичні TLS-сертифікати для WebRTC (wss)

Роль nginx тепер сама видає робочий HTTPS/wss://-сертифікат при встановленні, без ручних кроків, у трьох варіантах: якщо задано домен (--domain) — Let’s Encrypt через HTTP-01, сертифікат на 90 днів зі стандартним поновленням; якщо домену немає, але є публічна IPv4-адреса — короткоживучий IP-сертифікат Let’s Encrypt (6 днів, поновлюється кожні 4 години через systemd timer); якщо недоступне жодне з двох — самопідписаний сертифікат із коректним subjectAltName (раніше лише CN, що сучасні браузери відхиляють). install.sh і quickstart-install.sh отримали прапорці --domain/--email.

REST API тепер покриває майже всю адмінку

Цей реліз додає CRUD для ресурсів, які раніше редагувалися лише в Django admin: dialplan-контексти, extensions і macros (/api/v1/dialplan-*), телефонні пристрої з ендпоінтом провіжну (/api/v1/phone-devices/<id>/provision/), черги та учасники черг, таблиці маршрутизації, групи транків, SIP-транспорти, SIP-піри і SIP-користувачі, а також обгортку над Apply Changes (GET /api/v1/config/preview/, POST /api/v1/config/apply/ з обов’язковим mode: "soft"|"hard", лише для суперюзера). Поля secret/md5_cred/priv_key_file тепер приховані в списочних відповідях (GET .../ повертає null) і показуються тільки при запиті конкретного об’єкта — це закриває витік облікових даних при масовому вивантаженні списку.

Демо WebRTC-користувачі одразу після встановлення

seed_quickstart тепер створює транспорт transport-wss і десятьох webrtcuser1–webrtcuser10 з випадковими паролями — свіжа інсталяція одразу має робочі акаунти для дзвінків із браузера.

Дрібніші, але відчутні зміни

  • Встановлення install.sh/quickstart-install.sh тепер повністю неінтерактивне: firewall-роль більше не зупиняється на підтвердженні виявленого SSH-порту (раніше це могло підвісити запуск без TTY, наприклад через ansible-pull чи в CI) — порт лише логується.
  • WebRTC SIP-користувачі раніше отримували контекст на основі username, якого ніколи не існувало в extensions.ael, тож вхідні дзвінки від них нікуди не потрапляли; тепер використовується таблиця маршрутизації користувача, як і для звичайних SIP-акаунтів.
  • Let’s Encrypt HTTP-01 валідація ламалася власним редіректом HTTP → HTTPS: запит до /.well-known/acme-challenge/ також підпадав під return 301, оскільки він виконувався до перевірки location. Редірект тепер обгорнутий у location /.
  • На Debian бракувало пакета cron, тому щоденні бекапи й звіти, встановлені іншими ролями, просто не мали чим запускатися — на Ubuntu це працювало випадково, бо там cron зазвичай уже стоїть.
  • Новий python manage.py mail_report щодня надсилає на пошту список найдовших дзвінків минулої доби з посиланнями на записи, за MAIL_REPORT_RECIPIENTS.
  • Валідатор AEL dialplan тепер перевіряє цілі goto/Goto() — раніше goto +0681231231,1; проходив веб-валідацію, але Asterisk відхиляв його при компіляції dialplan.