为Home Server配置UPS(二): 配置NUT服务的Web UI - Setup NUT - Web UI
UPS
本文紧接之前的Primary Node。没有搞定主机和UPS通信的朋友请想看链接的这个文章。
因为这里的主机是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 apc@xxx.xxx.xxx.xxx "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 apc@xxx.xxx.xxx.xxx 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
- 应该看到类似下面的网页内容
- Go to
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 yes
和PermitRootLogin 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
- Domain Name(s):
- 重点在于添加了
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的支持(如果真的有一天会支持的话)
- Define location:
至此,访问 nut.<internal>.web
应该就能显示出 UPS的信息了。