2. Установка и настройка сервера Smarty

2.1. Где скачать установочные пакеты

Инсталляционные пакеты ПО распространяются через FTP, доступ к которому предоставляется на время действия договора.

2.2. Установка на ОС Linux Debian

Все модули Smarty поставляются в виде установочных deb-пакетов и устанавливаются утилитой dpkg. Обязательным модулем является smarty-base.

Для работы необходим web-сервер nginx, uwsgi и python 2.7, а также несколько других пакетов.

2.2.1. Установка зависимостей

Установка через apt-get:

sudo apt-get install nginx git python-dev python2.7 libmysqlclient-dev libtiff5-dev libjpeg62-turbo-dev zlib1g-dev
libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk uwsgi uwsgi-plugin-python redis-server

Установка утилиты pip:

wget https://bootstrap.pypa.io/get-pip.py && python get-pip.py && rm get-pip.py

2.2.2. Установка Smarty и модулей

Установка через dpkg:

dpkg -i smarty*.deb
dpkg -i python2.7-jsonrpctcp*.deb

После установки пакетов Smarty необходимо установить python-библиотеки через pip:

sudo pip install -r /usr/share/nginx/html/microimpuls/smarty/requirements.txt

После установки пакета smarty-base создается конфигурационный файл для nginx в /etc/nginx/sites-available/smarty. По умолчанию настроен на домен smarty.example.com и слушает порт 80 и 8180. Необходимо перенастроить данный домен на необходимый.

Файлы Smarty размещаются в /usr/share/nginx/html/microimpuls/smarty.

2.2.3. Установка схемы базы данных

Первичная установка схемы базы данных осуществляется командой:

smarty_manage migrate --settings=settings.<settings filename>

2.2.4. Создание пользователя администратора

Создание пользователя с правами служебного администратора осуществляется командой:

smarty_manage createsuperuser --settings=settings.<settings filename>

2.2.5. Создание системных объектов в базе данных и примера настроек оператора

Для создания системных объектов Smarty в базе данных, а также примера настроек выполните команду:

smarty_manage setup_initial_data --settings=settings.<settings filename>

Примечание

Можно пропустить создание образца настроек оператора, добавив флаг --no-sample-data

2.2.6. Клонирование Client со всеми настройками оператора

В случае необходимости создания нового объекта Client и копирования всех данных можно использовать команду клонирования:

smarty_manage clone_client --src_client_id=<source client id> --settings=settings.<settings filename>
  • <source client id> - ID объекта Client, который нужно склонировать в новый Client.
  • <settings filename> - имя файла настроек Smarty, в котором должны быть установлены параметры подключения к БД (см. Описание основных параметров).

Примечание

Можно перенести также все телеканалы, фильмы, радиостанции, камеры и сервисы, используя соответствующие опции --clone-channels --clone-video --clone-radio --clone-cameras --clone-apps

2.2.7. Создание пользователя или восстановление пароля

В Smarty возможно создание или восстановление пользователя через команду create_user:

smarty_manage create_user --settings=settings.<settings filename> --username=new_user --password=new_password --is_admin=True --client_id=1 --is_superuser=True

Параметры:

  • –username - имя пользователя, обязательный.
  • –password - пароль, обязательный.
  • –is_admin - True или False, если True, то создаваемому пользователю будет доступна служебная часть сайта, по умолчанию False.
  • –client_id - ID клиента, к которому будет привязан создаваемы пользователь.
  • –is_superuser - True или False, если True, то будет создаен суперпользователь, по умолчанию False.
  • –monitoring_user - True или False, если True, то пользователь будет являться оператором мониторинга устройств, по умолчанию False.
  • –reset_password - если True, то в случае, если указанный username уже используется, то вместо создания нового будет изменён пароль у старого пользователя; по умолчанию False.

2.2.8. Создание Client

В Smarty возможно создание оператора (Client) через команду create_client:

smarty_manage create_client --settings=settings.<settings filename> --name=Client_name --api_key=api_key --domain_prefix=domain_prefix --email=email@example.com

