把台式机作为服务器在家里云部署

本文由Deepseek辅助完成:D 语言模块太废了

Deepseek写的有点尬但是比我写得好

Part1.前言

家中有一台2015年的台式电脑,在2020年中考结束后,我更换了除机箱和电源外的所有硬件,CPU换成了R5 3600,GPU是RX 480,内存2x8G。这台机器始终有个顽固的毛病——开机时常卡在VGA自检灯,由于初高中课业繁重,大学后又习惯了使用笔记本电脑,这台台式机逐渐被冷落在角落,故障也就一直搁置未修。

转折发生在大学校园网的资费政策:IPv4流量需要付费,而IPv6却完全免费。我曾尝试租用纯IPv6的VPS,但低价服务器要么位于香港,要么远在北美,访问国内服务时延迟高得令人抓狂。直到某个深夜,看着家中积灰的台式机,突然灵光一闪——何不将这台闲置设备改造成代理服务器?这个想法如同电路板上的跳线火花,最终在寒假里点燃了我的家庭服务器改造计划。

Part2.故障排查

大二寒假一回家,我就迫不及待地开始折腾这台台式。结果开机一看,好家伙,自检灯这次直接卡在DRAM上了。我第一反应就是内存条出问题了,于是开始各种排列组合:单插A槽、单插B槽、双通道轮着试,连橡皮擦金手指这种土方法都用上了,可DRAM灯就是死活不灭。

眼瞅着快过年了,我也懒得继续折腾,干脆把其中一根内存条拔了,就留一根凑合吧。反正笔记本能玩,服务器的事就先放放吧,毕竟人生苦短,及时行乐嘛。

谁知道过完年我又手痒想继续搞,结果这次开机直接卡在VGA自检了。这下可把我整懵了,赶紧找懂行的朋友问了下。他一句话点醒了我:“显卡松了?“我这才注意到显卡确实把PCIe插槽压得有点变形。试着用手把显卡往上托了托,还就点亮了!

那之前DRAM的问题又是咋回事?我顺手把之前拔掉的那根内存条插回去试试,果不其然,又卡在DRAM自检了。这下总算破案了:显卡太重导致PCIe接触不良,外加一根内存条确实有问题。毛病不少,不过好歹找到原因了。

Part3.重装系统

毕竟这么多年了,尽管我其实还是会偶尔给它开一下机,但是众所周知固态硬盘断电时间太久会丢数据,再加上这么久没用过那肯定没啥对我用得上的资料,那就直接重装系统了。

考虑到我回学校之后不太想用图形界面来控制主机,大概率是用SSH,那就装Linux好了。我选了个自己之前用的系统-LinuxMint。

过程很快,安装过程就跳过了。

Part4.安装软件

其实想重新利用这台主机还考虑到我想要做一些网页服务和CS2服务器,CS2服务器使用SteamCMD安装,以下是SteamCMD安装/更新CS2参数,仅参考:

1
./steamcmd/steamcmd.sh +force_install_dir ./cs2/ +login anonymous +app_update 730

网页服务我决定使用1Panel来帮助我完成大部分的工作,使用

1
sudo 1pctl user-info

可以查看1Panel的端口

通过1Panel安装了MySQL,gitea,hero,AList等服务,我打算利用AList将我的主机作为NAS使用

由于1Panel使用容器安装各类服务,需要将实体路径挂在到容器里面

Part5.自动开机

开学后需要面临的问题是我无法实体按键开关机,那我就需要一个办法来远程开关机。关机好说,SSH连接到主机后进行关机即可。 但是开机就有点麻烦了,我主要考虑的是利用BIOS设置中的Restore after AC power loss搭配智能插座(正好还能看看功率)来进行远程开机。

我在小米之家购买了米家智能插座3,可以查看功率和设置自动化任务,我设置了一个自动化任务是当检测到功率小于1W时自动断电,这是为了我不需要手动关闭智能插座,而是在SSH中执行关机命令就可以自动关闭智能插座了。

Part6.获取IP

除了开关机问题,我还担心我在返回学校后运营商分配的IPV6地址会变更,这样我就无法连接到主机了。

一开始,我想了一个比较麻烦的办法:用ToDesk连接到主机后使用中继服务器来连接到图形界面获取IP,但实际试了几次之后我发现这实在是太蠢了!我都连接到图形界面了就为了看个IP?于是我放弃了这个方法。

那我只好写一个脚本来获取IP了。我的主机预期会直接连接到公网,也就是在一些IP查询网站查询到的IPV6就可以直接连接到主机了。

我决定先写一个获取IP的脚本,python在linux方便安装,那就使用python就好了

1
2
3
4
5
6
7
8
9
10
import subprocess

# 定义cURL命令
curl_command = 'curl https://6.ipw.cn'

# 执行cURL命令并获取输出
output = subprocess.check_output(curl_command, shell=True)

# 将输出转换为字符串
output = output.decode('utf-8')

利用邮箱发送IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#下面四行导入依赖的包
import smtplib
import socket
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

import subprocess

# 定义cURL命令
curl_command = 'curl https://6.ipw.cn'

# 执行cURL命令并获取输出
output = subprocess.check_output(curl_command, shell=True)

# 将输出转换为字符串
output = output.decode('utf-8')

# 获取本机ip
ip = output

#设置服务器所需信息 该部分需要修改
#outlook邮箱SMTP服务器地址

mail_host = 'smtp.qq.com'

#outlook邮箱用户名

mail_user = 'xxxxx@qq.com'

#密码(部分邮箱如qq邮箱为授权码)

mail_pass = 'xxxxxx'

#邮件发送方邮箱地址

sender = 'xxxx@qq.com'

#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发

receivers = ['xxxx@qq.com']

#以上部分需要修改

#设置email信息

#邮件内容设置

message = MIMEText('服务器已开机','plain','utf-8')

#邮件主题

message['Subject'] = ip

#发送方信息

message['From'] = sender

#接受方信息

message['To'] = receivers[0]



#登录并发送邮件

server = smtplib.SMTP(mail_host,587)

server.set_debuglevel(1)

server.ehlo()

server.starttls()

server.login(mail_user,mail_pass)

server.sendmail(sender,receivers,message.as_string())

server.quit()

exit()

最后在systemd配置开机启动,on-failure时重启,间隔5s,完成!