0

asterisk

Asterisk в контейнере Docker

05.02.2023

Asterisk — это бесплатный инструмент с открытым исходным кодом для создания/разработки коммуникационных приложений. Он был разработан Марком Спенсером из Digium в 1999 году . С 2018 года Asterisk является подразделением Sangoma Technologies Corporation. Первоначально он был создан для систем Linux, но в настоящее время работает на различных устройствах, таких как NetBSD, OpenBSD, FreeBSD, macOS и Solaris, а также может быть встроен в системы на основе OpenWrt.

Программное обеспечение Asterisk включает в себя множество функций и преимуществ, доступных для корпоративных и частных систем АТС. Он обеспечивает голосовую почту, конференц-связь, интерактивный голосовой ответ (меню телефона) и автоматическое распределение вызовов.

Поскольку Asterisk имеет открытый исходный код, пользователи могут получить доступ к коду и создать новые функции, написав сценарии плана нумерации на нескольких собственных языках расширений Asterisk, добавив пользовательские модули на C и PHP или внедрив программы Asterisk Gateway Interface (AGI) с использованием любого программирования. язык с возможностью общения с использованием потоков stdin и stdout.

В этом руководстве мы запустим Asterisk в контейнере Docker. Это связано с множеством функций и преимуществ, таких как:

  • PrivateDial, настраиваемая конфигурация Asterisk
  • AutoBan, встроенная система обнаружения и предотвращения вторжений
  • Asterisk поддерживает системы IP-АТС и шлюзы VoIP
  • Небольшой размер образа на основе Alpine Linux
  • Кроме того, предоставьте аудиокодеки G.729 и G.723.1.
  • Автоматическая интеграция сертификатов Let’s Encrypt LTS с использованием обратного прокси-сервера Traefik
  • Контейнер аудио с использованием импульсного сокета хоста
  • Журнал, направляемый демону докеров с настраиваемым уровнем
  • Небольшой размер образа на основе Alpine Linux
  • WebSMS, отправка и получение сообщений, SMS, через HTTP
  • Постоянное хранилище благодаря консолидации данных конфигурации и запуска в /srv

Предварительные требования для установки

В этом руководстве есть ряд необходимых приложений. Установите их с помощью команд:

## On RHEL/CentOS/RockyLinux 8
sudo yum update
sudo yum install curl git vim make

## On Debian/Ubuntu
sudo apt update && sudo apt upgrade -y
sudo apt install curl git vim make

## On Fedora
sudo dnf update
sudo dnf -y install curl git vim make

Вам также необходимо установить Docker в вашей системе. Для этого вы можете воспользоваться помощью, предоставленной в руководстве ниже:

Команды используются для установки Docker Compose:

curl -s https://api.github.com/repos/docker/compose/releases/latest | grep browser_download_url  | grep docker-compose-linux-x86_64 | cut -d '"' -f 4 | wget -qi -
chmod +x docker-compose-linux-x86_64
sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

Подтвердите установку:

$ docker-compose version
Docker Compose version v2.14.2

Добавьте своего пользователя в группу Docker:

sudo usermod -aG docker $USER
newgrp docker

Запустите и включите службу:

sudo systemctl start docker && sudo systemctl enable docker

Вам также необходимо установить Docker-compose:

№1. Настроить контейнер Asterisk

Прежде чем мы запустим контейнер, нам нужно загрузить необходимые файлы и внести необходимые изменения. Мы будем использовать git для клонирования репозитория, содержащего эти файлы:

git clone https://github.com/mlan/docker-asterisk.git

Перейдите в каталог:

cd docker-asterisk

Теперь у нас есть все необходимые файлы для этого развертывания. В этом руководстве мы будем использовать примеры конфигураций в демонстрационном каталоге.

mv demo deploy
cd deploy

Здесь у нас есть файл docker-compose.yml , который можно использовать для запуска примера SIP-сервера VoIP. В файле есть различные конфиги и переменные окружения. Вы можете открыть этот файл для редактирования:

vim docker-compose.yml

В файле вы можете иметь следующие переменные окружения:

ПеременнаяЗначение по умолчаниюОписание
SYSLOG_LEVEL4Уровень ведения журнала, от 0 до 8. 0 — наименьший, а 8 — максимальный вывод журнала.
WEBSMSD_PORT80Это порт веб-сервера PHP, используемый WebSMS. Неопределенный или нечисловой, отключит веб-сервер PHP.
ACME_FILE/acme/acme.jsonФайл, содержащий сертификаты TLS, предоставлен  Let’s encrypt  с использованием  Traefik .
ИМЯ ХОСТА$(имя хоста)Он используется для идентификации соответствующих сертификатов TLS в ACME_FILE.
TLS_CERTDAYS30Срок действия самоподписанного сертификата TLS в днях.
TLS_KEYBITS2048Длина самоподписанного ключа TLS в битах.
SYSLOG_OPTIONS-SDtS: меньший вывод, D: удаление дубликатов, t: удаление временных меток, созданных клиентом.

№ 2. Создайте постоянное хранилище для Asterisk

Постоянное хранилище используется для хранения данных для контейнера. В этом руководстве мы создадим хранилище с именем asterisk-conf для сохранения данных в каталоге /srv .

Мы создадим каталог с помощью команды:

sudo mkdir -p /data/asterisk-conf

Назначьте правильные разрешения:

sudo chmod 775 -R /data/asterisk-conf
sudo chown -R $USER:docker /data/asterisk-conf

Для систем на основе Rhel настройте SELinux:

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

Теперь e создаст том докера, используя указанный выше путь:

docker volume create --driver local \
     --opt type=none \
     --opt device=/data/asterisk-conf \
     --opt o=bind asterisk-conf 

После создания вы можете проверить его с помощью команды:

$ docker volume list
DRIVER    VOLUME NAME
local     asterisk-conf

Теперь мы изменим YAML-файл docker-compose и добавим external: true

$ vim docker-compose.yml
volumes:
  asterisk-conf:                                # Persistent storage
    external: true                                                       

№3. Запустите контейнер Asterisk

Теперь вы настроены на запуск контейнера с помощью файла YAML для создания докеров. В каталоге demo у нас также есть Makefile , который так важен в этом развертывании.

Установите инструменты сборки:

sudo apt install build-essential

Это упрощает управление контейнером и выполнение других команд. Для запуска контейнера воспользуемся командой:

make up

Пример вывода:

docker-compose up -d
[+] Running 13/13
 ⠿ tele Pulled                                                                          13.2s
   ⠿ c158987b0551 Pull complete                                                          1.5s
   ⠿ 390edeb6309b Pull complete                                                          2.1s
   ⠿ f9c34e7c3c9b Pull complete                                                          3.8s
   ⠿ 84dbb9a70c8b Pull complete                                                          4.4s
   ⠿ d507ed88ccf8 Pull complete                                                          4.7s
   ⠿ 947c68adf1a6 Pull complete                                                          5.0s
   ⠿ ebad4628becc Pull complete                                                          5.3s
   ⠿ d2548a783261 Pull complete                                                          5.6s
   ⠿ b7d2cd86d6d3 Pull complete                                                          7.9s
   ⠿ 74e1e4e2b334 Pull complete                                                          8.9s
   ⠿ 608c86894759 Pull complete                                                          9.3s
   ⠿ aeb618e023a5 Pull complete                                                         11.3s
[+] Running 1/1
 ⠿ Container demo-tele-1  Started                                                        8.8s

Чтобы проверить, запущен ли контейнер, используйте команду:

$ make ps
docker-compose ps
NAME                IMAGE               COMMAND                  SERVICE             CREATED              STATUS                        PORTS
demo-tele-1         mlan/asterisk       "docker-entrypoint.s…"   tele                About a minute ago   Up About a minute (healthy)   0.0.0.0:5060->5060/udp, :::5060->5060/udp, 0.0.0.0:5060-5061->5060-5061/tcp, 0.0.0.0:10000-10099->10000-10099/udp, :::5060-5061->5060-5061/tcp, :::10000-10099->10000-10099/udp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp

Вы также можете использовать обычную команду:

docker ps

Теперь у вас есть все файлы конфигурации Asterisk, хранящиеся по вашему пути:

$ ls /data/asterisk-conf/etc/
asterisk  nftables.d  ssl

Теперь мы можем разрешить эти порты через брандмауэр:

##For UFW
sudo ufw allow proto tcp from any to any port 5060,5061

##For Firewalld
sudo firewall-cmd --add-port=5060/tcp --permanent
sudo firewall-cmd --add-port=5061/tcp --permanent
sudo firewall-cmd --reload

Теперь мы настроены на использование Asterisk по желанию. Чтобы подключиться к интерфейсу командной строки (CLI) asterisk, работающему в контейнере, мы выполним:

make cli
##OR
docker-compose exec tele asterisk -rvvvddd

Пример вывода:

docker-compose exec tele asterisk -rvvvddd
Seeding global EID '02:42:ac:11:00:02' from 'eth0' using 'siocgifhwaddr'
Parsing /etc/asterisk/asterisk.conf
Asterisk 18.15.0, Copyright (C) 1999 - 2022, Sangoma Technologies Corporation and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 18.15.0 currently running on ec74230892b0 (pid = 252)
Parsing /etc/asterisk/logger.conf
Core debug was OFF and is now 3.
ec74230892b0*CLI> 

Теперь мы можем запускать обычные команды Asterisk. Например:

ec74230892b0*CLI> pjsip show auths    
    
  I/OAuth:  <AuthId/UserName.............................................................>
==========================================================================================

     Auth:  itsp:mydoe-oauth/username
     Auth:  jane.doe-iauth/jane.doe
     Auth:  john.doe-iauth/john.doe

Objects found: 3

ec74230892b0*CLI> 

Есть еще несколько команд, для их просмотра используйте команду:

ec74230892b0*CLI> help
!                              -- Execute a shell command
acl show                       -- Show a named ACL or list all named ACLs
aeap show client               -- Show AEAP client configuration by id
aeap show clients              -- Show all AEAP client configurations
agi dump html                  -- Dumps a list of AGI commands in HTML format
agi exec                       -- Add AGI command to a channel in Async AGI
agi set debug [on|off]         -- Enable/Disable AGI debugging
agi show commands [topic]      -- List AGI commands or specific help
aoc set debug                  -- enable cli debugging of AOC messages
bridge kick                    -- Kick a channel from a bridge
......

Для выхода введите:

c99cd82ef92f*CLI> exit
Asterisk cleanly ending (0).
Executing last minute cleanups
Asterisk ending (0).

№ 4. Управление контейнером Asterisk

Здесь мы можем управлять контейнером с помощью набора команд.

Чтобы запустить контейнер, используйте:

make start
##OR
docker-compose start

Чтобы остановить контейнер:

make stop
##OR
docker-compose stop

Чтобы увидеть конфигурацию:

make config
##OR
docker-compose config

Чтобы включить и отключить звук:

make sound_enable
make sound_disable

Для удаления контейнера используйте команду:

make down 
##OR
docker-compose down

Заключение.

Теперь мы успешно развернули контейнер Asterisk с помощью Docker. Вы можете сделать желаемые конфигурации в соответствии с вашими потребностями. Надеюсь, это было информативно.

Еще статьи:

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380