搭建属于自己的服务器(三) - 主要业务
前言
本文主要讨论Homelab上运行的主要业务服务。不包含网络相关的服务,感兴趣的可以看前一篇文章。
PVE主机上跑着许多虚拟机以及LXC容器,Homelab的主要服务基本上都在这里跑着了。
跳板机
首先是跳板机,这是一个Debian 12的虚拟机,核心作用是作为整个家庭网络的Web统一入口,跳板机上运行着一个Traefik反向代理服务,所有的Web服务都通过Traefik进行访问。
Web服务的访问地址都是通过域名进行访问的,Traefik会根据域名将请求转发到对应的虚拟机或LXC容器上。
这些地址主要分为两类:公共服务以及自用服务。其中公共服务是名义上对所有互联网上的用户开放的,主要是博客,这些服务都通过了ICP备案可以合法对外开放;而自用服务则是仅限于家庭成员使用的,比如Jellyfin和Immich之类的。

同时,我在外面想通过SSH连接Homelab,也是通过FRP代理,先登录到跳板机,然后再从跳板机SSH到其他虚拟机或LXC容器。
内网穿透方案
一句话总结,就是frp。
首先需要购买一台云服务器,有以下要求:
- 首先要有公网IP(一般都有啦)
- 然后跟自己在同一个城市(为了同城场景下访问homelab时延迟更低)
- 最好是有较高的带宽(至少50M以上,保证外网的访问速度)
- 由于固定带宽成本很高,所以建议采用按流量付费的方式
于是我选择了阿里云的ECS,成都区域的t6实例,双核1G ,10%CPU性能基线。这个配置只是作为中转服务器简直太合适不过了。

Ubuntu Server
这台虚拟机是我的主力业务服务器,Homelab的服务基本都跑在这个上面。
服务我会尽量选择支持Docker部署的,管理起来更加方便。其他是在不支持Docker或者用Docker方式反而更麻烦的,就在Ubuntu上直接运行了。
如果Docker网络用默认的桥接模式,就必须为每个容器配置端口映射,但由于Docker容器众多,端口管理起来非常麻烦,所以我选择了Docker的macvlan模式,这样每个容器都可以直接拥有一个独立的IP地址,和宿主机在同一个局域网内,访问起来就像访问普通的物理主机一样,也不存在端口映射的问题了。
首先创建一个名为bmv的macvlan网络:
1 | sudo docker network create -d macvlan --gateway 192.168.32.1 --subnet 192.168.32.0/20 --ip-range=192.168.36.0/23 -o parent=enp6s18 -o macvlan_mode=bridge bmv |
然后设置macvlan网络到主机的桥接:
1 | sudo ip link add docker_bmv link enp6s18 type macvlan mode bridge |
注意,如果不这么做,会导致Docker宿主机和容器之间是无法通讯的(容器和容器之间,以及容器和宿主机外部可以通讯)。
具体可以参考这篇文章。
接下来挑几个有意思的服务介绍一下。
gitea
自托管的git服务,自己的私有代码都托管到这里了,内置CI功能(需要单独部署一个action runner)。选择自建而不是使用GitHub私有仓库的原因,一个是为了数据都掌握在自己手里(还有无限制的Actions配额),另一个就是因为GitHub的网络问题,国内访问不太顺畅。
immich
照片管理服务,我这里只用了他的外部图库功能,照片库是以只读方式挂载到容器的,以免意外操作导致照片被删除。
还用到了它的相册功能,很方便创建带密码的外链,分享给家人朋友。
它还自带AI人脸识别功能,利用服务器里的P4计算卡,可以自动识别照片中的人脸,进行分类和搜索。
其他功能还很丰富,详见官网。
jellyfin
影音媒体服务器,就是用来看电影的。海报墙足够好看,适合我这种轻度仓鼠,同样利用P4显卡可以实现硬件实时转码。
官网在这里。
Authelia
登录认证服务,支持密码和2FA,用于保护Homelab上部署的,外网可访问的,而又没有自带认证功能的服务(比如LibreSpeed测速服务,不能随便让别人跑流量)。
详细的功能和部署方法参见官网。
Home Assistant
智能家庭中枢,就不再这里展开了,可以参考我另一个系列(刚开坑,之后会继续更新)目录在这
Prometheus + Grafana
这是一套数据监控方案,主要用于监控Homelab上各个服务的运行状态。Prometheus负责数据采集和存储,Grafana负责数据可视化。
我现在已经弄了挺多仪表盘了,包括路由器监控,DNS监控,PVE主机监控,数据库监控等。

其他LXC容器
mariadb
公共数据库服务,供其他服务使用。比如自建博客的评论系统,还有Gitea的数据库之类的。
emqx
MQTT服务,暂时还没用到,之后开始折腾智能家居的时候,这里应该会变得很繁忙XD。
NAS
本着存算网分离的原则,我的NAS是一台独立的物理主机,上面运行着TrueNAS Scale,对整个局域网提供存储服务。
没错,就这么几个月的摸索时间,我的软件选型已经从Unraid切换到TrueNAS了哈哈哈。而且还添置了一些硬盘,现在整个存储阵列已经初具规模了。这里就简单介绍下数据分层存储吧。
首先整理一下我有哪些数据需要存储:
| 类别 | 要求 |
|---|---|
| 虚拟机备份 | 循环归档存储,最好不要丢失 |
| 服务持久存储 | 可用性要求高,不可丢失 |
| 普通文件 | 局域网临时共享 |
| 照片 | 规模中等,不能容忍丢失 |
| 多媒体 | 规模比较大,可以容忍丢失 |
| 早期归档数据 | 规模不大,不能容忍丢失 |
| 囤的一些杂项数据 | 重要度低,存一份即可 |
然后整理一下可用的存储介质:
| 类别 | 构成 | 位置 |
|---|---|---|
| PVE存储 | nvme SSD | PVE主机 |
| 固态阵列 | SSD RaidZ1 | TrueNAS |
| 机械阵列 | HDD RaidZ1 | TrueNAS |
| 阿里网盘 | 内测福利2TB | 云端 |
于是就可以根据每种数据的要求,选择合适的存储介质了。
| 项目 | PVE存储 | 固态阵列 | 机械阵列 | 云盘 |
|---|---|---|---|---|
| 虚拟机备份 | ✔原本 | 💾副本 | ||
| 服务持久存储 | ✔原本 | 💾副本 | ||
| 普通文件 | ✔原本 | |||
| 照片 | ✔原本 | 💾副本 | 💾副本 | |
| 多媒体 | ✔原本 | |||
| 早期归档数据 | ✔原本 | 💾副本 | ||
| 囤的一些杂项数据 | ✔原本 |
具体的备份方案和工作流,可以期待下一篇介绍最佳实践的博客~
公网服务
特指在上述阿里云服务器上部署的服务,除了frp之外,还有一些其他的服务。
为什么这些服务不部署在Homelab上呢?
由于homelab完全是家用环境设计的,电力,网络,包括自己随时的折腾都会导致服务不稳定,所以把这些关键的需要保证高可用的服务部署到公网服务器上,给homelab兜个底。
UniPush
我自己写的推送服务,整合了Gotify、企业微信、Server酱等多种推送服务,用一个API即可直接推送到手机上。这个服务可以用来推送各种通知,比如博客报告,评论提醒,服务器状态等。
有点类似PushPlus,只不过这个是完全自主开发的,更灵活方便修改。
uptime-kuma
一个开源的监控服务,主要用于监控Homelab上各个服务的运行状态。当状态异常时可以通过UniPush推送到手机上。
