搭建属于自己的服务器(三) - 主要业务

前言

本文主要讨论Homelab上运行的主要业务服务。不包含网络相关的服务,感兴趣的可以看前一篇文章。

PVE主机上跑着许多虚拟机以及LXC容器,Homelab的主要服务基本上都在这里跑着了。

跳板机

首先是跳板机,这是一个Debian 12的虚拟机,核心作用是作为整个家庭网络的Web统一入口,跳板机上运行着一个Traefik反向代理服务,所有的Web服务都通过Traefik进行访问。

Web服务的访问地址都是通过域名进行访问的,Traefik会根据域名将请求转发到对应的虚拟机或LXC容器上。

这些地址主要分为两类:公共服务以及自用服务。其中公共服务是名义上对所有互联网上的用户开放的,主要是博客,这些服务都通过了ICP备案可以合法对外开放;而自用服务则是仅限于家庭成员使用的,比如Jellyfin和Immich之类的。

pic

同时,我在外面想通过SSH连接Homelab,也是通过FRP代理,先登录到跳板机,然后再从跳板机SSH到其他虚拟机或LXC容器。

内网穿透方案

一句话总结,就是frp。

首先需要购买一台云服务器,有以下要求:

  1. 首先要有公网IP(一般都有啦)
  2. 然后跟自己在同一个城市(为了同城场景下访问homelab时延迟更低)
  3. 最好是有较高的带宽(至少50M以上,保证外网的访问速度)
  4. 由于固定带宽成本很高,所以建议采用按流量付费的方式

于是我选择了阿里云的ECS,成都区域的t6实例,双核1G ,10%CPU性能基线。这个配置只是作为中转服务器简直太合适不过了。

pic

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
2
3
sudo ip link add docker_bmv link enp6s18 type macvlan mode bridge
sudo ip addr add 192.168.36.0/23 dev docker_bmv
sudo ifconfig docker_bmv up

注意,如果不这么做,会导致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主机监控,数据库监控等。

pic

其他LXC容器

mariadb

公共数据库服务,供其他服务使用。比如自建博客的评论系统,还有Gitea的数据库之类的。

emqx

MQTT服务,暂时还没用到,之后开始折腾智能家居的时候,这里应该会变得很繁忙XD。

NAS

本着存算网分离的原则,我的NAS是一台独立的物理主机,上面运行着TrueNAS Scale,对整个局域网提供存储服务。

没错,就这么几个月的摸索时间,我的软件选型已经从Unraid切换到TrueNAS了哈哈哈。而且还添置了一些硬盘,现在整个存储阵列已经初具规模了。这里就简单介绍下数据分层存储吧。

首先整理一下我有哪些数据需要存储:

类别要求
虚拟机备份循环归档存储,最好不要丢失
服务持久存储可用性要求高,不可丢失
普通文件局域网临时共享
照片规模中等,不能容忍丢失
多媒体规模比较大,可以容忍丢失
早期归档数据规模不大,不能容忍丢失
囤的一些杂项数据重要度低,存一份即可

然后整理一下可用的存储介质:

类别构成位置
PVE存储nvme SSDPVE主机
固态阵列SSD RaidZ1TrueNAS
机械阵列HDD RaidZ1TrueNAS
阿里网盘内测福利2TB云端

于是就可以根据每种数据的要求,选择合适的存储介质了。

项目PVE存储固态阵列机械阵列云盘
虚拟机备份✔原本💾副本
服务持久存储✔原本💾副本
普通文件✔原本
照片✔原本💾副本💾副本
多媒体✔原本
早期归档数据✔原本💾副本
囤的一些杂项数据✔原本

具体的备份方案和工作流,可以期待下一篇介绍最佳实践的博客~

公网服务

特指在上述阿里云服务器上部署的服务,除了frp之外,还有一些其他的服务。

为什么这些服务不部署在Homelab上呢?

由于homelab完全是家用环境设计的,电力,网络,包括自己随时的折腾都会导致服务不稳定,所以把这些关键的需要保证高可用的服务部署到公网服务器上,给homelab兜个底。

UniPush

我自己写的推送服务,整合了Gotify、企业微信、Server酱等多种推送服务,用一个API即可直接推送到手机上。这个服务可以用来推送各种通知,比如博客报告,评论提醒,服务器状态等。

有点类似PushPlus,只不过这个是完全自主开发的,更灵活方便修改。

uptime-kuma

一个开源的监控服务,主要用于监控Homelab上各个服务的运行状态。当状态异常时可以通过UniPush推送到手机上。

pic