Files
blogs/docs/notes/SelfHosted.md

9.1 KiB
Raw Blame History

tag
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 上注册/登录账号(可能比较卡,毕竟国外平台),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
        可以看看这篇博客了解一下。
      • IPv4 Auto-Assign里挑一个容易记的 IP 池。比如我就选10.147.17.*
      • IPv6 Auto-Assign就随意了。说来 IPv6 现阶段不就是公网吗(
      • DNS参见英文文档

然后在设备加入虚拟内网之后,可以在Members里找到这个设备,手工给它分配个静态 IP。 :::

安装之后记得确认一下 Zerotier 服务是否开启Docker 容器还请额外注意端口映射。

sudo systemctl status zerotier-one.service

systemctl显示该服务disabledinactive (dead),说明没有启动,启用并立即启动它:

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 启动修复,可以考虑以下两行批处理:

bcdedit /set {default} bootstatuspolicy ignoreallfailures
bcdedit /set {current} recoveryenabled No

当然我已经换用 Ubuntu Server 了,这两行有没有用我也没有底(

Linux——开发、常驻服务、文件存取

不得不说Linux 能作为日用的服务确实不多(特别是无图形界面的服务器端),绝大多数部署起来可能还并不轻松。但部署好了之后是真好用啊(
那么既然不需要日用,为了节省图形资源,干脆就把老主机当作服务器,装个无图形界面的 Linux 吧。可以百度“Ubuntu Server 家庭云服务器”,有不少教程。

Linux 的主要远程手段是 SSH。在此之前需要安装openssh,并启用(和启动)sshd服务。

控制端则可以装一些便捷的工具去维护 SSH 连接,比如 XshellXftp

可部署的服务

  1. 代理服务器(不光是服务器本机,在内网范围内其他电脑都可以过这台机的代理)

为什么是代理优先呢?因为像dockernpm等很多服务都需要代理。这或许也是一种“分层结构”吧。

  1. docker容器服务(这种就基本上是服务器在跑,也是作为下层服务去提供别的服务)

  2. aria2下载服务BT/PT乃至直链1 ),配合ariaNg等 WebUI

  1. emby jellyfin影音服务(但总的来说和国内的手机 APP 一样,资源管理比较单一,莫得音、视、图同时管理,可能大多数人对这些资源分类比较门清吧)

  2. 跨平台前、后端开发(nodejs python ...,搭配 VSCode Remote-SSH

  3. 文件存取服务Xftp

  4. 其他定时服务、脚本……

后记

通篇看下来,我的服务场景也挺简单的,不是吗?说实话……我并不熟悉寄网(哪怕为了跨考自学过 408平时也没有太多 Web 编程的实践和需求。能简单搭这么一个自用的服务便已经方便我不少了。若是真正的大佬,或许还会利用反代、软路由等种种轮子实现更加 NB 的东西吧。

不过反正我这人也没什么水平,笔记也不过抛砖引玉。菜逼有菜逼的天马行空,简单点写,懂的都懂。


  1. 有些浏览器下载比较慢的,借助aria2和代理或许能明显改善速度。!!比如已似的 Pandownload。!! ↩︎