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

ШАГ 2. Запишите установочный ISO-образ на внешний носитель: USB-флешку или диск.
Важно
при записи ISO-образа используйте специализированные программы. Например:
- запись на USB-флешку: Etcher, WinSetupFromUSB
- запись на диск: Brasero, kb3

Рисунок 1 - Пример записи ISO-образа при помощи программы WinSetupFromUSB
1 – Указать USB-флешку или диск
2 – Выбрать место размещения ISO-образа
3 – Проставить чекбокс в строке «Linux ISO/Other Grub4dos compatible ISO»
ШАГ 3. Загрузка с внешнего носителя.
Укажите в BIOS свой носитель (USB-флешка или диск) на первое место в порядке загрузки устройств. Для этого в начале загрузки компьютера нажмите клавишу DEL или F2, и войдите в BIOS. Возможно, на некоторых устройствах понадобится нажать клавиши F8 или F11, в зависимости от типа материнской платы.
На вкладке «Boot» выберите загрузку со своего носителя. Вставьте флешку в компьютер и нажмите «Ввод».

Рисунок 2 - Пример boot-меню с выбором флешки в качестве источника загрузочных данных
Из появившегося списка выберите Ubuntu (safe graphics).

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

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

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

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

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

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

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

Теперь вы можете пользоваться OS Linux 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:

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/.