Установка Issabel 4 (2018)

Качаем отсюда 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/