pages.chenos.dev / workstation / 开发环境与模板

手把手:开发环境与 agent 模板

在 agent-01 里装好开发工具、Claude Code 和通用配置,配好 SSH 免密登录,再做成模板。以后新开 agent 只需要克隆,然后做几步个性化设置。

一键脚本:本页的步骤已经做成脚本 agent-template.sh,三个子命令:install(在模板源虚拟机里装好全部工具和全局代理,含 Claude Code、Codex CLI、OpenCode、T3 Code)、cleanup(转换成模板前清理身份和凭证)、init 主机名(每台克隆机改名、登录 Claude/Codex/OpenCode/GitHub、装 T3 后台服务)。下载:curl -fsSL https://pages.chenos.dev/workstation/scripts/agent-template.sh -o ~/agent-template.sh。完整用法见 手把手:用 agent-template.sh。

整体流程

agent-01:装工具 → 装 Claude Code 和通用配置 → 配好 SSH 免密 →(可选)共享文件夹、预装源码
   │
   │ 关机,完整克隆一份
   ▼
9000 tpl-agent:清理身份信息 → 转换成模板
   │
   │ 克隆
   ▼
agent-02、agent-03 …:改主机名 → 绑定 IP → 登录 Claude → 配 GitHub 凭证 → 开始干活
放进模板不放进模板(每台单独做)
开发工具、Node、Docker、Claude Code 程序本身Claude Code 登录
CLAUDE.md、settings.json、skills 等通用配置GitHub 凭证、私钥
代理设置、镜像源、时区主机名、IP 绑定
你电脑的 SSH 公钥(authorized_keys)T3 Code 配对
共享文件夹挂载、软链接、公开仓库的源码私有仓库的凭证
做法上是从 agent-01 克隆一份出来做模板,agent-01 本身保持原样继续用。

第一部分:装开发工具

SSH 登录 agent-01 执行。下面多处用 sudo -E,作用是把代理环境变量一起带进 sudo。

1.1基础工具

sudo apt update
sudo apt install -y git build-essential tmux htop unzip jq gh libatomic1   # libatomic1:T3 Code 运行需要

gh 是 GitHub 命令行工具,克隆后用来登录 GitHub。

1.2Node.js 24 LTS 和 pnpm

curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs
sudo corepack enable                   # 启用 pnpm 和 yarn
node -v && pnpm -v

1.3Docker(项目里要用数据库之类的服务才需要)

curl -fsSL https://get.docker.com | sudo -E sh
sudo usermod -aG docker $USER          # 以后用 docker 不用加 sudo,重新登录后生效

装好后一定要给 Docker 配代理,否则拉不了镜像。见 搭建教程 4.3 ②。配完后测试:

docker run --rm hello-world            # 重新登录后执行,能看到 Hello from Docker! 就说明正常

第二部分:装 Claude Code,搬通用配置

2.1安装,但不登录

curl -fsSL https://claude.ai/install.sh | bash
claude --version
不要在这里登录。登录要等克隆出来之后,每台机器单独登录。用其他 agent 工具也一样:先装好,不登录。

2.2把原来那台机器上的通用配置搬过来

只搬“规则和习惯”,不搬登录信息和历史记录:

~/.claude 里的内容搬不搬
CLAUDE.md(全局规则,比如 pages 文档放在哪里)✅ 搬
settings.json(主题、权限等设置)✅ 搬,搬完检查一遍里面有没有原来机器的路径
skills/、agents/、commands/(如果有)✅ 搬
.credentials.json、.claude.json❌ 不搬,这是登录信息
projects/、sessions/、history.jsonl、file-history/❌ 不搬,这是原来机器上的会话记录和记忆,里面的路径也对不上
cache/、telemetry/、plugins/ 等❌ 不搬,新机器上会自动生成;插件在新机器上重新安装

在原来那台机器上执行(agent-01 是你在 ~/.ssh/config 里配的别名,见第三部分;还没配的话先写成 dev@agent-01的IP):

cd ~/.claude
rsync -av CLAUDE.md settings.json agent-01:~/.claude/
for d in skills agents commands; do [ -d "$d" ] && rsync -av "$d" agent-01:~/.claude/; done

2.3修正配置里的路径

原来机器上的用户名和新虚拟机里的不一样(比如 chenos 和 dev),配置里写死的绝对路径要改过来。在 agent-01 里:

