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