FreePBX 17: установка и настройка с нуля до первого звонка

FreePBX 17: установка и настройка с нуля до первого звонка
Быстрый ответ
FreePBX 17 официально ставится только на чистый Debian 12 одним скриптом от Sangoma. Минимальный путь до рабочей АТС:
  • Debian 12 со статическим IP, от 2 vCPU, 4 ГБ RAM и 40 ГБ диска, плюс место под записи разговоров.
  • Скрипт sng_freepbx_debian_install.sh, первый вход в веб-интерфейс, обновление модулей.
  • Asterisk SIP Settings: внешний адрес, локальные сети, RTP 10000-20000. Без этого будет звонок без звука.
  • Транк, добавочные, входящий маршрут по DID. Дальше переадресация, Follow Me, запись и оповещение.

Перезапуск без обрыва звонков — команда core restart when convenient в Asterisk, полный перезапуск — fwconsole restart. Записи разговоров лежат в /var/spool/asterisk/monitor/год/месяц/день.

Диагноз: поставил FreePBX 17, а звонить некуда

FreePBX 17 ставится за полчаса. А потом начинается. Звонок проходит, но без звука. Входящий отвечает «номер не обслуживается». Перевод по ## не работает. Записи разговоров есть в отчёте, а где файлы — непонятно. Знакомо?

Половина статей про FreePBX написана под версию 13 на CentOS. Меню переехали, модули переименовали, CentOS умер, app_macro из Asterisk выпилили. Ты читаешь инструкцию, а у тебя на экране другая кнопка.

Эта статья собрана под FreePBX 17 на Debian 12. Один проход от пустой виртуалки до АТС, которая принимает звонки, переводит их, пишет разговоры и делает оповещение по громкой связи.

Что получишь на выходе

  • FreePBX 17 на Debian 12, поставленную официальным способом.
  • Правильно настроенную сеть и NAT: звук в обе стороны.
  • Входящую маршрутизацию по номерам и резервный маршрут.
  • Переадресацию, Follow Me и перевод звонка, которые работают с первого раза.
  • Запись разговоров с пониманием, где лежат файлы и сколько они весят.
  • Multicast paging для оповещения по громкой связи.
  • Перезагрузку без обрыва звонков, бэкап и безопасное обновление.

Время: 1,5-2 часа на всё. Из них полчаса — установка, которая идёт сама.

Что нужно: виртуалка или сервер под Debian 12, доступ к консоли гипервизора, SIP-транк от провайдера с логином и паролем, один-два IP-телефона или софтфон для проверки.

Системные требования FreePBX 17

Официальная страница установки жёстких требований к железу не публикует. Пишет только, что нужен Debian 12. Ниже — цифры из практики. Они с запасом закрывают небольшой офис.

Параметр До 20 абонентов 20-100 абонентов Комментарий
ОС Debian 12 Bookworm Debian 12 Bookworm Только чистая установка, без лишних пакетов
CPU 2 vCPU 4 vCPU Транскодирование и запись съедают процессор
RAM 4 ГБ 8 ГБ 2 ГБ хватит для теста, но не для продакшна
Диск системы 40 ГБ 60 ГБ SSD, логи и бэкапы растут
Диск под записи по формуле ниже по формуле ниже Лучше отдельный том
FreePBX 17.x 17.x Поддержка до 30.06.2028
Asterisk 22 LTS 22 LTS Диапазон поддержки 18-23, 23 пока только для тестов
СУБД MariaDB 10.11 MariaDB 10.11 Ставится скриптом из репозитория Debian
PHP 8.2 8.2 Ставится скриптом

Формула для диска под записи. WAV 8 кГц, 16 бит, моно — это 128 кбит/с, то есть почти 1 МБ на минуту разговора. Час — около 58 МБ. Офис с 10 менеджерами по 3 часа разговоров в день пишет примерно 1,7 ГБ в день и 37 ГБ в месяц. Считай заранее, а не когда кончится место.

На момент публикации актуальна версия FreePBX 17 на Debian 12, FreePBX 18 запланирована на Debian 13 с бетой в ноябре 2026 и релизом 1 января 2027. Перед установкой проверь свежие релизы на странице FreePBX Versions.

Порты FreePBX 17

Порт Протокол Назначение Доступен снаружи?
5060 UDP/TCP SIP, PJSIP Только с IP провайдера и удалённых сотрудников
5061 TCP SIP over TLS Только если используешь TLS
10000-20000 UDP RTP, голос Да, для провайдера и удалённых абонентов
80/443 TCP Веб-интерфейс и UCP Нет, только из админской сети или через VPN
22 TCP SSH Нет, только из админской сети
3306 TCP MariaDB Нет, слушает localhost
239.x.x.x:10000 UDP multicast Оповещение multicast paging Нет, только внутри голосового VLAN

Архитектура

Вот как устроена типовая установка. АТС стоит за роутером с NAT, провайдер приходит снаружи, телефоны внутри. Именно граница NAT ломает звук чаще всего.

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["SIP-провайдер"] --> B["Роутер с NAT"]
    B --> C["FreePBX 17 на Debian 12"]
    C --> D["Asterisk 22 PJSIP"]
    D --> E["Входящие маршруты"]
    E --> F["Группы и Follow Me"]
    F --> G["IP-телефоны"]
    D --> H["Записи в monitor"]
    D --> I["CDR в MariaDB"]
    G --> J["Multicast VLAN"]
    style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style G fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style B fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style D fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d

Что будет в статье

  • Причины, почему свежая FreePBX 17 не работает как ожидается.
  • Установка на Debian 12 и честный ответ про Ubuntu.
  • Настройка сети в ОС и в FreePBX.
  • Транк, добавочные и входящая маршрутизация.
  • Переадресация, Follow Me, перевод звонка.
  • Запись разговоров и где хранятся файлы.
  • Multicast paging, перезагрузка, проверка, осложнения, бэкап, обновление и FAQ.

Причины: почему свежая FreePBX 17 работает не так

Ломается не FreePBX. Ломаются ожидания от неё. Семь причин закрывают почти все жалобы на свежую установку.

Причина Почему ломает
Ставят на Ubuntu или на «не чистый» Debian Скрипт установки тестируется только на ванильном Debian 12. Другие пакеты и версии библиотек дают ошибки сборки и странное поведение модулей.
Не заданы внешний адрес и локальные сети Asterisk пишет в SDP свой внутренний IP. Провайдер шлёт голос в никуда. Итог — тишина в одну или обе стороны.
Закрыт диапазон RTP SIP проходит, звонок соединяется, а UDP 10000-20000 режет firewall. Снова тишина.
Нет входящего маршрута под формат DID Провайдер шлёт номер не в том виде, что указан в маршруте. Звонок падает в «номер не обслуживается».
Режим DTMF не совпадает Коды ## и *2 во время разговора — это DTMF. Если телефон шлёт их не тем способом, Asterisk их не видит.
Репозиторий apt с алиасом stable После выхода Debian 13 алиас stable указывает на trixie. Обычный apt upgrade тянет пакеты из чужого релиза.
Записи разговоров забили диск MariaDB и Asterisk падают, когда кончается место. Записи никто не чистит, пока не станет поздно.

