TrueNAS + Pushover = ❤️

 Публичный пост для комнаты «Селфхостинг»
14 октября 2024  400
Держи долор

«проклято, но мне вроде надо, спасибо» © Уважаемый @TiraelSedai

💬 Вступление

Одной из самых известных и бесплатных операционных систем для NAS является TrueNAS, в частности TrueNAS SCALE (далее, для удобства, я буду называть TrueNAS именно её). TrueNAS умеет отправлять уведомления несколькими способами среди которых, к большому сожалению, нет интеграции с прекрасным сервисом Pushover, который по праву признан одним из самых удобных способов доставки. Зато есть интеграция с Amazon Simple Notification Service, который, в свою очередь, можно интегрировать с Pushover :)

Так как я пытаюсь все уведомления от homelab-сервисов привести к общему знаменателю (коим и является Pushover), то я потратил некоторое время на настройку данной интеграции, а результатом спешу поделиться с вами.

📋 Что нам понадобится

  • Аккаунт в Pushover.
  • Установленное и настроенное приложение Pushover для iOS или Android.
  • Аккаунт в AWS.
  • Доступ к админке TrueNAS.
  • Установленный на локальной машине Node.js.
  • 15-30 минут времени.
  • Хорошее настроение.

📫 Pushover

На главной странице Pushover нам нужно найти и сохранить User Key.


Потом прокручиваем вниз и нажимаем на ссылку Create New Application/API Token.

Теперь нужно указать имя, по желанию краткое описание и URL, загрузить картинку (она будет отображаться в приложнении и в push-сообщении), согласиться с условиями использования и нажать Create Application.

Готово! Сохраняем API Token/Key и отправляемся дальше.

💾 Готовим код

В любом удобном месте создаём папку для кода и переходим в неё:

mkdir pushover_test
cd pushover_test

Убеждаемся, что Node.js установлен и создаём проект, после чего устанавливаем необходимый модуль:

npm --version
npm init
npm install pushover-notifications


Далее в любимом редакторе создаём файл index.js в данной директории со следующим контентом:

var Push = require('pushover-notifications');

exports.handler = function(event, context) {

    var push = new Push( {
        user: process.env['PUSHOVER_USER'],
        token: process.env['PUSHOVER_TOKEN']
    });

    var snsMessage = event.Records[0].Sns.Message;

    var alertSubject = snsMessage.Subject;
    var alertTime = snsMessage.Timestamp;
    var alertMessage = snsMessage;

    var message = {
        title: alertSubject,
        message: alertMessage,
        timestamp: alertTime,
        url: "https://127.0.0.1",
        url_title: "TrueNAS"
    };

    push.send( message, function( err, result ) {
      if ( err ) {
        throw err;
      }
    });

};


Можно прописать юзера и токен в коде, но лучше хранить в переменных окружения.

Сохраняем и пакуем содержимое (!) нашей папки в ZIP архив:

zip -r pushover_app.zip .

ƛ AWS Lambda

Логинимся в AWS. В строке поиска вверху набираем lambda.


Выбираем Lambda. Нажимаем Create function.

Выбираем Author from scratch вверху, вводим имя, значение Runtime оставляем как есть (Node.js 20.x) и нажимаем Create Function внизу.

Отлично, функция есть (не забудем запомнить её APN).

Теперь загрузим её код. Выбираем Upload From → .zip file на вкладке Code под диаграммой функции.

Выбираем наш архив с предыдущего шага и грузим его. В результате увидим в открывшемся редакторе наш код.

Переходим на вкладку Configuration и выбираем Environment Variables. Их мы ещё не добавили, поэтому нажимаем кнопку Edit.

Добавляем две переменных, PUSHOVER_USER и PUSHOVER_TOKEN со значениями User Key и API Token/Key соответственно, которые мы сохранили при работе с Pushover.

Тут, собственно, мы закончили, двигаемся дальше.

📣 AWS SNS

В строке поиска вверху набираем sns (не sms). Выбираем Simple Notification Service.


В меню слева выбираем Topics, а затем нажимаем на Create Topic.

Тут нужно выбрать Standard type, ввести имя и нажать Create Topic внизу.

Отлично, топик мы создали. Сохраним где-то значение поля ARN и нажимаем Create Subscription.

Выбираем APN топика, AWS Lambda в качестве протокола и APN созданной нами функции.

