Gotify — open source проект по доставке уведомлений и отправке сообщений на сервер



    Для тех, кто администрирует серверы и/или веб-проекты остро стоит вопрос информированности о том, что же происходит с их «подопечными». На рынке существует масса решений об оповещении о сбоях, состоянии соединения и прочих параметрах, в том числе и с помощью СМС. Речь о 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.
    • +25
    • 6.9k
    • 3
    Support the author
    Share post

    Similar posts

    Comments 3

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

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

          Only users with full accounts can post comments. Log in, please.