Вот тут важно. Причины 2 и 3 дают больше половины вопросов на форумах. Если после установки ты видишь звонок без звука — не трогай кодеки и не переустанавливай систему. Иди в раздел про NAT.

Установка FreePBX 17 на Debian 12

Договоримся об именах. Сервер АТС — pbx01, IP 10.0.10.20/24, шлюз 10.0.10.1. Гипервизор — узел Proxmox. Подставляй свои значения, команды от этого не меняются.

Подготовка: виртуалка и чистый Debian 12

Зачем: скрипт Sangoma рассчитан на ванильную систему. Без графической оболочки, без веб-сервера, без ничего лишнего. Ставь netinst-образ с debian.org и на шаге выбора ПО оставь только «SSH server» и «стандартные системные утилиты».

Хост: узел Proxmox, под root. VMID 120 и имя хранилища подставь свои. ISO заранее загрузи в хранилище local.


qm create 120 --name pbx01 --ostype l26 --cores 2 --memory 4096 \
  --scsihw virtio-scsi-single --scsi0 local-lvm:40 \
  --net0 virtio,bridge=vmbr0 --agent enabled=1 \
  --cdrom local:iso/debian-12-amd64-netinst.iso --boot order='scsi0;ide2'
qm start 120

Результат: ВМ запущена, в консоли Proxmox идёт установщик Debian. Пройди его, задай пароль root и обычного пользователя.

Ставишь на железо — то же самое, только с флешки. Ставишь в облако — бери официальный образ Debian 12 у провайдера, скрипт с ним работает.

Шаг 1. Настрой сеть Debian 12 до установки FreePBX

Зачем: АТС должна иметь постоянный адрес. Телефоны, провайдер и правила firewall привязываются к IP. DHCP-адрес, который сменился после перезагрузки, — это отдел без связи в понедельник утром.

В Debian 12 по умолчанию сетью управляет ifupdown через файл /etc/network/interfaces. Сначала узнай имя интерфейса.

Хост: pbx01, под root, через консоль Proxmox. Не по SSH — при ошибке в конфиге ты потеряешь доступ.


ip -br link
ip -br addr

Результат: имя интерфейса, обычно ens18 в Proxmox. Теперь задай статику.

Хост: pbx01, файл /etc/network/interfaces. Блок для основного интерфейса замени целиком.


auto lo
iface lo inet loopback

auto ens18
iface ens18 inet static
    address 10.0.10.20/24
    gateway 10.0.10.1

DNS-серверы задай в /etc/resolv.conf. Строку dns-nameservers в interfaces Debian без пакета resolvconf игнорирует — это частая ловушка.


cat > /etc/resolv.conf <<'EOF'
nameserver 10.0.10.1
nameserver 1.1.1.1
EOF

hostnamectl set-hostname pbx01
sed -i 's/^127\.0\.1\.1.*/127.0.1.1 pbx01/' /etc/hosts

systemctl restart networking
ip -br addr show ens18
ping -c 3 10.0.10.1
ping -c 3 deb.debian.org

Результат: у интерфейса адрес 10.0.10.20/24, шлюз пингуется, имя deb.debian.org резолвится. Без интернета скрипт установки не сработает, так что проверь это сейчас.

Обнови систему перед установкой. Скрипт ставит пакеты поверх, и чем свежее база, тем меньше сюрпризов.


apt update && apt -y full-upgrade
apt install -y tmux wget
reboot

Шаг 2. Запусти скрипт установки

Зачем: это официальный способ. Скрипт sng_freepbx_debian_install ставит Asterisk, MariaDB, PHP 8.2, Apache, NodeJS и сам FreePBX 17, а потом настраивает сервисы. Руками это полдня работы и десяток мест, где можно ошибиться.

Запускай внутри tmux. Если SSH-сессия оборвётся на 20-й минуте, установка не умрёт вместе с ней.

Хост: pbx01, под root, можно уже по SSH.


tmux new -s install
cd /tmp
wget https://github.com/FreePBX/sng_freepbx_debian_install/raw/master/sng_freepbx_debian_install.sh -O /tmp/sng_freepbx_debian_install.sh
bash /tmp/sng_freepbx_debian_install.sh

Во втором окне смотри лог. Отключиться от tmux — Ctrl+B, потом D. Вернуться — tmux attach -t install.


ls -lt /var/log/pbx/
tail -f /var/log/pbx/freepbx17-install*.log

Результат: через 20-40 минут скрипт сообщает об успешной установке. Время зависит от канала и железа. Не прерывай его, даже если кажется, что он завис на сборке — он не завис.

У скрипта есть ключи. Полезные: —dahdi ставит драйверы для аналоговых и E1-плат Sangoma и фиксирует версию ядра, —opensourceonly ставит только открытые модули без коммерческих. Для чистого SIP без плат ключи не нужны.

А если Ubuntu?

Отвечаю прямо, раз запрос «установка FreePBX на Ubuntu» стабильно ищут. Официально FreePBX 17 на Ubuntu не поддерживается. Скрипт написан и тестируется под Debian 12. В интернете есть инструкции по установке на Ubuntu 24.04 руками, например у geekrewind, и они работают на момент написания.

Но смотри, что ты получаешь. Каждое обновление модулей и Asterisk тестируется на Debian. На Ubuntu ты первый тестировщик. Ответ на форуме будет «переставь на Debian». Ubuntu и Debian отличаются меньше, чем кажется, но разница всплывает в 3 ночи во время обновления.

Если причина в том, что «у нас всё на Ubuntu», — подними отдельную ВМ под Debian 12. Это 512 МБ лишней памяти и спокойный сон. Подробнее — в разделе альтернатив.

Шаг 3. Первый вход и обновление модулей

Открой в браузере http://10.0.10.20/. FreePBX попросит создать администратора: логин, пароль, email для уведомлений. Пароль — длинный, не «admin123». Этот логин открывает всю АТС, включая транки, через которые можно наговорить на чужие деньги.

Дальше мастер предложит язык, часовой пояс и активацию. Активация нужна только для коммерческих модулей и доступа к их магазину. Для открытой АТС её можно пропустить.

Обнови модули сразу после установки. Скрипт ставит то, что было в репозитории на момент его запуска, а исправления выходят постоянно.

Хост: pbx01, под root.


fwconsole ma refreshsignatures
fwconsole ma upgradeall
fwconsole chown
fwconsole reload
asterisk -rx "core show version"
fwconsole ma list | head -n 30

Результат: Asterisk 22.x, все модули в статусе Enabled, нет красного баннера «Please run fwconsole reload» в веб-интерфейсе.

Шаг 4. Проверь репозитории apt

Это специфика 2025-2026 годов. Не перепутай: шаг маленький, а последствия большие.

