1.准备
AX9000是小米出品的一款高端家用路由器,支持Wifi6及外接硬盘,路由器性能强悍,笔者在产品首发时花990元购了一台,目前看价格一路飙涨到1500元,笔者的华为AX3000今年也出现了同样情况,电子消费品逆势上涨实不多见,主要还是市场缺芯导致。
前天看论坛有消息说该路由器支持Docker我觉得路由器的小伙伴鸭梨不小
随手查了小米官方消息,AX9000固件刷开发版本支持了Docker功能
小米路由器AX9000开发者版本Docker功能介绍 - 小米社区 (xiaomi.cn)
一想到小米手机客户端上自带的网盘管理功能效果差的吐血,笔者决定尝试搭建一个家庭网盘试试效果。
准备材料:
1.AX9000路由器一台
2.移动硬盘(也可以用大容量U盘替代)
3.橙子一只(没有橙子的同学也可以用桔子代替)

2.升级固件
下载固件
参考官方指导到该页面进行固件下载(43Mb的bin文件) MiWiFi – 下载

安装固件
进入开发者版本管理后台(默认为192.168.31.1或miwifi.com),输入管理密码,然后进行--常用设置--系统状态,然后选择手动升级固件。



升级中,整个升级实际约2分钟完成,可以用手机难连通后,刷新PC页面重新进入管理后台,再次看版本已经变化,高级菜单中也已经出现了Docker的菜单。


3.Docker环境安装与准备
接下来我们安装Docker运行环境,安装要求:
1安装前需要确认你的硬盘或U盘已经连接到路由器,并且可以被正常识别
2.设备需要>32G,且必须是ext4格式

很遗憾,笔者移动硬盘是windows系统下用,一直是用NTFS格式,200G碎片文件复制到电脑上估计要小半天,决定先以docker功能验证为首要目标,暂时不迁移文件,验证通过后视方案再进行下一步。

翻箱倒柜,总算找出一个满足条件的设备,没错就是它,这个当年性能小霸王:

将U盘格式化U盘为ext4
由于ext4是linux文件系统格式,笔者电脑为win10系统,处理起来稍复杂。
下载软件DiskGenius进行分区处理:


安装Docker环境
u盘连接到路由器,重新执行docker安装:


点击安装第三方管理按钮,安装第三方管理工具进行docker管理。
安装需要几分钟时间,安装完毕后,点击管理docker按钮,进行管理界面,输入账户和密码(均为admin):


从上图可以看到,当前环境中只运行了Portainer自身这个容器,暴露了9001外部端口。
到这里,我们的容器环境已经准备完毕。
4.网盘选择
我们这次目的是安装一个网盘软件,要求能够PC访问,移动端有App可以访问(必须支持IOS系统),最重要是支持镜像部署方式,基于这个前提我们开始软件的选型:
目前主流的几款:NextCloud/ownCloud/seaFile
以前笔者玩过Seafile这款软件,seafile是一款类似百度网盘的软件,其支持web/pc客户端/移动客户端多种终端,而且支持多账户协同,很适合小团队文件共享。
Nextcloud和ownCloud师出同门,这款两产品也支持web/pc/移动版本,功能上和seafile没太大差异。
seafile是python语言写的,国人开发的;nextCloud和ownCloud是php语言写的,外国人开发的;笔者多年前做过短期的PHP开发,讨厌PHP,基于这两个原因优先选择seafile尝试。
5.安装seafile网盘
注意
路由器是ARM架构,通常我们用的镜像是无法在ARM平台上正常运行的,需要找专用于ARM的镜像,百度了下,有人已经将seafile编译并发布了arm镜像,在树莓派部署Seafile最佳实践 - 知乎 (zhihu.com)
如果没有找到arm镜像,则需要自己下载源码编译了。
搜索镜像
挑选镜像及版本
找到正确的镜像信息,复制标准的镜像名称及版本,本例复制的是:jmujmu/seafile-pi:8.0.7
下载镜像
镜像下载会比较慢,玩docker的同学都了解该原因,你也可以添加私有或国内镜像地址来进行加速:
镜像地址
下载完成
由于网盘应用需要存储文件到U盘,而容器的机制默认是将文件存储在容器内部,一旦容器销毁重建,则文件会丢失,因而我们需要将文件映射到实体的USB设备上。

