Edit Note: Self Hosted

This commit is contained in:
2025-06-28 15:15:29 +08:00
parent e2cf5cd376
commit 5cbddd7a53

View File

@ -8,31 +8,17 @@ tag:
# 自组服务:让老机器“物尽其用”
这问题最初还真是为了分担《原神》这种重负载。毕竟 2.8 版本的海岛成功把我的轻薄本干烧了。~~虽然轻薄本拿去直播《原神》讲真也挺抽象的。~~ 然后次年下旬,我折腾 Hyper-V 时发现它似乎是通过远程提供的虚拟机界面,于是便走上了“自组服务”的不归路
今年的 618 读者们都有过什么盘算呢?换机还是装新机?我嘛……显然是没有条件(米)去换代的,所以如何利用好现有的条件首先就是个问题。之前偶然借助 Hyper-V 得知了 RemoteApps 这项功能,但跑虚拟机[^vm]始终是我个人比较抵触的事情(问就是配置不够分),于是我将目光盯向了 17 年买的老华硕笔记本。这就是咱“自组服务”最初的尝试了
说白了,“把重负载分摊出去”的做法,某种意义上也顺应如今的各种“云”服务——把重活脏活甩给有能力负担的机器(对于绝大多数用户而言当然就是企业的云服务器),并提供轻量的终端接口给用户。何尝不是一种 C/S 模式呢?
[^vm]: 这里仅指传统意义的虚拟机,也就是 VMWare、VirtualBox 之类“模拟一套硬件”的硬件抽象层虚拟化。广义的虚拟机实际上就是虚拟化Java 语言也有我们熟悉的 JVM 虚拟机,这是编程语言层的虚拟。此外还有 QEMU、Wine、Linux Docker 等在别的层级实现的虚拟化。
---
## 基础设施
话虽如此,自组服务也并非是自己买台服务器——那功耗和噪音注定不是家庭可承受的。所以让老机器“物尽其用”,也就成了我的首选
首先除非你想要亲自呆在老机器旁边操作,否则肯定需要远程连接到那台老机器上的,也就需要保证**别的设备能和老机器互通**
> [!important]
> - 量力而行。这里的“力”指**老机器的配置、性能**。你毕竟不能强求赛扬 CPU 去跑《原神》PC 客户端。
> - 下面无论何种部署方式,均要求**在能够建立远程连接之前,首先有块屏幕**。
> - 本文只提供大概流程(或者说思路),**恕不详述具体操作流程**。信息检索能力很重要喔,哪怕是问 AI 呢?
如果两台机同在一个内网(比如以 WiFi、有线等方式设备间连接同一个路由器那么通常来说需要**固定老机器的 IP**,否则刚搭的“自组服务”可能没几天就飘不知道哪去,得登进路由器里查咯。固定 IP 可以在老机器的系统里操作,等会具体到系统上再分别讨论;一些路由器也支持用户登录进去固定主机的 IP但我家网关莫得这个功能。
## 前置准备
首先,需要固定机器在内网的 IP。你可以在路由器或是在 Windows 的控制面板或者设置里操作。具体的教程还请百度,恕不展开。
::: details Linux 如何固定
必应了一下,有介绍`/etc/sysconfig/network-scripts`的,有介绍最新版 Ubuntu 使用的`netplan`工具的,五花八门。
Arch Linux 安装时可以用`systemd-networkd`配置。
首先`ip link`(有的教程用`ip a`)查看网络设备号,然后编辑`/etc/systemd/network/网络设备号.network`,之后重启`systemd-networkd`服务。
:::
然后有条件的话可以尝试异地互联,比如出门可以用手机连回家里的老主机,用 Emby 看电影之类的。家里**有公网 IP 最好,但建议认真配置防火墙**;没有公网的也可以尝试 Zerotier 等工具**组虚拟内网**。
若并非同一内网,则更麻烦亿些。我个人折腾过可行的最简方案是 Zerotier **虚拟组网**,毕竟当时对寄网了解有限,搜**内网穿透**也只能搜出来“喂我花生”之类的东西(我家网关也只支持某某壳子)。
:::: details 配置 Zerotier One
首先当然得有那么个内网。在 [Zerotier](https://my.zerotier.com/login) 上注册/登录账号(可能比较卡,毕竟国外平台),`Create A Network`创建虚拟内网。免费版(截至目前)至多允许同一网络 25 个设备,但对于我来说足够了。
@ -57,7 +43,7 @@ Linux 可以通过 Docker、官网提供的命令行、部分包管理器等方
然后在设备加入虚拟内网之后,可以在`Members`里找到这个设备,手工给它分配个静态 IP。
:::
安装之后记得确认一下 Zerotier 服务是否开启Docker 容器还请额外注意端口映射。
安装之后记得确认一下 Zerotier 服务是否开启,若是 Docker 容器还请额外注意端口映射。
```bash
sudo systemctl status zerotier-one.service
```
@ -68,71 +54,141 @@ sudo systemctl enable --now zerotier-one.service
于是就可以使用 Zerotier CLI 了。我的场景比较简单,不考虑自建 moon 的情况下直接`sudo zerotier-cli join Network_ID`,然后也是在账号上给它放行、分配固定 IP 就可以了。
::::
## Windows——远程、串流、文件共享
> [!warning]
> 在配置基础设施、远程连接的时候,还请**不要**断开老机器的屏幕——至少等能连上了再拔线。
Windows 想必大家都很熟。但既然把老主机当作“服务”来看待,便没有必要守在它旁边操作。也就是说,我们可以通过远程、串流等方式连上这台电脑,就好像云原神一样:游戏是在电脑上跑的,玩家是在手机上玩的。
## Windows——性能分摊
Windows 开启 RDP 远程可以通过“高级系统设置”的“远程”选项卡Win7、8.1 可在**控制面板—系统**信息页跳转)、**设置—系统—远程桌面**Win10、11启用
相信大多数人玩电脑接触最多的还是 Windows 系统,那么对于如何使用它,想必都是很有经验的罢。根据老机器配置的不同,它承担负载的多寡也自然各有参差
而如需像云原神般串流,则需要 Sunshine被控服务端和 Moonlight控制终端两个软件。~~当然也有别的串流方案,但 Moonlight 我折腾成了。~~ 由于间隔比较久远,相关的教程可以去 B 站搜索“自制云原神”词条,或者搜“阿西西”这个 UP 主,我也就不多展开了。
### 固定 IP
至于文件共享,最简单的方式是 Samba也就是右键文件属性里的“共享”选项卡。记得遵照指引去“网络和共享中心”先“启用文件和打印机共享”喵。
- Win11 参考[电脑屋](https://www.diannaowu.com/jc/212.html)的教程;
- Win8.1 及以下通常还是从控制面板固定,也参考[电脑屋](https://www.diannaowu.com/jc/231.html)。
- Win10 除了控制面板法,也可以直接在“设置—网络和 Internet—状态”中找到上网的网络通常标以太网或者 WiFi点进底下的属性往下划拉到 IP 设置那边手动分配 IP。
### 可部署的服务
### 远程连接
我个人倒是有过这些实践:
白嫖国产软件的免费服务也可以,最常见的当属向日葵了吧。但我是受不了手机端向日葵广告满天飞,所以还是折腾 Windows 自带的 RDP 吧。
- 开着 BiliBili 直播姬做推流机,从内网接收 OBS 流,并推上 B 站;
- 挂着各种网盘(尤其百度网盘)下载;
- RDP 玩剑三Moonlight 实测会屏蔽键盘输入)、串流玩崩原铁;
- 远程过去 P 图,开 After Effect 2018 做视频
欲使用 RDP 连接,需要启用 Windows 的远程控制功能。据微软称家庭版只能它控别人,不能别人控它。但我都 LTSC 2021 起手了,又有何惧。
远程控制选项可在以下两个入口找到(以 Win10、11 为准,不推荐“开发人员设置”):
- 设置—系统—远程桌面,启用之(顺便根据指引把“睡眠”禁用掉、把“网络发现”打开)
- 打开“系统属性”[^sysdm]的“远程”选项卡,允许远程连接、勾上“仅允许……”选项(恕我懒得打全称)。
[^sysdm]: 通常是在“控制面板—系统”(早期 Windows或“设置—系统—关于”Win10、11里跳转。也可`Win+R`直接执行`%windir%\system32\sysdm.cpl`
然后就可以使用 RDP 连接了。控制端可以用`mstsc`Windows、Windows AppAndroid原“RD 桌面”、FreeRDP 以及 RemminaLinux等等。
::: warning
微软账号现在推行免密登录,取而代之的是用 2FA 工具验证登录码,这种方式[**不适用于**](https://support.microsoft.com/zh-cn/account-billing/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-microsoft-%E5%B8%90%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%97%A0%E5%AF%86%E7%A0%81%E8%AE%BF%E9%97%AE-674ce301-3574-4387-a93d-916751764c43) RDP 连接。
此外,实测发现,微软文档所述的“应用密码”也无法作为凭据。**推荐用本地、带密码的账户托管老机器,密码留空进行远控需要额外做组策略配置,恕不展开。**
:::
然后该干嘛干嘛。顺带一提,*远控的鼠标一般是不记录位移、只改变坐标的*,也就是说《原神》这类游戏远程玩效果并不佳;但《剑网三》重制版则更建议远程玩,因为接下来讲的 Moonlight 串流没法向它传递键盘输入。
### 串流
这里的串流主要是指类似“云原神”那样的——老机器跑游戏,其他设备接收画面、回传操作的——类似看别人直播的模式。顺带一提,自己直播也是一种串流,只不过方向相反:是你这边把音画上传[^limited_upload]到直播平台。
串流自建云游戏的主要方式是 Moonlight+Sunshine 和 Parsec其中前者结合 Zerotier 虚拟组网,甚至可以异地云玩。有关的配置方式可以参考[知乎专栏](https://zhuanlan.zhihu.com/p/718510054)或者 B 站搜索“自建云原神”之类的关键词(也可以看看“阿西西”这个 UP 主的魔改 Moonlight 客户端)。咱已经很久没搞了,讲出来也不一定对,就略过吧。
[^limited_upload]: 目前国内的 ISP又或者运营商对上传带宽限制得很死个人通常不会允许大规模的上传尤其 BT、PT、PCDN其中以 PCDN 为甚——很多软件都会在运行时偷偷跑上传),否则容易吃传单(据说可以投诉,但我这人懒得扯皮);企业商宽、专线通常会给多一点,但就极客湾的遭遇来看似乎也仅仅是“一点”,而且价格比较高昂。可能云游戏亏损就是亏损在这吧。
### 文件共享
最简单的就是 Windows 自带的 SambaSMB文件共享也就是右键文件/文件夹属性里边的“共享”选项卡。
此外还有其他参考:
- 网络文件系统 NFS参见[微软文档](https://learn.microsoft.com/zh-cn/windows-server/storage/nfs/nfs-overview)
- WebDav 服务器(需要 IIS参见[微软文档](https://learn.microsoft.com/zh-cn/iis/install/installing-publishing-technologies/installing-and-configuring-webdav-on-iis#enabling-webdav-publishing-by-using-iis-manager),或参考[《Windows 开启 WebDAV》少数派](https://sspai.com/post/78540)
### 其他服务
- 推流机(挂着直播平台的直播软件,开第三方推流接收内网 OBS 推过来的 rtmp 串流)
- 挂下载(主要是各种限速客户端的下载,或者数据量大的下载)
- 自动化脚本
- RemoteApps迫真“家庭”版 Office当然还有 Adobe 全家桶,等等)
- ……
总的来说你平时怎么用那台牢机器的那就怎么对待它就是了。3 代 i3老老实实办公、文件共享玩些老游戏差不多就得了。10 代 i5那可以试试串流玩点新游戏After Effects 2020 做点视频特效,之类的。要是还有 AMD/NVIDIA 显卡,嚯,那甚至可以试试大模型。
## Linux——Web 接口
**还是那句话,有什么样的性能办什么样的事**,不要学我一下子把负载全都倒到老 ASUS 上VSCode Remote+WSL+网易云+百度云+……,一下子给 7 代 i5、4GB 物理内存、32GB 虚拟内存(甚至才吃了 14GB整不会了
Linux 通常还是作为服务器而非日用的系统使用,所以相比费劲折腾 VNC 等远程桌面,不妨就让它挂一些长线运行的服务好了。而既然莫得远程桌面,这些长线服务很显然只剩 WebUI 这一种可视化的选择。当然如果你更偏好 CLI命令行界面那也不是不行
### 常驻开机
### 固定 IP
作为自组服务器,肯定不兴像平日的 Windows 那般被自动更新、启动修复等扰得无法远程
自动更新可以在**组策略`gpedit.msc`—计算机配置—管理模板—Windows 组件—Windows 更新—配置自动更新**一项中配置“已禁用”;若需禁止进 WinRE 启动修复,可以考虑以下两行批处理:
```batch
bcdedit /set {default} bootstatuspolicy ignoreallfailures
bcdedit /set {current} recoveryenabled No
不同的发行版主要用到的网络管理工具都不太一样
- 像 Arch Linux 安装阶段会用`systemd-networkd`分配固定 IP
- 而 Ubuntu 虽然也有上述服务,但更多在用`Netplan`(参见 [FreeCodeCamp](https://www.freecodecamp.org/chinese/news/setting-a-static-ip-in-ubuntu-linux-ip-address-tutorial/)
- 还可以用`ifconfig`做**临时**配置:
```bash
ifconfig # 查看所有网卡的配置信息
ifconfig eth0 # 查看某网卡的配置信息,如 eth0
ifconfig eth0 172.16.129.108 netmask 255.255.255.0 # 配置网卡的临时生效的IP地址
route add default gw 172.16.129.254 # 配置网关
```
当然我已经换用 Ubuntu Server 了,这两行有没有用我也没有底(
## Linux——开发、常驻服务、文件存取
总之,具体问题(发行版)具体分析,像`/etc/sysconfig/network-scripts`这种上古教程还是不要无脑跟了。~~我的 Ubuntu Server 24.04.2 LTS 连`sysconfig`都莫得。~~
不得不说Linux 能作为日用的服务确实不多(特别是无图形界面的服务器端),绝大多数部署起来可能还并不轻松。~~但部署好了之后是真好用啊(~~
那么既然不需要日用,为了节省图形资源,干脆就把老主机当作服务器,装个无图形界面的 Linux 吧。可以百度“Ubuntu Server 家庭云服务器”,有不少教程。
### SSH 远程连接
Linux 的主要远程手段是 SSH。在此之前需要安装`openssh`,并启用(和启动)`sshd`服务。
安装`openssh`,并启用`sshd`服务。多数软件包管理器应该都支持 SSH。以咱的 Ubuntu Server 为例:
控制端则可以装一些便捷的工具去维护 SSH 连接,比如 [Xshell](https://www.xshell.com/zh/xshell/) 和 [Xftp](https://www.xshell.com/zh/xftp/)。
```bash
sudo apt update
sudo apt install openssh
sudo systemctl enable --now sshd
sudo systemctl status sshd
```
### 部署服务
### 部署服务(分层讨论)
1. 代理服务器(不光是服务器本机,在内网范围内其他电脑都可以过这台机的代理)
首先说一下分层怎么回事。有些服务可能是通过容器分发的,那么 Docker 就是这些服务的下层,为这些服务提供支持(有点绕口?);而 Docker、npm 之类通常又依赖国外的源(像 DockerHub、npmjs于是代理又是容器的下层。~~当然正经分类起来这些都属于应用层。只是细化一下粒度便于讨论。~~
> 为什么是代理优先呢?因为像`docker`、`npm`等很多服务都需要代理。这或许也是一种“分层结构”吧。
::: details 代理层(以 Mihomo 为例)
Mihomo 可以理解为 Clash 的后继,所幸 Clash 的许多配置还是能兼容的(至少我的机场订阅可以直接覆盖使用)。但更好的办法还是编写配置文件了。
2. `docker`容器服务(这种就基本上是服务器在跑,也是作为下层服务去提供别的服务)
我参考了“虚空终端”[^yuanshen]文档的 GeoX [快捷配置](https://wiki.metacubex.one/example/conf/)
```yaml
geox-url:
geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb"
asn: "https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"
```
但遗憾的是在代理尚未配置好的情况下,似乎哪怕是`jsdelivr`镜像都很难获取到 Geo 信息。那么还是手动下载吧。
实际上只需下载`geoip.dat`并更名`GeoIP.dat``geosite.dat`更名`GeoSite.dat`Linux 对文件名大小写敏感),丢进 mihomo 配置目录即可(也就是`config.yaml`所在位置)。
3. `aria2`下载服务BT/PT乃至直链[^direct_http]),配合`ariaNg`等 WebUI
[^yuanshen]: 文档简介就是这么写的:“‘虚空终端’是一个基于开源项目‘原神’的二次开发版本”。或许是起名灵感,又或者是避嫌。
:::
[^direct_http]: 有些浏览器下载比较慢的,借助`aria2`和代理或许能明显改善速度。!!比如已似的 Pandownload。!!
::: note 应用支持层
主要就是 Docker。Docker 的安装参见官方文档。出于一些原因,现行很多镜像源并不可靠也并不完整,不如直接配置代理(参见[《如何配置 docker 通过代理服务器拉取镜像》(博客园)](https://www.cnblogs.com/abc1069/p/17496240.html))。
4. `emby` `jellyfin`影音服务(但总的来说和国内的手机 APP 一样,资源管理比较单一,莫得音、视、图同时管理,可能大多数人对这些资源分类比较门清吧)
`pnpm`或者说`node`直接上官网复制 Linux 安装脚本就彳亍,但**不建议去装 Docker 镜像**[^pnpm_docker_image]
5. 跨平台前、后端开发(`nodejs` `python` ...,搭配 VSCode Remote-SSH
[^pnpm_docker_image]: 个人理解吧……Docker 镜像通常是部署用的,比如 CI/CD runner 跑工作流,需要拉`node`容器生成我这博客的`dist`成品。直接拿来开发个人觉得不太妥。
:::
6. 文件存取服务Xftp
::: details 应用层
这块不是重点,各种服务有各种服务的参考文档。
7. 其他定时服务、脚本……
- `webmin`:提供 WebUI 对服务器做些运维。
- `aria2``AriaNg`提供直链、BT、PT 下载支持。参见[《手把手教你使用 Docker 搭建 aria2+AriaNg打造自己的离线下载服务器》博客园](https://www.cnblogs.com/wqp001/p/14709997.html) [^ariang_baidupan]。
- `jellyfin` `emby`:影音服务器。有关 Jellyfin 的媒体聚合和刮削会专门另开一篇讨论。
- `vscode-server`:控制端可利用 VSCode 配合 Remote-SSH 插件连上服务器,做些跨平台开发……或者 Linux Native 开发。~~真有人在 Linux 编译 MSVC x86-64 吗?有的话浇我。~~
- `ssh`Xshell 做些命令行活计Xftp 做些文件交换活计。
- `nfs`:和前面 Windows 一样,可以挂共享文件系统。
- ……
[^ariang_baidupan]: 自从 !!Pandownload!! 被赐似之后,这种套取直链的油猴插件就多半是骗钱引流的“浑水”了,**不建议尝试**!但当年这玩意能火,或许也说明有些慢速下载获取到合适的直链、搭配代理,确实能提速吧。
:::
## 后记
通篇看下来,我的服务场景挺简单的,不是吗?说实话……我并不熟悉寄网(哪怕为了跨考自学过 408平时也没有太多 Web 编程的实践和需求。能简单搭这么一个自用的服务便已经方便我不少了。若是真正的大佬,或许还会利用反代、软路由等种种轮子实现更加 NB 的东西吧。
通篇看下来,我的服务场景挺简单的,不是吗?说实话……我并不熟悉寄网(哪怕为了跨考自学过 408平时也没有太多 Web 编程的实践和需求。能简单搭这么一个自用的服务便已经方便我不少了。若是真正的大佬,或许还会利用反代、软路由等种种轮子实现更加 NB 的东西吧。
不过反正我这人也没什么水平,笔记也不过抛砖引玉。菜逼有菜逼的天马行空,简单点写,懂的都懂。