pages.chenos.dev / workstation / 手把手搭建

手把手:PVE 上搭建代理容器和 Ubuntu agent 虚拟机

在已经装好 PVE 的机器上,从零创建 LXC 容器、安装 mihomo 作为共享代理,再装一台 Ubuntu 虚拟机并让它走代理。

2026-10-06前置:PVE 已安装并换好更新源,见 安装 PVE

0. 先规划好 IP

后文都用下面这组地址举例,换成你自己家的网段。网段怎么选、换了网段哪些地方要跟着改,见 规划网段和 IP。

设备IP
路由器(网关)192.168.50.1
PVE 宿主机192.168.50.205
代理容器 proxy(LXC)192.168.50.101
笔记本(装了 Clash Verge)192.168.50.59
Ubuntu 虚拟机 agent-01由路由器自动分配(DHCP)

第一部分:创建 LXC 容器

1.1下载 Debian 模板

网页上的“模板”下载走的是国外官方服务器,实际很慢、两次都失败了。推荐直接在 PVE 的 Shell 里从中科大镜像下载(几十秒):

cd /var/lib/vz/template/cache
F=$(curl -s https://mirrors.ustc.edu.cn/proxmox/images/system/ | grep -o 'debian-13-standard[^"<]*\.tar\.zst' | sort -uV | tail -1)
echo "要下载:$F"          # 2026-10 时是 debian-13-standard_13.6-1_amd64.tar.zst
wget https://mirrors.ustc.edu.cn/proxmox/images/system/$F

下载完,在 local (pve) → CT 模板 里刷新就能看到。

想让网页上的 CT 模板 → 模板 下载也走国内镜像,可以执行下面的命令(PVE 升级后可能被还原,到时再执行一次)。正在下载的慢任务,在底部任务列表里双击 → 停止:

sed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
systemctl restart pvedaemon && pveam update

1.2创建容器

点右上角的 创建 CT,按标签页逐个填写:

标签页填什么
常规CT ID:101;主机名:proxy;保持勾选“无特权的容器”;勾选“嵌套”(Debian 13 的 systemd 需要,否则部分服务可能起不来);设置 root 密码
模板存储:local;模板:刚下载的 debian-13-standard
磁盘存储:local-lvm;大小:4 GiB
CPU核心:1
内存内存:512 MiB;Swap:512 MiB
网络桥接:vmbr0;IPv4 选“静态”;IPv4/CIDR:192.168.50.101/24;网关:192.168.50.1;IPv6 留空
DNS留空,沿用宿主机的设置
确认勾选 创建后启动,点 完成

“确认”页可以核对一下:应该看到 features nesting=1,以及 net0 … ip=192.168.50.101/24,gw=192.168.50.1。别忘了勾选左下角的“创建后启动”。

创建好后,在左侧选中 101 (proxy) → 选项 → 双击 开机自动启动,改成“是”。

1.3进入容器做基础设置

选中 101 (proxy) → 控制台。用户名填 root,密码是刚才设置的。登录后执行:

# 换成中科大镜像源(容器里先用 http,避免证书问题)
sed -i 's|http://deb.debian.org|http://mirrors.ustc.edu.cn|g; s|http://security.debian.org|http://mirrors.ustc.edu.cn|g' \
  /etc/apt/sources.list /etc/apt/sources.list.d/*.sources 2>/dev/null

# 设成北京时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 安装需要用到的工具
apt update && apt install -y curl ca-certificates unzip

# 确认容器能上网:显示 3 received 就对了
ping -c 3 223.5.5.5

网页控制台里粘贴:右键菜单粘贴,或者 Mac 上 Cmd+V。

第二部分:安装 mihomo

2.1下载 mihomo、IP 数据库和网页面板

这些文件都放在 GitHub 上,国内直接下载通常很慢甚至失败。有三种方式,实际用的是方式一。

方式一(推荐,实测可用):一键脚本,走 GitHub 加速代理

脚本会依次尝试几个 GitHub 加速地址(实测 ghfast.top 可用),IP 数据库优先走 jsDelivr CDN,每个文件下载完都会检查是否完整。在容器控制台里整段粘贴:

cat > /root/install-mihomo.sh <<'EOF'
#!/bin/bash
# 通过 GitHub 加速代理安装 mihomo、IP 数据库和网页面板
set -u
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
apt-get install -y curl unzip gzip ca-certificates >/dev/null

# 依次尝试这些加速前缀(失效了可以自己加新的);最后的 "" 表示直连 GitHub
PROXIES=("https://ghfast.top/" "https://gh-proxy.com/" "https://ghproxy.net/" "")

dl() { curl -fL --retry 3 --connect-timeout 15 -o "$2" "$1"; }

echo "===== 1. 寻找可用的加速地址 ====="
GH=""; VER=""
for p in "${PROXIES[@]}"; do
  echo "尝试:${p:-直连 GitHub}"
  v=$(curl -fsSL --max-time 15 "${p}https://github.com/MetaCubeX/mihomo/releases/latest/download/version.txt" 2>/dev/null | tr -d '[:space:]')
  if [[ "$v" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    GH="$p"; VER="$v"; echo "  ✓ 可用,mihomo 最新版本:$VER"; break
  fi
  echo "  ✗ 不可用"
done
[ -z "$VER" ] && { echo "所有加速地址都不可用,请改用方式三(Mac 下载后传进容器)"; exit 1; }

echo "===== 2. 下载并安装 mihomo ====="
cd /tmp
F="mihomo-linux-amd64-$VER.gz"
if ! dl "${GH}https://github.com/MetaCubeX/mihomo/releases/download/$VER/$F" "$F" || ! gzip -t "$F"; then
  echo "✗ mihomo 下载失败或文件损坏"; exit 1
fi
gunzip -f "$F"
install -m 755 "mihomo-linux-amd64-$VER" /usr/local/bin/mihomo
/usr/local/bin/mihomo -v | head -1 || { echo "✗ mihomo 无法运行"; exit 1; }

echo "===== 3. 下载 IP 数据库(优先用 jsDelivr)====="
mkdir -p /etc/mihomo
get_geo() {   # get_geo <远端文件名> <本地文件名>
  local out="/etc/mihomo/$2"
  for url in "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/$1" \
             "${GH}https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/$1"; do
    if dl "$url" "$out" 2>/dev/null && [ "$(stat -c%s "$out")" -gt 100000 ]; then
      echo "  ✓ $2($(du -h "$out" | cut -f1))"; return 0
    fi
  done
  echo "  ✗ $2 下载失败"; return 1
}
get_geo country.mmdb Country.mmdb || exit 1
get_geo geoip.metadb geoip.metadb  || exit 1

echo "===== 4. 下载网页面板 ====="
if ! dl "${GH}https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip" /tmp/ui.zip || ! unzip -tq /tmp/ui.zip >/dev/null; then
  echo "✗ 网页面板下载失败或文件损坏"; exit 1
fi
rm -rf /etc/mihomo/ui /tmp/metacubexd-gh-pages
unzip -q /tmp/ui.zip -d /tmp && mv /tmp/metacubexd-gh-pages /etc/mihomo/ui
echo "  ✓ 网页面板已放到 /etc/mihomo/ui"

echo
echo "===== 全部完成 ====="
mihomo -v | head -1
ls -lh /etc/mihomo
EOF

bash /root/install-mihomo.sh

实测输出(2026-10-07):mihomo v1.19.32,Country.mmdb 7.4M,geoip.metadb 8.1M,网页面板放到 /etc/mihomo/ui。脚本可以重复运行,以后升级 mihomo 也再跑一次。

加速网站是第三方的,域名经常变、可能失效,理论上也能篡改下载的文件。全部失效时,在网上搜一个新的“GitHub 加速”地址加进 PROXIES,或者改用方式三。

方式二:临时借用笔记本上 Clash Verge 的代理

  1. 在笔记本的 Clash Verge 里打开 设置 → 局域网连接(也叫 Allow LAN)
  2. 记下 端口号:Clash Verge Rev 默认是 7897,老版本是 7890
  3. 如果是 Windows 笔记本,系统防火墙弹出提示时要点 允许

然后在容器控制台里执行:

# 临时通过笔记本的代理上网(IP 和端口换成你自己的)
export http_proxy=http://192.168.50.59:7897 https_proxy=http://192.168.50.59:7897
curl -sI https://github.com | head -1      # 先测试:显示 200 再继续;502 就在 Clash Verge 里换个节点

# 1. 下载 mihomo 程序(自动获取最新版本号)
cd /tmp
VER=$(curl -sL https://github.com/MetaCubeX/mihomo/releases/latest/download/version.txt)
echo "最新版本:$VER"
curl -LO https://github.com/MetaCubeX/mihomo/releases/download/$VER/mihomo-linux-amd64-$VER.gz
gunzip mihomo-linux-amd64-$VER.gz
install -m 755 mihomo-linux-amd64-$VER /usr/local/bin/mihomo
mihomo -v      # 能显示版本号就说明装好了

# 2. 下载 IP 数据库(用来判断哪些是国内网站、可以直连)
mkdir -p /etc/mihomo
curl -L -o /etc/mihomo/Country.mmdb https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country.mmdb
curl -L -o /etc/mihomo/geoip.metadb https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb

# 3. 下载网页面板
curl -L -o /tmp/ui.zip https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip
unzip -q /tmp/ui.zip -d /tmp && mv /tmp/metacubexd-gh-pages /etc/mihomo/ui

# 下载完毕,取消临时代理
unset http_proxy https_proxy

下载完成后,笔记本的“局域网连接”可以关掉,以后不再需要它。

方式三:在 Mac 上下载,再传进容器(最可靠)

在 Mac 浏览器里下载这 4 个文件:GitHub Releases 里的 mihomo-linux-amd64-v1.x.x.gz(注意是 linux-amd64)、country.mmdb、geoip.metadb、metacubexd 的 gh-pages.zip,然后:

# Mac 终端:传到 PVE 宿主机
cd ~/Downloads
scp mihomo-linux-amd64-*.gz country.mmdb geoip.metadb metacubexd-gh-pages.zip root@192.168.50.205:/root/

# PVE 宿主机的 Shell:推进容器
for f in /root/mihomo-linux-amd64-*.gz /root/country.mmdb /root/geoip.metadb /root/metacubexd-gh-pages.zip; do
  pct push 101 "$f" "/root/$(basename $f)"
done

# 容器控制台:安装
cd /root
gunzip mihomo-linux-amd64-*.gz && install -m 755 mihomo-linux-amd64-v* /usr/local/bin/mihomo
mkdir -p /etc/mihomo
mv country.mmdb /etc/mihomo/Country.mmdb && mv geoip.metadb /etc/mihomo/
unzip -q metacubexd-gh-pages.zip -d /tmp && mv /tmp/metacubexd-gh-pages /etc/mihomo/ui

2.2写配置文件

只需要改前两行:PASS 是网页面板的登录密码,自己随便定;SUB 是机场的订阅链接(Clash Verge → 订阅 → 右键 → 编辑信息里能看到)。然后整段粘贴:

PASS='改成你的面板密码'
SUB='你的订阅链接'

cat > /etc/mihomo/config.yaml <<EOF
mixed-port: 7890
allow-lan: true
bind-address: "*"
mode: rule
log-level: info

external-controller: 0.0.0.0:9090
secret: "${PASS}"
external-ui: ui

profile:
  store-selected: true       # 记住你选的节点,重启后不会丢

proxy-providers:
  airport:
    type: http
    url: "${SUB}"
    interval: 3600
    path: ./providers/airport.yaml
    health-check:
      enable: true
      url: https://www.gstatic.com/generate_204
      interval: 300

proxy-groups:
  - name: PROXY
    type: select
    use: [airport]

rules:
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY
EOF

mihomo -t -d /etc/mihomo

最后一行显示 configuration file ... test is successful 就是正确的。

订阅链接相当于代理账号的密码:里面带着节点地址和密钥,不要发到群里,也不要写进 pages 等公开的地方。担心泄露就去机场后台重置订阅,再换上新链接。

2.3设置成开机自启的系统服务

cat > /etc/systemd/system/mihomo.service <<'EOF'
[Unit]
Description=mihomo
After=network-online.target

[Service]
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now mihomo
systemctl status mihomo --no-pager | head -3   # 看到 active (running) 就说明启动成功了
ls -lh /etc/mihomo/providers/                  # 能看到 airport.yaml,说明订阅拉取成功

如果没有启动成功,或者没有 airport.yaml,用 journalctl -u mihomo -n 50 --no-pager 查看日志。

2.4在网页面板里选节点

  1. 在笔记本浏览器里打开 http://192.168.50.101:9090/ui
  2. 第一次打开会要求填写后端地址:填 http://192.168.50.101:9090,密钥填配置里设置的 secret
  3. 进入 代理 页面 → 找到 PROXY 组 → 点一个真实的节点
注意:很多机场的订阅里,第一个“节点”其实是“剩余流量”“到期时间”这类提示信息,选它是连不上的。

2.5测试代理能不能用

回到容器控制台执行:

curl -x http://127.0.0.1:7890 -s -o /dev/null -w "%{http_code}\n" https://www.google.com
# 输出 200 就说明代理可以用了
curl -x http://127.0.0.1:7890 -s https://ipinfo.io     # 出口 IP:应该是节点所在的国外 IP

在 Mac 上做一次完整测试(用 -x 指定走工作站上的代理,不受 Mac 上 Clash Verge 的影响):

P=http://192.168.50.101:7890
nc -vz -G 3 192.168.50.101 7890                                         # 1. 端口能连上:succeeded
curl -x $P -s -o /dev/null -w "Google: HTTP %{http_code}\n" https://www.google.com      # 2. 200
curl -x $P -s https://ipinfo.io | grep -E '"(ip|city|country|org)"'     # 3. 国外 IP
curl --socks5-hostname 192.168.50.101:7890 -s https://ipinfo.io/ip; echo  # 4. SOCKS5 同一端口
curl -x $P -s -o /dev/null -w "Claude API: HTTP %{http_code}\n" https://api.anthropic.com  # 5. 有状态码(如 404)即连通
curl -x $P -s -o /dev/null -w "%{speed_download}" "https://speed.cloudflare.com/__down?bytes=50000000" \
  | awk '{printf "下载速度: %.1f MB/s\n", $1/1024/1024}'                 # 6. 速度
实测(2026-10-07):从 Mac 测试全部通过,proxy 容器完成。

第三部分:安装 Ubuntu 虚拟机

3.1下载 Ubuntu 镜像

在 PVE 宿主机的 Shell 里直接下载到 ISO 目录:

cd /var/lib/vz/template/iso
F=$(curl -s https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/24.04/ | grep -o 'ubuntu-24\.04\.[0-9]*-live-server-amd64\.iso' | sort -u | tail -1)
echo "要下载:$F"          # 2026-10 时是 ubuntu-24.04.5-live-server-amd64.iso
for M in https://mirrors.tuna.tsinghua.edu.cn https://mirrors.aliyun.com https://mirror.nju.edu.cn https://repo.huaweicloud.com; do
  echo "===== 尝试 $M ====="
  if wget -c "$M/ubuntu-releases/24.04/$F"; then
    wget -qO- "$M/ubuntu-releases/24.04/SHA256SUMS" | grep " \*\?$F\$" | sha256sum -c && break
  fi
done
ls -lh $F                 # 约 3.1G
实际踩过的坑:中科大镜像下载 Ubuntu ISO 返回 403 Forbidden(它对 ISO 大文件有访问限制;apt 软件源不受影响)。上面的命令会依次尝试清华、阿里云、南京大学、华为云,下载完自动校验 SHA256,看到 OK 才算成功。
2026 年 4 月发布的 26.04 LTS 也可以用。24.04 更成熟,各种软件的兼容性更好。

3.2创建虚拟机

点右上角的 创建虚拟机,按标签页逐个填写:

标签页填什么
常规VM ID:200;名称:agent-01
操作系统ISO 镜像:选刚下载的 Ubuntu;类型保持 Linux
系统保持默认,勾选 QEMU Agent
磁盘存储:local-lvm(如果加了 4T 数据盘就选 data4t);大小:128 GiB;勾选 Discard 和 SSD 仿真。按实际用量占空间,NocoBase 源码、node_modules 加 Docker 镜像,64G 很快就不够
CPU核心:4;类别:host(很重要,性能会好很多)
内存16384 MiB(agent-01 负责全量构建和完整测试;以后克隆的日常 agent 用 8192 即可)
网络桥接:vmbr0;模型:VirtIO
确认勾选 创建后启动,点 完成

3.3安装 Ubuntu Server

选中 200 (agent-01) → 控制台,按安装程序的提示一步步操作。键盘用方向键和回车:

  1. Language:选 English(服务器版安装界面的中文显示容易出问题)
  2. Keyboard:English (US)
  3. Type:Ubuntu Server
  4. Network:保持默认的 DHCP 自动获取,记下屏幕上显示的 IP
  5. Proxy:填 http://192.168.50.101:7890(proxy 容器)。安装程序会把它写进新系统的 apt 配置,以后 sudo apt 也自动走代理
  6. Mirror:agent 虚拟机不用国内镜像,改成官方源 http://archive.ubuntu.com/ubuntu(安装程序可能按地区自动填成 cn.archive.ubuntu.com,要改掉)。等出现 This mirror location passed tests 再继续
  7. Storage:选“Use an entire disk”,然后取消勾选“Set up this disk as an LVM group”。不取消的话,Ubuntu 默认只会用一半的磁盘空间
  8. Profile:
    • Your name:随便填
    • Server name:agent-01
    • Username:比如 dev
    • 设置密码
  9. Ubuntu Pro:选 Skip
  10. SSH:✅ 勾选 Install OpenSSH server
  11. Featured snaps:全部不选,直接 Done
  12. 等待安装完成,选 Reboot Now。如果提示移除安装介质,直接按回车

装完后再到 PVE 里:200 → 硬件 → CD/DVD 驱动器 → 编辑 → 选“不使用任何介质”。

3.4第一次登录和基础设置

在笔记本终端里 SSH 登录(IP 用安装时记下的那个):

ssh dev@192.168.50.xxx

登录后执行:

# 安装 QEMU Agent,装好后 PVE 网页上就能直接看到这台虚拟机的 IP
sudo apt update && sudo apt install -y qemu-guest-agent
sudo systemctl start qemu-guest-agent

# 设成北京时间
sudo timedatectl set-timezone America/New_York     # agent 虚拟机用纽约时区(和美国出口 IP 一致)

# 更新系统
sudo apt full-upgrade -y
建议同时在路由器里把这台虚拟机的 IP 绑定成固定地址(DHCP 静态分配),以后 SSH 登录不用每次查 IP。

第四部分:让虚拟机走代理

4.1设置全局代理环境变量

sudo tee -a /etc/environment <<'EOF'
http_proxy=http://192.168.50.101:7890
https_proxy=http://192.168.50.101:7890
HTTP_PROXY=http://192.168.50.101:7890
HTTPS_PROXY=http://192.168.50.101:7890
no_proxy=localhost,127.0.0.1,192.168.0.0/16,.lan
NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,.lan
EOF

退出 SSH 再重新登录,设置才会生效。

如果家里网段是 10.x.x.x,要把 10.0.0.0/8 也加进 no_proxy 和 NO_PROXY,否则访问内网也会绕到代理。

4.1+完整的全局代理(推荐,实际用的是这个)

4.1 只覆盖登录后的命令行程序。下面这个脚本让所有程序都走代理:登录会话、sudo、apt、systemd 后台服务(Docker、T3 Code 服务端等)、SSH 方式的 GitHub、snap,并顺便把时区设为纽约。可以重复执行,不会产生重复配置:

P=http://192.168.50.101:7890
NP=localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,.lan

# 0. 时区:纽约(自动处理夏令时 EDT / 冬令时 EST)
sudo timedatectl set-timezone America/New_York

# 1. 登录会话:curl、git、npm、pnpm、Claude Code 等(先删掉旧的代理行,避免重复)
sudo sed -i '/_proxy=/Id;/^NODE_USE_ENV_PROXY=/d' /etc/environment
sudo tee -a /etc/environment >/dev/null <<EOT
http_proxy=$P
https_proxy=$P
all_proxy=$P
HTTP_PROXY=$P
HTTPS_PROXY=$P
ALL_PROXY=$P
no_proxy=$NP
NO_PROXY=$NP
NODE_USE_ENV_PROXY=1
EOT

# 2. apt
sudo tee /etc/apt/apt.conf.d/95proxy >/dev/null <<EOT
Acquire::http::Proxy "$P";
Acquire::https::Proxy "$P";
EOT

# 3. sudo 执行的命令也保留代理变量
echo 'Defaults env_keep += "http_proxy https_proxy all_proxy no_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY NODE_USE_ENV_PROXY"' \
  | sudo tee /etc/sudoers.d/proxy >/dev/null
sudo chmod 440 /etc/sudoers.d/proxy
sudo visudo -c

# 4. 所有后台服务(systemd 系统服务,比如 Docker)和用户服务(比如 T3 Code)
for d in system user; do
  sudo mkdir -p /etc/systemd/$d.conf.d
  sudo tee /etc/systemd/$d.conf.d/proxy.conf >/dev/null <<EOT
[Manager]
DefaultEnvironment="http_proxy=$P" "https_proxy=$P" "HTTP_PROXY=$P" "HTTPS_PROXY=$P" "no_proxy=$NP" "NO_PROXY=$NP" "NODE_USE_ENV_PROXY=1"
EOT
done
sudo systemctl daemon-reexec

# 5. 用 SSH 方式访问 GitHub(git@github.com:...)
sudo apt-get install -y netcat-openbsd >/dev/null
mkdir -p ~/.ssh
grep -q 'ProxyCommand nc' ~/.ssh/config 2>/dev/null || cat >> ~/.ssh/config <<EOT
Host github.com
  ProxyCommand nc -X connect -x 192.168.50.101:7890 %h %p
EOT

# 6. snap 商店
sudo snap set system proxy.http="$P" proxy.https="$P"

echo "完成。请退出 SSH 再重新登录,让设置生效。"
退出 SSH 重新登录后,用 date 看时区(显示 EDT 或 EST),sudo curl -s https://ipinfo.io/ip 看 sudo 下也走代理,systemctl show-environment 看后台服务的代理变量。Docker 容器内部运行时的代理是另一回事,装 Docker 时再配。

4.2检查是否生效

echo $https_proxy                                                    # 应该显示 http://192.168.50.101:7890
curl -s -o /dev/null -w "%{http_code}\n" https://www.google.com          # 输出 200
curl -s -o /dev/null -w "%{http_code}\n" https://api.anthropic.com       # 有状态码输出(比如 404)就说明能连上
curl -s https://ipinfo.io                                            # 显示的应该是代理节点所在的地区

4.3需要单独配置的几种情况

① 用 SSH 方式操作 GitHub(地址是 git@github.com:... 这种)

https:// 开头的 Git 地址会自动走代理,SSH 方式不会。需要额外配置:

sudo apt install -y netcat-openbsd
mkdir -p ~/.ssh && cat >> ~/.ssh/config <<'EOF'
Host github.com
  ProxyCommand nc -X connect -x 192.168.50.101:7890 %h %p
EOF

② Docker(装了 Docker 才需要配置)

Docker 拉镜像不读上面那些环境变量,要单独设置:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/proxy.conf <<'EOF'
[Service]
Environment="HTTP_PROXY=http://192.168.50.101:7890"
Environment="HTTPS_PROXY=http://192.168.50.101:7890"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.0.0/16"
EOF
sudo systemctl daemon-reload && sudo systemctl restart docker

③ 自己写的 Node 程序

Node 自带的 fetch 默认不读代理变量。用 Node 24 以上版本时,加一个环境变量就能让它走代理:NODE_USE_ENV_PROXY=1。

Claude Code、npm、pnpm、curl、git(https 方式)都会自动读取代理变量,不需要额外设置。

4.4拍一个快照

到这里,一个干净可用的 agent 环境就配好了。在 PVE 里:200 → 快照 → 拍摄快照,名称填 base。以后 agent 把环境搞坏了,回滚到这个快照就行。

完成后的样子

PVE(192.168.50.205)
├── 101 proxy      192.168.50.101   mihomo 正在运行 ✅  网页面板:http://192.168.50.101:9090/ui
└── 200 agent-01   DHCP 分配的 IP   全局代理已设置 ✅  快照 base ✅
下一步:装开发工具、把 agent-01 做成模板、批量克隆,见 手把手:开发环境与 agent 模板。如果打算用共享文件夹,建议先做 共享文件夹第一部分,再做模板。
想在外网(公司、手机)访问这些机器?见 手把手:用 Tailscale 从外网访问。