管理界面中,切换到containers菜单,选择add container




以上全部参数配置完毕后,点击Deploy the container按钮创建容器,创建完毕如下图:

容器是运行正常然而访问发现提示502错误

查询日志,发现如下错误
'''waiting for mysql server to be ready: %s (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 111] Connection refused)"),'''
对方给的docker-compose.yml是将应用和数据库放在一个容器里跑,初步看有一个custom templates的功能支持自定义yaml,这种不提供命令行模式操作yaml,出错时排查较麻烦,笔者决定采用常规操作,将应用和数据库分离,数据库单独起一个容器。
数据库容器部署
和上面部署应用的步骤大致一样,先创建数据库的文件映射到U盘,然后拉取镜像:mariadb:10.5

创建并启动数据库镜像


然后将数据库的IP地址记下,并写入seafile应用的环境变量中使用,seafile所有环境变量清单如下:

配置完毕后,重新启动容器,发现应用已经可以访问,应用部分日志如下:
port of seafile fileserver: 8082
port of seahub: 8000
When problems occur, Refer to
https://download.seafile.com/published/seafile-manual/home.md
for information.
Starting seafile server, please wait ...
** Message: 15:02:28.337: seafile-controller.c(536): No seafevents.
Seafile server started
Done.
Starting seahub at port 8000 ...
----------------------------------------
Successfully created seafile admin
----------------------------------------
Seahub is started
6.seaFile网盘使用
使用浏览器访问网盘路径,由于我们是将容器80映射成1800的外部端口,所以访问地址为:http://miwifi.com:1800/

安装完毕后,此时ax9000实际跑了3个容器,而小米官方也是建议不超过3个。由于该路由器内存只有1个G,同时由于笔者容器都是在U盘上跑,I/O的瓶颈也是个大的问题,期间一度把路由器控制台也拖死,最后只能采用强制断电重启。
一段时间实测下来稳定性很差,页面经常打不开,更别提上传文件了,后面下功夫切换到移动硬盘验证效果也不行,有机会将数据库切换到公有云服务试试。

7.安装ownCloud网盘
虽然踩了前面的坑,但终归也有收获,安装过程轻车熟路了,直接切换ownCloud,停掉数据库和seaFile容器,搜索ownCloud镜像,注意镜像要选择支持ARM版本的。












移动版本支持手机端照片与视频备份,这个功能很有用,只是从当前时间产生的新照片才能自动上传备份,历史的数据还是需要自行处理。
8.问题
注意事项
1.注意外接设备的容量,文件格式;此外还要考虑I/O读写是否达标
2.注意镜像的格式,需要是ARM
小插曲
即将收工时,发现我们准备的原材料还有一个貌似没用上,没错,就是那个橙子!
此时,发现橙子已经被路由器成功加热完毕。
是不是很好奇橙子的作用?原因是(强行解释中。。)
1.降温,路由器刷机安装软件会发热,科学论证,橙子的内部结构有很好的吸热效果,实测发现橙子果然起到了很好的降温作用!
2.成功完成一件事总要有点奖励和仪式感嘛,这个橙子就是完工的证明和最适合的奖励!
8.小结与展望
本文演示了AX9000的例子,未来智能设备将是新型家庭标配(厨电,热水器,窗帘,智能温控,加热与加湿,视频,监控,门锁等方方面面),此外云主机及云端服务也会逐步从toB下沉到toC的家用市场,路由器也在尝试不只提供网络传输功能,未来智能路由设备还将提供云接入与安全能力,路由器将有机会成为控制的枢纽,也将有可能发展成为家庭版云端一体的边缘服务器或连接器。
但要想做到一个终端及应用治理多家厂商的设备及服务,技术并不是主导因素,更多的是商业模式及行业标准化进程,兼顾开放性与标准化,仍然有很长一段路要走。
网友评论