在 VPS 上运行我的智能体
摘要
作者概述了一种在隔离 VPS 上运行 AI 编码智能体的方法,旨在实现自主、异步工作,同时不危及本地机器的安全性。
<p><a href="https://lobste.rs/s/g3i12k/running_my_agents_vps">评论</a></p>
查看缓存全文
缓存时间: 2026/05/11 15:08
# 在 VPS 上运行我的 Agent 来源:https://crowdhailer.me/2026-05-11/running-my-agents-in-a-vps/
生成的图像:AI Agent 在 VPS 上隔离工作。
最近我一直在实验编码工具链(Claude Code, Codex, Overlay (https://github.com/CrowdHailer/overlay) 等)。我的目标是让它们完全异步运行,看看它们能独立完成多少工作。完全异步地运行工具链意味着允许它们在不向我请求确认的情况下继续执行。这种级别的自主性需要使用像 `--dangerously-skip-permissions` 这样的标志。为了安心,这意味着需要将它们与我的电脑完全隔离。
### 进一步目标
除了主要的隔离目标外,设置还应满足:
- **异步运行**,工作应在无需我输入或我的电脑开机的情况下继续。
- **完全访问电脑**,如果真正深入使用这些工具,能实现什么。
- **运行多个 Agent**,这是一个新的设计空间,运行多个 Agent 让我可以看到每个 Agent 的共通之处和新颖之处。
我的方法是将 Agent 安装在专用的 VPS 上,并通过 Git 工作流进行协作。这是我的设置。
## 设置 VPS
我从 Hetzner (https://www.hetzner.com/) 购买 VPS。他们的控制台直观,我的 SSH 密钥安装在每个新机器上,价格也很合适。
在 Hetzner 控制台购买 VPS
小型机器就足够了,因为 LLM 将在其他地方运行。这台机器只负责进行 API 调用和本地文件推送。*说实话,它也会编译代码和运行测试。* *但是 Gleam (https://gleam.run/) 和 EYG (https://github.com/CrowdHailer/eyg-lang) 工具链很快,且我的工作流是异步的,所以让编译更快对我的整体进度影响很小。*
在 VPS 上,我为每个 Agent 设置一个用户,安装一些依赖项并配置 Git。
### 安装核心依赖
首先安装 `git`、`tmux` 和 `curl`。这些依赖项让使用此设置更容易。单独的编码工具链我手动安装。我想看看每个工具链如何管理它们的安装过程。此外,在干净的 Ubuntu 机器上安装永远不应该是一个困难的过程。所有进一步的语言工具链我期望工具链按需自行安装。
### 创建 Agent 用户
每个 Agent 都有自己的用户。对于每个用户,脚本将从 root 用户复制一组允许的 SSH 密钥。这意味着我可以直接 SSH 到任何用户。我的工作流是 SSH 到单个用户并直接使用其工具链开始工作。
### 授予 sudo 访问
每个用户都有 sudo 权限,以便安装所需的内容。我想看看它们在拥有电脑完全访问权的情况下能实现什么。给予它们完全访问权并观察它们多久搞砸一次是实验的一部分。这种设置确实使得一个 Agent 可能影响另一个 Agent,但一旦它们在同一台机器上,这总是可能的。对于我的 Agent 任何行为不端的恢复过程是一样的,获取一个新的 VPS。
### 配置 Git
在仔细将我的 Agent 与工作流隔离后,我不能通过允许它们在 GitHub 上作为我行动来撤销这项工作。相反,我有一个 Bot 账户 (https://github.com/crowdhailer-bot/)。*GitHub 允许 Bot 账户但不允许 Bot 创建账户。* 我同等地不信任所有 Agent,所以它们都访问同一个 Bot 账户。在运行设置脚本之前,我复制了一个共享私钥,该密钥具有 GitHub 上 Bot 账户的 SSH 访问权。我将此密钥保存在密码管理器中,将单个密钥复制到 VPS 比每用户创建密钥并将其添加到 GitHub 更快。
### 全力投入脚本
此 VPS 旨在是可丢弃的。为了让我能快速扔掉它,设置需要简单且可复现。脚本完成上述所有操作:
```bash
#!/usr/bin/env bash
set -euo pipefail
AGENTS=("vikki" "clara" "corin" "gerry")
apt-get update -q
apt-get install -y -q git tmux curl
key_source="/tmp/ed25519"
shared_key=$(cat "$key_source")
[[ -z "$shared_key" ]] && { echo "Error: no private key provided in /tmp/ed25519"; exit 1; }
for name in "${AGENTS[@]}"; do
echo "--- Setting up agent: $name ---"
# Create user if doesn't exist
if ! id "$name" &>/dev/null; then
useradd -m -s /bin/bash "$name"
# Grant sudo for "Yolo mode" software installation
echo "$name ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/$name"
chmod 440 "/etc/sudoers.d/$name"
fi
home_dir="/home/$name"
ssh_dir="$home_dir/.ssh"
key_path="$ssh_dir/id_ed25519"
mkdir -p "$ssh_dir"
# Copy authorized keys to each user
cp /root/.ssh/authorized_keys "$ssh_dir/authorized_keys"
echo "$shared_key" > "$key_path"
# FIX: Set restrictive permissions BEFORE calling ssh-keygen
chmod 600 "$key_path"
# Generate the public key from the private
ssh-keygen -y -f "$key_path" > "${key_path}.pub"
# Add github.com to known_hosts to prevent interactive prompts
ssh-keyscan -t ed25519 github.com >> "$ssh_dir/known_hosts" 2>/dev/null
# --- Grouped Permission Updates ---
# This ensures the user owns the directory and has the right bits to
# swap out known_hosts files.
chown -R "$name:$name" "$home_dir"
chmod 700 "$ssh_dir"
chmod 600 "$ssh_dir/authorized_keys"
chmod 644 "${key_path}.pub"
chmod 644 "$ssh_dir/known_hosts"
# git commands need to be run as the correct user so that the config ends up in the users gitconfig file.
sudo -u "$name" git config --global user.name "$name"
sudo -u "$name" git config --global user.email "${name}@example.com"
done
rm -f "$key_source"
```
## 共享上下文
所有关于我如何工作的指导都保存在一个私有仓库中。每个 Bot 用户将其克隆到他们的 home 目录。这包含 `CLAUDE.md` 和 `AGENTS.md` 中的说明,关于我如何工作。例如,所有项目仓库都克隆到 `~/home/assistance/Projects` 目录。工作应频繁提交和推送。
## Git 工作流
现在,Agent 在他们自己的机器上工作并推送到他们自己的 GitHub 账户。给它们一个 GitHub 账户意味着我可以使用 Fork 和分支进行协作。对于帮助我处理 EYG (https://github.com/CrowdHailer/eyg-lang),流程如下:
1. Fork 仓库到 Bot 账户
2. Agent 克隆 Fork,本地工作并推送。
3. 我将 Fork 添加为远程仓库 `git remote add bot ...`
## 本地 SSH 配置
为了启动任务,我 SSH 到正确的用户并使用那里的终端工具。我使用 tmux 确保当我的连接断开时会话保持运行。tmux 还允许我 trivially 恢复会话。我有以下 SSH 配置使连接变得容易:
```ssh
# Common settings for all agents on this VPS
Host vikki clara corin gerry
HostName <vps_ip>
RequestTTY yes
# -A attaches to an existing session, if no session it creates one
# -s specifies the session name 'work'
RemoteCommand tmux new-session -A -s work
# Specific User Definitions
Host vikki
User vikki
Host clara
User clara
Host corin
User corin
Host gerry
User gerry
```
## 经验教训
我认为 [五个层级:从辣味自动补全到软件工厂](https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/) 是映射我进度的好框架。此设置让我超越了辣味自动补全阶段和样板代码写作阶段。我还没有合并过任何 AI 未修改的代码建议。但我得到的是见解,这些见解比我自己挖掘代码更快地解除了阻塞。
以下教训对 2026 年中的模型对我有效:
- 频繁扔掉机器。如果 Agent 搞砸了且不懂为什么,就继续前进。
- 创建小产物并告诉 Agent 推送它们。我最喜欢的提示词是尝试实现一个功能,编写测试,然后**写一个教程**关于如何实现该功能。经常我从不看 Agent 的代码,但通过它的教程让我到达所需的地方,此外还看到了所有提交的代码。
- 我不需要 watch 进度。有一个 VSCode 插件允许你打开远程机器上的项目。第一周我大量使用这个,之后就没碰过。
- 信任真的很重要。我想拥有在我的机器上询问代码库问题的能力,但我不信任任意的 bash 执行。也许一旦 Overlay (https://github.com/CrowdHailer/overlay) 与 EYG (https://github.com/CrowdHailer/eyg-lang) 作为其脚本语言发展起来,我会有可以在本地运行的东西。
---
我正在构建 EYG (https://eyg.run/),一个构建更好语言和工具的实验;对于某种程度的更好。所有进度都在我的不定期通讯中报告。
相似文章
在本地化隔离的微型虚拟机中运行编码代理
code-airlock 是一个开源工具,可在一次性微型虚拟机中运行 AI 编码代理,以避免授予它们对主机文件系统的直接访问权限。它将仓库克隆到沙箱中,让代理可以自由工作,完成后,用户审查并仅拉取所需更改。
如何让代理运行数小时,以及哪些架构真正对代理友好?#深度探讨 #氛围程序员问题
作者探讨了AI编码代理的两个关键挑战:确保长时间自主执行(数小时)以及为本地应用设计对代理友好的架构。他们提出在规划和执行之前,增加一个显式的知识组织阶段来管理混乱的上下文。
我们如何构建安全、可扩展的代理沙箱基础设施(8分钟阅读)
Browser Use 描述了隔离执行代码的 AI 代理的两种模式:隔离工具与隔离代理。他们使用 AWS 上的 Unikraft 微虚拟机实现了代理隔离模式,获得了安全、可扩展且一次性的沙箱。
运行本地代理而非云端代理的理由 #645
解释了运行本地代理而非云端代理的原因,强调了隐私和控制的优势。
为你的AI代理配备专属计算机(7分钟阅读)
LangChain推出LangSmith Sandboxes,为每个AI代理提供独立的隔离计算环境以安全执行代码,解决了在容器或本地运行不可信代码的安全风险。