Files
blogs/docs/notes/SelfHosted.md

138 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
tag:
- RDP
- 串流
- SSH
---
# 自组服务:让老机器“物尽其用”
这问题最初还真是为了分担《原神》这种重负载。毕竟 2.8 版本的海岛成功把我的轻薄本干烧了。~~虽然轻薄本拿去直播《原神》讲真也挺抽象的。~~ 然后次年下旬,我折腾 Hyper-V 时发现它似乎是通过远程提供的虚拟机界面,于是便走上了“自组服务”的不归路。
说白了,“把重负载分摊出去”的做法,某种意义上也顺应如今的各种“云”服务——把重活脏活甩给有能力负担的机器(对于绝大多数用户而言当然就是企业的云服务器),并提供轻量的终端接口给用户。何尝不是一种 C/S 模式呢?
---
话虽如此,自组服务也并非是自己买台服务器——那功耗和噪音注定不是家庭可承受的。所以让老机器“物尽其用”,也就成了我的首选。
> [!important]
> - 量力而行。这里的“力”指**老机器的配置、性能**。你毕竟不能强求赛扬 CPU 去跑《原神》PC 客户端。
> - 下面无论何种部署方式,均要求**在能够建立远程连接之前,首先有块屏幕**。
> - 本文只提供大概流程(或者说思路),**恕不详述具体操作流程**。信息检索能力很重要喔,哪怕是问 AI 呢?
## 前置准备
首先,需要固定机器在内网的 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 等工具**组虚拟内网**。
:::: details 配置 Zerotier One
首先当然得有那么个内网。在 [Zerotier](https://my.zerotier.com/login) 上注册/登录账号(可能比较卡,毕竟国外平台),`Create A Network`创建虚拟内网。免费版(截至目前)至多允许同一网络 25 个设备,但对于我来说足够了。
接下来图省事的朋友点进新建的网络,记一下`Network ID`就可以直接安装 Zerotier 客户端了。
Windows 有挂在任务栏里的 GUI 客户端,右键图标直接`Join Network`,粘贴刚刚的`Network ID`回车,进账号里同意加入、给它分配固定 IP 即可;
Linux 可以通过 Docker、官网提供的命令行、部分包管理器等方式安装 Zerotier One。
::: details 或者,进一步配置虚拟内网
主要关注以下项:
- `Basics` 网络基础设置
- `Name` 给你的内网重新起个拟人的名字。
- `Access Control`一般来说保持默认的`Private`(也就是必须你在账号上同意设备加入)即可。
- `Advanced` 高级设置
- `Manage Routes`相当于路由表了(左边是被访的内网网段,右边是 Zerotier 虚拟 IP
可以看看[这篇博客](https://stray.love/jiao-cheng/zerotier-zhong-jie-jiao-cheng)了解一下。
- `IPv4 Auto-Assign`里挑一个容易记的 IP 池。比如我就选`10.147.17.*`
- `IPv6 Auto-Assign`就随意了。说来 IPv6 现阶段不就是公网吗(
- `DNS`参见[英文文档](https://docs.zerotier.com/dns/)。
然后在设备加入虚拟内网之后,可以在`Members`里找到这个设备,手工给它分配个静态 IP。
:::
安装之后记得确认一下 Zerotier 服务是否开启Docker 容器还请额外注意端口映射。
```bash
sudo systemctl status zerotier-one.service
```
`systemctl`显示该服务`disabled``inactive (dead)`,说明没有启动,启用并立即启动它:
```bash
sudo systemctl enable --now zerotier-one.service
```
于是就可以使用 Zerotier CLI 了。我的场景比较简单,不考虑自建 moon 的情况下直接`sudo zerotier-cli join Network_ID`,然后也是在账号上给它放行、分配固定 IP 就可以了。
::::
## Windows——远程、串流、文件共享
Windows 想必大家都很熟。但既然把老主机当作“服务”来看待,便没有必要守在它旁边操作。也就是说,我们可以通过远程、串流等方式连上这台电脑,就好像云原神一样:游戏是在电脑上跑的,玩家是在手机上玩的。
Windows 开启 RDP 远程可以通过“高级系统设置”的“远程”选项卡Win7、8.1 可在**控制面板—系统**信息页跳转)、**设置—系统—远程桌面**Win10、11启用。
而如需像云原神般串流,则需要 Sunshine被控服务端和 Moonlight控制终端两个软件。~~当然也有别的串流方案,但 Moonlight 我折腾成了。~~ 由于间隔比较久远,相关的教程可以去 B 站搜索“自制云原神”词条,或者搜“阿西西”这个 UP 主,我也就不多展开了。
至于文件共享,最简单的方式是 Samba也就是右键文件属性里的“共享”选项卡。记得遵照指引去“网络和共享中心”先“启用文件和打印机共享”喵。
### 可部署的服务
我个人倒是有过这些实践:
- 开着 BiliBili 直播姬做推流机,从内网接收 OBS 流,并推上 B 站;
- 挂着各种网盘(尤其百度网盘)下载;
- RDP 玩剑三Moonlight 实测会屏蔽键盘输入)、串流玩崩原铁;
- 远程过去 P 图,开 After Effect 2018 做视频;
- ……
总的来说你平时怎么用那台牢机器的那就怎么对待它就是了。3 代 i3老老实实办公、文件共享玩些老游戏差不多就得了。10 代 i5那可以试试串流玩点新游戏After Effects 2020 做点视频特效,之类的。要是还有 AMD/NVIDIA 显卡,嚯,那甚至可以试试大模型。
**还是那句话,有什么样的性能办什么样的事**,不要学我一下子把负载全都倒到老 ASUS 上VSCode Remote+WSL+网易云+百度云+……,一下子给 7 代 i5、4GB 物理内存、32GB 虚拟内存(甚至才吃了 14GB整不会了。
### 常驻开机
作为自组服务器,肯定不兴像平日的 Windows 那般被自动更新、启动修复等扰得无法远程。
自动更新可以在**组策略`gpedit.msc`—计算机配置—管理模板—Windows 组件—Windows 更新—配置自动更新**一项中配置“已禁用”;若需禁止进 WinRE 启动修复,可以考虑以下两行批处理:
```batch
bcdedit /set {default} bootstatuspolicy ignoreallfailures
bcdedit /set {current} recoveryenabled No
```
当然我已经换用 Ubuntu Server 了,这两行有没有用我也没有底(
## Linux——开发、常驻服务、文件存取
不得不说Linux 能作为日用的服务确实不多(特别是无图形界面的服务器端),绝大多数部署起来可能还并不轻松。~~但部署好了之后是真好用啊(~~
那么既然不需要日用,为了节省图形资源,干脆就把老主机当作服务器,装个无图形界面的 Linux 吧。可以百度“Ubuntu Server 家庭云服务器”,有不少教程。
Linux 的主要远程手段是 SSH。在此之前需要安装`openssh`,并启用(和启动)`sshd`服务。
控制端则可以装一些便捷的工具去维护 SSH 连接,比如 [Xshell](https://www.xshell.com/zh/xshell/) 和 [Xftp](https://www.xshell.com/zh/xftp/)。
### 可部署的服务
1. 代理服务器(不光是服务器本机,在内网范围内其他电脑都可以过这台机的代理)
> 为什么是代理优先呢?因为像`docker`、`npm`等很多服务都需要代理。这或许也是一种“分层结构”吧。
2. `docker`容器服务(这种就基本上是服务器在跑,也是作为下层服务去提供别的服务)
3. `aria2`下载服务BT/PT乃至直链[^direct_http]),配合`ariaNg`等 WebUI
[^direct_http]: 有些浏览器下载比较慢的,借助`aria2`和代理或许能明显改善速度。!!比如已似的 Pandownload。!!
4. `emby` `jellyfin`影音服务(但总的来说和国内的手机 APP 一样,资源管理比较单一,莫得音、视、图同时管理,可能大多数人对这些资源分类比较门清吧)
5. 跨平台前、后端开发(`nodejs` `python` ...,搭配 VSCode Remote-SSH
6. 文件存取服务Xftp
7. 其他定时服务、脚本……
## 后记
通篇看下来,我的服务场景也挺简单的,不是吗?说实话……我并不熟悉寄网(哪怕为了跨考自学过 408平时也没有太多 Web 编程的实践和需求。能简单搭这么一个自用的服务便已经方便我不少了。若是真正的大佬,或许还会利用反代、软路由等种种轮子实现更加 NB 的东西吧。
不过反正我这人也没什么水平,笔记也不过抛砖引玉。菜逼有菜逼的天马行空,简单点写,懂的都懂。