最近在折腾Grafana,心血来潮将 UPS 也接入进来,用面板查看 UPS各项数据,效果还是不错的,解决了 NAS 端能看到的 UPS数据有限的问题。

效果图

IMG-BEB09ACF7FCB19A09CB8AF86D59577D7.webp

IMG-8F1C13986A157F4381B6A502BF8CB276.webp


这里以绿联 DXP4800Plus 为例,UPS 型号为APC BK650M2-CH:

1.准备条件:

  • UPS 已通过 USB 接入 NAS
  • NAS 系统【控制面板/硬件与电源/不断电系统】打开 NUT Server 开关
  • NAS 【控制面板/终端机】启用 SSH 服务

1.1 UPS 数据获取

进入 NAS 终端服务,获取UPS 名称等信息:

upsc -l  # 执行该命令

# 输出如下信息,可获取 UPS 名称为 ups0,第一行告警忽略即可
Init SSL without certificate database
ups0

接下来尝试获取UPS 数据读取:

upsc ups0  # 执行该命令

# 输出如下信息,表示UPS数据正常获取
Init SSL without certificate database # 初始化 SSL(未使用证书数据库)
battery.charge: 98 # 电池电量:98%
battery.charge.low: 15  # 电池低电量阈值:15%
battery.mfr.date: 2001/01/01 #电池生产厂商日期:2001 年 01 月 01 日 固件年份,非电池实际生产日期
battery.runtime: 3545  # 电池剩余运行时间(秒)
battery.runtime.low: 120 # 电池低电量剩余运行时间阈值:
battery.type: PbAc # 电池类型:铅酸电池
battery.voltage: 13.7 # 电池实时电压
battery.voltage.nominal: 12.0 # 电池标称电压:
device.mfr: American Power Conversion # 设备生产厂商(APC)
device.model: Back-UPS BK650M2-CH # 设备型号
.......


2.部署基本环境(docker-compose)

首先,在 Grafana 根目录创建 prometheus.yml 文件,复制下方内容:

# Global配置:全局采集/评估规则,所有job默认继承此配置
global:
  # 全局指标采集间隔(默认15秒,可被单个job覆盖)
  scrape_interval: 15s        
  # 告警规则评估间隔(默认15秒,建议与采集间隔保持一致)
  evaluation_interval: 15s    

# 采集目标配置:定义需要监控的所有数据源
scrape_configs:

  # 1. UPS数据(snmp-exporter)
  - job_name: 'nut-ups'
    metrics_path: /nut  # 适配hon95 Exporter的按需抓取路径
    params:
      target: ['192.168.31.5:3493']  # 你的NAS NUT地址
      ups: ['ups0']                  # 你的UPS_NAME(关键!刚才指标里是ups0)
      user: ['admin']              # NUT用户名(默认)
      password: ['admin']       # 替换为你实际的NUT密码
    static_configs:
      - targets: ['192.168.31.5:9199']  # NUT Exporter地址
    scrape_interval: 15s  # 每15秒采集一次UPS数据

⚠️ 注意:上方文件中的部分数据根据注释进行修改,NUT 用户名/密码就是你当前 NAS 登入的用户密码,不放心可以创建一个新账户,对权限进行约束后使用。

接下来,我们需要部署 Grafana 基本环境,如果是初次配置,直接复制整个 compose 文件即可。


# 自定义桥接网络,隔离监控组件
networks:
  monitoring:
    driver: bridge  # 修正之前的笔误(bridg→bridge)
    ipam:
      config:
        - subnet: 172.30.0.0/16  # 自定义子网,避免和家庭内网冲突

# 核心服务配置

