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

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

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

RECORDING_IO_DISK_FULL IP-Телефония и СКУД

Запись разговоров MixMonitor в Asterisk и архивация в S3: настройка и скрипты

Обновлено: 24.08.2026 · Официальная документация ↗
  • Переполнение локального дискового раздела /var/spool/asterisk/monitor (100% Disk Space Used) и последующая остановка записи.
  • Высокая дисковая задержка (I/O Wait) при одновременной записи 100+ параллельных каналов в несжатом WAV.
  • Задержки при завершении звонка из-за синхронной постобработки аудиофайлов.
  • Поврежденные или нулевые аудиофайлы звонков при аварийной перезагрузке.

1. Настройка MixMonitor в extensions.conf

Используйте опцию b (запись только после ответа), v/V (нормализация громкости) и передачу пути к постобработчику через MixMonitor(...,b,command):

[sub-record-call]
exten => s,1,NoOp(Sub: Start Recording)
 same => n,Set(REC_DIR=/var/spool/asterisk/monitor/${STRFTIME(${EPOCH},,%Y/%m/%d)})
 same => n,ExecIf($["${STAT(d,${REC_DIR})}" != "1"]?System(mkdir -p ${REC_DIR}))
 same => n,Set(REC_FILE=${REC_DIR}/${UNIQUEID}_${CALLERID(num)}_${EXTEN}.wav)
 same => n,MixMonitor(${REC_FILE},b,/usr/local/bin/archive_call_s3.sh "^{REC_FILE}" "${UNIQUEID}")
 same => n,Return()

2. Скрипт постобработки и выгрузки в S3 (/usr/local/bin/archive_call_s3.sh)

#!/usr/bin/env bash
set -euo pipefail

WAV_FILE="$1"
UNIQUEID="$2"
MP3_FILE="${WAV_FILE%.wav}.mp3"
S3_BUCKET="s3://company-call-records"

# Проверка наличия файла
if [ ! -f "$WAV_FILE" ]; then
    exit 0
fi

# 1. Конвертация в компактный MP3 (mono, 32kbps)
lame -b 32 -m m --silent "$WAV_FILE" "$MP3_FILE"
rm -f "$WAV_FILE"

# 2. Асинхронная отправка в S3 (AWS CLI или MinIO Client)
S3_KEY=$(echo "$MP3_FILE" | sed 's|/var/spool/asterisk/monitor/||')
aws s3 cp "$MP3_FILE" "${S3_BUCKET}/${S3_KEY}" --quiet

# 3. Удаление локального файла после успешной загрузки
if [ $? -eq 0 ]; then
    rm -f "$MP3_FILE"
fi
chmod +x /usr/local/bin/archive_call_s3.sh

3. Ротация и очистка устаревших записей через Cron

Файл /etc/cron.daily/cleanup-recordings:

#!/bin/bash
# Удаление локальных временных файлов старше 7 дней
find /var/spool/asterisk/monitor/ -type f -mtime +7 -delete
find /var/spool/asterisk/monitor/ -type d -empty -delete
💡 Практика специалистов: Никогда не выполняйте ресурсоемкое кодирование LAME/FFmpeg синхронно в диалплане через функцию System(). Запуск конвертера допускается только в третьем аргументе MixMonitor, который исполняется в фоновом форке ОС.

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

В чем разница между Monitor и MixMonitor?

Устаревший Monitor записывает два раздельных файла (in/out) и склеивает их после завершения вызова с блокировкой потока. MixMonitor микширует оба аудиопотока на лету в режиме реального времени и выполняет пост-команду асинхронно в отдельном потоке.

Как записывать звонки на отдельный RAM-диск для снижения нагрузки на SSD?

Смонтируйте директорию временной записи в tmpfs: mount -t tmpfs -o size=2G tmpfs /var/spool/asterisk/monitor. Скрипт постобработки сконвертирует файл и отправит его в S3, мгновенно освобождая оперативную память.

Что произойдет, если в момент выгрузки в S3 пропадет интернет?

Скрипт должен проверять код возврата команды aws s3 cp. Если код не равен 0, файл не удаляется и перемещается в локальную папку очереди повторов (/var/spool/asterisk/failed_uploads/).

Как связать запись разговора в S3 с историей вызовов в базе данных CDR?

Используйте переменную UNIQUEID Asterisk в имени файла записи. В таблице cdr поле recordingfile или uniqueid будет содержать точный ключ для генерации временной Pre-Signed URL ссылки из S3 для прослушивания в CRM.

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