# 一、前言 & 计划

大学第一年入坑了服务器,阿里云和腾讯云给学生的套餐还不错,2C 2G 40G 5M 每月只需要 10 RMB。但是脱离学生套餐,国内服务器的价格真的不要太高吗,10 元的学生套餐每个月要 100。

阿里云轻量应用服务器

当时就萌生了自己用一个电脑做服务器的想法,毕竟现在电脑硬件除了显卡都很便宜,稍微花点钱就能配个配置吊打上面的主机。

网络的话,一是没有公网 IP,二是宽带运营商对 80、443 端口查的非常严(逛一圈 v2ex 大概就知道形势了,毕竟 v 站玩服务器的人真的多),所以打算的是租一个极低配置的国内服务器,然后留一个端口作为 ssh,其他端口全部 frp 反向代理到本地的服务器,使用上基本就是透明的了。v 站有推阿里云的突发性能实例 t5 的,等于是平均只能有 0.2 核,但是价格非常香,算上硬盘只需要 24 元每月(一次买 3 年还有 5 折),流量按量计费就是 0.8 元每 G。

突发性能实例

不过由于学校寝室晚上要断网断电,再加上学生机目前够用、离到期还有很长时间,以及自建服务器还有 ups 等种种小毛病就没有考虑。

# 二、电脑采购

所以为什么最近开始考虑了呢,昨天学生机上同时跑两个 Web 应用(前端+后端+MySQL+Redis),更新一个应用的时候,不管是跑 npm 还是 maven 编译都能卡死,连按 10 下 Ctrl + C 都不带反应的。看了一下 CPU 占用很低,内存占用 80% 但也不至于这么卡,猜测可能用的是机械硬盘,读写炸掉了。所以没办法,就开始考虑这件事情了。

另外一个要考虑的是合法。首先要有备案,不然国内服务器都没法用。frp 的方案没有开放家里服务器的 80 和 443,所有数据应该是在 frp 的 tcp 连接里跑。v 站上大部分人宽带被封都是开放了 80 和 443。还有一个用高位端口遭了,可能是流量过大,我就跑几个普通的 web 应用,不至于网盘这么大流量,应该问题不大。保险起见,可以把 frp 自带的加密打开。

首先是主机。考虑到待机耗电问题,台式 U 都直接被 pass 掉。大概考虑两个方向,一个是 Intel 的 NUC,另一个就是低压 U 的笔记本。NUC 的体积很小,很适合藏在某个角落,只要网络稳定就行。最近 Intel 12 代出了,但 NUC 12 还没出,买 11 代总觉得有点怪。NUC7 呢,i5-7260U 只有 2C4T(8G+128G 1200),而 NUC8 i5-8260U 就有 4C8T(16G+256G 1650),比较不错。

不过转念一想,我已经有台式的情况下,笔记本的需求不是很大,手上这个笔记本虽然是作为开发本 + 远程开会(飞书)用,但是开发可以转移到台式上,而笔记本装成带桌面的 Linux 也可以通过网页进入飞书会议。笔记本的配置是 4600U(6C12T)+16G+512G(闲鱼参考价 2600),比 NUC 多一块屏幕和键盘,在偶尔出锅的时候不用再拆台式接主机,而且自带电池也不用 ups 了。少一个网口,不过我用 Wifi 就行(我家网口的位置都不方便,而且居然用的是四类线,有线接进来 100M 甚至跑不过光猫自带的无线 hhh)。

最后结论是,用家里旧电脑,不买 NUC 直接立省 100%。

# 三、环境配置、迁移

于是连快递都不用等了,今天直接开整。之前笔记本装过 Manjaro 了就不用新装 Linux 配梯子之类的了(这也是自建服务器比公有云的优势,梯子不太敢放到公有云上,结果拉个 GitHub 代码慢到死),只用 yay -Syu 更新一下就 ok。

最先配置 frpc,这个 archlinuxcn 和 aur 都有,直接 yay -S 就行。反代端口没有像以前想想那么多,实际上也就 22、80、443 就够了,毕竟家里的服务器会再套一层 Caddy,其他端口反代到 80/443 就行,还能走一层 HTTPS。然后服务器这边要先把以前的 Caddy 停掉,让出 80 和 443,ssh 也换到别的端口(毕竟以后 ssh 更多是要直连到 Caddy + web 服务的,这个 frp 中转站就不怎么用了)。

然后是 Manjaro 这里配置 sshd 以及 authorized_keys,因为以后是服务器了,所以原来服务器上 GitHub Actions 用的等等 authorized_keys 都要复制过来。

然后 Caddy,配置文件和前端的静态文件都打包下载过来,配置好以后直接 systemctl start caddy 就能用上 HTTPS,Caddy 永远滴神!

不过这里访问博客倒是一直 Permission Denied,因为博客的文件是在 $HOME 下的,反复检查权限也没发现问题,最后发现 aur 给的 caddy.service 里面配置了一行 ProtectHome=true 无条件保护 HOME,关掉就 ok 了(所有的 id_rsa .npmrc 这种权限默认都是 400,另外只要不犯 web server 的 root 指定为 $HOME 这种低级错误就问题不大)。

顺便一提,文件传输的形式可以用 scp,不过我是在两边各装一个 Syncthing 然后配对一下,两边各建一个文件夹,需要同步的文件就丢进去,过一会就自动同步了。这样做的好处是无感,不用等待下载漫长的过程。

然后 git 项目拉下来,用 docker 构建。因为之前用这个笔记本开发过,所以梯子、docker 这些都是有的,没有的话可以装一下。

项目的数据迁移,某些文件数据直接打包下载再粘贴就行,MySQL 的麻烦一点,直接复制过来不行。所以一般还是 mysqldump 出来再重新导入吧,也不是很麻烦。

GitHub Actions 和 Caddyfile 的 ssh 用户和部署路径可能有变化,记修改一下。

# 四、注意事项

数据迁移的部分就上面这么多,还有一些把桌面端变成服务器的注意事项。

一个是要让开机就能连到 Wifi。当然用有线就没这个问题了。搜索万能的 Manjaro Forum (opens new window) 得知,要设置一下 Wifi 密码不加密,而且所有人都可以连接到这个 Wifi 就行。

另一个就是 frpc 一定必须绝对要开机自启,Caddy 也要检查一下。虽然服务器平时不会关机,但是如果需要重启,frpc 没有自启、电脑又不在身边的话,等于断连了。

另外还要节电管理,任何情况下都不要睡眠(可以息屏),也不要关闭 Wifi。

还有就是数据备份,云服务器能保证六个九,但本地服务器可保证不了,一掉盘就玩完,所以重要数据一定要多地备份。一个有趣的思路是,把数据丢到服务器上去,反正服务器只开着 frpc,其他空间浪费了,而且云服务器进口流量不要钱。还是利用 Syncthing,写个脚本,每日把需要备份的文件(MySQL 就 dump 出来)复制到 Syncthing 的某个文件夹,然后自动共享到云端上,想看的时候看看 Syncthing 同步最后时间就行。如果没有装 Syncthing 的话,直接 rsync 当然也是可以的。

# 五、后记 & 功耗

整个过程用了一个白天(没有安装系统),效果算是不错,开着两个后端的同时构建一遍前端,CPU 占用 200%,功耗 20W,风扇都不带动的,博客也是随时都能秒加载。

最后的最后说下功耗,得益于 4600U 这颗低压 U + 无独显 + Linux,息屏 + 不睡眠能维持在 5W(Windows 不睡眠就要 12W 左右,可能是 Windows 上还跑了一个 WSL 2 的 docker),算下来一个月两块钱电费,这不比轻量服务器香?

之后有什么问题会在这篇博客继续更新~