Теперь нажимаем Create Subscription внизу.

👨🏻‍💻 AWS IAM

В строке поиска вверху набираем iam и выбираем одноимённую опцию.


В меню слева выбираем Access management → Policies. Нажимаем оранжевую кнопку Create Policy.

В первую очередь выбираем сервис, который нам нужен: SNS.

Теперь выбираем Publish в группе Write.

Ниже выбираем specific в секции Resources и нажимаем Add ARNs.

Вводим наш регион и имя топика. В результате в поле Resource ARN должен сформироваться такой же ARN, как и тот, который получился в результате создания топика.

Добавляем ARN и нажимаем Next.

Вводим имя политики и её описание (не обязательно). Нажимаем Create Policy.

Теперь слева выбираем Access management → Users и нажимаем Create User. Вводим имя юзера и нажимаем Next.


Выбираем Attach policies directly, отмечаем созданную нами политику и нажимаем Next.

Ещё раз убедимся, что всё правильно и нажимаем Create user.

Отлично, пользователя мы создали. Нажимаем View user и переходим на вкладку Security credentials.

Ниже нажимаем Create access key в секции Access keys.

Выбираем Other и нажимаем Next.

Вводим имя и нажимаем Create access key.

Сохраняем access key, secret access key и нажимаем Done.

🗄️ TrueNAS

Идём в TrueNAS админку, в секцию System → Alert Settings. В заголовке Alert Services нажимаем Add.


Вводим имя, выбираем тип (AWS SNS) и уровень уведомлений (от info (вообще всё что можно включая свежие апдейты) до emergency (NAS догорает, I'll be back, все дела), я выбираю info). Дальше вводим данные из AWS: регион (берём из ARN), ARN топика, key id (это access key пользователя AWS) и secret key (это secret access key пользователя AWS). Нажимаем Save.

🧪 Тестирование

Отправить тестовое сообщение можно со страницы создания/редактирования сервиса. Выглядит на телефоне это как-то так:


💰 Сколько это будет стоить?

Практически нисколько.

AWS SNS и Lambda будут бесплатными, а если у вас и будет больше миллиона сообщений в месяц — вы и сами в курсе, что промышленное использование должно оплачиваться 😉


Плюс $5 единоразово (!) за активацию приложения Pushover на телефоне (после 30-дневного триала).

Всем спасибо ✌🏻 Надеюсь кому-то это тоже будет полезно.

32 комментария 👇

Кажется, я бы забил на стадии "ну хотя бы в телеграм оно алерты слать умеет и норм", но ради искусства уважаю, конечно

  Развернуть 1 комментарий

@TiraelSedai, оно, конечно, да, но у меня идея разделить телегу (которую я часто на мьют ставлю) и важное

  Развернуть 1 комментарий

@rostbond, у меня в Телеге на мьюте все каналы, кроме важных (мои няшные ботики) и контакты.

  Развернуть 1 комментарий

@Spaider, ко всему прочему Телега не умеет emergency alert присылать (например, если сервак перегрелся). Эта штука умеет (если дописать три строчки кода).

  Развернуть 1 комментарий

@rostbond, нифига не понял, ну ладно :)

  Развернуть 1 комментарий

@Spaider, перефразирую: можно добавить вторую интеграцию и слать отдельные уведомления при критических ошибках, которые будут приходить со звуком независимо от режима телефона и которые будут висеть непрочитанными посредине экрана :)

  Развернуть 1 комментарий

Очень странно, что TrueNAS не умеет слать алерты тупо на какой-нибудь HTTP эндпоинт. Столько "па" можно было бы сэкономить в этом чюдном танце :)

  Развернуть 1 комментарий

@Spaider, раньше мог (можно было кастомный скрипт использовать)

  Развернуть 1 комментарий

В целом поддерживается отправка email, наверное, на локалхост в том числе — можно их читать и обрабатывать не отходя от кассы, получается

  Развернуть 1 комментарий

@loskutov, поддерживаю. Локально получить письмо, обработать и пукнуть curl'ом на https://api.pushover.net будет более правильно с точки зрения селф-хостинга :) А так уже гибридный хостинг получается.

  Развернуть 1 комментарий

@Spaider, интересная идея, спасибо. Это надо обмозговать :)

  Развернуть 1 комментарий