grep -rn '/home/' ~/.claude/CLAUDE.md ~/.claude/settings.json ~/.claude/skills 2>/dev/null   # 先看看有哪些
sed -i "s|/home/chenos/|/home/$USER/|g" ~/.claude/CLAUDE.md ~/.claude/settings.json            # 把 chenos 换成原来的用户名
pages 文档的规则也要顺便看一下:新工作站上网页由 web 容器提供(见 共享文件夹与 pages),agent 只需要把文件写进 ~/NocoBase/pages/,不用再管 Caddy。可以把多个 agent 写文档的规则一起加进 CLAUDE.md。

2.4T3 Code 命令行工具(如果要用)

sudo apt install -y libatomic1      # 缺它会报 libatomic.so.1: cannot open shared object file
curl -fsSL https://t3.codes/install.sh | sh

同样只装不配对。用法见 T3 Code 教程。

第三部分:在你的电脑上配置 SSH 免密登录和 Remote-SSH

这一部分在你自己的电脑上做。要在做模板之前完成:你电脑的公钥会跟着模板进入每一台克隆机,以后连哪台都不用输密码。

3.1生成密钥(已经有的话跳过)

macOS、Linux 用终端,Windows 用 PowerShell:

ssh-keygen -t ed25519          # 一路按回车

3.2把公钥放到 agent-01 上

macOS 或 Linux:

ssh-copy-id dev@192.168.50.111

Windows PowerShell:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh dev@192.168.50.111 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

再执行 ssh dev@192.168.50.111,不用输密码就能登录,说明成功了。

3.3给每台虚拟机起个短名字

编辑你电脑上的 ~/.ssh/config(Windows 是 C:\Users\你的用户名\.ssh\config):

Host agent-01
  HostName 192.168.50.111
  User dev

Host agent-02
  HostName 192.168.50.112
  User dev

之后直接 ssh agent-01 就能连上。以后每新开一台 agent,在这里加一段。

3.4VS Code Remote-SSH

  1. VS Code 左侧点 扩展 → 搜索 Remote - SSH(作者是 Microsoft)→ 安装
  2. 按 F1 → Remote-SSH: Connect to Host → 选 agent-01
  3. 第一次连接时,VS Code 会自动在虚拟机里装好服务端组件(会走虚拟机里配好的代理)
  4. 连上后 打开文件夹,选虚拟机里的项目目录

虚拟机这边不需要装任何东西,只要装 Ubuntu 时勾选了 OpenSSH server 就行。

3.5(推荐)禁止用密码登录 SSH

确认免密登录可以用之后,在 agent-01 里关掉密码登录,更安全。这个设置也会跟着进入模板:

echo 'PasswordAuthentication no' | sudo tee /etc/ssh/sshd_config.d/10-no-password.conf
sudo systemctl restart ssh
执行前务必确认免密登录已经可以用,否则会把自己关在门外。真关在门外了,也还能从 PVE 网页的 控制台 进去改回来。

第四部分:可选的预装内容

4.1共享文件夹

如果打算让所有虚拟机共用一个文件夹(推荐,pages 文档就放在里面),现在就按 共享文件夹教程第一部分做好:宿主机建目录、在 PVE 里登记、给 agent-01 加 Virtiofs 设备、写进 fstab、建软链接。这样克隆出来的虚拟机就都自带了。

4.2预装源码和依赖

代码量大的项目,在模板里先 clone 好、装好依赖,克隆出来的虚拟机只需要增量更新:

mkdir -p ~/NocoBase && cd ~/NocoBase
git clone https://github.com/nocobase/nocobase.git nocobase3    # 换成你实际用的仓库地址和分支
cd nocobase3 && pnpm install
私有仓库先不要在模板里 clone。clone 私有仓库需要凭证,凭证很容易残留在 .git/config 或者凭证缓存里,跟着模板复制到每一台机器。等克隆出来、每台单独登录 GitHub 之后再 clone。

4.3tmux 小配置

cat > ~/.tmux.conf <<'EOF'
set -g mouse on              # 可以用鼠标滚动、切换窗格
set -g history-limit 50000   # 保留更多的输出历史,方便回看 agent 的输出
EOF

第五部分:清理并转换成模板

5.1从 agent-01 克隆一份出来

  1. 先给 agent-01 拍一个快照,名称填 tools-ready
  2. 在 agent-01 里执行 sudo poweroff 关机
  3. 在 PVE 里右键 agent-01 → 克隆:VM ID 填 9000,名称填 tpl-agent,模式选 完整克隆
  4. 克隆完成后,只启动 9000,agent-01 先保持关机
这时 9000 和 agent-01 的身份信息完全一样,会拿到同一个 IP。所以清理完成之前,两台不能同时开机。

5.2清理身份信息

9000 用的是和 agent-01 相同的 IP,用 ssh agent-01 就能连上它。登录后执行:

# 1. 让每台克隆机开机时自动生成自己的 SSH 主机密钥
sudo mkdir -p /etc/systemd/system/ssh.service.d
sudo tee /etc/systemd/system/ssh.service.d/regen-keys.conf <<'EOF'
[Service]
ExecStartPre=
ExecStartPre=/usr/bin/ssh-keygen -A
ExecStartPre=/usr/sbin/sshd -t
EOF

# 2. 删掉现有的 SSH 主机密钥
sudo rm -f /etc/ssh/ssh_host_*

# 3. 清空 machine-id,克隆机开机时会自动生成新的(否则几台机器会拿到同一个 IP)
sudo truncate -s 0 /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id
sudo ln -s /etc/machine-id /var/lib/dbus/machine-id

# 4. 确认没有残留的登录信息(正常情况下这些都不存在)
ls ~/.claude/.credentials.json ~/.config/gh ~/.git-credentials ~/.ssh/id_* 2>/dev/null

# 5. 清理软件包缓存和命令历史,关机
sudo apt clean
rm -f ~/.bash_history && history -c
sudo poweroff

第 4 步如果列出了文件,说明有登录信息残留,先删掉再继续。

5.3转换成模板

  1. 在 PVE 里右键 9000 (tpl-agent) → 转换成模板
  2. 重新启动 agent-01,它继续正常使用
模板不能直接开机使用,只能用来克隆。

第六部分:克隆新的 agent

6.1克隆并开机

  1. 右键模板 tpl-agent → 克隆
  2. VM ID:202;名称:agent-02;模式:完整克隆。克隆出来的机器和模板完全独立,local-lvm 按实际使用量占空间,也不会浪费太多
  3. 启动,在 概要 页面看它分到的 IP

6.2改主机名,绑定 IP

ssh dev@<新机器的IP>
sudo hostnamectl set-hostname agent-02
sudo sed -i 's/agent-01/agent-02/g' /etc/hosts

6.3登录 Claude Code

claude auth login

6.4配置 Git 身份和 GitHub 凭证

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

GitHub 凭证有两种做法:

做法怎么做适合
每台一个细粒度 token(推荐)GitHub → Settings → Developer settings → Fine-grained tokens → 只勾选这台 agent 要用的仓库,权限给 Contents 和 Pull requests 读写,设一个过期时间。然后执行 gh auth login --with-token,粘贴 tokenagent 权限最小;哪台出问题,单独撤销它的 token 就行
直接登录你的账号gh auth login,选 GitHub.com → HTTPS → 用浏览器登录省事,但这台 agent 能访问你的所有仓库

任选一种之后,执行下面这条,让 git 也用这个凭证:

gh auth setup-git

6.5拉代码,开始干活

cd ~/NocoBase/nocobase3 && git pull && pnpm install     # 模板里预装过的项目
cd ~/NocoBase && git clone https://github.com/xxx/私有仓库.git   # 私有仓库现在 clone

要用 T3 Code 的话,再按 T3 Code 教程连接。

第七部分:日常使用 tmux

agent 跑在 tmux 里,断开 SSH、关掉 VS Code、电脑合盖都不会中断。

tmux new -s work        # 新建一个会话,在里面启动 agent
# 按 Ctrl+B,再按 D:暂时离开这个会话,agent 在后台继续跑
tmux attach -t work     # 下次登录后回到这个会话
tmux ls                 # 看看有哪些会话
你的电脑 VS Code ──Remote-SSH──▶ agent-01
                                 ├── 编辑代码、看文件改动(VS Code 窗口)
                                 └── VS Code 的终端里 tmux attach,查看 agent 的进度

在外面或者用手机连,见 Tailscale 教程。

第八部分:更新模板

模板本身不能开机,没法直接更新。做法是克隆一台出来,更新完再做成新模板:

  1. 从 tpl-agent 完整克隆一台,比如 ID 9001
  2. 开机,更新软件、装新工具:sudo apt update && sudo apt full-upgrade -y、claude update 等
  3. 重新执行一遍 5.2 的清理,关机
  4. 转换成模板,命名为 tpl-agent-v2
  5. 以后从新模板克隆;确认没问题后,旧模板可以删掉
克隆出来的虚拟机可以在 硬件 页面里单独调整 CPU、内存,或者扩大硬盘,不影响模板。