# 1. Grafana可视化(图表展示+报表)
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    user: root
    volumes:
      # 持久化Grafana配置/插件/数据(群晖路径)
      - ./grafana_data:/var/lib/grafana
      - /etc/localtime:/etc/localtime:ro  # 同步时区
    environment:
      - GF_SECURITY_ADMIN_USER=admin         # Grafana默认管理员账号
      - GF_SECURITY_ADMIN_PASSWORD=admin123  # 默认密码(首次登录后务必修改)
      - GF_USERS_ALLOW_SIGN_UP=false          # 关闭注册,提升安全性
      - GF_SERVER_ROOT_URL=http://192.168.31.5:3012  # 替换为你的NAS内网IP(如192.168.1.100)
    ports:
      - 3012:3000  # Grafana默认端口,访问用http://NASIP:3000
    networks:
      - monitoring
    depends_on:
      - prometheus  # 确保Prometheus先启动

  # 2. Prometheus核心(采集+存储指标)
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    user: root
    volumes:
      # 挂载自定义Prometheus配置文件(需手动创建,下文附模板)
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      # 持久化Prometheus数据(重启不丢失监控数据)
      - ./prometheus_data:/prometheus
      - /etc/localtime:/etc/localtime:ro  # 同步时区
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'          # 指定配置文件路径
      - '--storage.tsdb.path=/prometheus'                      # 数据存储路径
      - '--web.enable-lifecycle'                               # 启用热重载(无需重启容器更新配置)
      - '--storage.tsdb.retention.time=90d'                    # 数据保留90天(可按需调整)
    ports:
      - 9095:9090  # 映射端口(避免和NAS原有服务冲突,访问用9095)
    networks:
      - monitoring
    depends_on:
      - nut-exporter  # 确保先启动采集器

  # 3.UPS指标采集器
  nut-exporter:
    image: hon95/prometheus-nut-exporter:latest
    container_name: nut-exporter
    ports:
      - "9199:9995"
    environment:
      - NUT_HOST=192.168.31.5
      - NUT_PORT=3493 ## NUT默认端口,无需更改
      - NUT_USER=admin # 这里是你的 NAS 用户名
      - NUT_PASSWORD=admin123 # 这里是你的 NAS 密码
      - NUT_UPS_NAME=ups0 # 前面获取的UPS名称
    restart: unless-stopped

如果你已经部署好了 Grafana + prometheus,则只需要部署第三个 nut-exporter 容器即可。

2.1 环境测试

当所有容器正常启动之后, 首先测试 nut-exporter 是否能正常获取到 UPS 的各项数据。

如果你正常输入 http://192.168.31.5:9199 ,你会看到浏览器输出下方信息:

Prometheus NUT Exporter version 1.2.1 by HON95.
Usage: /nut?target=<target>

这是因为该容器采用「按需抓取」模式(而非常规默认暴露 /metrics),需要通过指定 target 参数才能获取 UPS 指标。

http://192.168.31.5:9199/nut?target=192.168.31.5:3493&ups=ups0&user=admin&password=admin123

所以,将上方链接中的 IP、UPS 名称、账户和密码修改成你自己的,然后在浏览器中打开。

不出意外,你将会获取到下图页面,表示 UPS 的各项数据已被正常抓取。

IMG-BB06EEDE0D31DEA6DFE08979E99108EF.webp

2.2 检查 Prometheus

接下来,打开 Prometheus 后台,依次点击上方菜单 Status/Target health ,如下图所示,则表示 Prometheus 也能正常获取到前面采集的 UPS 各项数据。

IMG-85784ED7D3520DF16BA4296436CCE6E1.webp

3.配置 Grafana 可视化面板

3.1 设置中文(可选)

初次登录 Grafana 主界面,你会看到整个界面是英文状态,这时候点击右上角的头像,打开 [ 个人资料 ] ,下方有语言设置,可将系统语言设置为中文。

IMG-8A864591B514AA17B5FFC41A0AE22284.webp

3.2 配置数据源

依次打开侧栏的 链接 ,选择 添加新链接 ,在右边搜索 Prometheus,数据源结果中选择 Prometheus,点击进入。

IMG-4C2199F08B32DA8BB48AA476EA9DF3C4.webp

Prometheus server URL 这里输入 http://[NAS IP ]+端口,例如 http://192.168.31.5:9095

IMG-A128245F829BAF22B03BA23F85F62D3D.webp

最后滑到页面最底部,点击 保存并测试 ,出现下图提示,则表明连接成功。

IMG-92F93BD5C90DEF89B0D2FB772F2BB94E.webp

3.3 导入数据面板

回到主页面,点击左边侧栏的仪表盘 ,选择右上方的 新建 按钮,在下拉选择导入面板。

Pasted image 20260102131914.webp

选择 上传仪表板 JSON 文件,将我修改好的 JSON 文件导入,下方的数据源选择你创建好的prometheus,然后保存即可(下载链接在末尾)。

Pasted image 20260102132441.webp

4.说明

1.该可视化面板基于编号 [15406] 进行修改,适配 APC BK650M2-CH,其他 UPS 出现数据无法获取的,可根据上方获取数据进行修改。

2.一般情况下,由于家庭消费及的 UPS,主要提供电量、负载、市电状态等数据,像频率 / 输出电压等参数只有数据中心的工业UPS 才会提供,所以原面板有些数据本身就获取不到。

5.下载链接