在 Proxmox 上设置 NUT

发布: (2026年2月9日 GMT+8 15:21)
5 分钟阅读
原文: Dev.to

I’m happy to translate the article for you, but I’ll need the text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line and all formatting exactly as you specify.

Source:

1. UPS 设置

1.1 UPS 连接

确保 UPS 已经接入网络。此示例使用 APC SRT3000XLI 3000VA 230V 在线 UPS,并已安装 NMC(网络管理控制) 模块。完整教程请参见此处

1.2 时区

  1. 打开 Configuration > General > Date/Time > Mode 菜单。
  2. 选择 NTP Poolhttps://www.ntppool.org/en/zone/id

Timezone configuration

1.3 SNMPv3

  1. 启用 SNMPv3:Configuration → Network → SNMPv3 > Access,勾选 Enable

    Enable SNMPv3

  2. 创建用户配置文件:Configuration → Network → SNMPv3 > User Profile。从四个默认配置文件中选择一个。

    SNMPv3 user profile

1.4 低电池延迟

Configuration > ShutdownLow Battery Duration 中将延迟设置为 20 秒

Low Battery Duration

2. Proxmox 主机设置

2.1 安装 NUT 包

apt update
apt install -y snmp nut nut-snmp

2.2 配置 NUT 模式

编辑文件 /etc/nut/nut.conf 并将 MODE 行改为:

MODE=standalone

2.3 配置 UPS(ups.conf)

nano /etc/nut/ups.conf

添加(或修改)以下块,使用已在 UPS 上创建的用户配置文件:

[apcsrt]
    driver = snmp-ups
    port = 10.0.3.136          # UPS IP
    snmp_version = v3
    secLevel = authPriv
    secName = apc_agent3
    authProtocol = SHA
    authPassword = farmcenter1009
    privProtocol = AES
    privPassword = farmcenter1009

2.4 创建 NUT 用户(upsd.users)

nano /etc/nut/upsd.users

在文件最底部添加:

[monuser]
    password = passwordbebas
    upsmon primary

Ctrl+W 搜索,随后 Ctrl+V 粘贴(如果使用 nano 编辑器)。

2.5 配置监控(upsmon.conf)

nano /etc/nut/upsmon.conf

修改 NOTIFYCMDNOTIFYFLAG 部分:

# Example:
# NOTIFYCMD /usr/bin/notifyme
+NOTIFYCMD /usr/local/bin/nut-notif.sh

NOTIFYFLAG ONBATT EXEC
NOTIFYFLAG LOWBATT EXEC
NOTIFYFLAG ONLINE EXEC

在文件最底部添加 MONITOR 行:

MONITOR apcsrt@localhost 1 monuser passwordbebas primary

确保使用的密码与 /etc/nut/upsd.users 中定义的相同。

2.6 重启 NUT 服务

systemctl restart nut-driver nut-server nut-monitor

2.7 验证与 UPS 的连接

upsc apcsrt@localhost

显示关键参数:

upsc apcsrt@localhost | egrep "battery.charge|battery.runtime|ups.status|battery.runtime.low|battery.runtime"

如果输出中出现这些数值,说明 NUT 已成功连接到 UPS。

2.8 通知脚本(/usr/local/bin/nut-notif.sh

创建文件 /usr/local/bin/nut-notif.sh(确保具有执行权限),内容为向 Telegram 发送消息的脚本。示例:

#!/bin/bash
# nut-notif.sh – 向 Telegram 发送 UPS 通知

# ==== CONFIGURATION ====
TOKEN="YOUR_TELEGRAM_BOT_TOKEN"
CHAT_ID="YOUR_TELEGRAM_CHAT_ID"
# =======================

EVENT=$1   # ONBATT、LOWBATT、ONLINE 等
MESSAGE="⚡ UPS ${EVENT} 于 $(date '+%Y-%m-%d %H:%M:%S')"

curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
     -d chat_id="${CHAT_ID}" \
     -d text="${MESSAGE}" >/dev/null
chmod +x /usr/local/bin/nut-notif.sh

YOUR_TELEGRAM_BOT_TOKENYOUR_TELEGRAM_CHAT_ID 替换为对应的实际值。

3. 结语

通过上述步骤,Proxmox 将:

  • 通过 NUT 实时监控 UPS 状态。
  • 当状态发生变化(ON BATT、LOW BATT、ONLINE)时,向 Telegram 发送通知。
  • 当 UPS 处于 Low Battery(低电量)状态时,自动关机。

希望本教程对您有帮助!如果有任何问题或疑问,请留下评论或通过 Telegram 联系我。 🚀

Bash 脚本用于向 Telegram 发送 UPS 通知

以下是一个示例 Bash 脚本,可用于通过已在 BotFather 创建的机器人,将 UPS 状态(ON BATTERY、LOW BATTERY、ONLINE)通知发送到 Telegram。

#!/bin/bash

# ------------------------------------------------------------------
# Setup variabel
# ------------------------------------------------------------------
TOKEN="6495733192:AAEiztfp_b6JoZB7uUWhpZV89KbpVQou_34"
CHAT_ID="-1001768856329"
TOPIC_ID="53038"
EVENT="$NOTIFYTYPE"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

# ------------------------------------------------------------------
# Fungsi untuk mengirim pesan ke Telegram
# ------------------------------------------------------------------
send() {
  curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
    -d chat_id="${CHAT_ID}" \
    -d message_thread_id="${TOPIC_ID}" \
    -d parse_mode=HTML \
    --data-urlencode text="$1"
}

# ------------------------------------------------------------------
# Buat trigger EVENT dari upsmon.conf
# ------------------------------------------------------------------
case "$EVENT" in
  ONBATT)
    MSG=$(printf "UPS ON BATTERY \n\n%s" "$DATE")
    ;;
  LOWBATT)
    MSG=$(printf "UPS LOW BATTERY \n\n%s\nProd server Graceful Shutdown" "$DATE")
    ;;
  ONLINE)
    MSG=$(printf "UPS ONLINE \n\n%s" "$DATE")
    ;;
  *)
    exit 0
    ;;
esac

# ------------------------------------------------------------------
# Panggil fungsi dengan parameter $MSG
# ------------------------------------------------------------------
send "$MSG"

Catatan:
绿色部分(变量 TOKEN)是从 Telegram BotFather 获取的令牌。请确保该令牌正确且您的机器人已完成设置。

脚本测试方法

运行上述脚本时,设置环境变量 NOTIFYTYPE 为想要测试的事件。

NOTIFYTYPE=ONLINE UPSNAME=apcsrt@localhost /usr/local/bin/nut-notif.sh
NOTIFYTYPE=ONBATT UPSNAME=apcsrt@localhost /usr/local/bin/nut-notif.sh
NOTIFYTYPE=LOWBATT UPSNAME=apcsrt@localhost /usr/local/bin/nut-notif.sh

如果一切配置正确,您将收到 Telegram 消息,内容对应每个事件中定义的文本。

高级测试

要进行真实测试,拔掉 UPS 电源并等待 UPS 进入 Low Battery(低电量)模式。如果配置正确,服务器将自动执行在 NUT(Network UPS Tools)中设置的关机命令。

祝您测试顺利,祝使用愉快!

0 浏览
Back to Blog

相关文章

阅读更多 »

解锁笔记本电脑 GPU 的隐藏力量

概述:大多数现代笔记本电脑都配备了强大的 GPU,但往往未被充分利用。无论你是运行本地 LLM 的软件工程师,还是数据科学家……