【玩转 AtomCode】一行命令让 AI 自己造服务:我用 AtomCode 在云服务器上从零开发一个服务器巡检 API(真实记录)

【玩转 AtomCode】一行命令让 AI 自己造服务:我用 AtomCode 在云服务器上从零开发一个服务器巡检 API(真实记录) 【玩转 AtomCode】一行命令让 AI 自己造服务我用 AtomCode 在云服务器上从零开发一个服务器巡检 API真实记录征文方向实战体验类 —— 我用 AtomCode 开发server-probe项目的真实记录。本文所有终端输出均为真实执行结果部署机器117.72.182.3Ubuntu 22.04通过 Python paramiko 远程 SSH 操作。一、为什么是 AtomCode先说结论对国内开发者而言AtomCode 是目前「开箱即用成本最低」的终端 AI 编码代理Terminal AI Coding Agent。三个理由维度AtomCodeClaude Code开源协议MIT源码托管于 AtomGit闭源模型多模型深度支持国产DeepSeek / Qwen / GLM…仅 Claude国内访问直连无需科学上网受限费用Token 限免CodingPlanClaude API 收费部署形态Rust 编译单文件二进制约 27MB零依赖Node 进程它的定位很清晰住在你终端里的 AI 编程助手你用自然语言说一句「帮我从零做一个服务器巡检 API」它就会自主规划 → 读/写文件 → 跑测试 → 自我修复 → 给你结论。本文就完整复现这一过程并贴出真实的 Agent 执行日志。二、环境准备2.1 服务器信息项目值公网 IP117.72.182.3操作系统Ubuntu 22.04.3 LTS (Jammy)内核5.15.0-60-generic规格2 vCPU / 3.8 GiB / 59 GB已装工具git / curl / python3 3.10.12 / node v20.18.1 / npm2.2 系统检查真实输出$cat/etc/os-release|head-n4PRETTY_NAMEUbuntu 22.04.3 LTSNAMEUbuntuVERSION_ID22.04VERSION22.04.3 LTS (Jammy Jellyfish)$ nproc2$free-htotal usedfreeshared buff/cache available Mem:3.8Gi 456Mi 113Mi3.0Mi3.3Gi3.1Gi Swap:2.0Gi5.0Mi2.0Gi $df-h/ Filesystem Size Used Avail Use% Mounted on /dev/vda1 59G 31G 26G55% /外网连通性AtomGit 与 GitHub 均可达是后续一键安装与调用限免模型的前提$curl-sS-m8-o/dev/null-wgithub: %{http_code}\nhttps://github.com github:200$curl-sS-m8-o/dev/null-watomgit: %{http_code}\nhttps://atomgit.com atomgit:200三、安装部署 AtomCode3.1 一键安装官方提供一行安装脚本自动识别平台linux-x64下载预编译二进制并写入 PATHcurl-fsSLhttps://raw.atomgit.com/atomgit_atomcode/atomcode/raw/main/scripts/install.sh|sh脚本把二进制放到/usr/local/bin/atomcode任意终端会话可直接调用重启后保持有效。AtomCode 本身是 Rust 编译的静态二进制不依赖 Node可独立运行。3.2 版本校验$whichatomcode /usr/local/bin/atomcode $ atomcode--versionatomcode5.0.0(unknown)备注本机最初安装的是 4.26.0由于config.toml中auto_update true在一次atomcode plugin list调用时触发了原地自升级当前为 5.0.0。5.0.0 的一个破坏性变更是顶层--max-turns/--disable-tools参数已移除老脚本若沿用会报unexpected argumentheadless 现行写法见第六节。3.3 关键子命令速览$ atomcode--helpAI coding assistantinyour terminal Usage: atomcode[OPTIONS][COMMAND]Commands: login Signinwith AtomGit OAuth and claim CodingPlan modelsinone flow status Show current login status upgrade Upgrade atomcode in-place to the latest released version rollback Roll back to the previous version(swap with .bak on disk)mcp Manage MCP server entriesin.mcp.json... Options: -C,--dirDIRWorking directory(defaults to current directory)-p,--promptPROMPTPrompt to runinheadless(non-interactive)mode --prompt-filePATHRead the prompt from afile-v,--verboseShow tool calls, token usage, and turn summary on stderr -y, --dangerously-skip-permissions Skip all permission prompts -- auto-approve every tool callheadless无头模式是自动化的关键--prompt-file读任务、-y自动批准所有工具调用、-C指定工作目录三者组合即可让 AtomCode 在服务器上「无人值守」地完成开发任务。四、认证与模型配置免费 Token4.1 为什么要登录AtomCode 的命令行外壳本身需要凭证才能调用模型。官方推荐atomcode login走AtomGit OAuth登录后自动领取CodingPlan限免额度并把可用的模型列表写入配置。这一步需要账号私钥无法代为操作但配置落盘后的形态可以完整展示。4.2 登录状态$ atomcode status Loggedinas: cpyaxjq(66612fcc2da91e28f2501347)Name: cpyaxjq Email: cpyaxjqnoreply.gitcode.com Auth file: /root/.atomcode/auth.toml4.3 配置文件~/.atomcode/config.toml真实内容已脱敏default_provider AtomGit-deepseek-v4-flash auto_update true auto_commit false vision_preprocessor_provider AtomGit-Qwen-Qwen3-VL-8B-Instruct keep_interrupted_context true [providers.AtomGit-deepseek-v4-flash] type openai model deepseek-v4-flash base_url https://llm-api.atomgit.com/v1 context_window 1000000 capable_model 0 [providers.AtomGit-Qwen-Qwen3-VL-8B-Instruct] type openai model Qwen/Qwen3-VL-8B-Instruct base_url https://llm-api.atomgit.com/v1 context_window 64000 [subagent] enabled true initial_turns 4 max_turns 12 max_concurrent 3 timeout_secs 300 [loop_config] max_rounds 100 [datalog] enabled true dir ~/.atomcode/datalog参数逐解释default_provider默认走AtomGit-deepseek-v4-flash即通过 AtomGit 的 OpenAI 兼容端点llm-api.atomgit.com/v1调用 DeepSeek V4 Flash 模型Token 限免。context_window 1000000上下文窗口 100 万 token长任务也不易截断。vision_preprocessor_provider图像预处理走 Qwen3-VL-8B处理截图/图片输入。subagent子代理并发执行最多 3 路并发、单路 12 轮、300s 超时。loop_config.max_rounds 100主 Agent 循环上限 100 轮足够复杂任务。datalog每轮 LLM 请求/响应落盘便于复盘后文的run.log即来源于此。五、整体工作流┌─────────────────────────────────────────────────────────────┐ │ 控制端 (Windows) │ │ python atomcode_ssh.py ──paramiko SSH──┐ │ └──────────────────────────────────────────┼──────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 云服务器 117.72.182.3 Ubuntu 22.04 │ │ │ │ ┌───────────────────────────────────────────────────────┐ │ │ │ atomcode (Rust 二进制 5.0.0) /usr/local/bin/atomcode │ │ │ │ headless 模式: --prompt-file task.md -y │ │ │ │ Agent 循环: 规划 → 工具(list/edit/bash) → 自愈 → 完成│ │ │ └───────────────┬───────────────────────────────────────┘ │ │ │ HTTPS │ │ ▼ │ │ https://llm-api.atomgit.com/v1 │ │ 模型: deepseek-v4-flash (CodingPlan 限免) │ │ │ │ 产出: /root/atomcode_demo/ │ │ app.py test_api.py server-probe.service README.md │ │ .venv(flask) │ └─────────────────────────────────────────────────────────────┘思路把开发任务写成一个 Markdown prompt 文件丢给 AtomCode 的 headless 模式让它在一个空目录里自主完成「建项目 → 写代码 → 装依赖 → 跑测试 → 自验证」全流程我们只在最后做人工复核。六、实战用 AtomCode 从零开发server-probe6.1 任务设计prompt 要点任务目标让 AtomCode 在/root/atomcode_demo下从零创建一个名为server-probe的轻量级服务器资产巡检 HTTP 服务。prompt 关键约束明确产物清单app.py/requirements.txt/test_api.py/server-probe.service/README.md避免 Agent 自由发挥生成一堆杂文件。约束实现方式本机不要依赖psutil直接用标准库os/platform/subprocess读取/proc与系统命令——既考验 Agent 对 Linux 内核接口的理解也保证零额外依赖。明确接口契约/healthz、/api/metrics、/api/info三个接口的字段逐一列出含cpu_percent需 1 秒采样。强制自我验证要求创建.venv、pip install、跑pytest直到通过、curl 验证接口并把验证结果写进 README。边界控制「不要做本项目之外的任何改动」防止 Agent 越界操作系统其他文件。6.2 启动 headless5.0.0 现行写法# 把任务写入 prompt 文件后一行启动atomcode --prompt-file /root/atomcode_demo_prompt.md\-C/root/atomcode_demo\-y21|tee/root/atomcode_demo/run.log参数解释--prompt-file读任务文件-C指定工作目录-y等价--dangerously-skip-permissionsheadless 下所有工具调用自动批准并记入日志tee同时留存完整执行日志run.log。6.3 Agent 循环实录run.log 摘录真实输出启动后引擎立即激活并进入规划阶段[engine] active (model deepseek-v4-flash) [headless] --dangerously-skip-permissions: all tool calls are auto-approved [warning] Running with Administrator privileges — model may have access to system files. [thinking] The user wants me to create a server-probe project from scratch ... [thinking] 1. Create app.py with Flask routes [thinking] 2. Create requirements.txt [thinking] 3. Create test_api.py [thinking] 4. Create server-probe.service [thinking] 5. Create README.md [thinking] 6. Set up virtual environment, install deps, run tests, verify [thinking] For cpu_percent, I need to do a 1-second sampling by reading /proc/stat twice. [thinking] cpu_percent 100 * (1 - (idle2 - idle1) / (total2 - total1))可以看到 Agent 自己推导出了 CPU 采样公式读两次/proc/stat算 delta而不是瞎写。随后它调用了list_directory探查目录、用todowrite建立任务清单再逐个创建文件[tool→ list_directory args{path: /root/atomcode_demo}] [tool← list_directory OK 0ms] run.log [tool-streaming← todowrite] {todos:[{content:创建 app.pyFlask 应用三个接口,status:in_progress}, ...]} [tokens] prompt9957 completion279 cached3072 (31% hit)自愈环节本实战最值得记录的一段。Agent 跑 pytest 时撞上默认 60 秒超时[tool→ bash args{command:cd /root/atomcode_demo source .venv/bin/activate pip install pytest -q python -m pytest test_api.py -v 21,timeout:60}] [tool← bash FAILED 60003ms] bash: timed out after 60s — pass a larger timeout if this command legitimately needs longer. [thinking] The pytest command timed out at 60 seconds - this is likely because the /api/metrics endpoint has a 1-second sleep for CPU sampling, and pytest itself might be slow to install. Let me first install pytest first (without timeout), then run the tests ... [tool→ bash args{command:... pip install pytest -q,timeout:120}]Agent 没有放弃而是分析原因装包 1s 采样叠加导致超时拆分成「先装 pytest、再跑测试」两步并加大 timeout最终通过。最终总结已完成 server-probe 项目的全部创建和验证app.py3 个 API 接口、requirements.txt、test_api.py、 server-probe.service、README.md 及虚拟环境 .venv。pytest 3 个测试全部通过三个接口 via app.test_client 验证均返回 HTTP 200 且字段正确。 所有 3 个 pytest 测试再次通过项目完整可运行。 ATOMCODE_EXIT0token 用量末轮缓存命中率 96%~98%说明上下文管理做得不错[tokens] prompt23188 completion201 cached22528 (97% hit) [tokens] prompt23351 completion133 cached22784 (98% hit)6.4 生成的代码真实产物requirements.txt仅一行零额外依赖flaskapp.py关键片段 —— 完全用/proc与标准库实现没用 psutildef_get_cpu_stat():Parse the aggregate cpu line from /proc/stat, return (total, idle).forlinein_read_proc(/proc/stat).split(\n):ifline.startswith(cpu ):partsline.split()fields[int(v)forvinparts[1:]]totalsum(fields)idlefields[3](fields[4]iflen(fields)4else0)returntotal,idlereturn0,0defget_cpu_percent():Sample CPU usage over ~1 second.total1,idle1_get_cpu_stat()time.sleep(1)total2,idle2_get_cpu_stat()delta_totaltotal2-total1 delta_idleidle2-idle1ifdelta_total0:return0.0returnround(100.0*(1.0-delta_idle/delta_total),1)内存读/proc/meminfo、磁盘用os.statvfs(/)、负载读/proc/loadavg、/api/info里还用subprocess.run([atomcode,--version])把 AtomCode 自身版本回显进接口——细节到位。test_api.pypytest三个断言classTestHealthz:deftest_healthz_returns_ok(self,client):respclient.get(/healthz)assertresp.status_code200assertresp.get_json()[status]okclassTestMetrics:deftest_metrics_returns_required_fields(self,client):respclient.get(/api/metrics)assertresp.status_code200dataresp.get_json()assertcpu_countindataassertmem_percentindataclassTestInfo:deftest_info_returns_required_fields(self,client):respclient.get(/api/info)assertresp.status_code200assertkernelinresp.get_json()server-probe.service可直接systemctl使用的 unit[Unit] DescriptionServer Probe - Lightweight Asset Inspection HTTP Service Afternetwork.target [Service] Typesimple Userroot WorkingDirectory/root/atomcode_demo ExecStart/root/atomcode_demo/.venv/bin/flask --app app run --host 127.0.0.1 --port 8088 Restarton-failure RestartSec5 [Install] WantedBymulti-user.target七、人工复核验证Agent 说通过了不算数自己跑一遍才是真验证。7.1 pytest$cd~/atomcode_demosource.venv/bin/activatepython-mpytest test_api.py-vtestsession startsplatform linux -- Python3.10.12, pytest-9.1.1, pluggy-1.6.0 rootdir: /root/atomcode_demo collected3items test_api.py::TestHealthz::test_healthz_returns_ok PASSED[33%]test_api.py::TestMetrics::test_metrics_returns_required_fields PASSED[66%]test_api.py::TestInfo::test_info_returns_required_fields PASSED[100%]3passedin1.12s7.2 接口联调真实启动 curl$nohupflask--appapp run--host127.0.0.1--port8088/tmp/sp.log21$curl-sSlocalhost:8088/healthz{status:ok}$curl-sSlocalhost:8088/api/metrics{hostname:lavm-cw9k5dvspp,boot_time:1783657662,uptime_sec:784398.2,cpu_count:2,cpu_percent:0.5,mem_total_mb:3923.6,mem_used_mb:615.1,mem_percent:15.7,disk_root_total_gb:58.8,disk_root_used_gb:30.5,disk_root_percent:51.8,load_avg:[0.13,0.09,0.08]}$curl-sSlocalhost:8088/api/info{os_name:Linux,os_version:5.15.0-60-generic,kernel:5.15.0-60-generic,python_version:3.10.12,atomcode_version:atomcode 5.0.0 (unknown)}三个接口均返回 200 与正确 JSONatomcode_version字段还实时回显了5.0.0闭环完成。八、踩坑记录真实非杜撰root 运行告警headless 启动即提示Running with Administrator privileges。官方建议以普通用户运行因为 AtomCode 把配置/会话放在~/.atomcoderoot 跑一次会留下 root 属主文件后续普通用户启动会Permission denied。生产环境应建专用用户本机为临时演示故直接 root。headless 默认 60s 超时 → Agent 自愈内置bash工具默认 60s 超时pip install pytest pytest叠加 1s CPU 采样会超时。Agent 能自动拆分命令并加大 timeout 自愈但更稳妥的做法是在 prompt 里显式提示「装包与测试分步执行」。README 验证记录首次未落盘第一次运行时 Agent 把验证结论写进了「最终回复消息」而非 README 文件导致 README 的## 验证记录小节为空。我随后用第二次 headless 调用专门让它补写——这次它确实写进去了但把/api/info的 JSON 少了一个右花括号模型小笔误最终人工修正。结论Agent 的「说」与「写」要分开复核口头报告通过 ≠ 文件已更新。flask 后台进程随 SSH 通道关闭被回收用(flask ... )子shell 启动后paramiko 通道一关进程就被杀curl 拿到Connection refused。改用nohup flask ... 分离即可另外残留实例会导致Address already in use记得pkill -f flask --app app清理。5.0.0 参数变更从 4.26.0 自动升级到 5.0.0 后旧的--max-turns/--disable-tools顶层参数失效脚本需改用--prompt-file f -y写法否则报unexpected argument。九、体验总结优点真正的「终端原生 headless 可自动化」适合接 CI/CD 与远程运维场景这是它区别于 Cursor 等 GUI 工具的核心价值。免费 Token 国产模型直连国内开发者零成本上手context_window1000000对长任务友好。Agent 具备自愈能力超时拆分重试上下文缓存命中率 96%token 利用率高。单文件二进制、零依赖部署门槛极低。不足 / 建议headless 下bash工具默认 60s 超时偏紧建议允许在 prompt 里覆盖默认 timeout。模型偶有小笔误如 JSON 少括号关键产物仍需人工复核 测试兜底——AI 编码是「提效」而非「替人」。root 运行的权限模型可进一步收口避免越界改动系统文件。适用场景脚手架生成、巡检/运维小工具、批量重复性编码、接流水线做自动化重构与测试补全。复杂架构级任务建议人机协同。十、附把成果提交到 AtomGit征文鼓励原创开源项目入驻 AtomGit 平台。把server-probe推上去很简单cd~/atomcode_demogitinitgitadd-Agitcommit-mfeat: server-probe by AtomCode headless# 在 AtomGit 创建空仓库后gitremoteaddorigin gitatomgit.com:cpyaxjq/server-probe.gitgitpush-uorigin main一行atomcode --prompt-file起步一个能跑、有测试、可 systemd 托管的服务就此落地。AtomCode 的「开源 多模型 免费 Token」组合确实把 AI 编码的门槛压到了历史最低——值得一试。本文为「码动四季 · 玩转 AtomCode」征文投稿实战过程均基于真实服务器执行。