Перейти к содержимому

Введение в плагины Notifly

[!caution] Плагины недоступны в облачной (serverless) версии Notifly.

Yandex Cloud Functions запускают каждый запрос в изолированном окружении и не позволяют динамически загружать .so-файлы. Плагины работают только в self-hosted-сборке (см. Установку). Для облачной версии рекомендуется использовать вместо плагинов:

  • Вебхуки — приём событий от внешних систем;
  • Email Inbox — приём писем как уведомлений;
  • WebScript — события с фронтенда без бекенда;
  • Heartbeat и Активные мониторы — встроенные источники алёртов;
  • MCP-сервер — интеграции с AI и сторонними скриптами через готовые инструменты.

[!warning] Плагины в настоящее время поддерживаются только на Linux и MacOS из-за текущего ограничения golang.

Эта документация в целом предназначена для разработчиков плагинов. Если вы просто хотели использовать существующий плагин, вам нужно обратиться к документации разработчика плагина.

Notifly предоставляет встроенную функциональность плагинов, построенную поверх go plugin system. Она создана для расширения функциональности Notifly.

  • Один экземпляр плагина на пользователя
  • Регистрация пользовательских обработчиков HTTP
  • Отправка сообщений от имени канала
  • Система конфигурации на основе YAML в WebUI
  • Постоянное хранилище для каждого экземпляра плагина пользователя
  • Отображение динамически генерируемых инструкций пользователям
  • Получение webhook от GitHub, Travis CI и т. д.
  • Опрос новых каналов через RSS, Atom или другие источники.
  • Расширение функциональности WebUI.
  • Доставка уведомлений об сигнализации.

Сначала давайте посмотрим на минимальный пример плагина notifly, вы можете скопировать этот образец кода для загрузки собственного плагина:

package main
import (
"github.com/notifly/plugin-api"
)
// GetNotiflyPluginInfo — возвращает информацию о плагине notifly
func GetNotiflyPluginInfo() plugin.Info {
return plugin.Info{
Name: "minimal plugin",
ModulePath: "github.com/Notifly/example/minimal",
}
}
// Plugin — экземпляр плагина
type Plugin struct{}
// Enable — реализует plugin.Plugin
func (c *Plugin) Enable() error {
return nil
}
// Disable — реализует plugin.Plugin
func (c *Plugin) Disable() error {
return nil
}
// NewNotiflyPluginInstance — создаёт экземпляр плагина для контекста пользователя.
func NewNotiflyPluginInstance(ctx plugin.UserContext) plugin.Plugin {
return &Plugin{}
}
func main() {
panic("this should be built as go plugin")
}

Эта программа экспортирует две функции: GetNotiflyPluginInfo и NewNotiflyPluginInstance, notifly используются эти для получения метаданных плагина и создания экземпляров плагина для каждого пользователя.

GetNotiflyPluginInfo должна возвращать plugin.Info, содержащую описательную информацию о текущем плагине, все поля опциональны кроме ModulePath (путь модуля этого плагина), который используется для различения разных плагинов.

NewNotiflyPluginInstance вызывается с plugin.UserContext для каждого пользователя при запуске и каждый раз, когда добавляется новый пользователь, плагин должен вернуть экземпляр плагина, который удовлетворяет интерфейсу plugin.Plugin. Больше функциональностей можно реализовать, реализовав больше интерфейсов в пакете plugin-api.