在 VPS 上 24/7 运行 AI 代理。
离开你的笔记本,搬到不会休眠的实体机上。
要在 VPS 上 24/7 运行一个 AI 代理,你需要四样东西,没有一样是什么高深的技巧:一台不掉线的机器、一个能重启它的监督进程、绝不进入镜像的密钥,以及一个支出上限 — 再加上一个不要求你身份信息的主机。
- 01
大多数代理其实是围绕托管模型 API 的一层 I/O 密集型胶水代码。推理并不在你的机器上进行,所以机器可以很小:2 vCPU 和 4 GB 就能撑起一个单循环代理。
- 02
在线时长是监督进程的问题,不是硬件问题。一个 systemd unit 或者 Docker 的重启策略 — 启用它,并用一次真实的重启去测试它 — 就是全部内容。
- 03
真正会咬人的是两件事:被固化进镜像层的密钥,以及一个没有支出上限、整晚对着按量计费的 API 空转的代理。
为什么你的笔记本电脑算不上一次部署。四种失败模式,无一例外都很枯燥。
一个在你自己机器上能跑的代理,只是一个能运行的代理,还算不上一个已部署的代理。这中间的差距是四个毫不光鲜的问题,没有一个和 prompt 工程有关。
休眠。 合上盖子,进程就被挂起了。而且电源管理在盖子合上之前很久,就已经在限流后台任务,这带来了这种失败最糟糕的一种版本:代理确实在运行,但运行得又晚又不可预测。
IP 变动。 家里或者咖啡馆的网络,每次重新连接都会给你分配一个新地址。任何按 IP 限速的东西、任何需要稳定回调地址的 webhook、任何你登记过的白名单,都会时不时地失效。
重启。 操作系统更新会按自己的日程重启机器。除非代理已经注册到某个服务管理器里,否则机器醒来看到的只是一个桌面,而不是一个正在运行的循环。大多数人一个星期后才会注意到。
搬迁。 你出差、换机器、重装系统。任何只存在于你 shell 历史记录里的东西都是不可复现的 — 一个在三月的某个下午手动搭起来的代理,根本没有任何部署流程可言。
一台服务器只解决这四件事,别的什么都解决不了 — 不解决正确性,不解决成本,也不解决安全性。它给你的只是一个运行环境,运行环境本身出的问题依然要靠你自己修。如果有人把它吹得更神,你应该多留个心眼。
给机器定规格。什么样的代理形态该配什么档位的 VPS。
本能反应是往大了配置,因为“人工智能”听起来就很重。但只要模型跑在别人的硬件上,其实一点都不重:一个调用托管 API 的代理,大部分时间都花在等待网络 I/O 上。还有第三种形态 — 自己跑模型 — 不在本文讨论范围内;那种负载需要的是 GPU,而不是一台虚拟机。
形态一 — 单一循环。 一个进程,一个轮询或定时循环,一个托管模型 API,状态存在 SQLite 里。大多数独立开发者的代理和监控机器人都是这种形态,而且真的很小。
形态二 — 小型技术栈。 代理加上 Postgres、一个基于 Redis 的队列、一个 worker 和一个向量存储。这时内存成了决定性的约束条件 — 一个在进程内加载的嵌入模型,自己就要占用一两个 GB。
对照产品目录来看:Sentinel(NB-V1 — 2 vCPU、4 GB RAM、120 GB NVMe、1 Gbps、不限流量、$3.90/month)覆盖形态一还绰绰有余。一旦 Postgres 和队列都上了场,Garrison(NB-V2 — 4 vCPU、8 GB、240 GB、$7.90/month)才是形态二实打实的下限。Ravelin(NB-V3 — 8 vCPU、16 GB、480 GB、2.5 Gbps、$16.90/month)适合多个代理共用一台机器。本地推理应该放在专用服务器上。
计费按月进行,选更长的周期有折扣 — 三个月 10%,六个月 20%,十二个月 30%。如果你的代理是一个只能在 Windows 上跑的交易客户端,而不是一个 Python 进程,远程桌面档位就是为这种情况准备的。
部署路径 — 大约十五分钟,在 VPS 上跑起一个 AI 代理。
开机器时选 Ubuntu 24.04 LTS 或 Debian 13 — 下单时都可以选,此外还有 Ubuntu 22.04、Debian 12、AlmaLinux 9 和 Rocky Linux 9。你会拿到 root 凭据;拿到之后第一件该做的事,就是不再用它。如果 SSH 密钥认证对你来说还是陌生的领域,先去读下面链接的加固指南。
1 — 创建一个服务账户。 adduser --system --group --home /srv/agent agent。代理不应该以 root 身份运行,也不应该拥有交互式 shell。现在多敲一条命令,日后如果它调用的某个工具被人反过来利用,波及范围也能保持很小。
2 — 把代码搬到机器上。 git clone 到 /srv/agent,或者如果你不想在服务器上留一个部署密钥,用 rsync 也可以。把依赖锁定版本:有没有 lockfile,决定了重新部署时是能复现,还是会给你意外惊喜。
3 — 搭建运行环境。 python3 -m venv /srv/agent/.venv,然后用这个 virtualenv 的 pip 从 lockfile 安装依赖。或者安装 uv,让它同时管理解释器和 lockfile。两种方式都可以;但把两者混着用不行。
4 — 先手动跑一次。 sudo -u agent /srv/agent/.venv/bin/python -m agent --once。不要跳过这一步直接上 service unit。这里十次失败里有九次,要么是缺了某个环境变量,要么是用了相对于你笔记本电脑的路径,这两类问题在终端里都比在 journald 里看得清楚得多。
5 — 把它交给监督进程。 见下一章。这一步会把一个你手动启动的脚本,变成一个由机器自己管理的服务。如果整套流程花的时间明显超过十五分钟,原因几乎总是对你开发机产生了某种隐性依赖 — 一个全局安装的二进制文件、一个藏在 shell 配置里的凭据、一个仓库之外的路径。
让它 24/7 保持存活。systemd、Docker,以及崩溃循环的陷阱。
一个你在 SSH 会话里启动的进程,会在会话结束时死掉,而且重启后也不会自己回来。监督进程不是可选项,而你有两个合理的选择。
systemd,适合单一进程。 在 /etc/systemd/system/agent.service 里写一个 unit,设置 User=agent、WorkingDirectory=/srv/agent、ExecStart 指向 virtualenv 里的解释器、Restart=always 以及 RestartSec=5。然后 systemctl daemon-reload,再 systemctl enable --now agent。真正能扛过重启的是 enable 这一步;只 start 不 enable,是三周后代理无声无息消失的最常见原因。
Docker,适合一整套服务。 当代理还带着其他伙伴进程 — 数据库、队列、无头浏览器 — 就用一个 Compose 文件把它们都描述出来,每个服务都配上 restart: unless-stopped。unless-stopped 和 always 有一处关键的区别:一个你自己主动停掉的容器,在 daemon 重启之后依然会保持停止状态。
崩溃循环的陷阱。 systemd 默认会对重启限速。只要在这个时间窗口内崩溃得足够频繁,unit 就会进入 failed 状态并停止重试 — 于是代理看起来悄无声息地死掉了,尽管 unit 文件里白纸黑字写着 Restart=always。把 StartLimitIntervalSec 设为 0 可以无限重试,同时调大 RestartSec,这样一个坏掉的代理也不会一整晚都占着一个核心空转。
存活不等于健康。一个卡在 socket 读取上长达九个小时的循环,在 systemd 能看到的任何指标上都是一个正在运行的进程。要暴露一个心跳信号:用 WatchdogSec 配置的 watchdog、一个 Docker HEALTHCHECK,或者让代理每个周期都去触碰一个时间戳文件,再配一个 timer,在文件过期时发出告警。
密钥。那份绝不能进入镜像的环境变量文件。
一个代理手里握着的东西,比一个 web 应用要危险得多。一个模型 API 密钥就是一件可以花钱的工具;一个交易密钥自带杠杆;一个钱包密钥就是资金本身。而且和 web 应用不同,代理会根据它自己没有写过的文本采取行动,这让“密钥握在代理手里”和“密钥握在攻击者手里”之间的界线变得很薄。
别让密钥进入镜像。 Dockerfile 里的 ENV 和 ARG 值会被写进镜像层,任何拿到这个镜像的人都能用 docker history 读出来。改用 Compose 里的 env_file:,或者 systemd unit 里的 EnvironmentFile=,并把这份文件放在构建上下文之外。
别让密钥进入代码仓库。 .gitignore 和 .dockerignore 要在第一次提交时就写好,而不是等到第五十次。一个曾经被提交过的密钥,即使之后重写了那次提交,也已经算是泄露了,因为对象会留存在各个 clone 和 fork 里。正确做法是轮换密钥,而不是去重写历史。
限制这份文件能触及的范围。 把环境变量文件的属主设为服务账户,权限设为 600。再配合一个非 root 的服务账户,即便机器上别处的某个依赖被攻破,也不能直接从磁盘上读走你的密钥。
在发放密钥的一方就限定好权限范围。 每个代理一个密钥,选服务商提供的权限里最窄的那一档 — 只读够用就只给只读,交易所密钥就禁用提现,把 IP 白名单锁定到这台服务器上。一个稳定的 IP 是离开笔记本电脑之后一个不太起眼的好处:终于可以做 IP 白名单了。如果有好几个人需要用到同一套凭据,就把它们放进配套指南里那个自托管密钥库后面。
调度。循环、定时器,以及那个会咬你一口的时区问题。
“持续运行”这个说法其实对应三种不同的架构,选错架构是任务重复执行或漏跑的常见根源。
常驻循环。 一个长期存活的进程,在每个周期之间休眠。最容易理解,也是正确的默认选择。它的弱点在于状态:内存里的一切在重启后都会丢失,所以任何必须扛过崩溃的数据都应该放进 SQLite 或 Postgres,而不是一个变量里。
定时任务。 一个启动、做完一个工作单元就退出的进程。这种情况下用带 OnCalendar 的 systemd timer 更合适,主要是因为 Persistent=true:停机之后,一个 persistent 的 timer 会补跑漏掉的那一次,而 cron 只会直接跳过它。
队列。 一个生产者把任务放进队列,多个 worker 消费它们。一旦任务到来的速度超过了处理完成的速度,这就是你需要的方案。它还附带了重试、死信处理和并发上限。
不管选哪种,都有两条规则。 让每个任务都是幂等的 — 一个在崩溃后会重启的监督进程,必然会重试任务,而一个被重试的任务绝不能重复发帖或重复下单。另外,把服务器时钟留在 UTC,只在边界处做时区转换:一个一年两次悄悄偏移一小时的日程,是一种极其磨人、难以排查的 bug。
给代理配上工具。一个和代理同机部署的工具服务器。
一个没有工具的代理只是一个聊天循环。正是工具让它能够读取一个代码仓库、查询一个数据库、下一笔订单或提交一个 issue — 一旦代理住进了服务器,这些工具也应该住进去。
Model Context Protocol(MCP)已经成了暴露这些工具的通用方式,而一个你自己私下运行的服务器,很容易就能部署在代理旁边:同一台机器,同一个私有接口,不需要任何公网暴露。配套的指南对此有更完整的讲解 — 托管一台远程 MCP 服务器会带你走一遍 TLS、streamable-HTTP 传输、OAuth 和 agent card,而无需身份认证的托管角度则从身份这一侧讲解同一套技术栈。
先把它绑定到 localhost。 如果唯一的调用方就是同一台机器上的代理,工具服务器就没有理由占用一个公网端口。绑定到回环地址,证书也可以省了。只有在第二台机器需要访问它的时候,才把它公开暴露 — 而到了那时,TLS 和身份认证都得要,而不是二选一。
给工具的权限,只给刚好够用的那一份。 代理是根据文本来决定调用哪个工具的,而这些文本里有一部分来自外部。对于一个会读网页或收件箱的代理来说,prompt 注入不是什么假设性的风险,而是理所当然会发生的情况。一个只能读的工具,是没法被诱骗着去写的。凡是必须写入的工具,凡是具有破坏性的路径,都要求人工确认。
如果你是在为别人的代理而不是自己的代理构建工具,机器 API和面向代理的接口文档说明了本平台如何直接向代理开放开通流程。
可观测性与成本。该记录什么,以及失控时的一键熔断开关。
真实世界的代理部署里,最常见的是两种失败模式,而且都不是崩溃。一种是代理运行得完美无缺,却什么有用的东西都没产出。另一种是代理运行得完美无缺,一夜之间刷出一张四位数的 API 账单。
记录形状,而不是内容。 时间戳、任务 id、步数、调用过的工具名称、token 总量、耗时、结果。这些足以回答你实际会问到的每一个运维问题。完整的 prompt 和补全内容,等于把代理被要求做过的每一件事都以明文形式,记在别人大楼里的一块磁盘上。
限制留存时长。 journald 会一直增长下去,除非你明确告诉它别这么做。journald.conf 里的 SystemMaxUse 和 MaxRetentionSec 分别给体积和存留时间设了上限。否则一个话多的代理几周内就能把磁盘填满,而磁盘写满之后出的错,比一次干净利落的崩溃难读懂得多。
三层支出控制。 在服务商一侧,给 API 密钥设一个硬性上限 — 这是唯一一个代码里的 bug 绕不过去的限制,也是大家最常忽略的一层。在代理内部,给每次运行配一个 token 计数器和中止阈值。在代理外部,设一个最大步数和挂钟超时,这样一个自己和自己抬杠的模型,二十轮之后就会停下来,而不是四千轮。
在你真正需要之前,先把熔断开关做好。 一条能让一切停下来的命令:systemctl stop agent,或者 docker compose down。确保它不需要某一台装着特定密钥的笔记本电脑才能执行。一个糟糕的夜晚和一个糟糕的月份之间的区别,就在于叫停一个失控的代理需要十秒钟,还是需要一个小时。
身份底线。主机知道什么 — 以及它无法保护你免受什么。
一个代理是一个长期存活、持有凭据的进程,从一个固定地址持续地代表你行事。这让这份租赁记录比一个静态网站的租赁记录更有意思:它每小时都在做着可以追溯到你身上的事情,一做就是好几个月。
这里的底线是:注册只需要一个邮箱地址和一个密码,支付可以用八种资产 — Bitcoin、Ethereum、两条链上的 Tether、Monero、Litecoin、TRON 和 Solana — 全程不需要任何身份证件。数据中心位于四个北欧宪政国家:Stockholm、Helsinki、Oslo 和 Reykjavík。运营准则说明了哪些数据会被留存;网络页面说明了路由方式。
现在说说这个限度,它比宣传语更重要。一个不要求身份信息的主机,移除的是租赁记录。它触及不到推理这一层:你的代理每次调用,都是用绑定到某个账户、从一个固定 IP 出发的密钥,向模型服务商认证的。如果那个账户是用你的真实姓名注册的 — 对大多数人来说确实如此 — 那么无论这台实体机是谁租的,身份都已经在那里确立了。主机这一层只移除了一环:确实是真实的一环,但也仅此一环。
接下来要做的事都不怎么光鲜。做好隔离:一个代理,一台服务器,一把密钥,一个钱包。在第一天就把机器加固好,而不是等到第三十天 — 对于一台要无人值守运行好几个月的机器来说,第一小时清单这一个小时花得很值。如果代理必须访问一个私有网络,就用一条隧道在服务器上终结它,而不是把服务直接暴露出去 — 隧道指南讲解了具体配置。还有,用加密货币支付时,用的钱包不要和代理用来交易的那个钱包是同一个。
这些做法都不算什么稀奇的技巧,也都不是什么保证。这不过是在你睡着的时候,运行一个代表你行事的东西所需要的日常自律 — “持续运行”说到底也就是这个意思。这个主题群的其余内容都在指南索引里。
问题,已解答。
七个开发者在把代理从 localhost 迁走之前 — 以及迁走后第一个月里 — 会问到的问题。
24/7 运行一个 AI 代理需要多大的 VPS?
比大多数人想的要小,因为推理运行在服务商的硬件上,而不是你自己的机器上。一个调用托管模型 API、跑轮询循环的代理,本质上是 I/O 密集型进程:Sentinel 档位(2 vCPU、4 GB RAM、120 GB NVMe、$3.90/month)绰绰有余。一旦你加上 Postgres、队列和本地嵌入模型,就该升级到 Garrison(4 vCPU、8 GB、$7.90/month)。
应该用 systemd 还是 Docker 来让代理保持运行?
两种都可以;只是失败模式不同。带 Restart=always 的 systemd unit 是单一进程最短的路径,还能免费获得 journald、资源限制和启动顺序管理。当代理有其他伙伴进程时,配合 restart: unless-stopped 的 Docker 更合适,因为 Compose 能用一个文件描述整套服务。更重要的是,你要真正启用它,并在放手不管之前用一次真实重启测试过。
为什么我的代理崩溃几次之后就不再重启了?
因为 systemd 会对重启进行限速。StartLimitBurst 和 StartLimitIntervalSec 只允许在一个短时间窗口内重启有限的次数;一旦超过,unit 就会进入 failed 状态并停在那里,看起来就像悄无声息地死掉了一样。正确的做法是修复导致崩溃的根本原因 — 或者将 StartLimitIntervalSec 设为 0 以禁用限速器,并把 RestartSec 设为 10,这样一个陷入崩溃循环的代理也不会把一个核心的算力都耗在不断重试上。
API 密钥应该放在哪里?
放进一个容器镜像永远看不到的文件里。把环境变量文件放在构建上下文之外,通过 systemd unit 里的 EnvironmentFile= 或 Compose 里的 env_file: 引用它,属主设为服务账户,权限设为 600。密钥绝不要用 Dockerfile 里的 ENV 或 ARG:这些值会被固化进镜像层,用 docker history 就能读出来。在第一次提交之前,就把这个文件加进 .gitignore 和 .dockerignore。
怎样才能防止代理一夜之间把我整个 API 预算花光?
三层防护,三层都要。在服务商一侧:给 API 密钥设一个硬性支出上限,这是唯一一个代码里的 bug 绕不过去的限制。在代理内部:统计每次运行的 token 数或调用次数,超过阈值就中止。在代理外部:给每个任务设步数上限和挂钟超时。没有任何主机能替你做这件事 — VPS 只是租来的算力,不是别人 API 的预算守卫。
有哪些东西绝不应该写进代理的日志?
完整的 prompt 和补全内容、原始的工具参数、API 密钥、钱包相关材料,以及用户输入的任何内容。应该记录的是这次运行的轮廓:时间戳、任务 id、步数、工具名称、token 总量、耗时、结果。一份啰嗦的代理日志,等于把代理被要求做过的每一件事都以明文形式记在一块你无法物理掌控的磁盘上。
无需 KYC 的主机能让我的代理匿名吗?
不能,这一点值得说清楚。无需证件注册加上加密货币支付,意味着主机方没有可以关联到这台服务器的法律身份信息。但这对模型服务商这一层毫无影响:你的代理每次调用都是用绑定到某个账户的密钥、从一个固定的服务器 IP 向该 API 认证。主机这一层只移除了链条中的一环 — 租赁记录 — 仅此而已。
租一台无需 KYC 的 VPS,用加密货币支付,今晚就把代理从你的笔记本电脑上搬走。
Sentinel — 2 vCPU、4 GB RAM、120 GB NVMe、不限流量、$3.90/month — 足以撑起一个单循环代理,旁边还留有空间给它的工具服务器。注册只需要一个邮箱地址和一个密码;全程不需要任何证件。
最后审核 · 2026-08-24 · 来源 · systemd.service、systemd.timer 和 journald.conf 手册页,Docker restart-policy 与 Compose 文档,Model Context Protocol 规范,NordBastion 产品目录 · 周期 · 每年
Anonymous VPS hosting in 2026 — the cluster.
This guide is one spoke of a larger series. The pillar walks the three privacy layers end to end — the sibling spokes below dive into the specifics.
Three independent layers — signup, payment, network — explained, legal context included, common mistakes flagged.
Deploy your own MCP server on a no-KYC VPS — TLS, streamable HTTP, OAuth.
Host an MCP server with no ID — the privacy stack, crypto-paid.
Docker Compose、PostgreSQL、真正能用的 webhook——由您掌控的自动化。
CPU 跑 Ollama,无需 GPU——4、8、16、32 GB 各能装下什么。