Скрипт добавлял репозиторий Sangoma с алиасом stable. Пока стабильным был Debian 12, всё было хорошо. В августе 2025 вышел Debian 13, и stable стал означать trixie. На форуме FreePBX есть отдельная тема об этом. FreePBX 17 остаётся на Debian 12, переходить на 13 нельзя.

Хост: pbx01, под root.


grep -rnw stable /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null
grep -rn trixie /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null

Результат: пустой вывод — хорошо. Если нашлись строки со stable, замени алиас на bookworm в найденном файле. Имя файла бери из вывода grep, в примере оно условное.


cp /etc/apt/sources.list.d/ИМЯ_ФАЙЛА.list /root/
sed -i 's/\bstable\b/bookworm/g' /etc/apt/sources.list.d/ИМЯ_ФАЙЛА.list
apt update

Шаг 5. Настрой сеть в FreePBX: NAT и локальные сети

Зачем: это и есть «freepbx настройка сети» с точки зрения телефонии. ОС знает свой IP. А Asterisk должен знать ещё две вещи: какой адрес видит мир снаружи и какие сети считать своими. Без этого он пишет внутренний адрес в SDP, и голос провайдера уходит на 10.0.10.20, который из интернета недоступен.

Открой Settings → Asterisk SIP Settings. На вкладке общих настроек найди блок NAT Settings. Описание полей — в руководстве Asterisk SIP Settings.

Поле Значение Зачем
External Address Белый IP офиса Этот адрес Asterisk подставит в SDP для внешних абонентов
Local Networks 10.0.10.0/24 и все внутренние сети, включая VPN Для этих сетей NAT-подмена не нужна
Detect Network Settings Нажать один раз Заполнит оба поля автоматически, потом проверь глазами
RTP Port Ranges 10000-20000 Значение по умолчанию, не меняй без причины

Сохрани, нажми Apply Config. Транспорты PJSIP перечитываются не всегда, поэтому после смены сетевых настроек нужен перезапуск Asterisk. Когда звонков нет — сразу. Когда есть — мягко, об этом в разделе про перезагрузку.

Хост: pbx01, под root.


fwconsole restart
asterisk -rx "pjsip show transports"

На роутере проброс нужен в двух случаях: провайдер шлёт входящие на твой белый IP без регистрации, или есть удалённые сотрудники. Проброс 5060/UDP и 10000-20000/UDP на 10.0.10.20, и обязательно ограничение по IP-источникам для 5060. Если транк регистрируется сам, провайдеру проброс обычно не нужен.

SIP ALG на роутере
На многих роутерах по умолчанию включён SIP ALG или SIP helper. Он переписывает SIP-пакеты «чтобы помочь» и ломает регистрацию и звук. Если после правильной настройки NAT звук всё равно пропадает — выключи SIP ALG на роутере. На MikroTik это сервис sip в IP → Firewall → Service Ports.

Шаг 6. Транк и добавочные

Это база, без неё входящей маршрутизации не на что опираться. Коротко, потому что параметры зависят от провайдера.

Транк: Connectivity → Trunks → Add Trunk → Add SIP (chan_pjsip) Trunk. В FreePBX 17 есть только PJSIP, chan_sip убран. На вкладке pjsip Settings заполни данные провайдера.

Поле Что ставить
Username / Auth username Логин от провайдера
Secret Пароль от провайдера
Authentication / Registration Outbound / Send, если провайдер требует регистрацию
SIP Server / Port Адрес и порт провайдера
Context from-pstn, по умолчанию
Outbound CallerID Твой городской номер в формате, который ждёт провайдер

Добавочные: Applications → Extensions → Add Extension → PJSIP. Номер, имя, пароль. Пароль генерирует сам FreePBX — оставь его, не ставь «1234». Подбор паролей SIP идёт круглосуточно, это не теория.

Хост: pbx01, под root. Проверь, что транк зарегистрирован, а телефоны видны.


asterisk -rx "pjsip show registrations"
asterisk -rx "pjsip show endpoints"
asterisk -rx "pjsip show contacts"

Результат: у транка статус Registered, у подключённых телефонов контакт со статусом Avail.

Шаг 7. Настройка входящей маршрутизации

Зачем: Inbound Route решает, куда пойдёт входящий звонок. Без маршрута звонок попадает в «номер не обслуживается», даже если транк зарегистрирован и всё зелёное.

Маршрут выбирается по двум полям: DID — номер, на который позвонили, и CallerID — номер того, кто звонит. Пустое поле значит «любой». Более точный маршрут побеждает менее точный.

Сначала узнай, в каком виде провайдер присылает DID. Это главное место ошибок: в маршруте записан 3432223344, а провайдер шлёт 73432223344.

Хост: pbx01, под root. Позвони на свой городской номер с мобильного и смотри вывод.


asterisk -rvvvv

Ищи строку с контекстом from-pstn. Номер перед @from-pstn и есть DID. Если звонок уже был, найди его в логе:


grep -E '@from-pstn:' /var/log/asterisk/full | tail -n 10

Теперь создай маршруты в Connectivity → Inbound Routes → Add Inbound Route.

Маршрут DID Number CallerID Number Destination
Основной номер 73432223344 пусто Time Condition или IVR
Прямой номер отдела продаж 73432223355 пусто Ring Group продаж
VIP-клиент на основной номер 73432223344 79161234567 Добавочный руководителя
Резервный, ловит всё остальное пусто пусто Секретарь или IVR

Резервный маршрут с пустыми полями обязателен. Провайдер однажды поменяет формат номера, и вместо тишины звонки уйдут секретарю. Ты узнаешь о проблеме из жалобы «звонят не туда», а не «до вас не дозвониться».

Схема прохождения входящего звонка в типичном офисе выглядит так.

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["Входящий звонок"] --> B["Inbound Route по DID"]
    B --> C{"Рабочее время?"}
    C -->|Да| D["IVR"]
    C -->|Нет| E["Голосовая почта"]
    D --> F["Ring Group"]
    F --> G["Добавочный с Follow Me"]
    G --> H["Мобильный сотрудника"]
    G --> I["Переадресация по занятости"]
    B --> J["Резервный маршрут"]
    style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style C fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style J fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style F fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style G fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d

Рабочее время задаётся модулями Time Groups и Time Conditions в разделе Applications. Сначала группа со временем «пн-пт 9:00-18:00», потом условие, которое ведёт в одно место по времени и в другое вне его. Часовой пояс сервера проверь командой timedatectl — если там UTC, офис в Екатеринбурге будет получать звонки «в нерабочее время» до обеда.

Шаг 8. Настройка переадресации

Переадресация в FreePBX бывает трёх видов. Безусловная — все звонки на другой номер. По занятости — если линия занята. По неответу — если не взяли трубку за отведённое время. Управляются они кодами функций с телефона, через пользовательскую панель UCP или администратором.

Коды по умолчанию — из справочника кодов функций Sangoma. Проверить и поменять их можно в Admin → Feature Codes.

