基于 PVE 搭建 All In One 家庭云服务

2026年07月29日·工具效率·#内网穿透 #PVE·37次浏览

摘要:基于N100低功耗主机安装PVE虚拟化平台,部署了All In One家庭服务器:通过SakuraFrp和Cloudflared搭建内网穿透;创建Ubuntu开发机用于远程AI Agent编程;设置OpenWrt旁路由实现透明代理;在LXC容器中安装Docker并部署Nginx Proxy Manager、Uptime Kuma等服务。整体实现低功耗、全天候运行的远程开发与家庭服务集成。

基于 PVE 搭建 All In One 家庭云服务

前言

两年前,N100 CPU 刚出的时候,看准了它的低功耗,手痒入手了一台。但是当时并没有用起来,一直在吃灰。最近 Vibe Coding 兴起,就想起来有那么一台低功耗主机,刚好用来可以不关机跑 AI Agent,远程接入控制发送指令或验收结果,跑的过程中手机、电脑都可以关闭。

但是单单用来跑 Agent 又有点浪费,就捣鼓安装个 PVE,把之前没折腾的都折腾一遍,部署一个 All In Boom All In One 家庭服务器。

PVE 安装

打开 PVE 官网1,下载镜像、烧录U盘、刷机、安装。

有几点注意事项,第一,因为我的主机硬盘只有256GB,所以在安装阶段,选择手动分配硬盘,maxroot填32(确保 local 分区有 32GB 的安全空间用于系统、ISO 和备份),其他默认。这样可以在空间尽可能分配给虚拟机。

第二,在 PVE 安装完成后,使用大神提供的 PVE 优化脚本2一键设置镜像源、关闭企业订阅、添加温度监控。

隧道搭建

保证在外网能够访问到内网的服务器,需要搭建内网穿透服务。我采用的是主选国内线路 SakuraFrp + 备用 Cloudflared 隧道。

内网穿透不需要使用重量型的 VM 虚机,使用占用更低的 LXC 即可,也不需要分配太多资源。

内存和 Swap 分配 200MB,核心分配1核限制0.5(即半个核),磁盘一两G即可。网络使用 vmbr0 桥接,即与pve同网段,DNS 设置公共的 ip 即可。

隧道 LXC 配置
隧道 LXC 配置

LXC 模板使用的是 Debian12 模板,配置完成后启动 LXC,进入“控制台”,配置镜像源(以root用户登录,或使用sudo命令)。

bash
cp /etc/apt/sources.list /etc/apt/sources.list.bak

tee /etc/apt/sources.list <<-'EOF'
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
EOF

apt update

如果不使用 PVE 自带的控制台而是其他终端工具,需要打开 SSH 登录。编辑/etc/ssh/sshd_config,找到 #PermitRootLogin prohibit-password 修改成PermitRootLogin yes,找到#PasswordAuthentication yes去掉首部注释#符号。重启 SSH systemctl restart ssh 后即可用三方终端工具登录。

更新镜像源之后,就去对应的官网,找到一键配置脚本,安装好内网穿透服务即可。

SakuraFrp 与 Cloudflared 服务
SakuraFrp 与 Cloudflared 服务

继而就可以把内网 PVE 的 IP 和端口映射到公网。需要注意的是,因为 PVE 使用的是自签名证书,不被浏览器信任,所以 SakuraFrp 要选 tcp 类型而不是 http(s) 类型,Cloudflare Tunnel 则选择 http 且开启“不校验 LTS”,这样可以避免 https 无限重定向问题。

浏览器访问穿透后网址,如果提示证书不安全且没法手动信任选项时,可以在英文输入法下手打thisisunsafe跳过证书验证。

开发机

Vibe Coding 开发,不需要 GUI 界面,故而选择 Ubuntu 26.04 LTS 服务器版本镜像3。这个版本没有可视化界面,全是命令行,对资源的占用低。下载镜像,上传 PVE 安装启动,配置镜像源:

bash
sudo tee /etc/apt/sources.list.d/ubuntu.sources <<-'EOF'
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
Suites: resolute resolute-updates resolute-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: resolute-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF

设置中国时区:

bash
# 设置北京时间
sudo timedatectl set-timezone Asia/Shanghai

# 验证,输出类似 Thu Jul 30 11:58:58 PM CST 2026 的时间与当前时间一致
date

安装 QEMU Guest Agent(同时需要在关机下,在 web 面板 - 选项中,开启 QEMU Guest Agent)。这样 ip 等信息就可以在面板查看到了:

bash
# 安装guest agent
sudo apt install -y qemu-guest-agent

# 开机自启并立即启动
sudo systemctl enable --now qemu-guest-agent

# 查看运行状态
sudo systemctl status qemu-guest-agent

到此虚机安装完成,后续安装开发需要的软件即可,比如 nodejs、pnpm、java、claude code、opencode等。

在家里主机或笔记本上安装 vscode,通过Remote - SSH插件远程连接开发机,即可浏览项目的文件。也可以打开终端,借助 tmux + opencode 之类的搭配,让 AI Agent 一直运行在这台 7*24 小时运行的家庭服务器上,而不会随着窗口/终端关闭而终止任务。

PS:vscode 有一个端口映射的模块,可以把开发机上的端口映射到本地,这样就可以很便捷地在笔记本上调试网页。

vscode 端口映射
vscode 端口映射

代理软路由

搭建家庭的代理服务器,使用 OpenWrt 系统作为软路由,再在该系统的基础上安装各种代理插件。

前往 OpenWrt 官网4下载最新版本对应的generic-ext4-combined-efi.img.gz镜像包,打开 PVE 界面,上传解压后的img镜像。

该镜像的安装方式与其他虚拟机不一样,在创建的时候勾选“不使用任何介质”,创建完成后还需要删除默认创建的 scsi0 磁盘

网络用VirtIO,网卡用vmbr0,跟虚拟机同网段。

OpenWrt 系统对系统的占用也不大,配置分配可以适当调小,当遇到瓶颈再调大。

打开 PVE 的 Shell 终端(不是 OpenWrt 的),导入镜像:

bash
# qm importdisk 【虚拟机ID】 【镜像路径】 存储位置
qm importdisk 100 /var/lib/vz/template/iso/openwrt-25.12.5-x86-64-generic-squashfs-combined-efi.img local-lvm

导入完成后回到虚拟机硬件页面,找到未使用的磁盘 → 双击打开 → 保存,应用。调整启动顺序,选项 → 引导顺序:把刚添加的 SATA 磁盘放到第一位,取消 CD-ROM。

启动 OpenWrt 虚机,进入终端,修改 IP 地址:

bash
vi /etc/config/network

找到config interface 'lan',修改:

bash
config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ipaddr '192.168.1.2'             # OpenWrt本机IP
        option netmask '255.255.255.0'     
        option gateway '192.168.1.1'      # 上游主路由网关
        option dns '223.5.5.5 114.114.114.114'

保存后重启网络:

bash
/etc/init.d/network restart

再安装 QEMU Guest Agent 可以更好地管理:

bash
apk update
apk add qemu-ga
reboot

旋即就可以访问http://192.168.1.2进入系统,注意,在旁路由模式,需要在“网络 → DHCP 和 DNS → LAN” 中勾选“忽略此接口”后,保存 & 应用,依次关闭 DHCP,避免与主路由冲突。

之后就可以安装各种代理插件,然后在需要使用代理的设备上,手动把 OpenWrt 设置为网关&DNS服务器即可。

Docker 容器

Docker 的安装我选择是同隧道搭建一样的 LXC + Debian12,在创建的时候,选择“非特权容器”+“嵌套”,内存和核心分配多点。启动后,登陆root账户(或命令加sudo),参照前面的步骤更新镜像、安装依赖、安装 Docker。

bash
apt update
apt install ca-certificates curl

# 下载官方GPG秘钥
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

# 添加 Docker APT 源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新索引
apt update

# 安装 Docker引擎
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动 Docker 服务,并设置为开机自启
systemctl enable --now docker

启动验证,如果看到 Hello from Docker! 的信息,就说明安装成功了:

bash
docker run hello-world

默认情况下,docker 命令需要 sudo 权限。如果有非root用户,为了避免每次输入 sudo,可以将当前用户加入 docker 用户组。

bash
# 创建 docker 用户组(通常已存在)
groupadd docker
# 将当前用户加入 docker 组
usermod -aG docker $USER

Docker 安装成功后,就可以安装各种的云服务进行部署了,比如 反向代理Caddy、可用性监控Uptime Kuma、密码管理服务Vaultwarden、监控系统Prometheus

鉴于一些神奇力量,Docker 在大陆是没法访问的,因而需要做一些额外的配置以拉取镜像。这里有几个方法:

一、为 Docker 守护进程(Daemon)配置代理

创建配置目录,创建并编辑代理配置文件:

bash
mkdir -p /etc/systemd/system/docker.service.d
nano /etc/systemd/system/docker.service.d/http-proxy.conf

输入以下内容并保存:

text
[Service]
# 将 proxy-ip:port 替换为实际的代理地址和端口。可以是上一步安装的代理插件提供的局域网端口
Environment="HTTP_PROXY=http://proxy-ip:port"
Environment="HTTPS_PROXY=http://proxy-ip:port"
# 如果有不需要走代理的内网地址,可以配置 NO_PROXY
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"

重启并验证配置是否生效:

bash
systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker       # 或者在拉取镜像时观察是否通过代理成功连接。
二、把 LXC 网关设置成上一步配置的 OpenWrt

把 Docker LXC 的网关修改成上一步搭建的代理软路由IP,通过 OpenWrt 中安装的插件完成透明代理(IP 需要改成之前 OpenWrt 的静态 IP)。

Docker 配置代理网关和DNS
Docker 配置代理网关和DNS

三、替换成国内镜像

可以使用“毫秒镜像”“轩辕镜像”这一类国内镜像,但是免费用户会被限速,实测限速很严重。

对应官网都会有一键配置脚本,直接粘贴到终端运行即可。

总结

目前我的 PVE 只有四个 VM / LXC ,后续可以根据服务的增多,把 Docker 容器按职能再次拆分成几个 Docker LXC。

PVE 所有节点
PVE 所有节点

总结所有的网络与设备拓扑结构示例如下:

mermaid
渲染中...

Footnotes

  1. Proxmox Virtual Environment

  2. PVE 直通+CPU/硬盘/温度显示+换源/去订阅+CPU睿频模式 一键脚本

  3. Ubuntu 下载

  4. [OpenWrt Wiki] Downloads

基于 PVE 搭建 All In One 家庭云服务

https://www.zyaer.com/posts/all-in-one-home-cloud-service-based-on-pve

作者发布时间Licensezyaer2026-07-29CC BY-NC-SA 4.0