Дополнительная информация

Установка Linux Ubuntu 21.10

Следуя этой инструкции, вы установите Ubuntu Linux 21.10, как единственную операционную систему, в автоматическом режиме, с удалением всех предыдущих данных с жесткого диска компьютера.

ШАГ 1. Для установки Ubuntu Linux 21.10 перейдите на официальный сайт: https://ubuntu.com/ и скачайте установочный ISO-образ версии 21.10 на вкладке Download. Сохраните его на внешнем диске или флешке. Вес установочного образа 2,9 ГБ.

Страница загрузки Ubuntu

ШАГ 2. Запишите установочный ISO-образ на внешний носитель: USB-флешку или диск.

Важно

при записи ISO-образа используйте специализированные программы. Например:

  • запись на USB-флешку: Etcher, WinSetupFromUSB
  • запись на диск: Brasero, kb3

Пример записи ISO-образа

Рисунок 1 - Пример записи ISO-образа при помощи программы WinSetupFromUSB

1 – Указать USB-флешку или диск
2 – Выбрать место размещения ISO-образа
3 – Проставить чекбокс в строке «Linux ISO/Other Grub4dos compatible ISO»

ШАГ 3. Загрузка с внешнего носителя.

Укажите в BIOS свой носитель (USB-флешка или диск) на первое место в порядке загрузки устройств. Для этого в начале загрузки компьютера нажмите клавишу DEL или F2, и войдите в BIOS. Возможно, на некоторых устройствах понадобится нажать клавиши F8 или F11, в зависимости от типа материнской платы.

На вкладке «Boot» выберите загрузку со своего носителя. Вставьте флешку в компьютер и нажмите «Ввод».

Boot-меню с выбором источника загрузки

Рисунок 2 - Пример boot-меню с выбором флешки в качестве источника загрузочных данных

Из появившегося списка выберите Ubuntu (safe graphics).

Выбор Ubuntu (safe graphics)

В стартовом окне установки выберите язык установки и вариант Install Ubuntu.

Стартовое окно установки Ubuntu

Выберите раскладку клавиатуры, нажмите кнопку Продолжить.

Далее выберите режим установки и снова нажмите кнопку Продолжить.

Выбор режима установки

Выберите тип установки:

Выбор типа установки

Подтвердите свое согласие на внесение изменений на диск, нажав кнопку Продолжить.

Подтверждение изменений на диске

Шаг 4 – Выбор часового пояса

Выберите свой часовой пояс, нажмите кнопку Продолжить.

Выбор часового пояса

Шаг 5 – Создание учетной записи пользователя.

Создайте учетную запись, под которой вы будете работать. Нажатие на кнопку Продолжить запустит установку ОС.

Создание учетной записи пользователя

Дождитесь окончания установки. Перезагрузите компьютер, как указано в инфо-сообщении.

Завершение установки Ubuntu

Теперь вы можете пользоваться OS Linux Ubuntu.

Рабочий стол Ubuntu

Контейнеры Mediaproxy и Openresty

Для корректной работы системы необходимо, чтобы openresty имел доступ к записям трафика, сделаным mediaproxy. Для этого нужно создать общие volumes для директорий на mediaproxy и openresty.

Сервис mediaproxy ведет логирование внутренней работы, этот лог пишется во внутреннюю директорию контейнера "/opt/mp/logs". Также mediaproxy в некоторых случаях ведет запись медиа трафика. Файлы с трафиком кладутся во внутренние директории контейнера.

Openresty отвечает за доступ к записям разговора, используется сервисом распознавания речи и категоризации.

Примечание

Работа контейнеров Mediaproxy и Openresty предусмотрена в пользовательском файле docker-compose.yml. Дополнительных действий по запуску контейнеров и созданию volumes производить не требуется.

Дополнительную информацию по созданию volumes можно получить по ссылке https://docs.docker.com/storage/volumes/.


Данный образ базируется на centos:7, содержит в себе сервис mediaproxy и все необходимые зависимости. Mediaproxy отвечает за отправку медиа трафика, получение медиа трафика, проигрывание медиа контента, детектирование dtmf, запись разговоров и т.д. При размещении сервиса в сети клиента, можно не выпускать голосовой трафик внутренних звонков из клиентской сети, что повышает безопасность.



Данный образ базируется на openresty/openresty:1.19.9.1-1-centos7. Содержит в себе сервис openresty и все необходимые зависимости. Openresty отвечает за доступ к записям разговора, используется сервисом распознавания речи и категоризации.


HEALTHCHECK

Создаваемая команда Healthcheck — это способ проверки рабочего состояния ресурса. Он определяет состояние запущенного в Docker контейнера.

Healthcheck определяет возможность тестирования контейнера, чтобы убедиться в его работоспособности. Docker без Healthcheck не сможет определить, действительно ли запущены работающие в контейнере службы.

В контейнере mediaproxy реализована проверка зависания основного потока приложения. Интервалы проверки можно параметризовать, но есть особенность. Внутри приложения запущен таймер, который обновляет состояние приложения. Также сам HEALTHCHECK имеет таймер, по которому производится запуск скрипта проверки. Из-за неточности таймеров время обновления состояния приложения должно быть немного меньше времени вызова HEALTHCHECK скрипта.

Примечание

Работа контейнера предусмотрена в пользовательском файле docker-compose.yml. Дополнительных действий по запуску контейнера производить не требуется.

Для параметризации таймера внутри приложения используется переменная окружения ENV_HEALTHCHECK_INTERVAL.

Для параметризации самого HEALTHCHECK используются стандартные переменные: --interval, --timeout, --start-period, --retries.

В контейнере openresty HEALTHCHECK используется для очистки зависших записей разговоров. Каждые 5 минут запускается скрипт, который находит старые записи и удаляет. Для настройки времени жизни файлов используется переменная окружения «ENV_FILES_LIFETIME». При использовании docker-compose, для параметризации можно использовать переменную окружения из environment file «FILES_LIFETIME_1».

По умолчанию «ENV_FILES_LIFETIME» имеет значение 1440 секунд (24 часа). Рекомендуется оставлять этот параметр по умолчанию, так как 24 часа — это максимальное время, в течение которого сервисы MANGO OFFICE будут пытаться скачать записи повторно (при необходимости обработки записей в ВАТС либо в случае первоначального неудачного скачивания).

Дополнительную информацию можно получить по ссылке https://docs.docker.com/engine/reference/builder/#healthcheck.

Willfarrell

Если контейнер по какой-либо причине неработоспособен, его необходимо перезапустить.

Контейнер willfarrell/autoheal регулярно проверяет контейнеры на работоспособность и перезапускает те, что находятся в статусе unhealthy.

Примечание

Работа контейнера предусмотрена в пользовательском файле docker-compose.yml. Дополнительных действий по запуску контейнера производить не требуется.

Дополнительную информацию можно получить по ссылке https://github.com/willfarrell/docker-autoheal.

Docker compose file

Для развертывания внешнего (пользовательского) Media Proxy, пользователю предоставляются docker compose.

Docker Compose File предоставляется в Личном кабинете ВАТС (docker-compose.yml) и представляет из себя шаблон, который можно параметризовать с помощью переменных окружения. Переменные окружения прописываются в отдельном файле, который передается как --env-file=<path/to/file> при запуске Docker Compose.

Docker Compose File запускает четыре контейнера:

  • Mediaproxy
  • Openresty
  • Autoheal
  • Watchtower

Если вам необходимо запустить несколько экземпляров mediaproxy - нужно отредактировать docker-compose.yml и environment file.


version: "3.8"
        
        services:
            mediaproxy_1:
                image: ${URL_DOCKER_REGISTR}/mediaproxy/mediaproxy:latest
                container_name: ${MEDIAPROXY_CONTAINER_NAME_1}
                restart: always
                network_mode: "host"
                environment:
                    - ENV_INSTANCE_ID=${INSTANCE_ID_1}
                    - ENV_INTERNAL_IP_ADDRESS=${INTERNAL_IP_ADDRESS_1}
                    - ENV_INTERNAL_PORT_START=${INTERNAL_PORT_START_1}
                    - ENV_INTERNAL_PORT_END=${INTERNAL_PORT_END_1}
                    - ENV_EXTERNAL_IP_ADDRESS=${EXTERNAL_IP_ADDRESS_1}
                    - ENV_PUBLIC_EXTERNAL_IP_ADDRESS=${PUBLIC_EXTERNAL_IP_ADDRESS_1}
                    - ENV_EXTERNAL_PORT_START=${EXTERNAL_PORT_START_1}
                    - ENV_EXTERNAL_PORT_END=${EXTERNAL_PORT_END_1}
                    - ENV_NGINX_URL_BASE=${NGINX_URL_BASE_1}
                    - ENV_NGINX_URL_ALTER=${NGINX_URL_ALTER_1}
                    - ENV_LOGIN_FROM_PERSONAL_ACCOUNT=${LOGIN_FROM_PERSONAL_ACCOUNT}
                    - ENV_URL_INTEGRATION_API=${URL_INTEGRATION_API}
                depends_on:
                    - openresty_1
                volumes:
                    - type: volume
                      source: mediaproxy_logs
                      target: /opt/mp/logs/
                    - type: bind
                      source: ${BASE_PATH_RECORDS_1}
                      target: /opt/mp/tmp/record/
                    - type: bind
                      source: ${ALTER_PATH_RECORDS_1}
                      target: /opt/mp/tmp/reserve/
                deploy:
                    resources:
                        limits:
                            cpus: '2'
                            memory: 300M
                        reservations:
                            cpus: '0.5'
                            memory: 150M
            openresty_1:
                image: ${URL_DOCKER_REGISTR}/mediaproxy/openresty:latest
                container_name: ${OPENRESTY_CONTAINER_NAME_1}
                restart: always
                environment:
                    - ENV_FILES_LIFETIME=${FILES_LIFETIME_1:-1440}
                ports:
                    - "${NGINX_IP_PORT_1:-443}:443"
                volumes:
                    - type: bind
                      source: ${BASE_PATH_RECORDS_1}
                      target: /opt/mediaproxy/tmp/record/
                    - type: bind
                      source: ${ALTER_PATH_RECORDS_1}
                      target: /opt/mediaproxy/reserve/
            autoheal:
                image: willfarrell/autoheal
                restart: always
                environment:
                    - AUTOHEAL_CONTAINER_LABEL=all
                volumes:
                    - type: bind
                      source: /var/run/docker.sock
                      target: /var/run/docker.sock
            watchtower:
                image: containrrr/watchtower
                restart: always
                environment:
                    - REPO_USER=${LOGIN_FROM_PERSONAL_ACCOUNT}
                    - REPO_PASS=${PASSWORD_FROM_PERSONAL_ACCOUNT:-media-proxy}
                volumes:
                    - type: bind
                      source: /var/run/docker.sock
                      target: /var/run/docker.sock
                command: --interval 30 --cleanup ${MEDIAPROXY_CONTAINER_NAME_1} ${OPENRESTY_CONTAINER_NAME_1}
        volumes:
            mediaproxy_logs:
        
        

