Развертывание и интеграция «внешнего» приложения в платформу Luxms bi

Luxms BI это аналитическая платформа от российских разработчиков. Вот их официальный сайт https://luxmsbi.com Представляет собой набор инструментов для построения отчетов и графиков с оглядкой на большие объемы данных. Из коробки уже имеет некоторое количество инструментов для построения отчетов в графическом интерфейсе, однако дает возможность подключить и «внешние» приложения, развернутые где угодно. Об этом типе приложений и пойдет речь далее, однако они будут встроены в саму систему, для возможности вклиниться в авторизацию на платформе. Данная конфигурация снимет практически все возможные ограничения и позволит реализовать любую идею.

Разработка приложения

Собственно, первым делом нужно заиметь приложение, которые мы будем встраивать в платформу Luxms.

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

Наше кастомное приложение может быть реализовано на любых технологиях, однако мое сделано на python, фреймворк Django и далее примеры будут как раз для этого стека. Если нет представления что из себя представляет Django приложение, то можно ознакомиться с любой get strarted статьей для этого фреймворка

Итак, допустим у нас уже есть приложение, в dev версии оно запускается примерно следующей командой.

После того, как нас появилось необходимое нам приложение, займемся его упаковкой в docker. Нам нужно добиться, что бы на localhost, на каком-то определенном порте, на сервере, было запущено наше приложение. Для Django, в продуктивной конфигурации популярным решением является сервер Gunicorn. Весьма удобный способ запустить приложение, устанавливается как python библиотека, не требует тонких настроек.

В корне проекта нужно создать Dockerfile

Сразу стоит отметить, что это не оптимальный вариант, но рабочий. Можно использовать более легкий образ и воспользоваться трюками для оптимизации docker файла.

Сам же сценарий построение образа содержит следующие. Создается папка code, в нее копируются все файлы проекта (не ошибитесь папкой, что бы случайно не скопировать библиотеки из виртуального окружения)

Далее устанавливаются все библиотеки. Если у Вас отсутствует файл requirements.txt, то необходимо его предварительно создать командой

После этого запускается WSGI сервер. Обратите внимание, должен запуститься файл wsgi, этот файл создается автоматически при создании проекта, и в нем через двоеточие должно произойти обращение к переменной application

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

Создадим папку в корне проекта и назовем ее nginx, создадим в ней 2 файла. nginx.conf и Dockerfile

Содержимое nginx.conf

Если кратко, то NGINX «смотрит» на порт 8000 контейнера с Django приложением и транслирует его на порт 80, в своем контейнере. Тут же прописан путь до статик файлов.

Далее Dockerfile из этой папки

Тут ничего особенного не происходит, удаляются стандартные настройки и копируется наши, из файла nginx.conf.

Создаем docker-compose.yml файл в корне проекта

Тут у нас запускается 2 контейнера и устанавливается связь между ними. Тут же пробрасывается порт с 80 контейнера NGINX на 9238 внешний. (порт внешний может быть любой свободный)

Запускается приложение под docker следующей командой

После этого, в браузере по URL http://127.0.0.1:9238/ должно быть доступно приложение.

В итоге, структура моего проекта выглядит следующим образом

А так же мой requirements.txt, обратите внимание, по мимо библиотек Вашего проекта, в нем обязан быть gunicorn

Развертывание приложения на сервере c Luxms bi

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

Это означает что образы готовы, можем запускать контейнеры.

Переносим на сервер файл docker-compose.yml

Проходим в папку с этим файлом и запускаем наше приложение

После того, как docker отрапортует что все запущено, можно проверить рабочие контейнеры.

На этом этапе, наше приложение работает на localhost порт 9238. Следующим этапом нужно встроить его NGINX Luxms BI.

За NGINX в Luxms отвечет отдельная служба, конфигурационные файлы находятся по следующему адресу

/opt/luxmsbi/conf/nginx/conf.d

Если сильно не углубляться, то в файле nginx.conf написано, что настройки подгружаются из директории conf.d/*.conf

В папке conf.d в свою очередь наличествует следующий файл

entrypoint.conf

В нем есть такая строка include conf.d/luxms*.location; Что в свою очередь говорит о том, что любой файл в этой директории с префиксом luxms и расширением location будет подхвачен службой NGINX.

В таком случаи создадим такой файл в conf.d

touch luxms-kasudr.location

И заполним следующим содержанием

Итак, тут мы по обратному прокси выводим наше приложение, которое запущено через docker, на адрес /kasudr

Сохраняем файл и перезапускаем службу следующей командой

После этого, по адресу http://<IP Вашего сервера>/kasudr/ должно стать доступно приложение.

Встраивание приложения в платформу

Для того что бы встроить внешнее приложение в платформу luxms bi нужно пройти по ссылке http://<IP сервера>/admin.html Нажать на «Датасеты». Создать датасет либо выбрать интересующий. Затем нажать на него и еще раз нажать «дэшборд».

После этого можно видеть примерно следующие (в разных версиях Luxms интерфейс может существенно отличаться)

Нажимаем на плитку с плюсом, вводим название, нажимаем enter.

Затем заходим в основной интерфейс

Нажимаем «Наборы данных» затем на датасет с которым идет работа, а затем на созданный ранее «дэшборд»

После этого откроется рабочее поле отчета. Необходимо войти в режим редактирования

Выбрать иконку «Внешний» и перетащить (drag and drop) ее на рабочее пространство слева. Иконку расширить до нужных размеров.

Затем нажать на внешний отчет в рабочей области, откроется его конфигурация. В конфиге необходимо прописать URL к опубликованному на сервере приложению.

Затем нажать «applay» и «Сохранить»

Результат

Реализация авторизации

Одной из ключевых причин зачем было запускать приложение на том же сервер, что и платформа Luxms это возможность «встроиться» в авторизацию.

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

  • при авторизации на платформе, в cookie добавляется session id;
  • запуск приложения в «деше» производится во фрейме, если у приложения и во фрейме и платформе один домен, это означает что у них общие cookie, следовательно далее производится проверка наличия session id в базе данных;
  • если id найдено, то приложение является авторизованным, если нет, то не авторизованным.

На уровне приложения было сделано следующие. Берутся cookie, название LuxmsBI-User-Session. В них хранится ключ авторизации от платформы. Эти куки доступны нам т.к. мы захосчены на том же домене что и платформа. Далее мы делаем запрос в БД. Нужные нам данные хранятся в схеме adm, таблице user_sessions, и запрос будет выглядеть следующим образом.

Где session_id, это значение из cookie. В итоге можно понять, является ли пользователь авторизованным или нет, кто именно является пользователем приложения и т.д. По сути БД Luxms содержит все административные данные, которые нам могут понадобиться.

Коннект к базе данных из приложения

Стоит пару слов сказать о коннекте к БД. При развертывании платформы Luxms BI, может быть как минимум 2 варианта.

  1. База данных находится на отдельном сервере
  2. База данных находится на том же сервере, что и сама платформа Luxms

В первом варианте, дополнительно делать ничего не нужно. Мы просто из приложения подсоединяемся так же, как это делается в Luxms, уже все должно быть настроено.

Во втором варианте, возможно, понадобятся следующие действия

  1. Проходим в директорию /pgdata/data/
  2. Открываем на изменение файл pg_hba.conf
  3. Добавляем строчку

host all all 0.0.0.0/0 md5

После этого перезапустить службу с БД

Как служба будет перезапущена, из контейнера Docker можно воспользоваться ДНС адресом для коннекта к локальной базе данных.

Выглядит он следующим образом — 172.17.0.1

Итог

Итак, было реализовано приложение, упаковано в Docker, затем оно было захосчено на сервере, после этого была произведена интеграция этого приложения в платформу Luxms BI. Данный подход к разработки мне видится очень перспективным. Мы одновременно находимся в аналитической платформе, отвечающей запросам импортозамещения, и при этом мы ни чем не ограничены в разработке. Таким образом может быть реализована любая, самая смелая задача, подключены любые библиотеки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *