Skip to content

用笔记本来搭建本地服务器

更新于 at 00:00

Table of Contents

Open Table of Contents

前言

最近用一台家里的老旧笔记本搭了一台本地服务器,体验下来还是不错的,于是写一篇博客记录一下。

主要流程就是安装 Ubuntu Server 系统,路由器支持 IPv6 实现公网 IPv6 访问,宽带有公网 IPv4 或者有一台云服务器实现公网 IPv4 访问,最终实现通过 IPv4 + IPv6 双栈访问服务器,安装 docker 来快速部署和方便管理服务。

使用笔记本搭建本地服务器有两个独特的好处:

  1. 有一块显示屏,当服务器出现问题,并且无法通过 SSH 连接进行调试时,不用额外接一块显示屏就可以直接进行调试。
  2. 有一块电池,当直流供电中断时,一块电池可以起到 UPS 的作用。

不过这俩平时都用不到,我们需要进行一定的设置,我在文末会提及。

Thinkpad E431

neofetch系统信息

首先介绍一下我用的笔记本,联想 Thinkpad E431:

这台笔记本之前安装个 Windows 7 还能勉强够用,开机内存占用基本就过半了,4G 内存运行图形化界面还是比较吃力的,但装个 Ubuntu Server,我到目前见到最高的内存占用也就 25%。

如果你不是 Thinkpad E431,也可以参照一下这篇博客,毕竟 Linux 还是不怎么挑硬件的。

Ubuntu Server

你需要准备:一个 8G+ 的 U 盘用于制作启动盘,一根网线用于有线网络。

(1) 制作启动盘

这里使用的是 Rufus,其他制作工具也可以。

Ubuntu Server ISO 镜像文件下载地址:https://ubuntu.com/download/server

将 U 盘插入电脑,打开 Rufus,选择下载好的 Ubuntu Server 镜像,分区类型选择“MBR”,文件系统选择“NTFS”,点击“开始”,等待制作完成后拔出 U 盘。

rufus制作启动盘

(2) 从启动盘引导

搜索你笔记本对应的进入 BIOS 的方式,Thinkpad E431 是在开机时连续单击 F12 键进入 BIOS。

在 BIOS 中关闭安全启动 Secure Boot,在启动顺序中将启动盘(U 盘)置顶后,保存并退出,进入开机界面。

如果顺利的话,应该是进入 Ubuntu Server 的安装界面了。

(3) 安装 Ubuntu Server

推荐视频教程:【系统篇】安装Ubuntu Server 20.04

安装过程参照上面的视频就可以了,我安装也是跟着他来。

强调几点:

等待安装完成后,你就拥有了一台本地服务器,一些有关服务器的杂项设置可以参考文末。

如果你是第一次使用服务器,可以参考我这篇博客:连接到服务器

公网访问

2024-04-20 更新:DDNS v Tailscale v Cloudflared,在这篇文章中我弃用了下面的方案,转用 Tailscale,仅供参考。

至此,我们仅仅是搭建了一个能在局域网连接和访问的服务器,如果需要在非局域网环境连接或是访问,则需要进行相应的配置。

(1) 公网 IPv6 + DDNS

你需要准备:一个域名 www.example.com,托管在阿里云、腾讯云、Cloudflare 都可以。

现如今公网 IPv4 还是很难申请到了,但只要你的路由器支持 IPv6,就大概是公网 IPv6,只是每次路由器重新拨号时,IPv6 地址会改变,所以我们要采用 DDNS(动态域名解析)将 IPv6 绑定到一个域名,通过域名来固定访问地址。

ddns-go 项目地址:https://github.com/jeessy2/ddns-go

我是使用 docker(host)部署的,使用方式很简单,等你打开 ddns-go 的 webUI 界面看看就会用了,这里解释一下 DDNS 的原理。

ddns-go 定期获取本机 IP 地址,再通过阿里云/腾讯云/Cloudflare 的相应 API 更改域名 www.example.com 的解析结果为最新的 IP 地址。

PS 如果你有动态公网 IPv4 地址的话,也是使用 DDNS 绑定域名进行访问。

(2) FRP 实现 IPv4 公网访问

你需要准备:一台云服务器,最好是国内服务器,可能需要备案,或者用国外服务器。

因为我没有公网 IPv4,所以需要一台云服务器进行内网穿透,这里采用的是 FRP 来实现 IPv4 公网访问。