Параметры:

  • –name - название оператора, обязательный.
  • –api_key - TVMW API Key, обязательный.
  • –domain_prefix - префикс домена оператора, обязательный.
  • –email - email оператора, обязательный.

2.3. Установка на ОС Linux CentOS

Поддержка CentOS является экспериментальной - корректная работа всех функций Smarty не гарантируется. Скрипт установки для fabric и примеры конфигурации на CentOS можно найти здесь: https://github.com/microimpuls/smarty-centos

2.4. Конфигурация Smarty

2.4.1. Файл настроек Smarty

После первичной установки базовый файл конфигурации Smarty находится по адресу /etc/microimpuls/smarty/base.py (симлинк на /usr/share/nginx/html/microimpuls/smarty/settings/base.py).

Основной файл конфигурации, используемый для production-режима работы - /etc/microimpuls/smarty/prod.py. На этот файл (или на другой используемый конфиг) должен указывать симлинк в /usr/share/nginx/html/microimpuls/smarty/settings/<setings name>.py. Именно в нем следует производить настройку Smarty, т.к. базовый файл конфигурации может быть перезаписан после установки обновлений.

Конфигурация производится путем присваивания значений переменным на Python.

2.4.1.1. Обслуживание нескольких инстансов Smarty на одном сервере

Для удобства конфигурации и размещения на одном сервере нескольких инстансов Smarty рекомендуется вместо использования файла настроек prod.py создать собственный файл с кратким символическим именем, совпадающим с названием сервиса, например myiptv.py.

Данное имя затем также рекомендуется использование как суффикс или префикс в именах файлов конфигурации nginx, uwsgi, именах папок для логов, pid-файлов и др.

2.4.2. Описание параметров конфигурации Smarty

Актуальная документация: https://microimpuls.com/docs/smarty/configuring-and-management/smarty-config https://microimpuls.com/docs/smarty/configuring-and-management/logging

2.4.3. Добавление лицензионного ключа сервера Smarty

Каждый инстанс Smarty привязывается к аппаратной и программной конфигурации сервера лицензионным ключом, который может быть ограничен по времени действия и максимальному числу настроенных Client ID (см. Мультипровайдер).

Лицензионный ключ настраивается в файле конфигурации в следующих переменных:

SMARTY_KEY = 'XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX'
SMARTY_MAX_CLIENTS = 2
SMARTY_AVAILABLE_UNTIL = 'dd.mm.yyyy'

Для получения ключа необходимо обратиться к своему менеджеру по договору.

2.4.4. Настройка кеширования

Для кеширования используется сервер Redis - является обязательным компонентом системы. Требуется версия Redis >= 2.6.

По умолчанию конфигурация подразумевает локальную установку сервера Redis на тот же сервер Smarty, однако при необходимости их можно разделить. Для изменения параметров подключения к Redis необходимо в конфигурации Smarty прописать массив CACHES следующим образом:

CACHES = {
    "default": {
        "BACKEND": "core.cache.backends.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
        }
    }
}

В файле конфигурации Redis /etc/redis/redis.conf необходимо прописать:

stop-writes-on-bgsave-error no

Для оптимизации дисковых операций и увеличения общей производительности на сервере Redis рекомендуем также указать опцию, запрещающую сохранение на диск текущих данных сервера:

save ""

При ее указании все данные во время работы Redis будут храниться ТОЛЬКО в RAM сервера. В случае перезапуска сервера Redis рекомендуем запустить менеджмент команду flushall для заполнения Redis данными, используемыми Smarty.

Для вступления изменений конфигурации в силу требуется перезагрузить Redis и uwsgi.

Также поддерживается работа в кластерном режиме с группой серверов Redis, пример настройки:

CACHES = {
    "default": {
        "BACKEND": "core.cache.backends.RedisCache",
        "LOCATION": "redis://192.168.33.11:7000/0", # не используется, но необходимо
        "OPTIONS": {
            "REDIS_CLIENT_CLASS": "rediscluster.client.StrictRedisCluster",
            "CONNECTION_POOL_CLASS": "core.cache.cluster_connection.ClusterConnectionPool",
            "CONNECTION_POOL_KWARGS": {
                "startup_nodes": [
                    # masters
                    {"host": "192.168.33.11", "port": "7000"},
                    {"host": "192.168.33.12", "port": "7000"},
                    {"host": "192.168.33.13", "port": "7000"},
                ]
            }
        }
    }
}

