各类盒子安装Home assistant的日常维护与灾备
哈喽,艾瑞巴蒂。我是你们的智能家居领路人CT。在过去的几个月里,我分别给大家介绍了利用N1,章鱼星球,以及移动魔百和CM311-1A安装openwrt或armbian来运行home assistant以及相关的一些应用。相信安装这方面大家通过之前的教程也已经掌握,如果有需要也可以翻看之前相关内容。而本篇我们首先要讲的是系统应用全部部署完成之后如何进行版本升级。其次就是我们该如何应对当升级失败,或者盒子发生硬件故障时如何能迅速的利用备份文件和备用硬件迅速顶上原有系统。将家里自动化中断时间减到最低。
系统升级
通常情况下,我是不建议大家对任何智能家居相关应用进行升级的,特别是Home Assistant,一直在更新,一个月就有6,7个版本,每隔几个月还会再来个大版本更新。所以我之前一直戏称HA的玩家不是在升级,就是在升级的路上。所以我这里给大家的建议是非必要,不升级,除非新版拥有你确实需要的新功能和新特性,不然咬死不更新,因为每次更新都可能带来原有集成不能使用,或是yaml配置规则修改需要重写配置文件等问题。目前我自己在跑的HA还停留在2022.4版,这是因为4月这版新增了apple tv和homepod的支持:
而我估计我的下一次升级应该是等HA支持matter协议了。但是有些人说,我有强迫症,不更新浑身难受怎么办,那我这里给的建议就是不要更新结尾为.0的大版本,基本上大版发布以后,再等个2-3个小版,等版本号到.3 .4了之后再做更新,一则是系统自有的bug基本都会被修复,二是集成作者也会在这段时间内更新集成版本以适配新版系统。下面我们就来说说如何对现有系统进行升级:
按照我的教程,目前安装在盒子内的home assistant基本都是基于docker容器运行的,其中openwrt自带DockerMan管理插件,而armbian安装的,我也推荐使用portainer ce进行docker的管理,两者都带有非常便捷的UI界面。在portainer下,我们只要非常简单的点击容器内的Recreate按钮:
然后在弹出的对话框内打开Pull latest image开关,再点击红色的Recreate即可:
这时原先的Recreate按钮就会变成Recreation in progress的信息,此时,portainer会对容器进行停止,删除,拉取最新镜像,以及重建容器的一系列操作。
等完成之后,你就有了一个最新版本的容器:
当然,这里大家不要忘记,去image菜单里把老版本的镜像删除:
不过这里需要提醒的是,使用这个方法升级,必须确保在首次创建容器时,使用的镜像版本是latest,stable等,如果创建的是指定具体版本号的容器,就不能依据这个方法简单升级,只能手动升级了。
而在openwrt的dockerman下同样也是一键升级。
系统备份
因为按照我的教程,所有的应用都是跑在容器上的,所以理论上非常简单的,只要把各个容器映射出来的文件复制出来,就相当于做了备份:
但是这里有一个问题就是,docker的数据备份需要停止容器后才能备份,如果不停止容器的话,很容易就丢失文件内容。
如果每天备份的话,等于我每天都要中断一次HA,这个说实话,有点难受。而如果不关闭容器直接用cp命令复制文件,则经常会出现部分文件只有文件名,没有内容的情况。而使用rsync命令则会丢失自定义集成的配置。当然,其实HA Core有自己的备份途径,可以通过自动化非常方便的创建定时备份,例如下面的自动化就是每天晚上3点自动创建一个备份:
创建好的备份会自动保存在homeassistant映射目录的backups文件夹里:
不过这个有个问题就是,我是在盒子上运行的HA,一是每天备份不及时移出的话,会导致盒子的EMMC没多久就被写满。二是EMMC的寿命有限,每天这样备份,也不知道盒子能撑多久。如果不嫌麻烦的话,最简单的方式就是在升级或是大改前自己备份。不过这显然不符合我们智能家居自动化的需求。于是经过多次尝试,我发现通过直接使用tar命令将整个映射文件打包的方式,就能将文件夹内所有文件都成功复制出来,不会丢失任何数据,所以我这里就写了一个简单的脚本配合crontab计划任务来实现每天自动备份所有配置到NAS上,当然,你也可以直接在盒子上插个优盘进行备份。不过我自己吃过优盘的亏,所以就不搞优盘了。当然还有个选择就是docker在创建一个云盘的应用,把云盘直接映射到本地,然后直接把文件复制到云盘,不过我自己有nas,所以就不折腾这些了。脚本内容如下:
首先我做的是ping我的nas主机,看看主机是否在线,如果在线,返回OK信息,然后把NAS上的共享文件夹(//192.168.10.178/casatift_M2_1/backup)挂载到本机/home/share/backup文件夹,这样本机backup文件夹内的文件实际就是nas远程目录下的文件,然后把要备份的文件根据日期名对其进行打包,放入backup文件夹(tar -zcPvf /home/share/backup/backup$(date +%Y%m%d).tar.gz /home/share/backup/temp),我这里不光备份了HA,之后再查找backup文件夹下超过6天没修改的文件,将其删除(find /home/share/backup/ -mtime +6 -name "*.tar.gz" -exec rm -rf {} ;),也就是我每天备份一次,然后保留最近7天的备份。最后等待30秒,断开挂载。
最初的时候我是想盒子启动就自动挂载的,后来考虑到每次开机的时候nas究竟在不在线其实也不是100%,并且即使开机时在线,运行过程中也有可能断,所以我这里就直接改成了每次备份前检测nas状态,然后挂载远程目录,备份完成后断开。代码写完之后保存成.sh文件,然后chmod +x赋予可执行权限。
可以使用 bash 文件名执行下脚本测试。如果没有问题,使用crontab -e命令,修改计划任务表:
添加红线内容,这条内容的意思是每天凌晨3点执行我们刚才创建的脚本。
然后重新加载cron,命令为/etc/init.d/cron restart
然后我们的自动备份设定就完成了,每晚的3点,nas上就会自动生成一个新的备份打包文件,并删除6天前的备份:
而如果我们想复原备份,也仅仅只需要解压缩打包文件,将里面的内容复制到新的docker容器对应的挂载文件夹里运行即可。而因为docker的特性,所以这里并不要求备用盒子的硬件与主盒子相同,也就是说,你日常可以用N1,但还原备份的时候可以用魔百和或章鱼星球甚至X86,只要是docker,你就能完美复原备份。
不过这里还有个小问题,就是如果docker上还跑有mqtt服务的话更换硬件之后mqtt服务的IP地址会变,如果去设置每一个设备不管怎么样都是比较麻烦的,这里有两个简单的方式,一是将备用主机的IP手动设置成原有主机的IP地址,第二如果你使用openwrt一类可以做DNS劫持的路由的话,就可以在局域网内使用域名替代IP地址:
这个域名你可以随便设,因为仅在局域网内有效。然后所有有关mqtt服务器的地址设置全部使用此域名就好了,如果更换IP,也只需要在路由器里更新下就好。
总结
得益于盒子们低廉的价格,所以我自己日常家里都会多备上一台应急用的盒子,里面docker的容器都配置好,只要插上电,解压缩备份文件,然后复制进备用盒子,必要时可能还要升级下盒子里的容器镜像版本,只要不超过5分钟的时间,就能恢复整个家庭的智能家居应用。最后祝大家玩的开心。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~




















telanx
校验提示文案
咪了个喵喵喵
校验提示文案
买买买sir
校验提示文案
唔系大大王
校验提示文案
因你们而飞
校验提示文案
POKO哑虎呸呸
校验提示文案
supercoolman
校验提示文案
用户i
校验提示文案
天空的鱼1987
校验提示文案
天空的鱼1987
校验提示文案
唔系大大王
校验提示文案
用户i
校验提示文案
买买买sir
校验提示文案
supercoolman
校验提示文案
POKO哑虎呸呸
校验提示文案
咪了个喵喵喵
校验提示文案
因你们而飞
校验提示文案
telanx
校验提示文案