Для запуска дополнительного экземпляра mediaproxy нужно скопировать секцию «mediaproxy_1» и «openresty_1», так как для корректной работы mediaproxy необходим запуск двух контейнеров: mediaproxy и openresty.

Изменить название «mediaproxy_1» на «mediaproxy_2», «openresty_1» на «openresty_2». Также нужно изменить «depends_on» для «mediaproxy_2»: данный контейнер будет уже зависеть от «openresty_2». Для того, чтобы новый экземпляр корректно работал, необходимо еще изменить параметризацию переменных окружения.

Пример команды

INSTANCE_ID_1 -> INSTANCE_ID_2
        INTERNAL_IP_ADDRESS_1 -> INTERNAL_IP_ADDRESS_2
        

Важно

При параметризации Docker Compose File можно для нескольких экземпляров использовать одну переменную из environment file. Например, если вы хотите использовать одну директорию для записей разговоров или один IP address, но есть ограничения, - вы не можете использовать одинаковые значения для MEDIAPROXY_CONTAINER_NAME, OPENRESTY_CONTAINER_NAME, ENV_INSTANCE_ID, ENV_INTERNAL_PORT_START, ENV_INTERNAL_PORT_END, ENV_EXTERNAL_PORT_START, ENV_EXTERNAL_PORT_END.

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

watchtower:
            image: containrrr/watchtower
            restart: always
            environment:
                - REPO_USER=${LOGIN_FROM_PERSONAL_ACCOUNT}
                - REPO_PASS=${PASSWORD_FROM_PERSONAL_ACCOUNT:-media-proxy}
            volumes:
                - type: bind
                  source: /var/run/docker.sock
                  target: /var/run/docker.sock
            command: --interval 30 --cleanup ${MEDIAPROXY_CONTAINER_NAME_1} ${MEDIAPROXY_CONTAINER_NAME_2} {OPENRESTY_CONTAINER_NAME_1} ${OPENRESTY_CONTAINER_NAME_2}
        

Для того, чтобы добавить N экземпляров, необходимо N раз выполнить описанное выше.



