前两天刚刚入职,最近几天忙着租房搬家,忙活了几天总算是住进了自己小屋里,作为一个软件工程师,怎么可以没有一台家用服务器呢?方案有很多种,上至几千元的 NAS,下至淘汰的老电脑,但是旧电脑响声大功耗高,NAS 动辄三四千的价格对我这个刚毕业的大学生来说着实有些困难,于是我将目光放到了另一个小玩意上——树莓派。
我选择树莓派的原因也很简单,第一便宜,第二可查阅的资料非常多,基本上你之后使用过程中的问题网络上都有解决方案了,因此本文不会介绍怎么使用树莓派,怎么烧录系统,这些东西有太多人写过了,我重复写也没什么意思,因此这块内容我就一笔带过了,本文是我自己的家用服务器方案,更多的是提供一个方向性的指导,如果你觉得我的文章对你有所帮助,欢迎点个关注支持一下哦~
什么是树莓派?
打开任何一个搜索引擎在里面输入「树莓派」三个字都会出现很多内容,其实树莓派本质上就是一台小电脑,虽然外形只有信用卡大小,却具有电脑的所有基本功能。和我们平常用的电脑不一样的是,树莓派自身是没有屏幕、键盘、鼠标这些东西的,但是它提供了网口、USB 口以及视频输出口(其实意思就是让你自己配)。
当然了,树莓派和主流电脑一个很大的区别就是他的芯片,和主流的 x86 桌面级电脑不同的是,树莓派用的是低功耗的 ARM 芯片,因此在性能上和常规电脑还是有些差距的,不过随着近年来 ARM 芯片的不断发展,其性能已经和传统 x86 处理器不相伯仲,甚至在某些方面遥遥领先,例如苹果的 M1 芯片。这里推荐阅读我之前写的两篇文章 ?《M1 暴打 Intel?——x86 与 ARM 的爱恨情仇》和《M1 暴打 Intel?——这次的芯片有何不同》
好在在学校的这些年,有一些闲置的键盘、鼠标和移动硬盘没来得及出手,于是我便果断的选择了树莓派作为我的家用服务器。
树莓派的选择
打开淘宝搜索树莓派,眼花缭乱的,那应该如何选择呢?
其实很简单,虽然树莓派的型号众多,但是细分下来也只有三类:
1.Model B 系列:旗舰版,接口全,性能强2.Model A 系列:青春版,外形小,性能一般,配置和接口略有阉割3.Zero 系列:迷你版,拥有超小身材,性能较弱
目前,树莓派已经发展到了第四代了,如果资金不是非常紧张的,推荐购买树莓派 4B 版,官网对他的介绍如下:
相较于前代,处理器性能大幅增强,并且最高支持 8G 内存,支持 4K 视频输出,同时使用 USB- C 供电,完全可以作为一个桌面级电脑使用了,用作家用服务器绰绰有余了。
操作系统选择
说完了树莓派的硬件,怎么可以离开软件呢?树莓派相较于传统电脑另一个好处就是可以自由选择烧录的操作系统,官方推荐的是 Raspberry Pi OS,系统的烧录网上的教程太多了,这里我推荐直接使用官方提供的烧录软件「Raspberry Pi Imager」,从下面的图中也可以看出来是一个非常容易上手的软件了。
SD 卡选择 16G 的即可,如果容量大一些也是可以的,读写速度自然也是越快越好了,这里我烧录的系统是官方推荐的 Raspberry Pi OS,针对树莓派进行了性能优化,由于是基于 Debian 开发的操作系统,经常使用 Ubuntu 的同学上手难度会稍微低一些。
当然了,你也可以选择烧录其他的操作系统,例如 Ubuntu、Manjaro、Android 等操作系统,甚至有人成功烧录了最近新出的 Windows11,链接在这里,有兴趣的小伙伴自行阅读 ?How to Install Windows 11 on a Raspberry Pi 4[1]
家用树莓派方案指北
说了树莓派软硬件的选择后,终于可以进入本文的正题了。
树莓派的玩法有很多,网上有很多控制机器人、外接灯泡控制开关等,说实话,这些玩法教育意义大于实用意义,毕竟家用也不会把灯泡接到树莓派上,直接买个小米的智能灯泡控制体验不比这个好吗?
之所以一开始就舍弃使用旧电脑作为家用服务器这一方案的一个原因就是功耗,网上有人对树莓派的功耗进行过测试,4B 的功耗:空闲时 2.7 W,负载时到 6.4 W。按照家里电费 0.7 元一度电的价格计算,一年 365 天每天 24 小时高负荷运行的电费也才6.4×24×365÷1000×0.7=39.2448 元。
因此树莓派适用于一些适合 24 小时在线的服务,我的服务有:
1.离线下载(Aria2、qbittorrent)2.米家、HomeKit 等智能家居中转控制(HomeAssistant)3.局域网文件共享(Samba)4.Linux Server(Docker)5.家庭 Dashboard 中控面板(Flutter Web)6.……
接下来我将会按照顺序逐一介绍。
连接树莓派——连通性测试
想要使用树莓派第一步肯定是连接上树莓派,连接树莓派的方式有很多种,直接接键盘、鼠标、显示器,或者通过 SSH/VNC/FTP,无论用何种方式只要能连接上网络即可。方便起见,建议先连接显示器,然后开启 SSH 和 VNC 服务。网络上的教程很多很详细,这里不再赘述。
本节主要来介绍一个很关键但是很多文章都忽略的内容,即树莓派与个人电脑间的网络连通性测试。
如果要实现诸如上述局域网共享文件、离线下载等功能,一个很重要的特点是工作电脑与树莓派之间的传输速度要快,不然我离线下载完文件后传到自己电脑上还要好久,那岂不是多此一举吗?
由于大多数教程中工作电脑与树莓派的连接都是通过 WI-FI 而非网线的方式,因此在一开始就有必要针对二者的网络传输速度做一个测试,这里我推荐使用「iPerf3」,安装和使用都很简单。
我们需要在树莓派上使用 apt 安装 iPerf3,然后启动 iPerf3 的服务。
代码语言:javascript复制# 安装 iPerf3
sudo apt install iperf3
# 启动 iPerf3 服务
iperf3 -p 3005 -s
•-p
设置监听的端口号,客户端需要使用该端口与服务端进行通信。•-s
设置为服务模式运行。
然后在工作电脑上也安装上 iPerf3 即可,mac 电脑直接执行 brew install iperf3
即可安装,然后我们只需执行下面的命令即可。
# 测试 Mac 与树莓派之间的网速(我的树莓派内网 ip 为192.168.31.189)
iperf3 -c 192.168.31.189 -p 3005
我的测试结果如下图所示:
换算一下,上传下载大约能有 7MB/s 的速度,虽然速度不是很快,但是基本可以用。
PS:如果有小伙伴测试结束后发现连通速度有些慢,不妨检查下你的树莓派是否连接到 5GHz 的 Wi-Fi 上。
确认连接速度可以正常使用后,我们便可以来安装使用一个非常重要的工具了——Docker。
使用 Docker 为树莓派赋能
Docker 的存在使得开发者可以快速搭建自己所需要的开发环境,只需指定好镜像后即可快速生成所需要的容器环境。并且由于树莓派使用的是 ARM 架构的芯片,很多常用软件如果想要正常安装使用需要自行编译,这对于性能不够强悍的树莓派来说无疑是一种负担,为了让我们的精力聚焦在在实际的开发中,而不是纠缠着应用运行环境的问题上,这次我们使用 Docker 搭建所需要的开发环境,为树莓派赋能。
对 Docker 还不了解的小伙伴可以移步 ?https://yeasy.gitbook.io/docker_practice/
在树莓派上安装 Docker、配置镜像加速在上面的链接中都已给出,值得一提的是,Docker 的定位在于将容器内的环境搭建起来,但如果我们想将多个容器的运行方式和配置固定下来,应用于容器编排,则需要使用 Docker Compose。
举个例子,我们有一个应用容器,需要 mysql 存储数据, nginx 作转发,消息队列作数据转化,那在每次启动前,需要将每个前置容器先启动,再把应用容器跑起来,这本身就是一个重复的动作。而且在启动时,还需要针对每个容器进行不同的配置,所以为了实现对多个容器的组合管理,例如规定容器启动顺序,规定好配置内容等行为,Docker Compose 便应运而生了。
Docker Compose 的安装方式有很多种,但由于 ARM 架构的限制,树莓派上的 Docker Compose 建议使用 pip 安装。
代码语言:javascript复制sudo pip3 install -U docker-compose
!!!一定是 Python3 版本的 pip,所以建议直接使用 pip3
监管你的 Docker——Portainer
Portainer 是 Docker 的轻量级,跨平台和开源管理 UI。你可以通过 WebUI 管理你的 docker 容器,镜像,网络和卷。他的安装也很简单,直接执行以下命令即可。
代码语言:javascript复制docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
安装完成后如下图所示 ?
监控面板——Pi Dashboard
有了 Docker 之后,我们便可以方便快速的进行各种软件的安装了。为了方便监控我们的树莓派情况,首当其冲的便是 Pi Dashboard。
安装很简单,只需执行下面一行命令 ?
代码语言:javascript复制sudo docker run -d --name docker-pi-dashboard -e 'LISTEN=1024' --net=host ecat/docker-pi-dashboard
启动完毕后可以通过
代码语言:javascript复制sudo docker ps | grep docker-pi-dashboard
来确认我们的容器是否启动成功,如果启动成功,在浏览器中输入<你的IP地址>:1024
即可访问到 pi dashboard 了。如下图所示 ?
智能家居——HomeAssistant
智能家居是眼下最火的领域之一,小米、苹果、华为等都在布局该领域,旗下的米家、HomeKit 等都已经提供了非常完善的服务,那么我们为什么要在树莓派上搭建一套智能家居系统呢?
其实原因很简单,虽然目前智能家居产品众多,但是尚未有一种智能家居解决方案同时满足设备种类多、交互体验好、成本低廉的特性,为此很多情况我们都会选择某一家的某一些产品,这就有可能会造成整个家里出现小米的台灯、华为的传感器、苹果的音箱等多种混乱的局面,然后你还要安装多个 App,这种体验无疑是非常差的。
在计算机领域有一句名言——所有兼容问题都可以通过加一层抽象解决,所有性能问题都可以通过去掉一层抽象解决。既然这样,何不在这些智能家居平台基础上再抽出一层,提供一个统一的控制入口?
答案自然是可以的,并且已经有人将方案开源出来了,这就是本节要介绍的 HomeAssistant。
无论是米家还是 HomeKit 都只能在各自的生态中使用,米家只有移动端 App,HomeKit 虽然覆盖了平板、手机、电脑、手表等,但也仅限苹果生态。(互联网发展了这么多年,却忘记了他最开始的形态,真不知道这是一种进步还是一种悲哀)
扯了这么远,回到正题,HomeAssistant 的安装使用非常简单,官网已经写的非常详细了 ?https://www.home-assistant.io/installation/raspberrypi#docker-compose
推荐使用 Docker Compose 安装。
代码语言:javascript复制version: "3"
services:
homeassistant:
container_name: homeassistant
image: "ghcr.io/home-assistant/raspberrypi4-homeassistant:stable"
volumes:
- /PATH_TO_YOUR_CONFIG:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
privileged: true
network_mode: host
指定好 volumes 的路径后执行docker-compose up -d
指令即可。
米家的接入
安装好之后你的家庭应该是空的,如果想要绑定米家设备,可以接入米家的 MIoT 插件,文档 ?https://github.com/al-one/hass-xiaomi-miot/blob/master/README_zh.md
填写好自己的小米账号和密码后,即可利用网页在 HomeAssistant 中查看使用自己的米家设备,以此达到跨平台的目的。下图是我自己配置的控制页面 ?
开放能力——REST API
如果只是提供了一个网页用于控制,那么本质上也就是在交互体验上进行了优化,并不值得单独开一小节。HomeAssistant 作为一个开源产品,最大的优势在于提供了开放的能力,使每个用户按照自己的想法去进行更改设置,我们完全可以根据 HA 提供的 REST API 针对自己的需求定制化。(例如制作一个属于你自己的家庭枢纽,后面会提到)
HomeAssistant 默认是不会开放 REST API 功能,你需要在configuration.yaml
文件中配置一下api
选项,如下图所示 ?
关于 HomeAssistant 可配置的选项还有很多,具体的可以参考文档 ?https://developers.home-assistant.io/
离线下载——Aria2
有些资源下载时间较长,不适合电脑长期挂机下载的,这时就可以将我们的树莓派变成一个离线下载的服务器。提到下载,不可不提的一个神器便是 Aria2。
Aria2 是一款自由、跨平台命令行界面的下载管理器,和 wget 这类下载器不同的是,Aria2 不仅支持 BitTorrent,还能够从各种来源多路检索所请求的文件。包括 HTTP,HTTPS,FTP 和 BitTorrent 协议。
对种子下载原理感兴趣的同学可以阅读我的这篇文章 ?《人人都是 LSP?—— 种子与文件下载的相爱相杀》
而且 Raspbain 系统默认已经安装了 Aria2,运行 apt-cache show aria2 即可查看安装信息,因此我们要做的就是为 Aria2 找一个图形化界面即可,使用 Docker 的一大好处就是可以直接去找别人已经打包好的镜像文件,让安装使用变得十分易用。
只需执行下述命令即可启动一个 Aira2 的图形化界面了 ?
代码语言:javascript复制docker run -d --name aria2-ui-pi -p 8888:80 -p 6800:6800 -v /data:/data --restart=always huangzulin/aria2-ui-pi
默认下载路径是在容器内的 /data 文件夹,为了方便使用最好指定一个 volume 映射
局域网文件共享——Samba
现在,手机是 Android/iOS,电脑是 Win/Mac,除去苹果生态,设备与设备之间的文件传输直至今日仍然是一个大问题。
Samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件,SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。通过该协议,你可以快速方便的在 Win 与 Linux/Unix 之间分享文件,而不是通过 QQ 在线传文件。
安装过程也十分简单,你可以选择 apt 安装也可以选择 docker 直接安装,网上的教程非常多,详情可参考 ?在树莓派上配置 Samba 服务教程[2]
打造属于你自己的家庭枢纽
无论是 HomeAssistant 还是 Aria2,这些都是别人写好的东西,如果你想让树莓派更加定制化,你可以按照自己的想法去边写一些小程序(这也就是为什么之前要提一下开放 HomeAssistant 的 REST API)。
如果想要让自己的程序运行在树莓派上,大致有以下几条路可以走 ?
为了打造一个属于自己的家庭枢纽,我的想法是在一块可以触摸的屏幕上控制自己家的智能家居设备(借助 HomeAssistant),直观地查看天气(和风天气),追踪快递行程(爬虫)、时钟、纪念日/倒数日/照片墙等,因此这是一个完整的网页,我选择的技术栈是 SpringBoot Flutter Web Nginx,然后使用 Docker 打包成一个镜像启动整个服务。
部分页面如下 ?
我在做的就是 Java 相关的工作,后端选择 SpringBoot 无可厚非,之所以选择 Flutter Web 而不是传统的 Vue 或者 React,一方面是因为 Flutter 的声明式 UI 写起来确实比传统 Web 页面编写更舒服,效率更高,另一方面是因为用 Flutter 写的网页可以无缝转换成在 Android/iOS/PC/Linux/macOS 这些平台上的原生 App,有助于后期针对多个平台的覆盖(当然更多还是因为我已经把 Vue 和 React 忘的差不多了)。
目前这个网页比较简陋,还有很多我想做的功能没来得及做上去,但后续我准备持续更新这个代码,后续如果在家里运行效果还不错的话,甚至有想开源出去的想法,不过这就是后话了。
随时随地访问——内网穿透
玩了这么多东西,有没有发现一个最大的问题?
没错,就是这些所有的东西必须要求你的电脑和树莓派处在同一个网络里,即局域网环境里。虽然我一开始的使用场景就是在家里使用,但如果我在公司突然想看一部美剧了,但是用公司电脑下载视频显然是不现实的,如果这时候我可以在外网直接访问家里树莓派的离线下载服务,那么下班回家后岂不就可以看到自己想看的电影了吗?
所以,最好的方式就是联系你的宽带运营商,并申请一个公网 IP,这样你就可以通过这个公网 IP 访问到你的树莓派了。
据我所知,目前只有电信的部分地区会给公网 IP,大多数运营商是不会提供公网 IP 的,而且申请流程很麻烦,所以为了可以随时随地的从外网访问家里服务器的文件或其他服务,我们可以为树莓派做一个「内网穿透」。
「计算机领域的大多数问题都可以通过增加一层来解决」,所谓内网穿透,无非是在内部网络和互联网之间增加一个中转服务器,这个中转服务器负责接收你的请求并转发到内部服务器,也即「代理」。
当然了,内网穿透的原理肯定不会这么简单,这里只是通俗的解释一下,如果之后有机会来详细说下。所以为了实现内网穿透,我们需要有一台可以公网访问的服务器作为中转桥梁,这时我突然想到我毕业前买的学生机还没到期呢,现在刚好在吃灰,拿它来做中转岂不是最好的?
内网穿透服务器的选择有很多,FRP 是用的最多的,但我这里选择的是 ?nps[3],原因也很简单,页面好看,交互简单,性能够用。
nps 是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持 tcp、udp 流量转发,可支持任何 tcp、udp 上层协议(访问内网网站、本地支付接口调试、ssh 访问、远程桌面,内网 dns 解析等等……),此外还支持内网 http 代理、内网 socks5 代理、p2p 等,并带有功能强大的 web 管理端。
我们只需要在云主机上安装好服务端,并按照后台提示在树莓派上安装好客户端,简单设置自己要转发的端口即可实现内网穿透。
官方文档在 ?https://ehang-io.github.io/nps/#/?id=nps
最后
拥有一台树莓派最大的好处就是可以充分发挥你的灵感与创意,如果你有想法、有能力、有时间,不妨让树莓派成为你实现想法的载体。
最后扯一点文章之外的,工作之后的时间果然少了很多,这篇文章从开始写到现在完成差不多花了一个星期,阿里的工作强度的确很大,每天下班到家多半也是 10 点之后的事情了,能留出来码字的时间实在有限,难得周末有空,把近期搬家捣鼓自己家的想法写下来,也算是自己新阶段的开始。这段时间阅读了很多内部的优秀文档,也希望自己未来的文章可以像内网的大神们一样更专业,新的征程加油!
以上就是本文的全部内容了,如果觉得还不错的话,不妨给我一个点赞关注支持一下哦 ?
References
[1]
How to Install Windows 11 on a Raspberry Pi 4: https://www.tomshardware.com/how-to/install-windows-11-raspberry-pi#xenforo-comments-3710927
[2]
在树莓派上配置 Samba 服务教程: https://ee-fans.com/在树莓派上配置samba服务教程/
[3]
nps: https://github.com/ehang-io/nps