Действие Включить Выключить
Безусловная переадресация *72 *73
По занятости *90 *91
По неответу или недоступности *52 *53
Переключатель безусловной *96 *96
Не беспокоить *78 *79
Follow Me вкл/выкл *21 *21

Пользователь набирает *72, система спрашивает номер, он вводит 89161234567 и решётку. Готово. С телефона это быстрее, чем объяснять, где кнопка в веб-панели.

Администратору удобнее смотреть и менять переадресации из консоли. FreePBX хранит их в базе Asterisk в семействах CF, CFB и CFU: безусловная, по занятости и по неответу.

Хост: pbx01, под root.


asterisk -rx "database show CF"
asterisk -rx "database show CFB"
asterisk -rx "database show CFU"

asterisk -rx "database put CF 101 89161234567"
asterisk -rx "database del CF 101"

Результат: первая тройка команд показывает, у кого что включено. Вторая пара включает и выключает безусловную переадресацию для добавочного 101.

Вот тут важно. Переадресация на внешний номер — это исходящий звонок через твой транк. Он идёт по исходящим маршрутам и за твой счёт. Если исходящий маршрут не пускает мобильные номера, переадресация не сработает. Если пускает международку — переадресацию на платный номер в другой стране может включить тот, кто подобрал пароль добавочного.

Шаг 9. FreePBX Follow Me

Follow Me — это умная переадресация. Звонок сначала звонит на рабочий телефон, потом подключает мобильный, потом уходит в голосовую почту. Человек не теряет звонки, а клиент не слышит «абонент недоступен».

Открой Applications → Follow Me и выбери добавочный. Или в настройках самого добавочного на вкладке Find Me/Follow Me. Ключевые поля:

Поле Что ставить Комментарий
Enabled Yes Пользователь может переключать кодом *21
Initial Ring Time 10-15 секунд Сколько звонит только рабочий телефон
Ring Strategy ringallv2 Звонить всем из списка одновременно
Ring Time 20-25 секунд Сколько звонит список после начального времени
Follow-Me List 101 и 89161234567# Внешний номер обязательно с решёткой на конце
Confirm External Calls Yes Мобильный попросит нажать 1, чтобы принять
No Answer Destination Голосовая почта добавочного Куда уйдёт, если никто не взял

Решётка после внешнего номера — не опечатка. Без неё FreePBX считает 89161234567 внутренним номером, ищет такой добавочный, не находит и молча пропускает.

Подтверждение звонка на мобильном — самая недооценённая галочка. Без неё звонок примет автоответчик мобильного оператора, и клиент наговорит сообщение в ящик, который никто не слушает. С ней автоответчик не нажмёт 1, и звонок вернётся в АТС к следующему шагу.

Шаг 10. FreePBX перевод звонка

Перевод бывает слепой и с консультацией. Слепой — отдал звонок и забыл. С консультацией — сначала поговорил с коллегой, потом соединил. В FreePBX оба делаются двумя способами: кнопкой телефона или кодами во время разговора.

Способ Слепой С консультацией Как работает
Кнопка Transfer на телефоне Да Да SIP REFER, обрабатывает сам телефон и PJSIP
Коды во время разговора ## *2 DTMF, обрабатывает Asterisk

Совет из практики: учи людей кнопке телефона. Она работает независимо от настроек DTMF и понятнее пользователю. Коды нужны для софтфонов без кнопки перевода и для аналоговых телефонов через шлюз.

Чтобы коды ## и *2 работали, нужны три условия:

  • В Settings → Advanced Settings параметр Asterisk Dial Options содержит буквы T и t. По умолчанию там Ttr — не трогай.
  • У добавочного DTMF Signaling стоит RFC 4733, и у телефона тот же режим DTMF.
  • Коды In-Call Asterisk Blind Transfer и Attended Transfer включены в Feature Codes.
  • Для кнопки телефона у добавочного не запрещён Allow Transfer.

Проверить режим DTMF у конкретного добавочного можно из консоли.

Хост: pbx01, под root.


asterisk -rx "pjsip show endpoint 101" | grep -Ei 'dtmf_mode|allow_transfer'
asterisk -rx "features show" | grep -Ei 'blindxfer|atxfer'

Результат: dtmf_mode: rfc4733, allow_transfer: true, blindxfer ##, atxfer *2.

Шаг 11. Запись разговоров: настройка

Запись в FreePBX 17 настраивается в нескольких местах, и у каждого есть приоритет. Это главный источник путаницы: включил запись у добавочного, а разговор не записался, потому что маршрут сказал «никогда».

Где включается запись:

  • У добавочного: Applications → Extensions → вкладка Advanced → Recording Options. Отдельно для входящих и исходящих, внешних и внутренних.
  • Во входящем маршруте: вкладка Advanced, параметр Call Recording.
  • В группе вызова и очереди: свой параметр Call Recording.
  • По требованию во время разговора: код *1, если у добавочного разрешена On Demand Recording.

Значения параметра записи и как они взаимодействуют:

Значение Что делает
Force Записывать всегда, перекрывает No у других участников звонка
Yes Записывать, если более приоритетная настройка не запретила
Don’t Care Решение за другими участниками маршрута
No Не записывать, если кто-то другой не сказал Force
Never Не записывать никогда, перекрывает всё

Простая рабочая схема для офиса: во входящих маршрутах Force, у добавочных для внешних звонков Yes, для внутренних Don’t Care. Так пишутся все разговоры с клиентами, но не болтовня коллег между собой.

И не забудь предупредить звонящих. Поставь в начало IVR или входящего маршрута сообщение о том, что разговор записывается. Это и вопрос закона, и вопрос доверия клиентов.

Где хранятся записи разговоров FreePBX

Записи лежат в /var/spool/asterisk/monitor/ с разбивкой по датам: год, месяц, день. Например, /var/spool/asterisk/monitor/2026/10/25/. Формат по умолчанию — WAV. Имя файла начинается с типа звонка: in для входящих, out для исходящих, rg для групп, q для очередей. Дальше номера, дата, время и уникальный ID звонка.

Хост: pbx01, под root.


