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, то есть бесплатно и ничего не мешает сделать форк, взять в руки напильник и довести этот инструмент до состояния, подходящего под нужды определенных людей/команды.

Ссылки

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