Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

504 Gateway Timeout IP-Телефония и СКУД

FreePBX: Долго грузится список CDR Reports (Решение проблемы)

Обновлено: 09.09.2026 · Официальная документация ↗

Архитектура логирования вызовов и деградация БД

Модуль CDR Reports (Call Detail Records) во FreePBX отвечает за отображение истории звонков. Со временем администраторы замечают, что страница CDR грузится очень долго (от 15 секунд до нескольких минут), а иногда отваливается с ошибкой 504 Gateway Timeout веб-сервера Apache/Nginx. Проблема кроется в движке базы данных MySQL (или MariaDB). Каждая запись о звонке дублируется в таблицу cdr и очень детально (каждый этап перевода звонка) в таблицу cel (Channel Event Logging). Когда таблицы разрастаются до миллионов строк, простые SQL-запросы на фильтрацию с использованием LIKE парализуют ядро СУБД. Бизнес-риски: невозможность расследовать инциденты, недоступность биллинга, 100% загрузка ЦП (mysqld) приводит к деградации качества голоса (RTP).

Анализ узких мест БД

ТаблицаНазначениеСкорость роста (за 100 звонков)
asteriskcdrdb.cdrБазовая запись: Кто, Кому, Длительность.~ 100-150 строк (зависит от переадресаций)
asteriskcdrdb.celДетальный трейс событий (ANSWER, HANGUP, BRIDGE).~ 800 - 1500 строк
ПроблемаОтсутствие составных SQL-индексов по полям calldate, src, dst.

Оптимизация базы данных Asterisk CDR

Сценарий 1: Добавление SQL-индексов в MySQL/MariaDB

Ускорение поиска путем индексирования столбцов, по которым FreePBX делает фильтрацию.

 1. Подключаемся к базе данных через SSH сервера FreePBX
mysql -u root
 2. Выбираем базу CDR
USE asteriskcdrdb;
 3. Создаем индексы для дат и номеров (Операция может занять 10-30 минут!)
ALTER TABLE cdr ADD INDEX (calldate);
ALTER TABLE cdr ADD INDEX (src);
ALTER TABLE cdr ADD INDEX (dst);
ALTER TABLE cel ADD INDEX (eventtime);
ALTER TABLE cel ADD INDEX (cid_num);

Сценарий 2: Очистка старых данных (Purge)

Нет смысла хранить логи CEL за 5 лет. Очистка старых событий разгрузит диск и ОЗУ.

 Удаление записей CEL старше 6 месяцев
DELETE FROM cel WHERE eventtime < DATE_SUB(NOW(), INTERVAL 6 MONTH);
 Удаление старых записей CDR (осторожно, согласуйте с бизнесом!)
DELETE FROM cdr WHERE calldate < DATE_SUB(NOW(), INTERVAL 1 YEAR);
 Оптимизация таблиц (сжатие пространства после удаления)
OPTIMIZE TABLE cdr;
OPTIMIZE TABLE cel;

Типовые ошибки администраторов

  • Движок MyISAM вместо InnoDB: Старые версии FreePBX создавали таблицы в формате MyISAM. При любом INSERT (новом звонке) MyISAM блокирует ВСЮ таблицу (Table-level lock). Если кто-то открыл CDR Reports — запись новых звонков в БД зависает. Обязательно мигрируйте таблицы в InnoDB (ALTER TABLE cdr ENGINE=InnoDB;).
  • Выгрузка CDR в Excel за весь период: Нажатие кнопки "Export to CSV" без указания узкого диапазона дат вызывает катастрофический расход ОЗУ демоном PHP, что убивает веб-интерфейс OOM-киллером.
База данных телефонии тормозит, а отчеты не строятся?
Тяжелые запросы к CDR могут положить продуктивную АТС. DBA-инженеры ITSTM настроят репликацию Master-Slave: Asterisk будет писать звонки локально, а тяжелые отчеты (и интеграции с CRM) будут безопасно формироваться на выделенном Slave-сервере баз данных.
💡 Практика специалистов: Практика ITSTM: При траблшутинге зависаний веб-морды FreePBX мы часто используем 'SHOW FULL PROCESSLIST;' в консоли MySQL. Это сразу показывает, какой именно фильтр (например, поиск по фрагменту CallerID через 'LIKE %number%') вызвал Full Table Scan и парализовал базу. Добавление FULLTEXT индексов решает эту проблему.

Частые вопросы (FAQ)

Можно ли полностью отключить CEL, чтобы не засорять базу?

В FreePBX CEL используется для корректной отрисовки графиков перевода звонков (Linkedid). Вы можете отключить его (Settings -> Advanced Settings -> Enable CEL Logging = False), но тогда сложные маршруты звонков в отчетах будут отображаться криво.

Как автоматизировать очистке старых CDR?

Настройте Cron. Создайте bash-скрипт с SQL-запросом DELETE (как описано выше) и добавьте его в /etc/crontab для выполнения раз в месяц ночью.

Почему после DELETE размер файла базы (ibdata1) не уменьшился?

В архитектуре InnoDB удаление строк не освобождает физическое место на диске операционной системы, а помечает блоки как свободные для новых записей. Чтобы физически ужать файл, нужна команда 'OPTIMIZE TABLE' (требует параметра innodb_file_per_table=1).

Влияет ли долгая загрузка CDR на сами звонки?

Прямо на прохождение аудио (RTP) - нет, так как Asterisk обрабатывает медиа в других потоках. Но 100% загрузка I/O диска процессом MySQL вызовет задержки в обработке SIP-сообщений (INVITE), что приведет к задержкам при наборе номера.

Полезные материалы
Рекомендуем