«проклято, но мне вроде надо, спасибо» © Уважаемый @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