基于 PVE 搭建 All In One 家庭云服务
摘要:基于N100低功耗主机安装PVE虚拟化平台,部署了All In One家庭服务器:通过SakuraFrp和Cloudflared搭建内网穿透;创建Ubuntu开发机用于远程AI Agent编程;设置OpenWrt旁路由实现透明代理;在LXC容器中安装Docker并部署Nginx Proxy Manager、Uptime Kuma等服务。整体实现低功耗、全天候运行的远程开发与家庭服务集成。
前言
两年前,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 模板使用的是 Debian12 模板,配置完成后启动 LXC,进入“控制台”,配置镜像源(以root用户登录,或使用sudo命令)。
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 后即可用三方终端工具登录。
更新镜像源之后,就去对应的官网,找到一键配置脚本,安装好内网穿透服务即可。
继而就可以把内网 PVE 的 IP 和端口映射到公网。需要注意的是,因为 PVE 使用的是自签名证书,不被浏览器信任,所以 SakuraFrp 要选 tcp 类型而不是 http(s) 类型,Cloudflare Tunnel 则选择 http 且开启“不校验 LTS”,这样可以避免 https 无限重定向问题。
浏览器访问穿透后网址,如果提示证书不安全且没法手动信任选项时,可以在英文输入法下手打
thisisunsafe跳过证书验证。
开发机
Vibe Coding 开发,不需要 GUI 界面,故而选择 Ubuntu 26.04 LTS 服务器版本镜像3。这个版本没有可视化界面,全是命令行,对资源的占用低。下载镜像,上传 PVE 安装启动,配置镜像源:
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设置中国时区:
# 设置北京时间
sudo timedatectl set-timezone Asia/Shanghai
# 验证,输出类似 Thu Jul 30 11:58:58 PM CST 2026 的时间与当前时间一致
date安装 QEMU Guest Agent(同时需要在关机下,在 web 面板 - 选项中,开启 QEMU Guest Agent)。这样 ip 等信息就可以在面板查看到了:
# 安装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 有一个端口映射的模块,可以把开发机上的端口映射到本地,这样就可以很便捷地在笔记本上调试网页。
代理软路由
搭建家庭的代理服务器,使用 OpenWrt 系统作为软路由,再在该系统的基础上安装各种代理插件。
前往 OpenWrt 官网4下载最新版本对应的generic-ext4-combined-efi.img.gz镜像包,打开 PVE 界面,上传解压后的img镜像。
该镜像的安装方式与其他虚拟机不一样,在创建的时候勾选“不使用任何介质”,创建完成后还需要删除默认创建的 scsi0 磁盘。
网络用VirtIO,网卡用vmbr0,跟虚拟机同网段。
OpenWrt 系统对系统的占用也不大,配置分配可以适当调小,当遇到瓶颈再调大。
打开 PVE 的 Shell 终端(不是 OpenWrt 的),导入镜像:
# 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 地址:
vi /etc/config/network找到config interface 'lan',修改:
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'保存后重启网络:
/etc/init.d/network restart再安装 QEMU Guest Agent 可以更好地管理:
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。
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! 的信息,就说明安装成功了:
docker run hello-world默认情况下,docker 命令需要 sudo 权限。如果有非root用户,为了避免每次输入 sudo,可以将当前用户加入 docker 用户组。
# 创建 docker 用户组(通常已存在)
groupadd docker
# 将当前用户加入 docker 组
usermod -aG docker $USERDocker 安装成功后,就可以安装各种的云服务进行部署了,比如 反向代理Caddy、可用性监控Uptime Kuma、密码管理服务Vaultwarden、监控系统Prometheus。
鉴于一些神奇力量,Docker 在大陆是没法访问的,因而需要做一些额外的配置以拉取镜像。这里有几个方法:
一、为 Docker 守护进程(Daemon)配置代理
创建配置目录,创建并编辑代理配置文件:
mkdir -p /etc/systemd/system/docker.service.d
nano /etc/systemd/system/docker.service.d/http-proxy.conf输入以下内容并保存:
[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"
重启并验证配置是否生效:
systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker # 或者在拉取镜像时观察是否通过代理成功连接。二、把 LXC 网关设置成上一步配置的 OpenWrt
把 Docker LXC 的网关修改成上一步搭建的代理软路由IP,通过 OpenWrt 中安装的插件完成透明代理(IP 需要改成之前 OpenWrt 的静态 IP)。
三、替换成国内镜像
可以使用“毫秒镜像”“轩辕镜像”这一类国内镜像,但是免费用户会被限速,实测限速很严重。
对应官网都会有一键配置脚本,直接粘贴到终端运行即可。
总结
目前我的 PVE 只有四个 VM / LXC ,后续可以根据服务的增多,把 Docker 容器按职能再次拆分成几个 Docker LXC。
总结所有的网络与设备拓扑结构示例如下:
渲染中...
Footnotes
基于 PVE 搭建 All In One 家庭云服务
https://www.zyaer.com/posts/all-in-one-home-cloud-service-based-on-pve