2.4.5. Настройка модуля геолокации

Поддерживается несколько локаторов на основе IP-адреса абонента, работающие с разными источниками гео-данных. В служебной панели администрирования для настраиваемого Client ID необходимо установить используемый локатор, наиболее подходящий для оператора и его региона оказания услуг.

Если до изменения локатора база данных стран и городов уже была заполнена, то рекомендуется очистить её.

Все локаторы требуют создания/обновления своей базы данных. База данных может быть в виде SQL-таблиц или бинарных данных (либо и то, и то).

2.4.5.1. Локатор django-geoip (ipgeobase)

Представляет собой обёртку над https://django-geoip.readthedocs.org/en/latest/

Команда для обновления базы:

$ smarty_manage geoip_update --settings=settings.<settings name>

Создание стран и городов на основе данных django-geoip (работает только если в системе нет ни одной страны и города):

$ smarty_manage sync_geo_geoip --settings=settings.<settings name>

2.4.5.2. Локатор ip2location

Обновление базы:

$ smarty_manage update_ip2location --settings=settings.<settings name>

Эта команда скачивает бинарную базу данных для определения местоположения и CSV-базу для создания справочника городов и стран.

Создание стран и городов на основе данных ip2location (работает только если в системе нет ни одной страны и города):

$ smarty_manage sync_geo_ip2location --settings=settings.<settings name>

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

2.4.6. Настройка модуля мониторинга видеопотоков

Актуальная документация: https://microimpuls.com/docs/smarty/configuring-and-management/monitoring-and-alarming

2.4.7. Настройка модуля статистики и отчетов

См. https://micro.im/docs/smarty/configuring-and-management/viewstats

2.4.8. Настройка модуля сбора статистики по абонентам

См. https://micro.im/docs/smarty/configuring-and-management/viewstats

2.4.9. Настройка модуля мониторинга устройств

Актуальная документация: https://microimpuls.com/docs/smarty/configuring-and-management/monitoring-and-alarming

2.4.10. Настройка модуля отправки SMS

Актуальная документация: https://micro.im/docs/smarty/extra-services-integration/интеграция-с-sms-шлюзами

2.4.11. Подключение системы мониторинга ошибок Sentry

Для подключения Sentry необходимо в файле конфигурации Smarty добавить в INSTALLED_APPS модуль raven.contrib.django.raven_compat и прописать параметры подключения:

RAVEN_CONFIG = {
    'dsn': 'http://<LOGIN>:<PASS>@<SENTRY HOST>/<PROJECT>',
}

Строку подключения можно получить из настроек проекта в Sentry.

2.4.12. Настройка nginx и uwsgi

Образец файла конфигурации для nginx находится в файле /etc/nginx/sites-available/smarty.

Конфигурация для uwsgi находится в файлах /etc/uwsgi/apps-available/smarty и /etc/microimpuls/smarty/uwsgi/smarty.uwsgi, на него (или на другой используемый конфиг) должен указывать симлинк в /usr/share/nginx/html/microimpuls/smarty/<uwsgi settings name>.uwsgi.

2.4.13. Настройка мультиязычности контента в Smarty

Smarty позволяет сохранять в базе данных контент с названиями локализуемых полей на разных языках - например, названия телеканалов, фильмов, категорий, жанров, EPG и др. Чтобы активировать этот механизм, необходимо добавить в файл конфигурации параметр SMARTY_ADDITIONAL_LANGUAGES с перечнем необходимых языков (не более 5 дополнительных к основному языков), а также указать основной язык. Названия языков должны совпадать с названием локализации в абонентском приложении, по умолчанию используются двухбуквенные названия.

SMARTY_DEFAULT_LANGUAGE str
Название основного языка. По умолчанию ru.
SMARTY_ADDITIONAL_LANGUAGES list
Список дополнительных языков, задается в квадратных скобках с указанием значений через запятую, например: [ 'en', 'fr', 'de', 'es', 'pt' ] По умолчанию пустой.

После настройки параметров мультиязычности и перезагрузки uwsgi в панели администратора Smarty в полях формы локализуемых полей появится возможность указать название на дополнительных языках.

Для того, чтобы сервер Smarty в ответе на запрос API вернул значение на нужном языке, необходимо дополнительно передавать параметр lang. Подробнее в документации TVMiddleware API.

2.5. Системные команды Smarty и настройка crontab

Примечание

Внимание! Некоторые команды планировщика являются обязательными для функционирования сервиса.

2.5.2. Импорт EpgChannel

Команда:

smarty_manage epg_channel_import --settings=settings.<settings name>

Данная команда поможет загрузить все каналы или обновить иконки из определенного источника. Для запуска обязательно необходимо указать epg_source_id или --epg_source_name.

Если команда вызывается для загрузки иконок или загрузки всех каналов из EpgChannelSource, то к загруженным иконкам по возможности будут созданы более маленькие копии следующих размеров: 500x500, 120x91 и 40x40.

Для источника обязательно должен существовать EpgChannelSource с указанием маски URL источника каналов. Для источников, у которых нет общего списка необходимо указывать epg_channel_id или channel_id.

Аргументы для запуска:

--epg_source_id
 Идентификатор EpgSource, для которого необходимо произвести импортирование каналов.
--epg_source_name
 Имя EpgSource, для которого необходимо произвести импортирование каналов.
--epg_channel_id
 Идентификатор EpgChannel, для которого необходимо произвести импортирование.
--channel_id Идентификатор Channel, для которого необходимо произвести импортирование.
--reimport_icons
 Если указан этот аргумент, то для всех импортированных каналов будет произведено обновление иконок.
--force_import Загрузка всех каналов из источника. Если указан данный аргумент то все аргументы кроме epg_source_id и epg_source_name будут проигнорированы.
--force_parser_handling
 Принудительно разрешает использовать передачу управления парсеру (равносильно TVMW_EPG_IMPORT_ALLOW_PARSER_HANDLING=True)
--force_disable_parser_handling
 Принудительно запрещает использовать передачу управления парсеру (равносильно TVMW_EPG_IMPORT_ALLOW_PARSER_HANDLING=False)
--fix_duplicates
 Удаляет дубликаты телеканалов с одним и тем же внешним идентификатором в рамках одного источника EPG.
--verbose Включает подробный вывод информации о загружаемых из источника иконках.

Использование опций –force_parser_handling и –force_disable_parser_handling приоритетнее параметра TVMW_EPG_IMPORT_ALLOW_PARSER_HANDLING.

Пример команды для повторного импортирования иконок для одного канала:

smarty_manage epg_channel_import –epg_source_id=1 –epg_channel_id=100 –reimport_icons –settings=settings.<settings name>

2.5.14. Команда кэширования существующих иконок

Команда:

smarty_manage recache_icons --settings=settings.<settings name>

Вызывается в случае отсутствия информации о существующих иконках.

Команда проверяет и сохраняет в кэше существование иконок для всех EpgChannel по размерам, указанным в SMARTY_DEFAULT_ICON_SIZE и SMARTY_DEFAULT_ICON_SIZES.

2.5.19. Пример настройки crontab

Пример:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/1 * * * *         python /usr/share/nginx/html/microimpuls/smarty/manage.py cache_channel_list --settings=settings.prod
0 5,9,13 * * *      python /usr/share/nginx/html/microimpuls/smarty/manage.py epg_import --settings=settings.prod
0 3 * * *           python /usr/share/nginx/html/microimpuls/smarty/manage.py clean_old_messages --days_count 3 --settings=settings.prod

2.5.20. Команда генерации видео для архивных записей

Команда:

smarty_manage make_vodpvr --client_id=<client_id> --settings=settings.<settings name>

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

2.6. Запуск, перезапуск и остановка Smarty

Для управления процессами сервера приложений uwsgi используется init-скрипт /etc/init.d/uwsgi:

$ /etc/init.d/uwsgi
Usage: /etc/init.d/uwsgi {start|stop|status|restart|reload|force-reload}

Все команды действуют на все запущенные инстансы uwsgi.

Логи по умолчанию сохраняются в /var/log/uwsgi/, /var/log/nginx/ и /var/log/microimpuls/.

2.7. Установка обновлений Smarty

Примечание

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

Обновления устанавливаются командой dpkg:

dpkg -i smarty*.deb

После установки обновления необходимо установить новые требуемые python-библиотеки через pip:

sudo pip install -r /usr/share/nginx/html/microimpuls/smarty/requirements.txt --ignore-installed

Миграция схемы БД осуществляется командой:

python /usr/share/nginx/html/microimpuls/smarty/manage.py migrate --settings=settings.<settings filename>

Если в процессе установки пакета будет предложено заменить файл base.py - необходимо ответить Y (заменить файл).

После установки всех обновлений и миграции схем БД необходимо перезапустить сервер приложений uwsgi, завершить все команды epg_import и cache_channel_list (через вызов kill), а затем выполнить команду обновления кеша:

python /usr/share/nginx/html/microimpuls/smarty/manage.py flushall --settings=settings.<settings filename>

Примечание

Если не выполнить команду обновления кеша flushall, то в кеше могут оказаться данные со старой структурой, что может привести к непредсказуемым ошибкам в работе приложений.

2.7.1. Устранение ошибки конфликта миграций

В процессе миграции схемы БД может возникнуть ошибка конфликта миграций: To fix them run 'python manage.py makemigrations --merge'. Не нужно делать команду makemigrations. Ошибка может возникнуть в случае нарушения правильного порядка действий при установке или обновлении системы. Чтобы устранить эту ошибку, необходимо выполнить следующие действия:

  • Удалить содержимое папки /tvmiddleware/migrations

  • Переустановить пакет обновления smarty, который был установлен в тот момент, когда возникла данная ошибка. Временно удалить из папки /tvmiddleware/migrations все новые миграции (дата создания у которых новее чем дата последнего успешного обновления smarty).

  • Очистить таблицу django_migrations в базе данных smarty.

  • Выполнить команду:

    $ python manage.py migrate --fake --settings=settings.<settings filename>
    
  • Скопировать обратно миграции, временно удаленные на шаге 2. Повторно выполнить команду миграции:

    $ python manage.py migrate --settings=settings.<settings filename>
    

2.8. Масштабирование и отказоустойчивость

2.8.1. Доступные средства масштабирования и отказоустойчивости

Подробная информация о кластерных конфигурациях Smarty в новой базе знаний по продукту на сайте https://microimpuls.com/docs/smarty/scaling-and-redundancy.

2.8.2. Настройка подключения к СУБД с использованием репликации

Актуальная документация по настройке подключения к SQL-кластеру: https://microimpuls.com/docs/smarty/scaling-and-redundancy/smarty-sql-cluster-connection

2.8.3. Настройка логирования статистики запросов в statsd

statsd - сервер аггрегации статистических данных: https://github.com/etsy/statsd.

Smarty позволяет выгружать в statsd статистику по запросам к API (количество запросов, время ответа, количество выполненных SQL-запросов, время ответа СУБД). Для этого необходимо добавить в файл конфигурации Smarty параметры, указанные ниже:

MIDDLEWARE_CLASSES += (
    'core.middleware.StatsMiddleware',
)

STATSD_HOST = 'X.X.X.X'
STATSD_PORT = '8125'

Где:

STATSD_HOST str
IP-адрес сервера statsd для выгрузки данных статистики и мониторинга работы сервера Smarty.
STATSD_PORT int
Порт сервера statsd для выгрузки данных статистики и мониторинга работы сервера Smarty.
STATSD_PREFIX str
Префикс, который будет добавляться (если задан) к ключам параметров, передаваемых в statsd.

Примечание

Внимание! Необходимо обеспечить доступность сервера statsd и правильность настроек подключения, в противном случае подключенная `core.middleware.StatsMiddleware` и отсутствие соединения со statsd может приводить к чрезмерному потреблению оперативной памяти.