type
status
date
slug
summary
tags
category
icon
password
前两天,终于让手里的那台联想小新ideapad700-15ISK彻底退役了。这台机器自2016年读大学时购入,历经加装内存、硬盘、更换屏幕等多次升级,已陪伴我整整9年。其质量仍然很好,但闲着也是无用,索性刷个Ubuntu系统,作为个人服务器兼NAS使用。
由于本文是过程向,而非教程向,整体按照时间顺序记录,因而可能会缺乏逻辑性,见谅
📝 主要过程
需求
1.开放一个共享文件夹便于保存或读取资料 2.闲时挂载bt种子进行影视资源的上传与下载 3.存储收集的音乐资源,提供音源服务,作为电脑、手机端的个人音乐库 4.作为网盘自动同步手机、电脑端指定目录下的所有内容 5.运行个人自动化脚本。如:通知、数据处理、应答等
准备
1.已备案过的具有公网ip的云服务器和域名 2.闲置电脑和硬盘 3.光猫的超级管理员密码(用于关闭光猫的ipv6防火墙,也可以用来改桥接)
1 安装Ubuntu24.04.2LTS版
1.1 制作Ubuntu启动盘
将下载好的Ubuntu 24.04.2 LTS Server的iso文件,利用balenaetcher烧录到准备好的U盘中
Hint:U盘会被格式化;若U盘有写入保护,可参考下面这篇文章
1.2 在目标机器上安装Ubuntu
将刻录好iso镜像的U盘启动器,插入目标机器,开机时狂按F12进入bios,切换启动引导至U盘。接着按照系统引导逐步安装即可
Hint:具体步骤可参照下面这个视频
2 安装frp和ddns-go
由于入户光猫申请不到公网ipv4的地址,而我需要外网也能ssh家庭局域网内的服务器。所以我的实现方式是: 1.利用frp和手中已有公网ip的阿里云服务器实现ipv4的内网穿透 2.利用ipv6的地址和ddns-go,将手中闲置的域名解析到动态变化的ipv6地址 这两种方式分别可以实现: 1.当我访问阿里云的公网ipv4的特定端口时,能被转到固定的内网服务器ipv4的特定端口 2.当我访问固定的域名时,能被解析到动态变化的内网服务器的ipv6地址 这样就可以实现最基础的外网ssh远程内网服务器的功能。其余需要外网访问的功能,也都可以基于这两个方法实现
2.1 安装frp
2.1.1 frp客户端配置 frpc
为了方便操作,我们可以下载一个WinSCP,将在github上下载好的frp,传输给
/usr/bin
文件夹下,此时/usr/bin/frp
路径下应该包含frpc
(客户端)和frpc.toml
(配置文件)这两个文件,frpc.toml
的配置内容如下:文件配置好后,我们需要将frpc注册成service,以保证开机自动运行,我们将
frpc.service
文件放在/etc/systemd/system
路径下,其内容如下:这里需要注意两个问题:
1.利用WinSCP将
frpc.service
放入/etc/systemd/system
路径下时,会被系统拒绝,原因是/etc/systemd/system
路径只有root用户拥有写入权限,而Ubuntu系统默认不允许远程root账户登录。
此时,我们可以修改一下
/etc/ssh/sshd_config
,将其中的PermitRootLogin
参数的值改为yes。这样便可以实现远程root账户登录
2.要给frpc文件添加可执行权限,即
这样,frp的客户端就配置完成了。
完成以上步骤后,daemon-reload并restart一下,frpc就正常运行了,当然,别忘了
2.1.1 frp服务端配置 frps
总体思路与客户端类似,唯一值得注意的是,需要在阿里云服务器的防火墙和阿里云的安全组下访问规则中,将先前配置好的对应端口开放:7000端口(用于frp的客户端与服务端相互通信的端口)、7500端口(用于显示网页图形界面的管理页面端口)、6000端口(用于暴露在公网给其他机器访问的端口)
完成以上步骤后,此时就已经可以正常地ssh到阿里云服务器的ipv4地址,进行内网穿透,访问内网的家庭服务器了
2.2 安装ddns-go
2.2.1 获得域名解析服务商的AccessKey(我用的是阿里云)
创建一个AccessKey并将AccessKey ID和AccessKey Secret的值记录并保存下来
2.2.2 在Ubuntu上安装ddns-go
在github上找到ddns-go并下载对应的版本内容,用WinSCP传到Ubuntu上,然后输入以下命令安装
安装完成后如下图所

此时需要打开网页进行进一步的配置,默认端口为9876。填入先前获得的AccessKey ID和AccessKey Secret

接着在ipv6设置中的Domains这一项,填入我们事先准备好的闲置域名

最后,保存即可。这样ddns-go就成功配置好了。此时就可以通过固定的域名访问拥有动态公网ipv6地址的Ubuntu服务器了
3 安装samba实现内网共享文件夹
3.1 挂载硬盘
因为这台联想小新700只有128g的SSD和1T的HDD,面对家庭存储的需求,这点硬盘容量显然过于鸡肋。我手里刚好有一块闲置的西数8T紫盘,买了个好点的纹波小的电源,直接通过USB连接并外挂
当然我是新手,这里了解一下Linux的文件管理机制:
Linux 一切皆文件
- 硬盘、U盘、光驱等设备都映射到
/dev/
下的文件(如/dev/sdc2
),而不是盘符
- 必须挂载到目录才能访问。
- 可以挂载到任意目录(如
/mnt/data
、/media/yourname/disk
)。
- 可以挂载网络存储、内存盘等,而 Windows 的盘符(A-Z)有限。
Windows 自动分配盘符(如
D:
),但 Linux 要求显式挂载。了解完之后,我们输入如下命令来显式地进行硬盘挂载:
当你执行
sudo mount /dev/sdc2 /home/mujiang/HDD-8T-SHARE
时:- 如果
/home/mujiang/HDD-8T-SHARE
是空目录: - 挂载后,该目录会显示
/dev/sdc2
的内容。 - 原有目录本身无内容,所以不会有变化。
- 如果
/home/mujiang/HDD-8T-SHARE
原本有文件: - 这些文件会暂时“隐藏”,只能看到
/dev/sdc2
的内容。 - 卸载硬盘后(
sudo umount /home/mujiang/HDD-8T-SHARE
),原有文件会重新出现。 - 文件不会被删除,只是被挂载的硬盘“覆盖”了访问入口。
3.2 安装samba并配置
3.2.1 安装samba
输入如下命令进行samba安装:
3.2.2 配置samba
打开samba配置文件
修改配置文件如下
其中0664和0775的含义如下:
create mask = 0664
的作用
- 定义新创建文件的默认权限(即用户上传或新建文件时的权限)。
0664
的八进制解析:0
:特殊权限位(通常为 0)。6
(所有者权限):rw-
(可读可写,不可执行)。6
(所属组权限):rw-
(可读可写,不可执行)。4
(其他用户权限):r--
(仅可读)。
效果:
- 用户
mujiang
创建的文件权限为rw-rw-r--
(所有者可读写,组用户可读写,其他用户只读)。
directory mask = 0775
的作用
- 定义新创建目录的默认权限。
0775
的八进制解析:0
:特殊权限位。7
(所有者权限):rwx
(可读可写可执行)。7
(所属组权限):rwx
(可读可写可执行)。5
(其他用户权限):r-x
(可读可执行,不可写)。
效果:
- 用户
mujiang
创建的目录权限为drwxrwxr-x
(所有者可读写执行,组用户可读写执行,其他用户可读和执行)。
权限对照表
权限项 | 数字表示 | 字符表示 | 说明 |
文件所有者 | 6 | rw- | 可读可写 |
文件所属组 | 6 | rw- | 可读可写 |
其他用户 | 4 | r-- | 仅可读 |
目录所有者 | 7 | rwx | 可读可写可进入 |
目录所属组 | 7 | rwx | 可读可写可进入 |
目录其他用户 | 5 | r-x | 可读可进入,不可写 |
添加samba用户
重启服务
防火墙设置(如有)
3.2.3 测试访问
由于我们之前设置好了ddns,所以此时我们有如下两种访问形式: 1.办公电脑在内网,输入内网Ubuntu服务器的内网ip访问共享文件夹 2.办公电脑在外网,输入固定的域名,利用ddns解析到最新的ipv6地址,访问内网的Ubuntu服务器的共享文件夹
客户端访问
- Windows:文件资源管理器输入
\\服务器IP\HDD-8T-SHARE
- Linux/macOS:使用文件管理器连接或
smb://服务器IP/HDD-8T-SHARE
注意事项:
- 如果硬盘是NTFS格式,确保安装NTFS支持包:
- 对于大容量共享,可能需要调整Samba性能参数:
- 如需匿名访问,设置
guest ok = yes
并取消valid users
行
3.3 效果


4 安装qBittorrent和PeerBanHelper实现bt下载
由于国内糟糕的BT共享环境和以迅雷为首的大平台的作恶,为防止服务器挂BT种子时被恶意吸血,因此选用github上基于qBittorrent的改版qBittrrent-Enhanced-Edition安装使用,并配合PeerBanHelper对恶意ip进行封禁
4.1 安装qBittorrent-Enhanced-Edition
我们安装无头的x86版本,链接如下:
这里我将其放在了
/usr/bin
路径下,并通过运行webui,将webui的端口改在了10001(看个人喜好),勾选高级设置中的Auto Ban Unknown Client From China(捂脸)和Auto Ban Bittorrent Media Player接着将qbittorrent-nox注册成service,使其开机自动运行
4.2 安装PeerBanHelper
在github上PeerBanHelper的release仓库中找到合适的deb后缀的安装包
安装完成后,peerbanhelper会在Ubuntu服务器的本机9898端口默认开启一个配置页面
后续可以用frp+nginx穿透到公网方便运维
5 安装Navidrome搭建个人音乐库
5.1 安装并配置Navidrome
官方给出了如下的安装教程,这里仅简要说一下
在github上下载并安装合适的版本
打开配置文件
添加/更新以下行以指定音乐库路径(以自己的路径举例):
启动 Navidrome 服务:使用 systemctl 启动 Navidrome 服务并将其设置为在启动时运行
检查服务状态:验证 Navidrome 是否正常运行。
如果一切设置正确,Navidrome 将可以通过网络浏览器访问:http://localhost:4533
5.2 手机端、电脑端安装音流实现多端听Navidrome里的歌
github上搜索音流并安装,具体细节略去不表
6 安装Docker
- 安装必要依赖
2.添加 Docker 官方 GPG 密钥(使用国内镜像加速)
3.设置 Docker 稳定版仓库(使用国内源)
4.更新并安装 Docker
7 安装musictagweb实现音乐刮削
直接docker无脑安装
- 从Docker Registry拉取镜像
- dokcer run
ps:
/path/to/your/music
改成你的音乐文件夹路径!我这里为/home/mujiang/HDD-8T-SHARE/HomeServer/music/path/to/your/config
改为配置文件路径!我这里为/home/mujiang/music_tag_data- 修改默认密码(可选)
访问在
127.0.0.1:8001/admin
默认账号密码 admin/admin 修改默认密码
8 安装homeassistant实现全屋智能
8.1 用Docker安装homeassistant
用docker一键安装
HA 想使用内网穿透还得再 configuration.yaml 文件里加上这一段:
完成修改后,重启一下docker里的homeassistant容器
8.2 nginx问题解决
8.2.1 问题探究
在下文配置好相应的frp和nginx后,我们会发现通过homeassistant.home.yourdomain.com:28080可以正常访问并登录网页,但是通过homeassistant.home.yourdomain.com却只能访问,无法登陆,错误页面如下:

出现这个问题的原因是:
1. Home Assistant 的 WebSocket 依赖
Home Assistant 的前端(如登录后的实时界面)依赖 WebSocket 协议实现双向通信(例如状态更新、事件推送)。而初始的 HTTP 反向代理配置可能仅处理普通 HTTP 请求,未正确转发 WebSocket 连接。
2. Nginx 的默认代理行为
默认情况下,Nginx 的
proxy_pass
会:- 将客户端请求转换为普通的 HTTP/1.1 请求转发给后端。
- 不会主动处理
Upgrade
标头(WebSocket 的关键握手标头)。
8.2.2 问题解决
通过在nginx的location块中添加以下配置解决问题:
关键标头的作用
Upgrade: $http_upgrade
将客户端的
Upgrade
标头(如 websocket
)原样传递给后端(Home Assistant),告知需要升级协议。Connection: "upgrade"
确保
Connection
标头包含 upgrade
,这是 WebSocket 握手必需的字段。如果缺少这些标头,Home Assistant 无法建立 WebSocket 连接,导致登录后实时功能失效(表现为“无法连接”)。
Nginx 配置的深层原理
1. WebSocket 握手流程
WebSocket 通过 HTTP 协议初始化握手,客户端发送:
Nginx 必须将这些标头透传给后端,否则握手失败。
2. 反向代理的“协议转换”问题
Nginx 默认会:
- 将客户端请求降级为 HTTP/1.1 不带标头的普通请求。
- 丢弃
Upgrade
和Connection
标头,导致后端无法识别 WebSocket 请求。
添加
proxy_set_header
后,Nginx 会保留这些标头,允许协议升级。为什么只配
trusted_proxies
不够?trusted_proxies
仅告诉 Home Assistant 信任来自 Nginx 的 IP(避免将 Nginx IP 误判为攻击来源)。
- 但 WebSocket 功能依赖正确的标头转发,与 IP 信任无关。
9 安装syncthing实现个人云盘搭建
9.1 在Ubuntu服务器上安装syncthing
步骤 1:下载 Syncthing
1. 进入临时下载目录:
2. 使用
wget
下载 Syncthing:步骤 2:解压文件
1. 解压下载的
.tar.gz
文件:2. 进入解压后的目录:
步骤 3:安装 Syncthing
1. 将二进制文件复制到
/usr/local/bin
(系统可执行路径):2. 验证安装:
应输出类似:
步骤 4:配置 Syncthing 为系统服务
1. 创建数据存储目录并设置权限:
2. 创建 Systemd 服务文件:
粘贴以下内容:
3. 启动并启用 Syncthing 服务:
4. 检查服务状态:
步骤 5:访问 Syncthing Web 界面
默认情况下,Syncthing 的 Web 界面运行在
http://localhost:8384
。如果需要远程访问,修改配置文件
/var/lib/syncthing/config.xml
,将 127.0.0.1
替换为 0.0.0.0
:接着,进行下一节所示的frp和nginx相关配置即可
9.2 在个人windows电脑及手机上上安装syncthing
9.2.1 开机自启动并无窗口运行设置
windows装好后,默认是以终端窗口运行,且每次运行时会弹出网页控制台(本机默认在13614端口)。我们可以写一个简单的bat的脚本来规避这个问题,注意在此步之前,一定要在windows系统设置中将终端选为下图所示

将syncthing的执行路径添加的系统环境变量的path中
在syncthing的安装目录下,新建一个文本编辑为bat,内容如下,命名为syncthing_start.bat
新建一个该bat脚本的快捷方式,并放置在windows开机自启动目录下,即C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
9.2.2 手机上安装syncthing
谷歌商店上找到Syncthing-Fork安装即可,其余过程略去不表
9.3 同步方式设置
我想实现增量备份
因此在ubuntu服务器的syncthing的界面,右上角“操作-高级-文件夹-具体文件夹名称”点开后会弹出来一个全是英文的菜单,里面有一个Ignore Delete的选项,勾选就可以忽略删除了。
8 设置frp和nginx实现稳定公网访问
没有在前面进行这一步是因为两天前我还在乐滋滋地用ipv6公网访问我的所有服务,结果今天就发现联通把我光猫的所属网段下所有ipv6的端口全部封了!!!(不得不感叹一下上海网络检查的速度,要不说魔都效率高呢)。所以纵然ipv6的地址数量浩瀚到可以给每一粒沙子都分配地址,但现实国情就是:现在的ipv6在大部分区域都变成了只能进不能出的单向通道(只能访问服务,但不能提供服务),这基本是掐死了个人用户的DIY空间。 此外,入户的公网ipv4地址,那是根本申请不下来啊…… 但,“只要思想不滑坡,方法总比困难多”:虽然利用frp实现内网穿透延迟高、还耗费中继服务器的流量,但它好歹能用啊。而且我需要公网访问的家庭网络服务,对延迟并不敏感 那么,说干就干
8.1 利用frp通过自定义域名访问内网的web服务
8.1.1 配置 frps.toml
在 frps.toml 文件中添加以下内容,以指定 HTTP 请求的监听端口为 28080:
如果需要配置 HTTPS 代理,还需要设置
vhostHTTPSPort
。8.1.2 配置 frpc.toml
在 frpc.toml 文件中添加以下内容,确保设置了正确的服务器 IP 地址、本地 Web 服务监听端口和自定义域名:
8.1.3 添加相应的dns解析
在相应的域名托管平台,将步骤6.1.2中customDomains中填写的对应的域名,添加A记录解析平台到serverAddr对应的地址
8.1.4 访问测试
使用浏览器访问
http://navidrome.yourdomain.com:28080
即可访问内网机器上的 4533 端口服务,访问 http://qbittorrent.yourdomain.com:28080
可以访问内网机器上的 10001 端口服务。但很显然,输入端口的方式仍然不够优雅,所以下一步,我们配置一下nginx代理
8.2 利用nginx实现端口转发
在具有公网ip的中继服务器上,部署nginx服务,并在编写好的配置文件中加入如下的配置
完成了如上的配置之后,这时nginx会将例如对于该域名navidrome.yourdomain.com(默认是80端口)的访问,转发到中继服务器的28080端口(由frp监听),从而穿透到内网的相应端口,实现服务
这样我们只需通过配置好的有规律的域名,就能访问到内网机器的对应服务,非常舒服
🤗 总结
整体操作下来其实没有难度,只是步骤很多很繁琐。但只要不接触内核、驱动,都是小问题
📎 参考文章
其余步骤待补充
- 作者:江牧
- 链接:https://lawyerjiang.top/article/life/2
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。