Качаем отсюда https://www.issabel.org ну или делаем так
Выбираем Asterisk 13.
запускаем установку , у меня на виртуалке HyperV 4 ядра Intel i3 и 4 Гб памяти (обычно показывает использование 3 Гб).
Добавляем
yum install hyperv-daemons
Запускаем SSH клиент или MobaXterm (Просто чума для админа)
Устанавливаем дополнения
yum install mailx yum install callcenter yum install openfire
Выставляем часовой пояс, русский язык — в меню Issabel — Система/Предпочтения
Настраиваем удаленный SMTP — в меню Issabel — Email/Удаленный SMTP
Перегружаемся, делаем резервную копию и обновляем Issabel
yum update
Идем пить кофе или пиво (по наличию 🙂
Во избежание некоторых проблем, запускаем кеширующий DNS
Запускаем не все, а только это:
yum -y install bind bind-utils bind-chroot systemctl start named-chroot systemctl enable named-chroot ln -s '/usr/lib/systemd/system/named-chroot.service' '/etc/systemd/system/multi-user.target.wants/named-chroot.service'
Редактируем
/var/named/chroot/etc/named.conf
options { listen-on port 53 { any; }; listen-on-v6 port 53 { none; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; allow-query { 127.0.0.1; 192.168.7.0/24; }; recursion yes; allow-recursion { 127.0.0.1; 192.168.7.0/24; }; forwarders { 8.8.8.8; }; version "DNS Server"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; dnssec-enable no; dnssec-validation no; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; logging { channel default_file { file "/var/log/named/default.log" versions 3 size 5m; severity dynamic; print-time yes; }; category default { default_file; }; };
Продолжаем
cd /var/named/chroot/var/log && mkdir named && chown named. named
Перечитываем конфигурацию named с помощью rndc:
rndc reconfig
systemctl restart named-chroot.service
проверяем
nslookup ya.ru 127.0.0.1
Если примерно следующее
Server: 127.0.0.1 Address: 127.0.0.1#53 Non-authoritative answer: Name: ya.ru Address: 87.250.250.242
то все нормально.
Меняем в настройках сетевых карт адреса DNS на 127.0.0.1
например, запустив
nmtui
Устанавливаем русские звуки
cd /var/lib/asterisk/sounds wget http://downloads.asterisk.org/pub/telephony/sounds/asterisk-core-sounds-ru-wav-current.tar.gz wget http://downloads.asterisk.org/pub/telephony/sounds/asterisk-extra-sounds-en-wav-current.tar.gz tar xvf asterisk-core-sounds-ru-wav-current.tar.gz tar xvf asterisk-extra-sounds-en-wav-current.tar.gz
для конвертации файлов из формата wav в mp3. Скачаем lame и установим.
cd /usr/src wget http://sourceforge.net/projects/lame/files/lame/3.98.4/lame-3.98.4.tar.gz tar zxvf lame-3.* cd lame-3.* ./configure make make install
Запускаем синхронизацию
systemctl start ntpd
Включаем синхронизацию по времени
systemctl enable ntpd
При звонке через sipnet выяснилось, что нет кодека g729 и g723, посмотреть список кодеков можно выполнив:
asterisk -rx "core show translation"
Устанавливаем с сайта http://asterisk.hosting.lv
Для моей виртуалки и 13 * подошел SSE4 x64
http://asterisk.hosting.lv/bin/codec_g723-ast130-gcc4-glibc-x86_64-core2-sse4.so
cd /usr/src wget http://asterisk.hosting.lv/bin/codec_g729-ast130-gcc4-glibc-core2.so mv codec_g729-ast130-gcc4-glibc-core2.so codec_g729.so cp codec_g729.so /usr/lib64/asterisk/modules asterisk -r *CLI> module load codec_g729.so
После этого если есть сообщение
Loaded codec_g729.so
То можно рестартовать астериск, если пишет ошибки, то нужно подбирать другую версию под проц
cat /proc/cpuinfo
и разрядность
uname -a
ОС.
service asterisk restart
Перенаправляем почту с записью разговоров на email.
Сначала выставляем параметры — Email — Удаленный SMTP, сохраняем и проходим тест.
добавляем подстановки для подмены адреса отправителя в /etc/postfix/generic, где asterisk@mydomain.ru — реальный почтовый ящик
asterisk@issabel.local asterisk@mydomain.ru root@issabel.local asterisk@mydomain.ru admin@mail.voip asterisk@mydomain.ru fail2ban@issabel.local asterisk@mydomain.ru root@localhost asterisk@mydomain.ru root@localhost.local asterisk@mydomain.ru root asterisk@mydomain.ru asterisk asterisk@mydomain.ru asterisk@local asterisk@mydomain.ru
на основе этого генерим db
postmap /etc/postfix/generic
Создаем файл /etc/postfix/recipient_bcc , где указываем куда должна уходить почта
1121@mail.voip support@MYREALMAIL1.ru 1111@mail.voip support@MYREALMAIL1.ru 1121@issabel.local support@MYREALMAIL1.ru 1111@issabel.local support@MYREALMAIL1.ru admin@mail.voip mail@MYREALMAIL2.ru root@issabel.local mail@MYREALMAIL2.ru asterisk@issabel.local support@MYREALMAIL1.ru
на основе этого генерим db
postmap /etc/postfix/recipient_bcc
Рихтуем /etc/postfix/main.cf
relay_domains = MYREALDOMAIN.ru virtual_transport = lmtp:unix:/var/lib/imap/socket/lmtp virtual_mailbox_domains = ,issabel.local,mail.voip myhostname = issabel.local mydomain = local relayhost = 194.85.88.247:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl/passwd smtp_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_tls_auth_only = no smtp_use_tls = no smtp_tls_note_starttls_offer = no smtpd_tls_loglevel = 2 smtpd_tls_received_header = no tls_random_source = smtp_tls_CAfile = ignore_mx_lookup_error = yes recipient_bcc_maps = hash:/etc/postfix/recipient_bcc smtp_generic_maps = hash:/etc/postfix/generic
194.85.88.247 — адрес mail.nic.ru, заставить работать удалось только указав IP
Рестартуем postfix
service postfix restart
Рихтуем файл /etc/asterisk/voicemail.conf для корректной отправки сообщений, в секцию [general] добавляем строку:
charset=UTF-8
Для доступа с сотового телефона к АТС, например используя Zoiper настраиваем OpenVPN, ну и необходимо пробросить порт через шлюз. OpenVPN настроен для доступа только к АТС.
Скачиваем озвучку с сайта http://downloads.asterisk.org/pub/telephony/sounds/
с префиксом -ru-
в каталог
/var/lib/asterisk/sounds
tar xfz **********
FESTIVAL — по умолчанию стоит русская версия 1.96 которая поддерживает русский язык. Попытка поменять ее на 2.5 пока не удалась, нужно убирать предыдущую.Разницы по качеству синтеза между версиями 1.96 и 2.5 нет никакой.
Ставим Festival, получил ошибку при make — error trying to exec ‘cc1plus’: execvp: No such file, поэтому сразу пофиксил:
yum install ncurses-devel
yum install gcc-c++
далее
cd /usr/src wget http://www.cstr.ed.ac.uk/downloads/festival/2.4/speech_tools-2.4-release.tar.gz wget http://www.cstr.ed.ac.uk/downloads/festival/2.4/festival-2.4-release.tar.gz wget http://www.cstr.ed.ac.uk/downloads/festival/2.4/festlex_CMU.tar.gz wget http://www.cstr.ed.ac.uk/downloads/festival/2.4/festlex_POSLEX.tar.gz wget http://www.cstr.ed.ac.uk/downloads/festival/2.4/festlex_OALD.tar.gz
Далее
tar zxvf festival-2.4-release.tar.gz tar zxvf speech_tools-2.4-release.tar.gz tar zxvf festlex_CMU.tar.gz tar zxvf festlex_POSLEX.tar.gz tar zxvf festlex_OALD.tar.gz cd speech_tools ./configure make make install cd .. cd festival ./configure make make install
Далее
export PATH=$PATH:/usr/src/festival/bin/
mkdir /usr/src/festival/lib/voices/ mkdir /usr/src/festival/lib/voices/russian/ cd /usr/src/ wget http://sourceforge.net/projects/festlang.berlios/files/msu_ru_nsh_clunits-0.5.tar.bz2
tar xjfv msu_ru_nsh_clunits-0.5.tar.bz2 mv /usr/src/msu_ru_nsh_clunits/ /usr/src/festival/lib/voices/russian
При попытке разхархивировать — вылезла ошибка, поэтому архив развернул на своем компе и запихнул в каталог
/usr/src/festival/lib/voices/russian/
ls /usr/src/festival/lib/voices/russian/msu_ru_nsh_clunits/ COPYING dict etc festival festvox lab lib mcep README wav
Изменяем файлы
/usr/src/festival/lib/languages.scm
/usr/src/festival/lib/siteinit.scm
Меняем /etc/asterisk/festival.conf
[general] host=localhost port=1314 usecache=yes cachedir=/var/lib/asterisk/festivalcache/ festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n
mkdir /var/lib/asterisk/festivalcache/ && chown asterisk:asterisk /var/lib/asterisk/festivalcache/
Прописал в /etc/rc.d/rc.local
service festival stop festival -b '(voice_msu_ru_nsh_clunits)' --server
Проверяем запуск
netstat -ln --program|grep 1314
Открываем /etc/asterisk/extensions_custom.conf
и в кодировке UTF-8 пишем
[from-internal-custom] exten = 1235,1,Festival('Привет. а у нас заработал фестиваль.') exten => 1235,n,Playback(demo-congrats) ; extensions can dial 1234 exten => 1235,n,Hangup() exten => h,1,Hangup() include => custom-recordme ; extensions can also dial 5678 include => weather-wakeup include => calendar-event include => conferences include => agentlogin
Звоним на номер 1235 и если услышим, то на этом все….
Без переустановки Festival
- Копируем содержимое архива msu_ru_nsh_clunits-0.5.tar.bz2 в каталог /usr/share/festival/lib/voices
- Добавляем в файл festival.scm в конце, если нет
;;; Command for Asterisk begin (define (tts_textasterisk string mode) "(tts_textasterisk STRING MODE) Apply tts to STRING. This function is specifically designed for use in server mode so a single function call may synthesize the string. This function name may be added to the server safe functions." (let ((wholeutt (utt.synth (eval (list 'Utterance 'Text string))))) (utt.wave.resample wholeutt 8000) (utt.wave.rescale wholeutt 5) (utt.send.wave.client wholeutt))) ;;; Command for Asterisk end
- Вставляем строку в файл /etc/festival/siteinit.scm
(set! voice_default 'voice_msu_ru_nsh_clunits) (provide 'siteinit)
- Редактируем файл /usr/share/festival/lib/languages.scm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;; ;;; Centre for Speech Technology Research ;; ;;; University of Edinburgh, UK ;; ;;; Copyright (c) 1996,1997 ;; ;;; All Rights Reserved. ;; ;;; ;; ;;; Permission is hereby granted, free of charge, to use and distribute ;; ;;; this software and its documentation without restriction, including ;; ;;; without limitation the rights to use, copy, modify, merge, publish, ;; ;;; distribute, sublicense, and/or sell copies of this work, and to ;; ;;; permit persons to whom this work is furnished to do so, subject to ;; ;;; the following conditions: ;; ;;; 1. The code must retain the above copyright notice, this list of ;; ;;; conditions and the following disclaimer. ;; ;;; 2. Any modifications must be clearly marked as such. ;; ;;; 3. Original authors' names are not deleted. ;; ;;; 4. The authors' names are not used to endorse or promote products ;; ;;; derived from this software without specific prior written ;; ;;; permission. ;; ;;; ;; ;;; THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK ;; ;;; DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ;; ;;; ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT ;; ;;; SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE ;; ;;; FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ;; ;;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN ;; ;;; AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ;; ;;; ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF ;; ;;; THIS SOFTWARE. ;; ;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Specification of voices and some major choices of synthesis ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; This should use some sort of database description for voices so ;;; new voices will become automatically available. ;;; (define (language_russian) "(language_russian) Set up language parameters for Russian." (set! male1 voice_msu_ru_nsh_clunits) (male1) (Parameter.set 'Language 'russian) ) (define (language_british_english) "(language_british_english) Set up language parameters for British English." (require 'voices) ;; Will get more elaborate, with different choices of voices in language (set! male1 voice_rab_diphone) (set! male2 voice_don_diphone) (if (symbol-bound? 'voice_gsw_diphone) (set! male3 voice_gsw_diphone)) (if (symbol-bound? 'voice_gsw_450) (set! male4 voice_gsw_450)) (male1) (Parameter.set 'Language 'britishenglish) ) (define (language_american_english) "(language_american_english) Set up language parameters for American English." (if (symbol-bound? 'voice_nitech_us_slt_arctic_hts) (set! female1 voice_nitech_us_slt_arctic_hts)) (if (symbol-bound? 'voice_nitech_us_bdl_arctic_hts) (set! male1 voice_nitech_us_bdl_arctic_hts)) (male1) (Parameter.set 'Language 'americanenglish) ) (define (language_scots_gaelic) "(language_scots_gaelic) Set up language parameters for Scots Gaelic." (error "Scots Gaelic not yet supported.") (Parameter.set 'Language 'scotsgaelic) ) (define (language_welsh) "(language_welsh) Set up language parameters for Welsh." (set! male1 voice_welsh_hl) (male1) (Parameter.set 'Language 'welsh) ) (define (language_castillian_spanish) "(language_spanish) Set up language parameters for Castillian Spanish." (voice_el_diphone) (set! male1 voice_el_diphone) (Parameter.set 'Language 'spanish) ) (define (select_language language) (cond ((or (equal? language 'americanenglish) (equal? language 'english)) ;; it may not be the *real* English (language_american_english)) ;; but at least it's supported without ;; non-free add-ons. ((equal? language 'britishenglish) (language_british_english)) ((equal? language 'scotsgaelic) (language_russian)) ((equal? language 'russian) (language_scots_gaelic)) ((equal? language 'welsh) (language_welsh)) ((equal? language 'spanish) (language_castillian_spanish)) ((equal? language 'klingon) (language_klingon)) (t (print "Unsupported language, using English") (language_american_english)))) (defvar language_default language_russian) (provide 'languages)
Меняем /etc/asterisk/festival.conf
[general] host=localhost port=1314 usecache=yes cachedir=/var/lib/asterisk/festivalcache/ festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n
mkdir /var/lib/asterisk/festivalcache/ && chown asterisk:asterisk /var/lib/asterisk/festivalcache/
Открываем /etc/asterisk/extensions_custom.conf
и в кодировке UTF-8 пишем
[from-internal-custom] exten = 1235,1,Festival('Привет. а у нас заработал фестиваль.') exten => 1235,n,Playback(demo-congrats) ; extensions can dial 1234 exten => 1235,n,Hangup() exten => h,1,Hangup() include => custom-recordme ; extensions can also dial 5678 include => weather-wakeup include => calendar-event include => conferences include => agentlogin
Звоним на номер 1235 и если услышим, то на этом все….
Добавим возможность звонить через +7
для этого добавляем в файл /etc/asterisk/extensions_custom.conf
в секции [from-internal-custom] в самый конец
exten => _+7XXXXXXXXXX,1,GoTo(outbound-allroutes,8${EXTEN:2},1)
Проверяем после reload
Для создания архива записанных сообщений копирую файлы через скрипт WinSCP, запускаемый планировщиком. Скрипт выглядит примерно так:
@echo off "C:\Program Files (x86)\WinSCP\WinSCP.com" ^ /log="C:\Users\836D~1\Desktop\SYNHRO~1\WinSCP.log" /ini=nul ^ /command ^ "open sftp://root:PASSWORD@192.168.192.168/ -hostkey=""ssh-ed25519 256 63:fd:6e:62:c8:e2:db:1b:27:a3:3f:d1:a6:0a:96:8b""" ^ "synchronize -criteria=size -transfer=binary local E:\HttpServer\Voip\ /var/spool/asterisk/monitor/" ^ "exit" set WINSCP_RESULT=%ERRORLEVEL% if %WINSCP_RESULT% equ 0 ( echo Success ) else ( echo Error ) exit /b %WINSCP_RESULT%
в папке E:\HttpServer\Voip будет зеркальная копия сообщений, скопированных из
/var/spool/asterisk/monitor/
Таким же образом копируется архив с ежедневными файлами резервного копирования настроек из каталога /var/www/backup/