Сервер push сообщений “Push0k“ 19.01
Доработал серверную часть, добавил процедуры для новой «админки».
Сделал, push0k admin, приложением electron. Клиентскую часть также реализовал на electron.
Приложение push0k admin:
Приложение сделано на electron с использованием vue.js . Внутри реализовано подобие оконной системы, небольшие модальные диалоги можно перетаскивать как окна, заголовки окон для windows сделаны аналогично windows 10, для Mac OS как в последних версиях, но пока без учета dark theme. Для linux соберу позднее, там с заголовками диалогов чуть сложнее, думаю будет как в ubuntu и если не ubuntu то win 10 style. Потребление памяти в win 10 и Mac OS больше 150 мегабайт не видел.
В предыдущих версиях не было возможности добавить анимацию, сделал немного без фанатизма. Ранее описанные диалоги — окна появляються из центра окна приложения постепенно увеличиваясь, при закрытии улетают в центр уменьшаясь. Также анимированно нажатие кнопок и обязательные для заполнения поля.
Более подробно по ссылке https://github.com/PloAl/push0k, там же можно скачать программу бесплатно.
Клиентское приложение на electron выложу позднее.
Убрал платную внешнюю компоненту, для защищенного соединения. Возможно выложу ее позднее и бесплатно.
Добавил возможность быстрой установки в контейнере docker
Контейнер состоит из: Ubuntu 16.04, PostgreSQL 9.6, node.js 8.11 + push0k 1805
Запуск, команды консоли
Загрузить образ:
docker pull ploal/push0k
Создать и запустить контейнер из образа:
docker run --name push0k -d --restart=always --net host --tmpfs="/var/lib/postgresql/9.6/main/pg_stat_tmp:rw,noatime,nodiratime,size=500M,mode=700,uid=799,gid=799" ploal/push0k:1806 /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
После выполнения второй команды можно подключаться к контейнеру
- порт администрирования push0k:
2016
- порт сервера postgreSQL:
5432
Сетевой ip адрес совпадает с адресом компьютера где установлен docker. По умолчанию в postgreSQL устанавливается парольYourPassword
. Пароль можно изменить в консоли контейнера команда:sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'YourPassword'"
Если контейнер запускается в более ранней версии docker 17.05, из строки запуска следует убрать параметр
--tmpfs="/var/lib/postgresql/9.6/main/pg_stat_tmp:rw,noatime,nodiratime,size=500M,mode=700,uid=799,gid=799"
, данный параметр создает RAM диск для записи статистики postgreSQL, в версиях ниже 17.05 параметр недоступен.
Этот контейнер также использую данный контейнер в качестве 1с сервера. Для установки 1c сервера, достаточно перенести распакованные установочные файлы *.deb , внутрь контейнера. Перейти в консоли контейнера в каталог куда перенесены установочные файлы
cd /YourCatalog/withSetupDebs
и запустить установку командой
dpkg -i *.deb
после установки для автоматического запуска сервера надо отредактировать файл /etc/supervisor/supervisord.conf
в файле надо убрать комментарии в виде символов ";" с секции ;[program:1csvr]
и строки под ней ;command=/opt/1C/v8.3/...
Для переноса файлов внутрь контейнера рекомендуется настроить и использовать примонтированную папку "public", также возможна масса других вариантов: поиск напрямую в папках aufs, установка настройка samba, запуск ssh. Для поиска и редактирования файла /etc/supervisor/supervisord.conf
проще всего воспользоваться старым добрым полношным коммандэром для этого набрать в консоли mc
Сервер push сообщений “Push0k“ 18.05
Новая логика серверной части:
Серверный скрипт “push0k.js“ теперь к пакету nmp “socket.io” дополнительно использует пакеты “pg” и “pm2“. Первый позволяет подключаться к базе postgresql напрямую, второй пакет позволяет запустить несколько процессов и по максимуму задействовать все ядра процессора.
Логика сервера push0k, аналогична логотипу, все сообщения пересылаются через сервер.
- socket.io основной websocket сервер.
- node-postgres модуль для связи с postgreSQL.
- pm2 используется для запуска балансировки и мониторинга нескольких процессов push0k.js
Убрал использование базы данных 1С, данные записываются напрямую в базу postgresql. Подробнее на картинке.
push0k admin отдельная конфигурация, рекомендуется локальная файловая установка, т.к. как используются внешние источники данных (нет справочников, документов и.т.д.) и логика предполагает "одного капитана на корабле", если их два и более у каждого должна быть своя локальная файловая база.
Скрипт сервера *.js ранее хранился внутри серверной конфигурации 1с оттуда и использовался. Сейчас файлов сервера стало немного больше, и все файлы сервера теперь доступны по ссылке github.com/PloAl/push0k . Инструкция по установке серверной части node.js находится там же. А для push0k admin, доступна по кнопке F1.
Оптимизировал логику уведомлений и синхронизации клиентов. Все данные синхронизируются буквально по одной дате. В справочные таблицы добавил колонки даты последнего изменения и идентификатор изменившего. Добавил таблицу версии в триггерной функции при обновлении справочных таблиц записывается старая запись в формате json. Интерфейс для просмотра истории версии и восстановления старой версии пока не делал.
Добавил предопределенный элемент справочника Комнаты “Администраторы“. Логика аналогична группе прав «администраторы» в ОС. При первом запуске создается пользователь данной комнаты - «администратор». Не входящие пользователи в эту комнату, при запуске “push0k admin” не смогут авторизоваться.
Больше безопасности:
Доработал механизм авторизации. Для авторизации в базе сохраняется двойной хеш sha256. При авторизации используется хеш от сохраненного хеша + УИД текущего соединения "соленый хеш". Т.е. перехваченный хеш не позволит авторизоваться повторно, и не раскроет текущий пароль. При установке нового пароля, хеш нового пароля запаковывается в запароленый zip архив, пароль на zip = старый пароль + УИД соединения. Добавил в внешнюю компоненту метод получения хеш sha256, для использования типового метода надо пересылать пароль на сервер, в ВК хеш получается сразу на клиенте. В целом описанное выше означает что важные личные данные даже без использование TLS хорошо защищены. Но конечно более надежно использовать TLS соединения.
Реализовал отображение информации о зашифрованном соединении подобно как в браузерах. Проверяется доменное имя сертификата и сервера, срок действия сертификата и то что сертификат не само подписанный. Можно посмотреть информацию о издателе доменном имени и сроке действия сертификата.
Новые требования:
Реализовал возможность авторизации по номеру мобильного телефона.
Сделал возможность настроить отображение уведомлений и сообщение от контакта будут приходить втихую без уведомления. Возможно и полностью заблокировать сообщения от определенных контактов.
Добавил возможность пользовательской настройки представления контакта. Т.е. например в контактах несколько Иванов, каждый из пользователей волен обозвать другого как ему угодно хоть Дартаньян хоть Каналья.
Попугайметр - механизм для тестирования сервера:
Добавил комнату предопределенный элемент справочника Комнаты “Test”. С помощью сообщения в комнате, клиенты при получении автоматически отвечают заданного размера сообщениями программно в цикле заданное количество раз. По факту получается нагрузочное тестирование.
Тестирование с скриншота отправка сообщений в тестовую комнату чат, самому порой удивительно всего 50 000 сообщений и 4 250 000 телодвижений:
отправка 50 000 сообщений: Процессы сервера: 4 Пользователи: 5
1. Всего сообщений получено 50 000 * 5 = 250 000
2. Пересылка в другие процессы сервера 250 000 * Процессы сервера: 4 - 1 = 750 000
3. Отправлено адресатам 250 000 * Пользователи: 5 - 1 = 1 000 000
4. Записано сообщений в таблицу postgreSQL 250 000
5. Получено уведомлений доставки 1 000 000
6. Записано в таблицу postgreSQL уведомлений доставки 1 000 000
7. Все операции 4 250 000
В тестах пока максимум 10 000(+-несколько сотен) операций в секунду, при этом количество процессов не влияет. Без разницы 4 пользователя в 4ёх процессах или все на одном процессе. Это говорит о том что процессор в данном тесте не является бутылочным горлышком, узким местом. Знаю windows - не серверная, не самый лучший вариант для запуска сервера из за ограничений сетевого стека.
Классификатор телефонов:
Добавил таблицу классификатор Российских телефонных кодов, нашел на сайте Россвязи 4 файла csv . Таблицу создавал специально под формат csv, загружал из диалога pgAdmin4, около 50000 записей 0,3 секунды, файлы с кодами 8 и 9 пришлось заменой немного подправить.
Данный функционал пригодится в дальнейшем при регистрации нового пользователя, можно будет понять можно ли на телефон отправить смс.
Много новых возможностей клиентской обработки:
Отдельная кнопка цитирования "6699" и кнопка пересылки сообщения полностью. При наведении курсора на дату сообщения можно увидеть, имя компьютера и имя базы 1с где было создано сообщение.
Комнаты - теперь имеют звездатое название или стартег
Скриншот формы редактирования и администрирования комнаты на клиенте.
К сожалению мобильная версия приложения для android, отстала от всех вышеописанных изменений и будет доступна позднее.
Сервер push сообщений “Push0k“ 17.12
Это продолжение публикации Что нам стоит Push построить
Там же более подробное описание логики работы решения.
Код решения практически полностью открыт. Исключение составляет внешняя компонента используемая на клиенте и дополнительное мобильное приложение Push0kService.apk , но закрытая часть написана универсально и никак не влияет на возможность доработки решения. Также закрытый код не содержит какого либо обращения к моим http ресурсам для сбора обезличенной статистики запусков и прочих метрик.
Описание изменений:
Сервер:
-
Добавил возможность отладки серверного скрипта *.js в браузере Google chrome. Галка включения отладки в настройках и рядом ссылка для перехода в браузер chrome. Отладка может быть запущена и удаленно с другого компьютера локальной сети, то есть не обязательно запускать на том же компьютере где запущен серверный скрипт *.js.
-
Оптимизировал по серверный скрипт *.js: убрал комментарии, инициализацию новых свойств объектов где возможно, вынес настройки в отдельный файл.
-
Сделал статистику прикрепленных файлов размер, получено и передано максимальные скорости передачи. Файлы хранятся на диске частями перекодированные в base64 внутри файлов json.
-
Заполнил справочную информацию: по установке, настройке и логике заполнения, в встроенной справке 1с.
-
Сделал возможность блокировки пользователей при частом вводе неправильного пароля, по сути защита от брутфорса - подбора паролей.
-
Убрал возможность установки пароля пользователя, пароль генерируется по кнопке случайный и временный. При первой авторизации клиента в клиентском приложении появляется диалог для смены пароля и без смены дальше ничего не работает.
-
Добавил много новых настроек, более подробно в справке.
Клиент:
-
Добавил отображение новых не прочтенных сообщений. Рыжая цифра новых в списке пользователей и жирно рыжая дата в сообщениях.
-
Реализовал прогресс бар при передаче и загрузке файлов на или с сервера.
-
Добавил x64 версию внешней компоненты.
-
Сделал отображение собственного контакта в списке для передачи файлов между устройствами и другой информации.
-
Сделал возможность перетаскивания файлов вложений из сообщений.
-
Добавил “бота” в собственный контакт при получении NFC метки, ищет в метке ссылку на справочник, далее ищет ссылку в справочнике и если находит, пишет автоматически сообщение с ссылкой в чат.
-
Реализовал клиентскую версию в виде внешней обработки. Данные сохраняются локально в виде файлов html, отдельно для каждой базы. Обращений к серверу практически нет. Сделал отображение картинок по умолчанию круглым.
Клиент android
-
Убрал использование мобильной Внешней Компоненты.
Добавил вместо ВК дополнительное приложение - службу. Приложение Push0kService.apk позволяет оставаться на связи, android не закрывает приложение и дополнительную службу. Для корректной работы требуется заблокировать отображение уведомлений от приложения 1С, уведомления выводятся службой Push0kService.apk
-
Добавил отображение новых не прочтенных сообщений. Рыжая цифра новых в списке пользователей и жирно рыжая дата в сообщениях.
-
Реализовал уведомление - прогресс бар при передаче и загрузке файлов на или с сервера.
-
Сделал интеграцию с приложением чтения записи NFC меток Беспроводные метки NFC. Позволяет записывать переданные в чат ссылки на справочники в метку NFC.
-
Добавил возможность кадрирования - обрезки выбираемых картинок для фотографии пользователя, также обрезать можно и кружочком.
Все описанные конфигурации разрабатывалось на версии платформы 8.3.10, и рекомендуется использовать версию не ниже.
Серверная push0k часть может работать как на windows так и на linux, без разницы в файловом база или сервер 1с.
Node.js можно использовать практически любую, но рекомендуется все же последняя. Socket.io рекомендуется 2.0 и выше.
Мобильное приложение и служба Push0kService.apk , рассчитаны на android не ниже 5.0 lollipop
Версия за “стартмани” не имеет возможности в клиентской части подключаться по протоколу https.
Для этого требуется другая дополнительная Внешняя Компонента.
Мобильному приложению android требуется другая версия Push0kService.apk