version: "3.8"
        services:
            mediaproxy_1:
                image: ${URL_DOCKER_REGISTR}/mediaproxy/mediaproxy:latest
                container_name: ${MEDIAPROXY_CONTAINER_NAME_1}
                restart: always
                network_mode: "host"
                environment:
                    - ENV_INSTANCE_ID=${INSTANCE_ID_1}
                    - ENV_INTERNAL_IP_ADDRESS=${INTERNAL_IP_ADDRESS_1}
                    - ENV_INTERNAL_PORT_START=${INTERNAL_PORT_START_1}
                    - ENV_INTERNAL_PORT_END=${INTERNAL_PORT_END_1}
                    - ENV_ PUBLIC_EXTERNAL_IP_ADDRESS=${PUBLIC_EXTERNAL_IP_ADDRESS_1}
                    - ENV_EXTERNAL_IP_ADDRESS=${EXTERNAL_IP_ADDRESS_1}
                    - ENV_EXTERNAL_PORT_START=${EXTERNAL_PORT_START_1}
                    - ENV_EXTERNAL_PORT_END=${EXTERNAL_PORT_END_1}
                    - ENV_NGINX_URL_BASE=${NGINX_URL_BASE_1}
                    - ENV_NGINX_URL_ALTER=${NGINX_URL_ALTER_1}
                    - ENV_LOGIN_FROM_PERSONAL_ACCOUNT=${LOGIN_FROM_PERSONAL_ACCOUNT}
                depends_on:
                    - openresty_1
                volumes:
                    - type: volume
                      source: mediaproxy_logs
                      target: /opt/mp/logs/
                    - type: bind
                      source: ${BASE_PATH_RECORDS_1}
                      target: /opt/mp/tmp/record/
                    - type: bind
                      source: ${ALTER_PATH_RECORDS_1}
                      target: /opt/mp/tmp/reserve/
                deploy:
                    resources:
                        limits:
                            cpus: '2'
                            memory: 300M
                        reservations:
                            cpus: '0.5'
                            memory: 150M
            openresty_1:
                image: ${URL_DOCKER_REGISTR}/mediaproxy/openresty:latest
                container_name: ${OPENRESTY_CONTAINER_NAME_1}
                restart: always
                environment:
                    - ENV_FILES_LIFETIME=${FILES_LIFETIME_1:-1440}
                ports:
                    - "443:443"
                volumes:
                    - type: bind
                      source: ${BASE_PATH_RECORDS_1}
                      target: /opt/mediaproxy/tmp/record/
                    - type: bind
                      source: ${ALTER_PATH_RECORDS_1}
                      target: /opt/mediaproxy/reserve/
            mediaproxy_2:
                image: ${URL_DOCKER_REGISTR}/mediaproxy/mediaproxy:latest
                container_name: ${MEDIAPROXY_CONTAINER_NAME_2}
                restart: always
                network_mode: "host"
                environment:
                    - ENV_INSTANCE_ID=${INSTANCE_ID_2}
                    - ENV_INTERNAL_IP_ADDRESS=${INTERNAL_IP_ADDRESS_2}
                    - ENV_INTERNAL_PORT_START=${INTERNAL_PORT_START_2}
                    - ENV_INTERNAL_PORT_END=${INTERNAL_PORT_END_2}
                    - ENV_ PUBLIC_EXTERNAL_IP_ADDRESS=${PUBLIC_EXTERNAL_IP_ADDRESS_2}
                    - ENV_EXTERNAL_IP_ADDRESS=${EXTERNAL_IP_ADDRESS_2}
                    - ENV_EXTERNAL_PORT_START=${EXTERNAL_PORT_START_2}
                    - ENV_EXTERNAL_PORT_END=${EXTERNAL_PORT_END_2}
                    - ENV_NGINX_URL_BASE=${NGINX_URL_BASE_2}
                    - ENV_NGINX_URL_ALTER=${NGINX_URL_ALTER_2}
                    - ENV_LOGIN_FROM_PERSONAL_ACCOUNT=${LOGIN_FROM_PERSONAL_ACCOUNT}
                depends_on:
                    - openresty_2
                volumes:
                    - type: volume
                      source: mediaproxy_logs
                      target: /opt/mp/logs/
                    - type: bind
                      source: ${BASE_PATH_RECORDS_2}
                      target: /opt/mp/tmp/record/
                    - type: bind
                      source: ${ALTER_PATH_RECORDS_2}
                      target: /opt/mp/tmp/reserve/
                deploy:
                    resources:
                        limits:
                            cpus: '2'
                            memory: 300M
                        reservations:
                            cpus: '0.5'
                            memory: 150M
            openresty_2:
                image: ${URL_DOCKER_REGISTR}/mediaproxy/openresty:latest
                container_name: ${OPENRESTY_CONTAINER_NAME_2}
                restart: always
                environment:
                    - ENV_FILES_LIFETIME=${FILES_LIFETIME_2:-1440}
                ports:
                    - "444:443"
                volumes:
                    - type: bind
                      source: ${BASE_PATH_RECORDS_2}
                      target: /opt/mediaproxy/tmp/record/
                    - type: bind
                      source: ${ALTER_PATH_RECORDS_2}
                      target: /opt/mediaproxy/reserve/
            autoheal:
                image: willfarrell/autoheal
                restart: always
                environment:
                    - AUTOHEAL_CONTAINER_LABEL=all
                volumes:
                    - type: bind
                      source: /var/run/docker.sock
                      target: /var/run/docker.sock
            watchtower:
                image: containrrr/watchtower
                restart: always
                environment:
                    - REPO_USER=${LOGIN_FROM_PERSONAL_ACCOUNT}
                    - REPO_PASS=${PASSWORD_FROM_PERSONAL_ACCOUNT:-media-proxy}
                volumes:
                    - type: bind
                      source: /var/run/docker.sock
                      target: /var/run/docker.sock
                command: --interval 30 --cleanup ${MEDIAPROXY_CONTAINER_NAME_1} ${MEDIAPROXY_CONTAINER_NAME_2} ${OPENRESTY_CONTAINER_NAME_1} ${OPENRESTY_CONTAINER_NAME_2}
        volumes:
            mediaproxy_logs:
        

Важно

mediaproxy_logs является общим для обоих mediaproxy. Внутри логи разделяются по папке, заданной в переменной:
INSTANCE_ID_1
INSTANCE_ID_2


Environment file

Это обычный текстовый файл, который содержит информацию о переменных окружения и их значениях. Предназначен для предварительной настройки и запуска клиентского Media Proxy.

Указанные переменные позволяют настроить Docker Compose File. В момент запуска Docker Compose с параметром --env-file=<path/to/file> из файла вычитываются переменные окружения и подставляются в Docker Compose File.

Описание переменных:

MEDIAPROXY_CONTAINER_NAME_1 - Название контейнера mediapoxy. Необходимо для корректного обращения к контейнеру (отключает генерацию имени контейнера средствами Docker Compose).

Где взять? Установлено в шаблоне, скачиваемом в ЛК, изменять не рекомендуется. (Исключение: если вы являетесь опытным администратором и точно знаете, что делаете).

OPENRESTY_CONTAINER_NAME_1 - Название контейнера openresty. Необходимо для корректного обращения к контейнеру (отключает генерацию имени контейнера средствами Docker Compose).

Где взять? Установлено в шаблоне, скачиваемом в ЛК, изменять не рекомендуется. (Исключение: если вы являетесь опытным администратором и точно знаете, что делаете).

INSTANCE_ID_1 - Идентификатор экземпляра. Используется для разграничения нескольких экземпляров mediaproxy на одной машине. Если на одной машине развернуто несколько экземпляров mediaproxy, то идентификаторы не должны пересекаться (переменная окружения ENV_INSTANCE_ID).

Где взять? Установлено в шаблоне, скачиваемом в ЛК. Если на машине развернут один экземпляр mediaproxy, параметр изменять не рекомендуется. Если развернуто два экземпляра, рекомендуется использовать параметр из Примера заполнения docker-environment.txt для двух медиапрокси.

INTERNAL_IP_ADDRESS_1 - Внутренний IP-адрес (адрес внутри сети клиента). Этот адрес будет использоваться для внутренних вызовов для обслуживания RTP-потоков внутри сети клиента (переменная окружения ENV_INTERNAL_IP_ADDRESS).

Где взять? Чтобы узнать свой внутренний IP, в приложении «Terminal» введите команду:

$ sudo ifconfig
        

В результате вы получите пакет данных, в котором содержится внутренний IP:

Вывод команды ifconfig

INTERNAL_PORT_START_1 - Начало диапазона внутренних портов (порты внутри сети клиента). Эти порты будут использоваться для внутренних вызовов (переменная окружения ENV_INTERNAL_PORT_START). Рекомендуемый диапазон на один экземпляр media proxy не менее 300 внутренних портов.

Где взять? В шаблоне, скачиваемом в ЛК это значение уже задано. Его можно изменить, например, если порт уже занят.

INTERNAL_PORT_END_1 - Конец диапазона внутренних портов (порты внутри сети клиента). Эти порты будут использоваться для внутренних вызовов (переменная окружения ENV_INTERNAL_PORT_END).

Где взять? В шаблоне, скачиваемом в ЛК это значение уже задано. Его можно изменить, например, если порт уже занят.

PUBLIC_EXTERNAL_IP_ADDRESS_1 - Публичный внешний IP-адрес (адрес доступный из сети интернет). Этот адрес будет использоваться для внешних вызовов для обслуживания RTP-потоков за пределами сети клиента (переменная окружения ENV_PUBLIC_EXTERNAL_IP_ADDRESS).

Где взять: Применяется в случае статического NAT на “локальный внешний IP-адрес” (должен быть настроен полный маппинг портов один к одному). По умолчанию принимается значение параметра “локальный внешний IP-адрес”.

EXTERNAL_IP_ADDRESS_1 - Локальный внешний IP-адрес (адрес доступный из сети интернет). Этот адрес будет использоваться для внешних вызовов для обслуживания RTP-потоков за пределами сети клиента (переменная окружения ENV_EXTERNAL_IP_ADDRESS).

Где взять? Узнать свой внешний IP-адрес можно в открытых интернет-источниках, например https://2ip.ru/.

EXTERNAL_PORT_START_1 - Начало диапазона внешних портов (порты доступные из сети интернет). Эти порты будут использоваться для внешних вызовов (переменная окружения ENV_EXTERNAL_PORT_START). Рекомендуемый диапазон на один экземпляр media proxy не менее 150 внешних портов.

Где взять? В файле, скачиваемом в ЛК это значение уже задано. Его можно изменить, например, если порт уже занят.

EXTERNAL_PORT_END_1 - Конец диапазона внешних портов (порты доступные из сети интернет). Эти порты будут использоваться для внешних вызовов (переменная окружения ENV_EXTERNAL_PORT_END).

Где взять? В файле, скачиваемом в ЛК это значение уже задано. Его можно изменить, например, если порт уже занят.

NGINX_IP_PORT_1 - Порт/адрес:порт для взаимодействия с nginx. Данный порт/адрес:порт должен быть доступен из интернета.

