news 2026/5/6 1:58:11

基于Ansible与Tmux构建云端AI开发环境:实现24/7远程编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Ansible与Tmux构建云端AI开发环境:实现24/7远程编程

1. 项目概述:为什么需要一个“永不关机”的远程开发代理?

作为一名常年与代码打交道的开发者,我经常遇到一个尴尬的场景:本地电脑上跑着一个耗时漫长的构建、测试或者数据同步任务,而我却不得不合上笔记本去开会、通勤或者干脆想让它休息一下。一旦断开连接,所有进程中断,前功尽弃。更别提那些对算力有要求的任务,本地风扇狂转,机器烫得能煎鸡蛋。

这就是vps-agent项目要解决的核心痛点:将你的开发环境,特别是AI辅助编程的“大脑”——Cursor Agent,部署到一台远程的VPS(虚拟专用服务器)上,让它24/7不间断运行。你可以在本地通过SSH连接上去,在一个持久的tmux会话中工作,然后随时安全地断开连接。你的代码、终端状态、正在运行的进程,全部原封不动地保留在云端。等你需要时,再重新连接,就像从未离开过一样。

这不仅仅是“远程桌面”那么简单。它通过Ansible实现了自动化部署,确保环境的一致性和可重复性;通过tmux提供了强大的终端会话管理能力;而核心是集成了Cursor Agent CLI,让你能在云端享受AI结对编程的便利,同时释放本地资源。简单来说,它为你构建了一个专属的、永不离线的云端开发工作站

2. 核心思路与工具选型解析

2.1 为什么是这套技术栈?

这个项目的设计非常精炼,每个工具的选择都直指核心需求,没有一丝冗余。我们来拆解一下:

  1. Ansible:作为自动化配置管理工具,它是这个项目的基石。它的优势在于“声明式”和“无代理”。我们只需要用YAML语言描述最终的系统状态(“需要安装tmux”、“需要创建cursor用户”),Ansible会自行判断如何达到这个状态。相比需要在中控机和目标机都安装客户端的方案,Ansible仅需通过SSH连接,大大简化了部署流程。这对于管理单台或多台VPS来说,是最清晰、最可维护的选择。

  2. Ubuntu 24.04 LTS on ARM64:选择最新的LTS版本确保了长期稳定的系统支持和软件包更新。而指定ARM64架构则是一个充满前瞻性的选择。目前,各大云服务商(如AWS的Graviton、Azure的Ampere)提供的ARM实例,在同等性能下,价格通常比x86实例低20%-40%,性价比极高。对于运行开发环境、编译等任务,ARM64已具备完善的生态支持。

  3. Tmux:这是实现“持久会话”能力的灵魂。Tmux是一个终端复用器,它允许你在一个终端窗口中创建多个“窗格”(Pane)和“窗口”(Window),更重要的是,这些会话可以脱离当前SSH连接而独立存在。你detach(分离)后,所有进程照常运行;你换个时间、换个网络attach(附加)回来,一切如初。它比screen更现代,功能更强大,是运维和开发者的标配。

  4. Cursor Agent CLI:这是项目的价值核心。Cursor是一款深度集成AI的IDE,其Agent功能能理解上下文、自动补全、甚至编写代码。将其CLI版本部署在云端,意味着你可以获得一个不知疲倦、算力充沛的云端编程伙伴。无论是代码生成、重构建议还是错误排查,它都能在后台持续为你服务。

  5. Taskfile:这是一个常常被忽略但极大地提升了项目易用性的工具。它用简单的YAML文件定义了一系列任务(Task),比如“部署”、“连接”、“更新”。用户不需要记忆复杂的Ansible命令,只需要运行task deploytask connect即可。它统一了项目入口,降低了使用门槛。

这套组合拳下来,实现了一个优雅的闭环:用Ansible一键搭建环境,用Tmux维持工作状态,用Cursor Agent提升效率,最后用Taskfile简化所有操作。

2.2 与官方方案的对比思考

项目文档中提到了Cursor官方的“自托管云代理”和“Agent Client Protocol (ACP)”。为什么还要自己造轮子?这恰恰体现了实践者的智慧。

  • 官方自托管代理(Undercooked):正如文档所说,截至2026年4月,该功能可能还不完善,存在如“无法自动补全文件”等基础功能缺失的问题。依赖一个尚在雏形的功能,对于生产性或严肃的开发工作流来说风险太高。自己搭建的方案,可控性更强,功能也更完整。
  • ACP协议(Work in Progress):新的协议标准意味着未来的可能性,但也意味着当前的不稳定性和兼容性问题。vps-agent基于成熟的SSH和Tmux技术栈,稳定可靠,几乎不存在兼容性风险,并且其模式(持久终端会话)是通用的,不局限于Cursor,你可以在这个环境里运行任何CLI工具。

因此,vps-agent的定位非常清晰:它是一个基于成熟、稳定技术构建的,立即可用、高度可控的云端开发环境解决方案,完美填补了官方方案成熟前的空白。

3. 前期准备与详细配置指南

3.1 本地环境准备(你的笔记本电脑)

在开始向云端部署之前,我们需要在本地配置好“发射台”。

  1. 安装Taskfile:这是我们的指挥中心。访问 taskfile.dev 选择适合你操作系统(macOS, Linux, Windows)的安装方式。通常macOS用户用brew install go-task/tap/go-task,Linux用户可以直接下载二进制文件。安装后,在终端运行task --version确认安装成功。

  2. 安装Ansible与Ansible-lint:项目推荐使用uv这个现代的Python包管理工具来安装,这能有效避免污染系统全局Python环境。

    # 安装uv(如果尚未安装) curl -LsSf https://astral.sh/uv/install.sh | sh # 使用uv安装ansible-core和ansible-lint uv tool install ansible-core uv tool install ansible-lint

    注意:使用uv安装后,你可能需要将uv的bin目录(通常是~/.local/bin)添加到你的PATH环境变量中,或者通过uv run ansible-playbook来运行命令。更通用的方式是使用uv创建的虚拟环境。不过,对于这个一次性安装的系统工具,用系统包管理器(如brew install ansibleapt install ansible)可能更直接。uv的优势在于版本隔离。

  3. 安装并认证GitHub CLI (gh)

    • 安装:访问 cli.github.com 按指南安装。
    • 认证:这是关键一步。运行gh auth login,按照提示选择GitHub.com,推荐使用SSH密钥认证方式(这与后续Ansible操作匹配)。完成后,务必运行gh auth status确认显示登录成功。Ansible剧本会调用gh命令来管理部署密钥,所以这步必须提前做好。

3.2 准备你的云端战场(VPS)

你需要一台运行Ubuntu 24.04 ARM64的VPS。几乎所有主流云厂商都提供此类服务:

  • AWS EC2:选择t4gm6g等Graviton系列实例(ARM64),在创建实例时选择Ubuntu 24.04 LTS AMI。
  • DigitalOcean:创建Droplet时,在“镜像”中选择Ubuntu 24.04 LTS,在“CPU选项”中勾选“Premium Intel & AMD”或专门筛选ARM机型。
  • Linode:创建实例时,选择“Distributions”下的Ubuntu 24.04 LTS,并选择ARM64架构的机型。
  • Vultr:在部署服务器时,选择“Cloud Compute”或“Optimized Cloud Compute”,应用选择Ubuntu 24.04,服务器类型选择“Ampere (ARM)”系列。

创建VPS时的关键操作:

  • 区域选择:尽量选择离你物理位置近的区域,以降低SSH延迟。
  • SSH密钥对:在创建实例时,务必上传你的本地公钥(通常是~/.ssh/id_ed25519.pub~/.ssh/id_rsa.pub)。这是你免密登录的凭证。云服务商会将公钥自动注入到新服务器的authorized_keys文件中。
  • 安全组/防火墙:确保开放22端口(SSH)。其他端口暂时不需要。
  • 获取你的VPS的公网IP地址

3.3 配置Ansible库存清单

这是连接本地和云端的桥梁。项目结构已经规划好,你只需要填写信息。

  1. 克隆项目仓库

    git clone https://github.com/meoyawn/vps-agent.git cd vps-agent
  2. 复制并编辑库存文件

    cp ansible/inventory/hosts.example.yaml ansible/inventory/hosts.yaml

    用你喜欢的编辑器打开ansible/inventory/hosts.yaml。它的内容类似于:

    all: children: vps: # 这个组名必须是 vps,因为Playbook只针对这个组执行 hosts: your_vps_hostname: # 这里可以是你自定义的主机名,如 `my-dev-agent` ansible_host: 203.0.113.10 # 替换成你的VPS公网IP ansible_user: ubuntu # 通常是Ubuntu镜像的默认用户名 # ansible_ssh_private_key_file: ~/.ssh/id_ed25519 # 如果你的密钥不是默认路径或名称,需取消注释并指定
    • ansible_host: 填入你的VPS IP地址。
    • ansible_user: Ubuntu云镜像的默认用户通常是ubuntu。如果你用的其他发行版或自定义镜像,请更改。
    • ansible_ssh_private_key_file: 如果你使用的SSH私钥不是默认的(例如,你为这个项目专门生成了新密钥对,或者密钥放在非标准路径),需要取消注释这行并指定正确的路径。

4. 一键部署与核心工作流实操

4.1 执行自动化部署

当你的hosts.yaml配置无误后,部署就变得极其简单。在项目根目录下,运行:

task apply

这个命令背后,Taskfile.yml定义了一个名为apply的任务,它实际上执行了ansible-playbook ansible/playbooks/site.yaml。让我们深入看看这个Playbook (site.yaml) 做了哪些了不起的事情:

  1. 系统基础配置:更新apt缓存,安装基础工具包(如vim,git,curl,wget等)。
  2. 创建专用用户:创建一个名为cursor的系统用户,并为其配置sudo权限(无需密码),后续所有操作都在此用户下进行,实现环境隔离。
  3. 配置SSH与GitHub密钥
    • 在VPS上为cursor用户生成一对新的SSH密钥。
    • 利用你本地已经认证好的ghCLI,将生成的公钥自动注册到你的GitHub账户,作为“部署密钥”。这意味着cursor用户可以直接克隆你的私有仓库,无需额外配置令牌。

    重要提示:这个过程需要你的GitHub账户有相应的权限(添加SSH密钥)。确保gh auth status输出正确。

  4. 安装核心软件
    • Tmux:安装并配置基础设置。
    • Cursor Agent CLI:从Cursor官方下载最新的CLI二进制文件,安装到cursor用户的目录下,并确保其在PATH中。
  5. 创建工作区目录:在cursor用户的家目录下创建~/workspace/目录,作为所有代码仓库的统一存放点。

整个过程完全自动化,你只需要在初始时输入一次VPS的IP地址。部署成功后,你的云端开发环境就准备就绪了。

4.2 日常使用工作流

部署完成后,日常使用才是精髓所在。你不再需要记住复杂的SSH命令。

  1. 连接到你的云端工作会话: 在本地终端,只需运行:

    task tmux

    这个命令会:

    • 通过SSH连接到你的VPS。
    • 切换到cursor用户。
    • 检查是否存在名为cursor的tmux会话(默认名称),如果不存在则创建它。
    • 将你的本地终端附加(attach)到这个会话上。

    此刻,你的终端已经“进入”了VPS上的那个持久会话。你可以在这里运行任何命令。

  2. 在会话中开始工作

    # 进入预设的工作区 cd ~/workspace # 克隆你的项目 git clone git@github.com:yourname/yourproject.git cd yourproject # 启动Cursor Agent,让它分析这个项目 cursor-agent # 现在,你可以像在本地一样使用Cursor的AI功能了 # 例如,让Agent帮你写一个函数,或者解释一段代码

    cursor-agent启动后,通常会运行在后台或占用当前终端。你可以使用Ctrl+B然后按D来分离(detach)当前tmux会话。注意:这只是从会话中分离,cursor-agent进程和所有其他命令仍在VPS上继续运行。

  3. Tmux基本操作指南: 在tmux会话中,所有命令都以前缀键开始,默认是Ctrl+B

    • Ctrl+B D:分离当前会话(会话在后台运行)。
    • Ctrl+B C:在当前会话中创建一个新窗口(Window)。
    • Ctrl+B ,:重命名当前窗口。
    • Ctrl+B 数字:切换到指定编号的窗口。
    • Ctrl+B %:将当前窗格垂直分割。
    • Ctrl+B ":将当前窗格水平分割。
    • Ctrl+B 方向键:在窗格间切换焦点。
    • Ctrl+B Z:将当前窗格全屏放大,再按一次恢复。
    • 在终端中直接运行tmux attach -t cursor可以重新附加到名为cursor的会话。
  4. 断开与重连: 当你需要离开时,在tmux会话中按下Ctrl+B D即可分离。然后直接关闭本地终端窗口。 任何时候你想回来,只需在本地再次运行task tmux,你就会回到离开时的精确状态——光标位置、命令历史、正在运行的后台进程(如cursor-agent),一切如常。

4.3 维护与更新

环境需要维护,vps-agent也提供了便捷的方式。

  • 更新Cursor Agent:Cursor Agent CLI会频繁更新以获取新功能。要更新VPS上的Agent,只需在本地运行:

    task update-cursor-agent

    这个任务会运行一个独立的Playbook,专门用于下载并替换VPS上cursor用户目录下的Agent二进制文件。

  • 修改配置或增删软件:如果你需要调整VPS上的配置(例如,安装额外的系统包、修改tmux配置、添加环境变量),你应该去修改ansible/playbooks/目录下的对应Playbook或角色(Role)文件,然后再次运行task apply。Ansible具有幂等性,这意味着多次运行同一个Playbook是安全的,它只会让系统达到Playbook描述的状态,而不会造成重复操作或错误。

5. 深度优化、问题排查与安全实践

5.1 性能与使用优化技巧

  1. SSH连接优化:编辑本地的~/.ssh/config文件,为你的VPS添加配置,可以显著提升连接速度和稳定性。

    Host my-dev-agent # 与你 inventory 中设置的主机名一致 HostName 203.0.113.10 User cursor # 连接时直接使用 cursor 用户 IdentityFile ~/.ssh/id_ed25519 # 指定私钥 ServerAliveInterval 60 # 每60秒发送一个保活包,防止连接超时 ServerAliveCountMax 3 TCPKeepAlive yes Compression yes # 启用压缩,加速传输

    配置后,你可以直接用ssh my-dev-agent连接,task tmux命令内部的SSH调用也会受益于这些优化参数。

  2. Tmux配置美化与增强:默认的tmux配置比较简陋。你可以为cursor用户创建~/.tmux.conf文件来增强体验。例如,将前缀键从Ctrl+B改为更顺手的Ctrl+A(需注意不要与终端跳转行首快捷键冲突):

    # 更改前缀键 unbind C-b set -g prefix C-a bind C-a send-prefix # 启用鼠标支持(方便调整窗格大小、选择窗格) set -g mouse on # 设置状态栏更美观 set -g status-style bg=black,fg=white set -g window-status-current-style bg=red,fg=black # 设置窗格边框颜色 set -g pane-border-style fg=green set -g pane-active-border-style fg=brightred # 重新加载配置文件的快捷键(修改后按前缀+R生效) bind R source-file ~/.tmux.conf \; display-message "Config reloaded."

    将这些配置通过Ansible自动化部署是更好的实践,你可以将其添加到Playbook中,实现一键配置。

  3. 工作区管理:养成在~/workspace下按项目克隆仓库的习惯。你可以在tmux中为每个项目创建一个独立的窗口(Window),并重命名窗口以便识别。例如,窗口1叫“backend”,窗口2叫“frontend”。

5.2 常见问题与故障排除

即使自动化程度很高,也可能会遇到问题。下面是一个快速排查指南:

问题现象可能原因解决方案
运行task apply失败,提示“SSH连接被拒绝”或“认证失败”。1. VPS IP地址错误。
2. 安全组未开放22端口。
3. 本地私钥路径错误或权限不对。
4. VPS上的默认用户名不是ubuntu
1. 核对hosts.yaml中的ansible_host
2. 登录云控制台检查防火墙/安全组规则。
3. 检查ansible_ssh_private_key_file路径,并确保私钥文件权限为600 (chmod 600 ~/.ssh/id_xxx)。
4. 尝试用ssh ubuntu@<ip>手动连接,确认用户名。
task apply在“注册GitHub SSH密钥”步骤失败。1. 本地ghCLI未登录 (gh auth status失败)。
2. GitHub账户权限问题(如启用了2FA但未配置SSH密钥的特定流程)。
1. 运行gh auth login重新登录。
2. 尝试手动处理:登录VPS (ssh cursor@<ip>),查看/home/cursor/.ssh/id_ed25519.pub,将其内容复制并手动添加到GitHub的SSH Keys设置中。
运行task tmux提示“找不到会话cursor”或无法附加。Tmux会话尚未创建,或者会话名不是cursor首次运行task tmux时会自动创建。如果失败,可以手动SSH到VPS,切换到cursor用户,运行tmux new -s cursor创建会话。
在tmux会话中,网络断开后重连,发现会话不见了。Tmux服务器可能意外终止了(如VPS重启)。Tmux会话默认保存在内存中,服务器退出会话即丢失。这是tmux的局限。可以考虑使用tmux-resurrecttmux-continuum插件来定期自动保存和恢复会话状态。更根本的解决方案是确保VPS稳定运行,或编写系统服务来保证tmux在启动时运行。
cursor-agent命令未找到或启动失败。1. Playbook安装Agent失败。
2. Agent二进制文件路径未加入cursor用户的PATH。
1. 运行task update-cursor-agent尝试重新安装。
2. 登录VPS检查/home/cursor/.local/bin目录是否存在且包含cursor-agent文件,并检查~/.bashrc~/.profile中是否将该路径加入了PATH。
感觉Agent响应慢。1. VPS配置过低(CPU/内存不足)。
2. VPS地理位置离你太远,网络延迟高。
3. Agent在处理大型项目。
1. 考虑升级VPS配置。
2. 选择离你更近的云区域。
3. 在项目根目录创建.cursorignore文件,忽略node_modules,build,.git等不需要Agent分析的大目录。

5.3 安全加固建议

将开发环境放在公网VPS上,安全至关重要。

  1. 禁用密码登录,仅使用SSH密钥:这应该是在创建VPS时云厂商的默认选项,但请再次确认。检查VPS上的/etc/ssh/sshd_config,确保PasswordAuthentication设置为no
  2. 更改SSH端口:将默认的22端口改为一个非标准的高位端口(如2222),可以避免绝大部分自动化扫描攻击。需要在sshd_config中修改Port,并在云服务商的安全组中开放对应端口。
  3. 使用Fail2ban:安装并配置Fail2ban,自动屏蔽多次尝试SSH登录失败的IP地址。
  4. 定期更新系统:通过Ansible Playbook加入定期执行apt update && apt upgrade -y的任务,或直接在VPS上配置无人值守更新。
  5. 限制cursor用户的权限:虽然为了方便给了sudo权限,但在生产使用中,可以考虑更精细的权限控制,或者只授予执行特定命令(如安装特定软件包)的sudo权限。
  6. 备份重要数据~/workspace下的代码应通过git推送到远程仓库进行备份。对于tmux会话状态等,如果非常重要,可以考虑定期备份tmux的resurrect脚本文件。

6. 扩展场景与进阶玩法

vps-agent的基础框架非常稳固,你可以基于它拓展出更多强大的工作流。

  1. 多项目并行开发:在一个tmux会话中创建多个窗口,每个窗口对应一个不同的项目目录。你可以让一个窗口运行前端开发服务器,另一个窗口运行后端API,第三个窗口运行数据库或消息队列。所有服务都在云端持续运行,你只需一个连接即可查看所有状态。

  2. 作为CI/CD的轻量级运行器:你可以在VPS上安装Docker、Node.js、Python、Go等工具链。然后,将这个小型的“云端开发机”作为你个人或小团队的简易CI/CD环境。通过编写脚本,在tmux会话中自动运行测试、构建和部署任务。

  3. 数据抓取与处理任务:有些爬虫或数据处理脚本需要长时间运行。你可以将其放在这个VPS的tmux会话中,让它7x24小时工作,完全不影响本地电脑。

  4. 学习与实验沙盒:这是一个完美的实验环境。想尝试一个可能搞乱系统的新技术、新数据库?在VPS上随便折腾,玩坏了直接通过Ansible一键重置,或者销毁VPS重开一个,完全不影响主力机。

  5. 集成其他CLI AI工具:这个环境不限于Cursor Agent。你可以同样方式安装并运行GitHub Copilot CLI (gh copilot),Claude CLI, 或是开源的Continue等任何命令行AI工具,打造一个属于你自己的云端AI助手集群。

我个人最深刻的体会是,这个方案带来的最大价值是“心流”的延续。以前,下班时不得不中断一个复杂的调试过程,第二天回来又要花大量时间重新进入状态。现在,我只需要在办公室的电脑上Ctrl+B D,回到家后task tmux,所有的终端历史、未完成的命令、正在运行的本地服务器都瞬间呈现,思维的上下文无缝切换。它不仅仅是一个工具,更是一种让工作流适应人,而非让人适应工作流的方式。从按下task apply那一刻起,你就拥有了一个在云端永不停歇的数字分身。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 1:57:51

新手福音:用快马生成你的第一个Ollama调用程序

最近在尝试本地部署AI模型时&#xff0c;发现了Ollama这个神器。作为一个刚入门的新手&#xff0c;整个过程比想象中顺利很多&#xff0c;特别是借助InsCode(快马)平台快速生成了基础代码框架&#xff0c;省去了不少摸索时间。这里记录下我的学习过程&#xff0c;希望能帮到同样…

作者头像 李华
网站建设 2026/5/6 1:57:17

夏季养生全攻略|三伏将至,这些“老理儿“现在看正是时候

夏季阳气浮于表&#xff0c;脾胃反而最虚。你以为的"降火"&#xff0c;可能正在透支秋冬的健康。一、夏季最大的养生误区&#xff1a;一味清热降火入夏之后&#xff0c;很多人第一反应就是——"上火了吧&#xff1f;喝点凉茶。"冰西瓜、冰咖啡、凉茶、苦瓜…

作者头像 李华
网站建设 2026/5/6 1:56:51

多模态触觉传感器技术解析与应用实践

1. 多模态触觉传感器的技术演进与核心价值在机器人操作领域&#xff0c;触觉感知长期被视为实现类人灵巧操作的关键瓶颈。传统工业机器人依赖预设程序完成重复性抓取任务&#xff0c;面对复杂多变的非结构化环境时往往捉襟见肘。这种现象在2015年DARPA机器人挑战赛中暴露无遗—…

作者头像 李华
网站建设 2026/5/6 1:50:29

Video-Thinker-7B:视频理解与推理的开源模型解析

1. 项目概述Video-Thinker-7B是当前视频理解与推理领域最具突破性的开源模型之一。这个7B参数规模的视觉语言模型在视频内容分析、时序推理和跨模态理解方面展现出惊人的能力。作为一名长期关注多模态AI发展的从业者&#xff0c;我亲眼见证了从早期简单视频分类到如今复杂场景理…

作者头像 李华