Для тех, кто администрирует серверы и/или веб-проекты остро стоит вопрос информированности о том, что же происходит с их «подопечными». На рынке существует масса решений об оповещении о сбоях, состоянии соединения и прочих параметрах, в том числе и с помощью СМС. Речь о MRTG, Twilio, F-Droid, сервисах Google и многих-многих других. Вот только проблема в том, что большинство из этих решений весьма узко специализированы, а повлиять на их функции не представляется возможным. MRTG отдаст информацию о трафике и соединении, Google пришлет СМС. Кое-какую свободу дает Twilio в плане написания скриптов на JavaScript под свои нужды, но простите, это же коммерческий проект. То есть «давай, плати бабло или проваливай».

Так вот, в этом семействе инструментов у нас есть open source пополнение: Gotify — простой клиент-серверный проект для получения и отправки пуш-уведомлений и команд, в том числе и через Android-приложение. И о нем определенно стоит рассказать чуть подробнее, думаю, это пригодится для тех, кто искал нечто похожее и при этом бесплатное, но в итоге завел собственный pet-project. Вполне возможно, эта публикация сэкономит пару сотен часов вашего времени.

Что предлагает Gotify


Проект уже несколько лет мирно существует и развивается на GitHub и за это время обзавелся сервером, веб-клиентом, Android-приложением, API и, конечно же, документацией. Я решил рассказать о Gotrify по двум причинам: он open source и работает не только на «прием», но и на «отдачу», все сорцы лежат на GitHub, плюс он конфигурируется с помощью bash-скриптов. Ну и конечно же, он бесплатный.

Большинство существующих решений нацелены исключительно на прием уведомлений от целевого сервера\устройства, но не на полноценное взаимодействие между клиентом и сервером. То есть, вы можете получить уведомление о том, что ваш сервер упал, либо пропал интернет. Поинтересоваться же самостоятельно, что происходит на «том берегу» не всегда удобно и можно сделать в том же приложении/окне. Чаще всего, для получения подобного рода информации приходится подрубать VPN или (прости-господи) какой-нибудь TeamViever и смотреть «руками». Выше я упоминал, что некоторый простор дает Twilio за счет самописных JS-скриптов, но это платно, так что мимо.

По факту весь проект Gotify разделен на три части: сервер, клиент и приложение. Сервер работает понятно как — на отправку и прием сообщений, клиент — только на прием, а приложение — только на отправку.



Плюс ко всему у проекта есть API-клиент (и документация), шаблон API, шаблон плагина, собственный веб-сайт, конфигурационная библиотека на Go, которая поддерживает JSON, YAML, TOML и переменные среды, а еще билд сервера, клиент и, собственно, Android-приложение. Единственное, что может беспокоить — это Android-приложение. В мире нет ничего более беспомощного, безответственного и безнравственного, чем мониторинг инфраструктуры через мобильный телефон. Но технологии идут вперед и мы знаем, что рано или поздно перейдем и на эту дрянь. Не то чтобы это был минимально необходимый набор, чтобы удаленно общаться с сервером, но когда open source сообщество начинает пилить собственные инструменты, ему сложно остановиться.

Отдельно стоит сказать о том, что для общения с сервером нужна только аутентификация и токен приложения, который возвращается сервером через REST-реквест. В дальнейшем с использованием этого токена можно получать сообщения через любой http-клиент, например через curl или HTTPie:

$ curl -X POST "https://push.example.de/message?token=<apptoken>" -F "title=my title" -F "message=my message" -F "priority=5"
$ http -f POST "https://push.example.de/message?token=<apptoken>" title="my title" message="my message" priority="5"

Согласно руководству на официальном сайте проекта, пуши на сервер с разным приоритетом можно отправлять как на Golang, так и на Python:

Golang

package main

import (
        "net/http"
        "net/url"
)

func main() {
    http.PostForm("http://localhost:8008/message?<apptoken>",
        url.Values{"message": {"My Message"}, "title": {"My Title"}})
}

Python

import requests #pip install requests
resp = requests.post('http://localhost:8008/message?token=<apptoken>', json={
    "message": "Well hello there.",
    "priority": 2,
    "title": "This is my title"
})

Также под Linux и Mac возможно и написание собственных плагинов. Вот их доступные характеристики, которые перечислены на сайте проекта:

  • индивидуальные плагины для каждого пользователя;
  • регистрация кастомных обработчиков http;
  • отправка сообщений в виде приложения;
  • система конфигурации на основе YAML в WebUI;
  • постоянное хранилище для каждого пользовательского плагина;
  • отображение динамически генерируемых инструкций для пользователей.

В основе системы плагинов Gotify лежит стандартная система плагинов Go, которая описана тут. Для чего их можно использовать в Gotify? разработчики приводят в пример получение вебхуков от GitHub, Travis CI и прочих, опрос каналов через RSS, Atom источники и расширение стандартной функциональности WebUI, ну и конечно же доставка алерт-уведомлений о сбоях. На этой странице можно найти шаблон для плагина и пояснения по коду. Для правильной работы плагинов разработчики рекомендуют использовать Docker, но и без него вполне возможно настроить работу Gotify, хотя корректная отправка и прием сообщений в этом случае не гарантируются.

Я не стал приводить тут полный текст базовой документации по проекту — все можно почитать самостоятельно. Судя по отзывам, проект получился достаточно продуманным, хотя бы с той стороны, что не используется SMS-оповещение (что неудобно, если вы находитесь за границей или в подвале), активно пытается игнорировать power-safe mode, который завезли в Android 6-7. Gotify любопытен хотя бы тем, что это — open source, то есть бесплатно и ничего не мешает сделать форк, взять в руки напильник и довести этот инструмент до состояния, подходящего под нужды определенных людей/команды.



Ссылки


  1. Репозиторий GitHub.
  2. Официальный сайт проекта.
  3. Документация по API.

Комментарии (3)


  1. softkot
    12.03.2019 20:14
    +1

    Прекрасный проект, развития и успехов. Есть вопрос разработчикам. Android приложение корректно работает в режиме глубокого сна? Если я не ошибаюсь, то начиная с определенного api level разбудить девайс могут только пуши от google с высоким приоритетом.


  1. QtRoS
    13.03.2019 01:25

    Согласно руководству на официальном сайте проекта, пуши на сервер с разным приоритетом можно отправлять как на Golang, так и на Python

    Какая интересная формулировка. А другими средствами нельзя HTTP запрос отправить? :)
    Может быть час поздний, но по тексту не удалось понять — какая типичная схема развертывания? Допустим, инхаус внутри организации хочется получить оперативную доставку уведомлений на мобильный телефон. Что для этого нужно? Видимо, развернуть свой сервер и опциально клиенты? Как появляется связь между приложением и конкретным сервером? Было бы здорово увидеть пример!


  1. Valsha
    13.03.2019 02:00

    Ну на мобильный телефон подучить можно, но я так понимаю только на Android. Для APN нужен же сертификат.