Где взять? В файле, скачиваемом в ЛК это значение уже задано, по умолчанию 443 - https.

NGINX_URL_BASE_1 - URL для получения записи разговора. Используется для получения записи разговора сервисом распознавания речи и категоризации (переменная окружения ENV_NGINX_URL_BASE).

Где взять? Параметр равен https://X.X.X.X Где X.X.X.X это PUBLIC_EXTERNAL_IP_ADDRESS_1.

NGINX_URL_ALTER_1 - Альтернативный URL для получения записи разговора (используется при отсутствии места по адресу из пункта 8). Используется для получения записи разговора сервисом распознавания речи и категоризации (переменная окружения ENV_NGINX_URL_ALTER).

Где взять? Параметр равен https://X.X.X.X Где X.X.X.X это PUBLIC_EXTERNAL_IP_ADDRESS_1.

BASE_PATH_RECORDS_1 – имя папки на хосте, куда будут помещаться записи медиа трафика.

Где взять? Использовать свой путь к директории.

ALTER_PATH_RECORDS_1 – имя папки на хосте, куда будут помещаться записи медиа трафика. Используется при отсутствии места в директории BASE_PATH_RECORDS_1.

Где взять? Использовать свой путь к директории.

URL_INTEGRATION_API - Внешний https url (адрес доступный из сети интернет) web-сервиса Interation API, который используется для коммуникации с внутренними сервисами MANGO. Параметр опционален, если опущен, то используется “integrationapi.mango-office.ru”.

Где взять? Предоставляется MANGO. В файле, скачиваемом в ЛК это значение уже задано.

LOGIN_FROM_PERSONAL_ACCOUNT - Логин из настроек в личном кабинете. Данный логин используется для аутентификации пользователя и получения конфигурации для mediaproxy (переменная окружения ENV_LOGIN_FROM_PERSONAL_ACCOUNT).

Где взять? Уникальный ключ авторизации, предоставляется MANGO OFFICE.

PERCENT_FREE_DISK_SPACE - Лимит свободного места на диске (в процентах). При достижении указанного порога запись медиа-трафика переключается на альтернативный каталог (ALTER_PATH_RECORDS_1). Если альтернативный каталог также исчерпан, запись останавливается.

Где взять? Параметр задаётся пользователем самостоятельно. Значение зависит от доступного дискового пространства на сервере клиента. Рекомендуемое значение по умолчанию — 5.

ENABLE_CURL_VERBOSE_LOG - Признак расширенного логирования HTTPS-подключений к integration_api. При включении записывает отладочную информацию HTTP/TLS в логи MediaProxy. Используется для диагностики сетевых и TLS-проблем.

Где взять? Параметр задаётся пользователем самостоятельно. Значение рекомендуется включать только при необходимости диагностики. Возможные значения: true / false. По умолчанию отсутствует (рассматривается как false).

OVERRIDE_CA_SERT_DIR - Путь к директории на хосте, в которой расположен файл корневого сертификата или сертификатный bundle для верификации подключения к integration_api при работе через on-premises HTTPS Proxy.

Где взять? Параметр задаётся пользователем. Значение определяется инфраструктурой клиента (путь до CA сертификата на его сервере). Используется совместно с переменной OVERRIDE_CA_SERT_FILENAME.

OVERRIDE_CA_SERT_FILENAME - Имя файла корневого сертификата или bundle используемого при верификации TLS-соединений с integration_api. Сертификат должен находиться в каталоге, указанном в OVERRIDE_CA_SERT_DIR.

Где взять? Параметр задаётся пользователем. Значение определяется инфраструктурой клиента (имя сертификата или сертификатного bundle). Используется совместно с переменной OVERRIDE_CA_SERT_DIR.

PREMISES_DB_PASSWORD - параметр не используется и должен быть пустым.

PASSWORD_FROM_PERSONAL_ACCOUNT - Используется Watchtower для авторизации в Docker Registry и автоматического получения обновлений контейнеров. Не заменяется и не генерируется пользователем локально.

Где взять? Предоставляется MANGO OFFICE в Личном кабинете ВАТС.

Стандартные поля для заполнения docker-environment.txt, содержание которых предоставляет MANGO

URL_INTEGRATION_API
URL_DOCKER_REGISTR
LOGIN_FROM_PERSONAL_ACCOUNT
PASSWORD_FROM_PERSONAL_ACCOUNT


MEDIAPROXY_CONTAINER_NAME_1=mediaproxy_1
        OPENRESTY_CONTAINER_NAME_1=openresty_1
        INSTANCE_ID_1=1
        
        INTERNAL_IP_ADDRESS_1=10.60.75.12
        INTERNAL_PORT_START_1=2001
        INTERNAL_PORT_END_1=3000
        
        EXTERNAL_IP_ADDRESS_1=10.60.75.12
        PUBLIC_EXTERNAL_IP_ADDRESS_1=10.60.75.12
        EXTERNAL_PORT_START_1=3001
        EXTERNAL_PORT_END_1=5000
        
        NGINX_IP_PORT_1=443
        NGINX_URL_BASE_1=https://10.60.75.12
        NGINX_URL_ALTER_1=https://10.60.75.12
        
        BASE_PATH_RECORDS_1=/opt/mp/thatrecord
        ALTER_PATH_RECORDS_1=/opt/mp/thataltrecord
        
        LOGIN_FROM_PERSONAL_ACCOUNT=подставить уникальный ключ авторизации
        PASSWORD_FROM_PERSONAL_ACCOUNT=media-proxy
        URL_INTEGRATION_API=https://192.168.37.168:8080
        URL_DOCKER_REGISTR=registry-vbpx.mango-office.ru
        
        PERCENT_FREE_DISK_SPACE=5
        ENABLE_CURL_VERBOSE_LOG=true
        OVERRIDE_CA_SERT_DIR=/opt/custom_ca
        OVERRIDE_CA_SERT_FILENAME=cabundle.pem
        PREMISES_DB_PASSWORD=
        

Опционально, время после которого удаляются не скачанные файлы в минутах
FILES_LIFETIME_1=5



MEDIAPROXY_CONTAINER_NAME_1=mediaproxy_1
        OPENRESTY_CONTAINER_NAME_1=openresty_1
        INSTANCE_ID_1=1
        INTERNAL_IP_ADDRESS_1=10.60.75.12
        INTERNAL_PORT_START_1=2001
        INTERNAL_PORT_END_1=3500
        EXTERNAL_IP_ADDRESS_1=10.60.75.12
        PUBLIC_EXTERNAL_IP_ADDRESS_1=10.60.75.12
        EXTERNAL_PORT_START_1=3501
        EXTERNAL_PORT_END_1=4000
        NGINX_IP_PORT_1=443
        NGINX_URL_BASE_1=https://10.60.75.12:443
        NGINX_URL_ALTER_1=https://10.60.75.12:443
        BASE_PATH_RECORDS_1=/opt/mp/rec1
        ALTER_PATH_RECORDS_1=/opt/mp/thataltrecord
        
        MEDIAPROXY_CONTAINER_NAME_2=mediaproxy_2
        OPENRESTY_CONTAINER_NAME_2=openresty_2
        INSTANCE_ID_2=2
        INTERNAL_IP_ADDRESS_2=10.60.75.12
        PUBLIC_EXTERNAL_IP_ADDRESS_2=10.60.75.12
        INTERNAL_PORT_START_2=4001
        INTERNAL_PORT_END_2=4500
        EXTERNAL_IP_ADDRESS_2=10.60.75.12
        EXTERNAL_PORT_START_2=4501
        EXTERNAL_PORT_END_2=5000
        NGINX_IP_PORT_2=444
        NGINX_URL_BASE_2=https://10.60.75.12:444
        NGINX_URL_ALTER_2=https://10.60.75.12:444
        BASE_PATH_RECORDS_2=/opt/mp/rec2
        ALTER_PATH_RECORDS_2=/opt/mp/thataltrecord
        
        LOGIN_FROM_PERSONAL_ACCOUNT=подставить уникальный ключ авторизации
        PASSWORD_FROM_PERSONAL_ACCOUNT=media-proxy
        URL_INTEGRATION_API= integrationapi.mango-office.ru
        URL_DOCKER_REGISTR= registry-vbpx.mango-office.ru
        
        PERCENT_FREE_DISK_SPACE=5
        ENABLE_CURL_VERBOSE_LOG=true
        OVERRIDE_CA_SERT_DIR=/opt/custom_ca
        OVERRIDE_CA_SERT_FILENAME=cabundle.pem
        PREMISES_DB_PASSWORD=
        ---
        
        

Работа через корпоративный HTTPS-Proxy

В ряде корпоративных инфраструктур доступ к внешним сервисам осуществляется через внутренний HTTPS-Proxy. Для корректной работы MediaProxy необходимо обеспечить возможность установления TLS-соединения между MediaProxy и сервисом Integration API по HTTPS.

Если в инфраструктуре клиента используется собственный корневой сертификат (CA), MediaProxy должен доверять этому сертификату. Для этого необходимо указать путь к сертификату и имя файла сертификата (или сертификатного bundle) в переменных окружения:

  • Переменная OVERRIDE_CA_SERT_DIR определяет путь к директории на хосте, где размещён сертификат.
  • Переменная OVERRIDE_CA_SERT_FILENAME задаёт имя файла сертификата в указанной директории.

В случае отсутствия пользовательского сертификата MediaProxy использует стандартный корневой сертификат.

При работе через HTTPS-Proxy необходимо обеспечить сетевую доступность web-сервиса Integration API из контейнера MediaProxy.

Информация о настройках HTTPS-Proxy и предоставление корневого сертификата пользовательской инфраструктуры выполняются силами IT-службы клиента.

MediaProxy не требует клиентского сертификата для подключения к Integration API; аутентификация выполняется с использованием ключа авторизации (basic_auth).

Работа со сторонним корневым сертификатом

В некоторых корпоративных инфраструктурах подключение MediaProxy к сервису Integration API проходит через HTTPS-Proxy, который подменяет серверный сертификат. В этом случае стандартные системные корневые сертификаты могут не позволить подтвердить подлинность полученного сертификата.

Для обеспечения корректного подключения необходимо передать MediaProxy корневой сертификат (или сертификатный bundle), который используется в инфраструктуре клиента.

Для этого при запуске MediaProxy указываются переменные окружения:

  • OVERRIDE_CA_SERT_DIR - путь к директории на хосте, где размещён сертификат
  • OVERRIDE_CA_SERT_FILENAME - имя файла сертификата в указанной директории

Указанный сертификат используется только для установления соединения MediaProxy с Integration API по HTTPS и не влияет на работу подключений MediaProxy к коммутатору по протоколу TCP с TLS.

Обновление контейнеров

Обновление контейнеров производится с помощью watchtower. На данный момент обновление происходит принудительно. В случае, если пользователь уберет функционал, связанный с обновлением, то есть вероятность отказа работы mediaproxy из-за отсутствия обратной совместимости с другими компонентами системы.

Примечание

Работа контейнера предусмотрена в пользовательском файле docker-compose.yml. Дополнительных действий по запуску контейнера производить не требуется.

При наличии нескольких экземпляров mediaproxy и openresty все контейнеры должны быть перечислены в команде Watchtower --cleanup, иначе обновление будет неполным.


version: "3.8"
        services:
            mediaproxy_1:
                image: ${URL_DOCKER_REGISTR}/mediaproxy/mediaproxy:latest
                container_name: ${MEDIAPROXY_CONTAINER_NAME_1}
                restart: always
                pull_policy: always
                network_mode: "host"
                environment:
                    - ENV_INSTANCE_ID=${INSTANCE_ID_1}
                    - ENV_INTERNAL_IP_ADDRESS=${INTERNAL_IP_ADDRESS_1}
                    - ENV_INTERNAL_PORT_START=${INTERNAL_PORT_START_1}
                    - ENV_INTERNAL_PORT_END=${INTERNAL_PORT_END_1}
                    - ENV_PUBLIC_EXTERNAL_IP_ADDRESS=${PUBLIC_EXTERNAL_IP_ADDRESS_1}
                    - ENV_EXTERNAL_IP_ADDRESS=${EXTERNAL_IP_ADDRESS_1}
                    - ENV_EXTERNAL_PORT_START=${EXTERNAL_PORT_START_1}
                    - ENV_EXTERNAL_PORT_END=${EXTERNAL_PORT_END_1}
                    - ENV_NGINX_URL_BASE=${NGINX_URL_BASE_1}
                    - ENV_NGINX_URL_ALTER=${NGINX_URL_ALTER_1}
                    - ENV_LOGIN_FROM_PERSONAL_ACCOUNT=${LOGIN_FROM_PERSONAL_ACCOUNT}
                    - ENV_URL_INTEGRATION_API=${URL_INTEGRATION_API}
                depends_on:
                    - openresty_1
                volumes:
                    - type: volume
                      source: mediaproxy_logs
                      target: /opt/mp/logs/
                    - type: bind
                      source: ${BASE_PATH_RECORDS_1}
                      target: /opt/mp/tmp/record/
                    - type: bind
                      source: ${ALTER_PATH_RECORDS_1}
                      target: /opt/mp/tmp/reserve/
                deploy:
                    resources:
                        limits:
                            cpus: '2'
                            memory: 300M
                        reservations:
                            cpus: '0.5'
                            memory: 150M
            openresty_1:
                image: ${URL_DOCKER_REGISTR}/mediaproxy/openresty:latest
                container_name: ${OPENRESTY_CONTAINER_NAME_1}
                restart: always
                pull_policy: always
                environment:
                    - ENV_FILES_LIFETIME=${FILES_LIFETIME_1:-1440}
                ports:
                    - "${NGINX_IP_PORT_1:-443}:443"
                volumes:
                    - type: bind
                      source: ${BASE_PATH_RECORDS_1}
                      target: /opt/mediaproxy/tmp/record/
                    - type: bind
                      source: ${ALTER_PATH_RECORDS_1}
                      target: /opt/mediaproxy/reserve/
            autoheal:
                image: willfarrell/autoheal
                restart: always
                environment:
                    - AUTOHEAL_CONTAINER_LABEL=all
                volumes:
                    - type: bind
                      source: /var/run/docker.sock
                      target: /var/run/docker.sock
        volumes:
            mediaproxy_logs:
        

Дополнительную информацию можно получить по ссылке https://containrrr.dev/watchtower/.


Предыдущая
Следующая