«проклято, но мне вроде надо, спасибо» © Уважаемый @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-дневного триала).
Всем спасибо ✌🏻 Надеюсь кому-то это тоже будет полезно.


Кажется, я бы забил на стадии "ну хотя бы в телеграм оно алерты слать умеет и норм", но ради искусства уважаю, конечно
Очень странно, что TrueNAS не умеет слать алерты тупо на какой-нибудь HTTP эндпоинт. Столько "па" можно было бы сэкономить в этом чюдном танце :)
Интересный получается селфхостинг, завязанный сразу на несколько сторонних сервисов 🤔
Мне оно ненадо но лайк за суперподробный мануал!
Пришел написать про мейл+обработчик. А для селф-хостинга сервиса пуш-уведомлений нет? Я для этой цели использую опять же, почту, но вдруг есть что-то удобнее.
UPD: https://github.com/gotify