在云服务器上部署 frps 并开放相应端口,在本地服务器上部署 frpc,进行相应配置,如何写配置网上教程很多。

我原本是用 docker 部署 frps 和 frpc,但动不动报错,最后采用二进制文件使用系统服务开机自启。

PS 如果你没有云服务器,其实也不一定要配置 IPv4 公网访问,毕竟现在国内 IPv6 还是比较普及的,实在不行就用流量访问。

一些推荐的服务

除了前面提及的 ddns-go 和 frp 之外,这里推荐一些服务让你知道一个本地服务器能干什么。

你也可以参考我这篇博客:搭建自己的在线动漫资源库

你可能需要

设置合盖不休眠

因为是用笔记本搭建的服务器,如果设置合盖不休眠的话,占用体积会更小,或许也会降低功耗(毕竟关闭显示屏了)。

sudo vim /etc/systemd/logind.conf
~~~
- #HandleLidSwitch=suspend
+ HandleLidSwitch=ignore
~~~
sudo systemctl restart systemd-logind.service

开盖关闭显示器

在设置合盖不休眠后使用过程中,会发现因为合盖导致笔记本散热减弱,后面改成了“开盖关闭显示器”。

使用一行命令开启/关闭显示器,配置开盖时打开显示器。

(1) 安装相关软件

sudo apt update
sudo apt install acpid vbetool

(2) 配置 ACPI 开盖事件

sudo vim /etc/acpi/events/lid
~~~
event=button/lid LID0 open
action=/etc/acpi/lid.sh
~~~

(3) 创建 ACPI 脚本

sudo vim /etc/acpi/lid.sh
~~~
#!/bin/bash
sudo vbetool dpms on
~~~
sudo chmod +x /etc/acpi/lid.sh

(4) vbetool 命令

sudo vbetool dpms on #开启显示器
sudo vbetool dpms off #关闭显示器

电池供电主动关机

我们希望服务器能 7x24 小时保持工作,但总会出现突发情况,导致突然断电,如果我们不进行相关设置,电池耗尽导致突然关机,可能会出现数据丢失等问题,所以这里讲一下如何设置成电池供电时主动关机。

网上常见的是 ACPI 电源管理一套流程,但我实际用下来貌似没效果,所以直接用的是 crontab 每 5 分钟检测,如果是电池供电则执行关机命令。

vim path/to/auto_shutdown.sh
# 这里涉及两个文件,脚本文件和日志文件,请注意修改相应地址
~~~
#!/bin/bash

if [ `cat /sys/class/power_supply/AC/online` -eq 0 ]; then
        shutdown -h 3
        echo "$(date +%Y-%m-%d\ %H:%M:%S):检测到直流供电断开,准备关机。" >> /home/xxx/log/auto_shutdown.log
fi
~~~
chmod +x path/to/auto_shutdown.sh # 给脚本执行权限
sudo -i # 关机是高权限操作,需要 root 的 crontab
crontab -e # G 跳转到末尾,o 新建一行进行输入,键入下面命令后 :wq 退出
~~~
*/5 * * * * path/to/auto_shutdown.sh
~~~

以 root 用户登录

安装完 Ubuntu Server 你会发现你并不知道 root 用户的密码,我们需要重新设置 root 密码。

sudo -i # 进入 root 用户
passwd # 设置 root 密码

修改 SSH 端口

sudo vim /etc/ssh/sshd_config
~~~
在配置文件中找到“Port”行,取消注释并改为你要使用的端口
~~~
sudo service ssh restart

配置 ufw 防火墙

sudo apt update
sudo apt install ufw
sudo ufw allow 22 # 首先放行 SSH 端口,如果你修改了 SSH 端口则放行相应端口
sudo ufw enable # 开启 ufw 防火墙
sudo ufw status # 查看 ufw 规则
sudo ufw delete allow 22 # 删除放行 22 端口的规则

公网无法访问 IPv6

如果你发现在局域网内能正常解析域名并访问,但在公网(比如使用流量)却无法正常访问,这可能是因为你的路由器或是光猫有 IPv6 防火墙,请自行搜索关闭防火墙的方法。

在此之前,请确认服务器防火墙是否放行相应端口。

Server-Box

推荐一个开源安卓软件 Server Box,用于在手机上查看服务器状态。

项目地址:https://github.com/lollipopkit/flutter_server_box