ls -lh /var/spool/asterisk/monitor/$(date +%Y/%m/%d)/ | tail -n 10
du -sh /var/spool/asterisk/monitor/*/*
df -h /var/spool/asterisk

Результат: сегодняшние записи, размер по месяцам и свободное место на разделе. Если раздел общий с системой — это повод вынести записи на отдельный диск.

Связь записи со звонком хранится в CDR. Колонка recordingfile содержит имя файла. Именно по ней веб-интерфейс Reports → CDR Reports показывает кнопку прослушивания.

Хост: pbx01, в клиенте mariadb под root.


SELECT calldate, src, dst, duration, recordingfile
FROM asteriskcdrdb.cdr
WHERE recordingfile <> ''
ORDER BY calldate DESC
LIMIT 10;

Хочешь хранить записи на отдельном диске — не меняй путь в конфигах Asterisk руками. Подмонтируй диск прямо в /var/spool/asterisk/monitor. Путь для FreePBX не меняется, плеер в CDR продолжает работать, а место берётся с нового тома. Перед монтированием перенеси существующие файлы и проверь владельца asterisk.

Хост: pbx01, под root. Пример для второго диска /dev/sdb1, уже отформатированного в ext4. Делай в тихое время, без звонков.


fwconsole stop
mkdir -p /mnt/rec-tmp
mount /dev/sdb1 /mnt/rec-tmp
rsync -a /var/spool/asterisk/monitor/ /mnt/rec-tmp/
umount /mnt/rec-tmp
echo "UUID=$(blkid -s UUID -o value /dev/sdb1) /var/spool/asterisk/monitor ext4 defaults,noatime 0 2" >> /etc/fstab
mv /var/spool/asterisk/monitor /var/spool/asterisk/monitor.old
mkdir /var/spool/asterisk/monitor
systemctl daemon-reload
mount -a
chown -R asterisk:asterisk /var/spool/asterisk/monitor
fwconsole start

Результат: df -h /var/spool/asterisk/monitor показывает новый диск, старые записи слушаются из CDR. Каталог monitor.old удали через неделю, когда убедишься, что всё на месте.

Опечатка в путь записей
Если меняешь каталог записей через Advanced Settings или переменную MIXMON_DIR, путь обязательно заканчивай слешем. Без него дата приклеивается к имени каталога, и записи уходят в каталоги вида monitor2026 рядом с нужным. Плеер в CDR их не находит, а разбираться приходится по факту, когда запись срочно нужна.

Шаг 12. FreePBX multicast paging

Paging — это оповещение: нажал кнопку, сказал «Иванов, зайдите к директору», и это слышно на всех телефонах группы. Обычный paging в FreePBX делает отдельный звонок на каждый телефон. Multicast шлёт один поток в сеть, а телефоны слушают его сами. Для 50 телефонов на складе разница огромная.

Вариантов четыре. Выбирай по бюджету и по тому, нужна ли АТС в цепочке.

Вариант Цена Нагрузка на АТС Ограничение
Paging and Intercom Бесплатно Звонок на каждый телефон Не multicast, рекомендуют до 25 телефонов в группе
Page Pro Коммерческий модуль Один поток Платно, multicast-группы задаются как IP:порт
Телефон сам шлёт multicast Бесплатно Нулевая Только внутри сети, кнопка настраивается на каждом телефоне
Page с MulticastRTP в своём диалплане Бесплатно Один поток Ручной конфиг, проверь кодек с твоими телефонами

Официальная позиция Sangoma: RTP multicast в FreePBX настраивается только в коммерческом Page Pro. Это сказано в руководстве Paging and Intercom. Там же: Force, Skip и Whisper для multicast не работают, а приоритет барж задаётся на самих телефонах.

Бесплатный путь с АТС в цепочке — приложение Page в Asterisk с каналом MulticastRTP. Добавь свой номер в контекст from-internal-custom, который FreePBX подключает к внутреннему диалплану.

Хост: pbx01, файл /etc/asterisk/extensions_custom.conf. Номер 7001 не должен пересекаться с добавочными и кодами функций.


[from-internal-custom]
exten => 7001,1,NoOp(Multicast paging to warehouse)
 same => n,Page(MulticastRTP/basic/239.255.10.1:10000,iq)
 same => n,Hangup()

fwconsole reload
asterisk -rx "dialplan show 7001@from-internal-custom"

Опция i игнорирует переадресации, q отключает сигнал перед объявлением. Звонишь на 7001 и говоришь. Поток уходит на группу 239.255.10.1, порт 10000, кодеком G.711. На телефонах в разделе multicast-прослушивания добавь адрес 239.255.10.1:10000 и задай приоритет. Как именно — зависит от модели, у Sangoma это описано в статье про multicast paging на телефонах.

Почему 239.x.x.x, а не 224.0.0.x из примеров. Диапазон 224.0.0.0/24 зарезервирован под служебные протоколы, его коммутаторы флудят во все порты. Диапазон 239.0.0.0/8 — административный, для внутренних задач. С ним IGMP snooping на коммутаторах работает предсказуемо.

Вот как идёт поток при multicast в сравнении с обычным paging.

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#f8fafc',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'noteBkgColor': '#fefce8',
    'noteTextColor': '#713f12',
    'noteBorderColor': '#fbbf24',
    'actorBkg': '#f8fafc',
    'actorBorder': '#94a3b8',
    'actorTextColor': '#1e293b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'sequence': {
    'mirrorActors': false,
    'messageAlign': 'center',
    'actorMargin': 120,
    'width': 160,
    'noteMargin': 12
  }
}}%%
sequenceDiagram
    participant U as Сотрудник
    participant A as Asterisk
    participant S as Коммутатор
    participant T as Телефоны склада
    U->>A: Набор 7001
    A->>S: Один RTP-поток на 239.255.10.1
    S->>T: Копия потока каждому слушателю
    Note over S,T: IGMP snooping решает, кому слать
    U->>A: Положил трубку
    A->>S: Поток остановлен

Multicast не ходит через маршрутизатор без отдельной настройки. Если телефоны в другом VLAN, чем АТС, нужен PIM или отдельный интерфейс АТС в голосовом VLAN. Самое простое — держать АТС и телефоны в одном голосовом VLAN.

Как перезагрузить FreePBX 17 правильно

«Перезагрузи и посмотри» — любимый рецепт тех, кто не знает, что сломалось. Но перезапуск иногда действительно нужен. Вопрос — какой именно, потому что их пять, и только один из них не рвёт идущие разговоры.

Что нужно Команда Рвёт звонки?
Применить изменения из GUI fwconsole reload Нет
Перезапустить Asterisk, когда звонков не будет core restart when convenient Нет, ждёт ноль звонков
Перезапустить Asterisk, не принимая новых звонков core restart gracefully Нет, но новые не примет
Перезапустить FreePBX и Asterisk сразу fwconsole restart Да
Перезагрузить ОС reboot Да, плюс время загрузки

Хост: pbx01, под root. Мягкий перезапуск — первая команда. Она вернёт управление сразу, а сам перезапуск случится, когда положат последнюю трубку.


asterisk -rx "core show channels count"
asterisk -rx "core restart when convenient"

fwconsole restart

systemctl list-units --type=service | grep -Ei 'freepbx|asterisk'

Последняя команда покажет, под каким юнитом systemd запущена АТС на твоей установке. Обычно это freepbx.service, который сам запускает Asterisk через fwconsole. Поэтому systemctl restart freepbx делает то же, что fwconsole restart.

Когда нужен reboot ОС: обновилось ядро или системные библиотеки. Проверить это можно утилитой needrestart. После обычного обновления модулей FreePBX перезагружать сервер не нужно.


apt install -y needrestart
needrestart -r l
needrestart -k

Перезагрузка из веб-интерфейса есть только в коммерческом модуле System Admin. Без него — консоль. И это нормально: тот, кто перезагружает АТС, должен видеть, что происходит.

Проверка: всё ли работает в FreePBX 17

Один проход по чек-листу после настройки. Если все пункты зелёные — АТС можно отдавать людям.

Хост: pbx01, под root.


asterisk -rx "core show uptime"
asterisk -rx "pjsip show registrations"
asterisk -rx "pjsip show contacts"
asterisk -rx "core show channels"
fwconsole ma list | grep -vi enabled
df -h / /var/spool/asterisk/monitor
timedatectl | grep -Ei 'time zone|synchronized'

Результат: uptime растёт, транк Registered, телефоны Avail, модулей не в статусе Enabled нет, на дисках есть место, время синхронизировано и часовой пояс твой.

Дальше живые тесты. Каждый — один звонок:

  • Входящий с мобильного на городской: звук в обе стороны дольше 60 секунд. Ровно 30-32 секунды и обрыв — признак проблем с NAT.
  • Исходящий на мобильный: определяется твой городской номер.
  • Перевод кнопкой телефона и кодом ## на другой добавочный.
  • Follow Me: не бери рабочий телефон, должен зазвонить мобильный с запросом нажать 1.
  • Запись: файл появился в каталоге за сегодня и слушается из CDR.
  • Multicast: набор 7001, голос на всех телефонах группы.
  • Вне рабочего времени: звонок уходит туда, куда должен.

Логи при проблемах — в /var/log/asterisk/full. Отфильтровать конкретный звонок удобнее всего по номеру звонящего.


grep 79161234567 /var/log/asterisk/full | tail -n 50
tail -f /var/log/asterisk/full | grep -Ei 'warning|error'

Осложнения: типовые ошибки FreePBX 17

Всё не так плохо, как ты думаешь после первого звонка без звука. Всё намного предсказуемее. Почти каждая ошибка ниже встречалась у меня больше одного раза.

Ошибка Причина Решение
Звонок без звука в одну сторону Не задан External Address или Local Networks NAT Settings в Asterisk SIP Settings, перезапуск
Обрыв ровно через 30-32 секунды Не доходит ACK из-за NAT или SIP ALG External Address, выключить SIP ALG
«Номер не обслуживается» на входящем DID не совпадает с маршрутом Посмотреть DID в логе, исправить маршрут, добавить резервный
## и *2 не работают Режим DTMF или опции Dial RFC 4733, T и t в Asterisk Dial Options
Переадресация на мобильный не идёт Исходящий маршрут не пускает номер или провайдер режет CallerID Шаблон маршрута, CID Options транка
Follow Me не звонит на мобильный Внешний номер без решётки Дописать # к номеру
Записи есть в CDR, но не играют Неверный путь записи или права Проверить каталог, fwconsole chown
Multicast не слышно Разные VLAN, IGMP snooping без querier, кодек Один VLAN, querier на коммутаторе, G.711 на телефоне

Звонок без звука или обрыв через 30 секунд

Причина: Asterisk сообщает собеседнику внутренний адрес вместо внешнего. Или роутер с SIP ALG переписывает пакеты. Обрыв ровно на 30-32 секунде — классика: подтверждение ответа не доходит, и одна из сторон по таймеру кладёт трубку.

Решение: проверь, что Asterisk видит правильные внешний адрес и локальные сети, и посмотри на SIP-диалог в живую.

Хост: pbx01, под root.


asterisk -rx "pjsip show transport 0.0.0.0-udp" | grep -Ei 'external|local_net'
asterisk -rx "pjsip set logger on"
asterisk -rvvv

В выводе логгера найди в SDP строку c=IN IP4. Для внешнего звонка там должен быть белый IP, а не 10.0.10.20. После диагностики выключи логгер командой pjsip set logger off, иначе лог распухнет. Имя транспорта на твоей установке может отличаться — список даёт pjsip show transports.

Входящий не попадает в маршрут

Причина: провайдер шлёт DID в формате, которого нет в маршрутах. Иногда шлёт номер не в заголовке To, а в другом месте, и тогда DID вообще приходит как логин транка.

Решение: найди реальный DID в логе и сделай маршрут под него. Если провайдер шлёт логин вместо номера, в настройках транка на вкладке pjsip Settings → Advanced есть параметр Context и опция получения DID из заголовка To. Для быстрой проверки маршрутов без провайдера есть код 777 — симуляция входящего звонка.


grep -E '@from-pstn:1\]' /var/log/asterisk/full | tail -n 5

Переадресация или Follow Me на мобильный не работает

Причина первая: исходящий маршрут не совпадает с набираемым номером. Причина вторая: при переадресации АТС подставляет номер исходного звонящего, а российские провайдеры часто отбрасывают вызовы с чужим CallerID.

Решение: в исходящем маршруте проверь шаблоны набора, например 8XXXXXXXXXX. В транке на вкладке General поставь CID Options в Force Trunk CID — тогда на мобильный уйдёт твой городской номер. Минус — сотрудник не увидит номер клиента. Плюс — звонок дойдёт. Часть провайдеров разрешает чужой CallerID по заявке.


grep -Ei 'chan_pjsip.*(403|404|503|Forbidden)' /var/log/asterisk/full | tail -n 10

Записи не воспроизводятся из CDR

Причина: файл не там, где его ищет FreePBX, или у веб-сервера нет прав на чтение. Типично после ручной смены каталога или копирования записей от root.

Решение: найди файл по имени из колонки recordingfile и верни права.

Хост: pbx01, под root. Имя файла подставь из CDR.


find /var/spool/asterisk -name 'in-73432223344-79161234567-*' 2>/dev/null | head
fwconsole chown

Ошибка «Please run fwconsole reload»

Причина: изменения в GUI сохранены, но не применены, или предыдущий reload упал на ошибке модуля. Красный баннер висит, кнопка Apply Config не помогает.

Решение: запусти reload из консоли с подробным выводом. Ошибка будет видна сразу, с именем модуля.


fwconsole reload --verbose
fwconsole ma list | grep -Ei 'disabled|broken|needs upgrade'

Модули ionCube после перезагрузки

Причина: коммерческие модули зашифрованы ionCube. Если загрузчик ionCube не подключён к PHP, они перестают работать, иногда после обновления PHP или перезагрузки.

Решение: проверь, что PHP видит загрузчик. Если не видит, а коммерческие модули тебе не нужны, проще их удалить. Если нужны — переустанови пакет загрузчика из репозитория Sangoma.


php -v | grep -i ioncube
fwconsole ma list | grep -i commercial

Альтернативы: Ubuntu, ISO, FreePBX 16 и другие

Основной рецепт — FreePBX 17 скриптом на Debian 12. Он выбран потому, что это единственный официально поддерживаемый путь до 2028 года. Но варианты есть, и честно о каждом.

Вариант Плюсы Минусы Когда выбирать
Debian 12 + скрипт Официально, поддержка до 2028 Только Debian 12 По умолчанию
ISO SNGDEB от Sangoma Ставит Debian и FreePBX за один проход Меньше контроля над разметкой и пакетами Железный сервер, быстрый старт
Ubuntu 24.04 руками Единая ОС с остальной инфраструктурой Неофициально, ты сам себе тестировщик Лаборатория, не продакшн
FreePBX 16 на SNG7 Привычный интерфейс ОС без поддержки с 2024 года, EOL FreePBX 16 — 2027 Только пока мигрируешь на 17
Ждать FreePBX 18 Debian 13, свежий Asterisk Бета в ноябре 2026, релиз в январе 2027 Если запуск АТС не раньше весны 2027
Чистый Asterisk без GUI Минимализм, полный контроль Всё руками, сложнее передать коллегам Узкие задачи, шлюзы, лаборатория

ISO-образ вместо скрипта

Sangoma публикует ISO, который ставит Debian 12 и сразу запускает установщик FreePBX. Удобно на железе, где неохота возиться с netinst. Внутри тот же скрипт. Если ставишь на виртуалку в Proxmox, разницы почти нет, но со скриптом ты контролируешь разметку диска и можешь сразу выделить отдельный том под записи.

Установка FreePBX на Ubuntu

Если всё-таки Ubuntu — ставь в отдельную ВМ, сними снапшот до каждого обновления и держи план миграции на Debian. Скрипт Sangoma на Ubuntu не рассчитан, поэтому идёшь по сторонней инструкции. Каждое обновление модулей проверяй сначала на копии ВМ. Это не запрет, это стоимость владения, о которой лучше знать заранее.

FreePBX 16 и миграция

FreePBX 16 жил на SNG7 — это CentOS 7, поддержка которого закончилась в 2024 году. Сам FreePBX 16 по графику уходит в EOL 1 января 2027. Если у тебя такая АТС, мигрируй сейчас: новая ВМ с FreePBX 17, бэкап модулем Backup & Restore на старой, восстановление на новой. Модуль сам конвертирует данные, но коммерческие модули и кастомный диалплан проверь руками.

Хост: старая АТС на FreePBX 16 и новая pbx01. Бэкап делается в GUI модулем Backup & Restore, файл переносится на новую машину. Команды для восстановления на новой:


ls -lh /var/spool/asterisk/backup/
fwconsole backup --restore=/var/spool/asterisk/backup/ИМЯ_АРХИВА.tar.gz
fwconsole reload

Профилактика: чтобы FreePBX 17 не упала в понедельник

АТС ломается не от нагрузки. Она ломается от кончившегося диска, неудачного обновления и подобранного пароля. Все три вещи предотвращаются заранее и скучно.

Безопасность

Телефонное мошенничество
Подобранный пароль добавочного — это не утечка данных, а прямые деньги. Через твой транк начинают звонить на платные международные номера, обычно ночью и в выходные. Счёт за выходные может превысить стоимость всей АТС. Закрой международное направление в исходящих маршрутах, если оно не нужно, поставь лимит у провайдера и не открывай SIP в интернет для всех.

Firewall. В FreePBX 17 есть модуль Firewall в разделе Connectivity. Если используешь его — не ставь параллельно UFW, два менеджера правил на одной машине конфликтуют. Если модуля нет или ты предпочитаешь управлять правилами сам, минимальный набор на UFW такой. Вместо 203.0.113.10 — IP провайдера, вместо 10.0.10.0/24 — офисная сеть.

Хост: pbx01, под root. Делай через консоль гипервизора, а не по SSH.


apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow from 10.0.10.0/24 to any port 22 proto tcp
ufw allow from 10.0.10.0/24 to any port 80,443 proto tcp
ufw allow from 10.0.10.0/24 to any port 5060 proto udp
ufw allow from 203.0.113.10 to any port 5060 proto udp
ufw allow 10000:20000/udp
ufw enable
ufw status numbered

fail2ban. Проверь, стоит ли он и есть ли тюрьма для Asterisk. Если нет — поставь и включи. Фильтр asterisk в Debian уже есть, лог FreePBX пишется в /var/log/asterisk/full.


apt install -y fail2ban
cat > /etc/fail2ban/jail.d/asterisk.local <<'EOF'
[asterisk]
enabled  = true
logpath  = /var/log/asterisk/full
maxretry = 5
findtime = 600
bantime  = 86400
EOF
systemctl restart fail2ban
fail2ban-client status asterisk

SSH hardening — отдельный файл. Вместо admin — твой пользователь. Вход по ключу проверь до применения.

Хост: pbx01, файл /etc/ssh/sshd_config.d/10-hardening.conf.


PermitRootLogin prohibit-password
PasswordAuthentication no
MaxAuthTries 3
AllowUsers admin

sshd -t && systemctl reload ssh

Отдельный пользователь БД нужен, если внешние системы читают CDR: например, CRM или отчёты. Не давай им пользователя FreePBX. Создай свой, только на SELECT и только на asteriskcdrdb.


CREATE USER 'cdr_ro'@'10.0.10.50' IDENTIFIED BY 'ЗАМЕНИ_НА_ДЛИННЫЙ_ПАРОЛЬ';
GRANT SELECT ON asteriskcdrdb.cdr TO 'cdr_ro'@'10.0.10.50';
FLUSH PRIVILEGES;

Для доступа с другой машины MariaDB должна слушать не только localhost, а firewall должен пускать 3306 только с 10.0.10.50. Если такой задачи нет — не открывай.

Резервное копирование

Конфигурацию бэкапит штатный модуль Admin → Backup & Restore. Записи разговоров туда лучше не включать: архив раздуется до десятков гигабайт, и восстановление конфигурации будет занимать час вместо минуты.

Что бэкапить Как часто Где хранить Как восстановить
Конфигурация FreePBX Ежедневно Удалённое хранилище модуля Backup, SFTP или S3 Модуль Restore или fwconsole backup —restore
CDR Ежедневно, в составе бэкапа модуля Там же Вместе с конфигурацией
Записи разговоров Ежедневно, инкрементально NAS или отдельное хранилище rsync обратно в monitor
Снапшот ВМ Перед каждым обновлением Хранилище Proxmox qm rollback

Записи удобно забирать rsync-ом на NAS. Инкрементально, без повторной передачи уже скопированных файлов.

Хост: pbx01, под root. Вместо nas01 и пути — своё хранилище, доступ по SSH-ключу.


rsync -a --partial /var/spool/asterisk/monitor/ backup@nas01:/srv/pbx01-recordings/

Восстановление проверь хотя бы раз. Бэкап, который никто не пробовал восстановить, — это не бэкап, а надежда в формате tar.gz.

Ротация записей

Записи нужно удалять по сроку хранения. Иначе диск кончится, и это всегда случается в самый неудобный момент. Срок определяет бизнес, а не ты. Пример — 180 дней.

Хост: pbx01, файл /etc/systemd/system/rec-cleanup.service.


[Unit]
Description=Delete call recordings older than 180 days

[Service]
Type=oneshot
ExecStart=/usr/bin/find /var/spool/asterisk/monitor -type f -name '*.wav' -mtime +180 -delete
ExecStart=/usr/bin/find /var/spool/asterisk/monitor -mindepth 1 -type d -empty -delete

Файл /etc/systemd/system/rec-cleanup.timer.


[Unit]
Description=Daily call recordings cleanup

[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true

[Install]
WantedBy=timers.target

systemctl daemon-reload
systemctl enable --now rec-cleanup.timer
systemctl list-timers rec-cleanup.timer

Почему таймер, а не crontab. Капля никотина убивает лошадь. Одна строка в crontab с find -delete и опечаткой в пути — весь архив записей за год. Таймер виден в списке, пишет в журнал, и его проще проверить перед включением.

Мониторинг

Что мониторить: регистрацию транка, свободное место под записями, работу сервиса, число активных звонков. Пример для агента Zabbix.

Хост: pbx01, файл /etc/zabbix/zabbix_agent2.d/asterisk.conf. Агенту нужны права на asterisk -rx — добавь пользователя zabbix в группу asterisk.


UserParameter=asterisk.calls,asterisk -rx "core show channels count" | awk '/active call/ {print $1}'
UserParameter=asterisk.trunk.unregistered,asterisk -rx "pjsip show registrations" | grep -c -E 'Rejected|Unregistered|Failed'
UserParameter=asterisk.uptime.sec,asterisk -rx "core show uptime seconds" | awk '/System uptime/ {print $3}'

usermod -aG asterisk zabbix
systemctl restart zabbix-agent2
zabbix_agent2 -t asterisk.trunk.unregistered

Триггеры: asterisk.trunk.unregistered больше нуля дольше 5 минут, свободное место на /var/spool/asterisk/monitor меньше 15%, uptime сбросился — значит, был рестарт, и стоит знать почему.

Автозапуск

После перезагрузки сервера всё должно подняться само. Проверь один раз, а не после аварии.


systemctl is-enabled freepbx mariadb apache2 fail2ban
systemctl is-enabled rec-cleanup.timer

Результат: enabled везде. Если какой-то юнит называется иначе — смотри вывод systemctl list-unit-files | grep -Ei ‘freepbx|asterisk’.

Обновление без сюрпризов

Что проверить до обновления:

  • Свежий снапшот ВМ и свежий бэкап модулем Backup.
  • Репозитории apt без алиаса stable — шаг 4 этой статьи.
  • Нет активных звонков или есть окно обслуживания.
  • Список того, что обновится: модули и пакеты ОС.

Хост: узел Proxmox — снапшот, потом pbx01 — обновление.


qm snapshot 120 pre-update-$(date +%Y%m%d)

fwconsole ma showupgrades
fwconsole ma upgradeall
fwconsole reload
apt update
apt list --upgradable
apt upgrade
needrestart -k

При apt upgrade отклоняй любые предложения перейти на Debian 13. FreePBX 17 остаётся на Debian 12 до конца своей жизни. После обновления — пять тестовых звонков из раздела «Проверка». Что-то сломалось — откат снапшотом на узле Proxmox: qm rollback 120 и имя снапшота.

FAQ: частые вопросы про FreePBX 17

Какие системные требования у FreePBX 17?

Официально — чистый Debian 12, конкретные цифры по железу Sangoma не публикует. На практике для офиса до 20 человек хватает 2 vCPU, 4 ГБ RAM и 40 ГБ SSD. Место под записи считай отдельно: около 58 МБ на час разговора в WAV.

Можно ли установить FreePBX 17 на Ubuntu?

Технически можно по сторонним инструкциям, но официально не поддерживается. Скрипт установки и все обновления тестируются только на Debian 12. Для продакшна ставь Debian 12 в отдельную ВМ.

Как перезагрузить FreePBX без обрыва звонков?

Выполни в консоли asterisk -rx «core restart when convenient». Asterisk дождётся окончания всех разговоров и перезапустится сам. Для применения настроек из GUI перезапуск не нужен — хватает fwconsole reload.

Где хранятся записи разговоров FreePBX?

В каталоге /var/spool/asterisk/monitor/ с подкаталогами год/месяц/день. Формат по умолчанию WAV. Имя файла связано со звонком через колонку recordingfile в таблице asteriskcdrdb.cdr.

Почему не работает перевод звонка по ##?

Чаще всего не совпадает режим DTMF: у добавочного должен быть RFC 4733, и у телефона тоже. Проверь, что в Asterisk Dial Options есть буквы T и t. Проще всего научить людей кнопке Transfer на телефоне — она от DTMF не зависит.

Почему Follow Me не звонит на мобильный?

Внешний номер в списке Follow Me нужно писать с решёткой на конце: 89161234567#. Без неё FreePBX ищет внутренний добавочный с таким номером. Вторая частая причина — исходящий маршрут или провайдер не пропускают звонок с чужим CallerID.

Чем Follow Me отличается от переадресации?

Переадресация отправляет звонок на другой номер вместо рабочего телефона. Follow Me сначала звонит на рабочий, потом добавляет другие номера и умеет спрашивать подтверждение на мобильном. Для сотрудников, которые часто вне офиса, Follow Me удобнее.

Есть ли multicast paging в бесплатной FreePBX?

В бесплатном модуле Paging and Intercom — нет, он звонит на каждый телефон отдельно. Официально multicast делается в коммерческом Page Pro. Бесплатно можно настроить приложение Page с каналом MulticastRTP в extensions_custom.conf или кнопку multicast прямо на телефонах.

Нужно ли переходить на Debian 13 с FreePBX 17?

Нет. FreePBX 17 рассчитана на Debian 12 до конца поддержки в 2028 году. Debian 13 будет основой FreePBX 18, релиз которой запланирован на январь 2027.

Прогноз

Что сделали. Поставили FreePBX 17 официальным способом на Debian 12 со статическим адресом и чистыми репозиториями. Настроили NAT так, что звук идёт в обе стороны. Сделали входящую маршрутизацию с резервным маршрутом, переадресацию, Follow Me с подтверждением на мобильном и перевод звонка. Включили запись разговоров, разобрались, где она лежит и сколько весит, вынесли её на отдельный диск и поставили ротацию. Добавили multicast-оповещение без платного модуля.

Что теперь работает. АТС переживает перезагрузку, обновление и потерю диска с записями. Ты знаешь, какой перезапуск рвёт звонки, а какой нет. Транк и место на диске под мониторингом, а международные звонки закрыты до того, как ими кто-то воспользовался за твой счёт. Через год ты вспомнишь эту установку только потому, что ничего не случилось.

Не заработало?
Если что-то из этого не заработало — пиши в комментарии, разберёмся. Приложи версии FreePBX и Asterisk, что именно не работает и кусок лога /var/log/asterisk/full по проблемному звонку. С этим диагноз ставится быстро.

Андрей А.
Author: Андрей А.

25 years in IT — from a field engineer at MegaFon to head of department. I rebuild IT infrastructure that’s falling apart and turn it into something predictable. I know what chaos costs. I help businesses get out of a crisis: cleaning up legacy systems, stabilizing what’s breaking, and setting up processes you can actually plan around.

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх