Запись разговоров MixMonitor в Asterisk и архивация в S3: настройка и скрипты
- Переполнение локального дискового раздела
/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"
fichmod +x /usr/local/bin/archive_call_s3.sh3. Ротация и очистка устаревших записей через 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 Частые вопросы (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.