All in one is all in boom

2022 年底的时候,我入手了一台 小米迷你主机,在上面部署了基于 Windows + WSL 的一些自建服务,并通过 Tailscale 接入一个私有网络以便远程访问。使用它的一年多来,我遇到过 RDP 无法连接、停电、断网、死机等情况,有些时候人不在机器附近不能及时处理,导致一些惯常使用的服务无法访问。

为此,我折腾了这样一些方法来减轻/消除影响。但这个周末又出现了问题,可能是又又又又死机了,我现有的手段也没法解决只能干看着,大概要到周一的时候才能搞好了 T_T。还是俗话说得好,鸡蛋不要放在一个篮子里。

应对重启

曾经听说过这样一个情况:有人将业务部署到一台安装了 Ubuntu 的机器时候,误将 Live CD 环境当成了硬盘上的系统环境,将业务部署到了 Live CD 上面。一直运行了很久没出问题,后来一次需要重启机器的时候,机器重启丢失了全部的数据。

一般来说,稳定运行的服务器环境的重启频率往往是按年来计算的,但是在 Windows 11 这样的消费级系统(并且有 Windows 自动更新这样的大坑),重启的频率有可能是一周甚至一天一次,如果机器重启后需要手动重启上面部署的服务,一方面是麻烦,另一方面是无人值守或不方便现场操作机器时会更麻烦。

所以说配置好机器上面部署的各类服务的开机自启是很有必要的。(你可能会说 Windows 不是最适合的选择,但这已经是历史遗留问题了,更换基础环境的方案,比如 PVE,改日再议。)这里我列举一些我用过的开机自启方案,不同的服务有不同的自启特性和要求,需要对症下药:

  1. 守护进程
    比如:Nginx 等后台运行的无 UI 程序
    我的方案:用 nssm 创建一个 Windows 服务,并将这个服务的启动方式改为自动
  2. Windows 开机时运行
    比如:netsh 等需要开机时执行(往往还需要提权执行)的命令或脚本
    我的方案:创建一个计划任务,并设置为 在系统启动时 执行
  3. Windows 用户登录时运行
    比如:WSL 等需要用户登录后才能启动的应用,或者是 QQ 等有 GUI 的软件。
    我的方案:将脚本或者程序的快捷方式放在用户的启动目录(可以运行 shell:startup 找到这个目录);或者创建一个计划任务,并设置为 在用户登录时 执行
  4. Windows 用户解除屏幕锁定时运行
    我的方案:创建一个计划任务,并设置为 工作站解锁时 执行

应对 Win11 RDP 无法连接的问题

Win11 遇到一个隔三岔五就会出现的问题:远程桌面有些时候会连不上,一直卡在连接中,大约 1 分钟之后会报错并中断连接。(具体的错误提示之后再补吧,现在找不到了)。如果遇到这个问题,只有重启机器后才能恢复正常。(也许仅重启 RDP 相关的服务也是可以的?)

我的解决办法是用 Go 写了一个简单 HTTP Server 并且设置开机启动。这个 HTTP Server 暴露一个 HTTP 接口,请求这个接口时会执行 Windows 的 shutdown.exe /r 重启机器。

应对停电

  • Q:停电了怎么办?
    A:当然是等供电恢复。
  • Q:来电了之后我人不在机器附近,怎么开机?

这里我是将机器设置为上电自动开机(一般需要 BIOS 支持,并且在 BIOS 中设置)。众所周知小米迷你主机是 Intel NUC 换皮,所以直接查 Intel NUC 的文档:Can Intel® NUC Mini PCs Start Automatically When a Power Source is Connected?

步骤如下:

  1. 开机时按 F2 进入 BIOS 设置
  2. 依次选择进入 Power > Secondary Power Settings
  3. After Power Failure 设置项的值调整为 Last State(若断电时为开机状态,则下次上电时自动开机)或者 Power On(始终上电开机)

应对宽带断网

等网恢复吧,没其他办法了。实在是需要始终在线的话,可以考虑备一个随身 Wi-Fi 之类的,在断网时切换到移动数据。

应对死机或者其他无响应的情况

用小米迷你主机的一年以来,我遇到过两次机器死机的情况。每次死机的时候机器有一定的发热(可能是 CPU 一直在跑),但是风扇不转(不理解为什么这种情况下风扇不运作),长按电源键强制重启后风扇才开始工作进行主动散热。

在这种情况下,运行在机器上的方案都不能正常工作,只能从外部强制关机再开机来解决。一般的方法是在机器的电源上接一个小米的智能插座,死机的时候操作智能插座将机器断电,然后再通电触发上电开机。

我现在有点后悔明知有这个后备方案但是没落实,现在貌似又遇到这种情况,却只能干看着机器连不上。

应对数据丢失或不可访问

对于一些高价值的数据(无论是物质价值还是时间成本;比如密码管理器的 DB 等等),定期备份和多副本是很有必要的。一方面是数据丢失时可以尽可能挽回损失,另一方面是当主服务不可用时可以从备份恢复,以减轻对眼前的工作以及生活的影响。

不同的应用和不同的数据有不同的备份方式,有些内置了备份/同步的功能,也有一些需要手动备份,这里就不赘述了。无论如何,如果你的重要数据到目前为止还是孤本,我建议立刻行动起来做好备份工作,以防万一。