为Home Server配置UPS(二): 配置NUT服务的Web UI - Setup NUT - Web UI

Self Hosted 自托管
Apr 25, 2023 ~

UPS

本文紧接之前的Primary Node。没有搞定主机和UPS通信的朋友请想看链接的这个文章。

配置NUT服务监控UPS: Setup NUT - Primary Node
最近刚刚把 Proxmox 主机上面的 NUT server 搞定,趁着热乎赶紧水一篇,过几天可能就又忘了。NUT 服务是 C/S架构的,主要考虑的应用场景是,UPS给多台电脑供电,而其中一台主机为主,它负责与UPS的通信,同时也成为NUT中的服务器。其他的主机则运行客户端,经由NUTserver获取UPS的情况数据以及决定是否需要关机等操作。 首先是server主机,需要负责与UPS的通信链接,并需要配置一些服务端的信息。 * Step 1: Install NUT * apt install nut * 这一步应该也会创建一个nut的用户(会有一个单独的group: nu…

因为这里的主机是Proxmox VE,所以最干净简洁的办法就是直接创建一个新的LXC,在其中安装配置GUI。LXC的overhead基本可以忽略不计,而相比于在Host上面直接配置GUI,使用LXC让我们可以有更方便的备份以及Snapshot方案,可以随意的在PVE Cluster的节点之间迁移,以及使用独立的IP来对网络(例如防火墙设置)进行管理。总之好处多多,成本几乎没有。

LXC配置

  • 创建LXC需要使用LXC Template (类似Docker的Image,或者VM的Image的概念)。这部分详见PVE文档,不过基本上就是下面几个命令
    • pveam update
    • pveam available --section system 然后看看想用哪个系统,我这里一般就用Ubuntu的LTS版本。
    • pveam download local debian-10.0-standard_10.0-1_amd64.tar.gz 这就是下载到PVE主机了。这里的 local 实际是你PVE上面 storage 的名字。我这里一般把镜像和备份放在一个HDD上面,我起的名字是 WD-Red-4T,所以这里就不能用local 而是用这个 WD-Red-4T
    • pveam list local 就是列出 local 这个storage里面的所有LXC镜像。
    • 之后创建LXC的时候,选择这个storage里面的下载好的Template就可以了。
  • 因为这个LXC只是跑一个简单的 WebGUI,而且只是内网使用,所以基本上不需要给什么硬件资源。
  • 在我的环境中,PVE上面的虚拟机和LXC的网络都是由OPNSense虚拟机进行管理的,所以网络方面就配置成DHCP就可以了,在OPNSense里面会给静态地址分配以及相应的DNS解析。如果没用像我这里用 OPNSense或类似的软路由/防火墙来管理Application的网络的话,给个静态IP是可以的,当然这里的配置需要看各家自己Router上面的配置。
  • Options方面,开机自启动肯定是要开开的。系统上面选择的是Ubuntu。Nesting这里其实应该是不需要的。Unpriviledged应该选上,因为这个LXC没有任何理由需要使用Host上面的Root用户权限。这里的WebGUI,只是通过NUT Client 跟之前配置的 NUT server 通信,获取UPS的信息。

WebGUI配置

  • 无脑执行下面的命令,安装该安装的东西 (LXC下的Ubuntu似乎是不需要用sudo的,默认直接就是LXC里的root用户)
apt install -y apache2 nut-cgi nut-client
  • 配置一下 /etc/nut/nut.conf 为client模式
# Content of /etc/nut/nut.conf
MODE=netclient
  • Setup hosts for NUT
# Content of /etc/nut/hosts.conf

# Replace xxx.xxx.xxx.xxx with the IP address of your NUT server host.
# You can also use the domain name for your NUT server host.
MONITOR [email protected] "a-human-readable-string-for-your-UPS"
  • Setup upsset.conf
    • 这里建议首先阅读一下这个Sample文件里面的内容。基本上就是一个基于IP地址的ACL。我这里就懒得设置了。
    • 文档结尾一行需要是: I_HAVE_SECURED_MY_CGI_DIRECTORY. 其他的我都删除了。
  • Setup  upsmon.conf.
    • 因为不涉及关机操作之类的,所以这里的设定就非常简单了。
    • 这个Client (i.e. upsmon),需要的就是通过一个NUT server 来 monitor 一个remote UPS,用户用NUT server上面设置过的user和password。模式是 slave 模式,然后IP地址是NUT server的地址(用 domain name也可以,只要你DNS搞定了。)
# Content of /etc/nut/upsmon.conf
RUN_AS_USER root
MONITOR [email protected] 1 upsuser ******* slave
  • 最后就是启动CGI和webserver
# May need to add 'sudo', depends
a2enmod cgi
systemctl restart apache2
  • Test your web server
    • Go to http://<your_LXC_ip>/cgi-bin/nut/upsstats.cgi
    • 应该看到类似下面的网页内容

Nginx Proxy Manager 的配置

用IP访问Web UI不够优雅。既然我们有 OPNSense还有Nginx Proxy Manager,那么没有理由我们不能给它一个相对好记的内网域名。

但是因为CGI的原因,Nginx Proxy Manager 这块儿需要一点hack。

目前的配置 如下

  • 上面提到的 LXC 的 IP 由 OPNSense负责分配。这个IP在OPNsense里面设置为静态。因为OPNSense里面设置了给static lease分配域名,所以这里这个LXC的FQDN就是 nutcgi0.<internal_host>.
  • DNS设置好之后,可以用 ping 或者 ssh 实验一下(Note:ssh很可能需要事先在LXC上面的 /etc/ssh/sshd_config 里面把 PasswordAuthentication yesPermitRootLogin yes 打开,除非在创建LXC的时候或者用cloud-init就已经设置好了公钥访问。甚至可能还需要先安装openssh: apt install openssh-server -y
  • 之后我在 Nginx Proxy Manager 里面的设置如下
    • Domain Name(s): nut.<internal>.web
    • Forward Hostname / IP: nutcgi0.<internal_host> (or just the IP of the LXC)
    • Port: 80
  • 重点在于添加了 Custom Locations
    • Define location: /
      • Scheme: http
      • Forward Hostname / IP: nutcgi0.<internal_host>/cgi-bin/nut/upsstats.cgi/
      • Forward port: 80
    • Define location: /upsimage.cgi
      • Scheme: http
      • Forward Hostname / IP: nutcgi0.<internal_host>/cgi-bin/nut/upsimage.cgi/
      • Forward port: 80
    • 需要添加这个的原因就是,默认的情况下,location是 /upsimage.cgi, 那么在 / 映射到 nutcgi0.<internal_host>/cgi-bin/nut/upsstats.cgi/  的情况下, upsimage.cgi 会被映射到 nutcgi0.<internal_host>/cgi-bin/nut/upsstats.cgi/upsimage.cgi/ 然而这是错误的。所以需要多添加一个特殊的 custom location。
      • 这个方法自然也只是对于 NUT CGI 这种非常少链接的GUI管用。复杂的自然还是需要Nginx对CGI的支持(如果真的有一天会支持的话)

至此,访问 nut.<internal>.web 应该就能显示出 UPS的信息了。

标签