SNMP Trap тоже выглядит приемлемым вариантом, хотя плохо понимаю, с чем это едят. Так или иначе, не раскрыта тема того, чем так хорош этот Pushover, что стоит этих плясок с бубном и дополнительной завязки на стороннюю инфраструктуру

  Развернуть 1 комментарий

@loskutov, Pushover прилетает, собственно, пушем, отформатированное, не мешается с остальными письмами, легко понять от какого именно сервиса прилетело, можно определённые сообщения маркировать как критические. На счёт инфраструктуры прав, прав. Буду думать.

  Развернуть 1 комментарий

@rostbond, пуш-уведомления, конечно, удобны, но ведь есть условный ntfy.sh, который на первый взгляд выглядит как то же самое, только с открытым кодом и возможностью заселфхостить, но допускаю, что дьявол кроется в каких-нибудь мелочах

  Развернуть 1 комментарий

@loskutov, оно там вроде денег хочет, но посмотрю, спасибо за рекомендацию!

  Развернуть 1 комментарий
Ignat Loskutov Разрабатываю всякое 14 октября в 21:28

Интересный получается селфхостинг, завязанный сразу на несколько сторонних сервисов 🤔

  Развернуть 1 комментарий

@loskutov, даже если они отвалятся — будет продолжать работать, пусть и без уведомлений 😎

  Развернуть 1 комментарий

Мне оно ненадо но лайк за суперподробный мануал!

  Развернуть 1 комментарий

Пришел написать про мейл+обработчик. А для селф-хостинга сервиса пуш-уведомлений нет? Я для этой цели использую опять же, почту, но вдруг есть что-то удобнее.

UPD: https://github.com/gotify

  Развернуть 1 комментарий

@AndreyBondarenko, Думаю, что нет. Чтобы всё работало чики-пуки, нужна довольно сложная система: для мобилок у Гугла своя инфра, у Эппла – своя. Для бровзером тоже всё по-другому работает. И даже в этом случае прохождение пушей, вообще говоря, не самая надёжная штука. Делать всё это на селф-хосте очень нетривиальная штука.

  Развернуть 1 комментарий

@Spaider, да вроде сразу нашлось, при чем с клиентами на телефон и интеграцией в Прометеус.

  Развернуть 1 комментарий

@AndreyBondarenko, а где посмотреть? Думаю, что мы всё же про разные вещи говорим.

  Развернуть 1 комментарий

@AndreyBondarenko, Ясно. Тут полностью своя херодура с клиентом и сервером, как я понял. Всё-таки хочется получать родные пуши, в эппле от APNS, на Андроиде от GCM. Кастомные нотификашки, все что я видел, убогие чуть более, чем полностью 🙂

  Развернуть 1 комментарий

@Spaider, а чем убогие? Я не разраб, мне интересно в чем разница.

  Развернуть 1 комментарий

@AndreyBondarenko, Если система берёт на себя доставку сообщения – то это сложно сделать хорошо, чтобы это одинаково нормально работало на любых Андроидах. Могут вылезти проблемы с жором батареи у большинства крупных контор (Xiaomi, Samsung, бла-бла-бла) системные механизмы могут сильно отличаться. Если ещё и “рисовать” уведомления самому, не испльзуюя системные, то сделать их красиво, удобно и без косяков тоже крайне сложная задача.

  Развернуть 1 комментарий

@AndreyBondarenko, Модно пользоваться gotify
Емть ещё Apprise, который позволяет использовать вообще почти любой канал передачи уведомлений, используя smtp

  Развернуть 1 комментарий

@nett00n, Apprise шикарно выглядит!

  Развернуть 1 комментарий

@nett00n, вот не зря я пост написал: столько вариантов накидали! Спасибо!

  Развернуть 1 комментарий

@AndreyBondarenko, если я правильно понял, то вот что есть https://github.com/ItsNotGoodName/smtpbridge
он поднимает smtp-сервер, а из него уже поляет почти хоть куда-хоть в телегу, хоть вообще в свой скрипт

  Развернуть 1 комментарий

@AndreyBondarenko, Я иногда использую ntfy.sh для пушей — там вообще изи всё

  Развернуть 1 комментарий

@AndreyBondarenko, если любитель классики подыми под ногами mailpie, вполне милая штука. mailpie же потом может форвардить на любой email дальше куда скажешь (save state)

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб