使用说明
开发运维
A. 模型上下文协议 (MCP)服务器,允许AI助手管理在Linux VPS服务器上运行的应用程序。注册你的应用程序一次,然后部署、重启、检查日志,并通过自然对话运行命令。
为什么要用这个?
管理少数VPS服务器意味着不断在SSH会话之间切换,记住服务名称,并一遍又一遍地键入相同的部署序列。 devops 消除了这种摩擦:
- 通过克劳德与您的服务器交谈。 “部署API,”“给我看工人的日志”“在prod上重新启动nginx”——所有这些都不需要打开终端。
- 一个命令启动一个新的服务器。 SSH强化、防火墙、Docker日志轮换、自动安全更新——在几秒钟内应用,而不是数小时的手动配置。
- 一切都经过审计。 每次命令执行都会记录到本地SQLite数据库中。你总是知道跑了什么,在哪里,什么时候。
- 没有特工暴露在互联网上。 远程代理监听Unix套接字,只能通过经过身份验证的SSH访问。没有开放端口,没有API密钥可旋转,没有攻击面。
运作原理
单二进制,两种模式:
┌─────────────────────┐ SSH ┌─────────────────────┐
│ Your machine │ ──────────────────▶ │ Linux VPS │
│ │ │ │
│ Claude ◀──▶ devops │ SSH channel fwd │ devops agent │
│ (MCP stdio) │ ──────────────────▶ │ (unix socket HTTP) │
│ │ │ │
│ SQLite (metadata) │ │ systemd / docker │
└─────────────────────┘ └─────────────────────┘
MCP模式(devops) 是默认值。它作为MCP服务器在您的计算机上运行,将应用程序元数据存储在SQLite中,并维护到您的服务器的持久SSH连接池。
代理模式(devops agent) 作为systemd服务在每个VPS上运行。它通过Unix套接字接受HTTP请求并执行操作(服务管理、部署、日志检索、任意命令)。
通信通过SSH通道转发进行——本地二进制文件通过SSH连接拨打Unix套接字。没有额外的端口,没有API令牌,没有要管理的TLS证书。
安全模型
远程代理以root身份运行(对于 systemctl 和 docker 这使得安全边界变得至关重要。以下是如何保持安全:
无网络暴露
代理程序仅在Unix套接字上侦听 /run/devops-agent/agent.sock 和 0600 权限。没有TCP侦听器。到达它的唯一方法是通过一个经过身份验证的SSH会话,该会话将通道转发到套接字。攻击者在不首先破坏SSH访问的情况下无法连接到代理。
SSH作为唯一的入口
所有身份验证和加密都由OpenSSH处理。该工具使用现有SSH密钥进行基于密钥的身份验证(~/.ssh/id_ed25519 或 ~/.ssh/id_rsa,可通过以下方式覆盖每个应用程序 key_path).已在引导的服务器上禁用密码身份验证。
引导服务器强化
当你引导一个新服务器时, devops 自动应用:
- SSH硬化 --密码身份验证已禁用,键盘交互已禁用,root登录仅限于密钥,最多3次身份验证尝试,X11转发已禁用
- 防火墙(UFW) --默认拒绝传入,只允许SSH(22)、HTTP(80)、HTTPS(443)
- 自动安全更新 --仅为安全补丁配置无人值守升级,不自动重新启动
- 内核调优 --TCP积压、连接重用、针对服务器工作负载优化的内存交换
- Docker强化 --JSON文件日志记录,带旋转(10MB,3个文件),支持实时还原,覆盖2存储驱动程序
命令过滤
代理强制执行硬编码的安全不变量,在执行之前阻止危险的命令。通过提交的每个命令 /exec 或 /deploy 根据这些过滤器进行检查:
- 破坏性命令 --
rm -rf /,mkfs,dd if=,shred,wipefs总是被封锁。rm -rf /opt/myapp允许(路径感知检测)。 - 防火墙篡改 --禁用、删除或刷新防火墙规则(
ufw disable,iptables -F,nft flush等等)并阻止停止防火墙服务。 - SSH中断 --停止或禁用
ssh/sshd服务被阻止。 - 电源命令 --
reboot,shutdown,halt,poweroff默认情况下被阻止,但可以通过过滤器配置为每个主机启用。 - 油孔开启 --除非端口在允许列表中,否则打开防火墙端口的命令将被阻止。
- 自定义筛选器 --可以通过以下方式为每个主机添加其他模式
devops_filter_add并通过以下方式同步到代理devops_filter_sync.
被阻止的命令返回HTTP 403。过滤器不区分大小写 strings.Contains 匹配——这是深度防御,而不是沙盒。SSH身份验证仍然是主要的安全边界。
最小药剂表面
该代理仅公开10个HTTP端点: /ping, /filters, /exec, /service, /logs, /health, /discover, /deploy, /sync-apps,以及 /redeploy每个端点验证其输入并确定其操作范围。
输入验证
这两种模式都会验证所有输入:在执行任何操作之前,会根据严格的允许列表检查主机名、服务名、端口、路径和运行时。
安装
先决条件
- 转到1.22+
- 仅仅 (任务运行器,可选但推荐)
- 通过SSH密钥身份验证对Linux VPS进行根访问。 在使用之前,您必须在服务器上安装SSH密钥
devops密码身份验证不受支持,也永远不会支持——该工具通过SSH以编程方式进行通信,这与交互式密码提示根本不兼容。如果您还没有设置基于密钥的访问,请先进行设置(ssh-copy-id root@your-server).
从源代码构建
git clone https://github.com/hegner123/devops.git
cd devops
# Build the binary
just build
# Install to your PATH
just install
无需手动构建 just:
# Local MCP binary (runs on your machine)
go build -o devops .
# Remote agent (same binary, cross-compiled for Linux)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o devops-linux-amd64 .
# Install
cp devops /usr/local/bin/devops
使用克劳德代码注册
claude mcp add --transport stdio devops -- /usr/local/bin/devops
入门
1.引导服务器
点 devops 在一个新的VPS。它将安装代理、强化SSH、配置防火墙并设置自动安全更新:
You: "Bootstrap my server at 203.0.113.10"
Claude: calls devops_bootstrap with host=203.0.113.10
→ installed 0.2.9, server configured
对于后续运行,引导程序会检测现有代理,并在有新版本可用时对其进行升级。
2.注册应用程序
告诉Claude您的服务器上运行的应用程序:
You: "Register my API app on 203.0.113.10. It's a Docker Compose service
called 'api' at /opt/api with deploy commands: git pull, docker compose up -d"
Claude: calls devops_add
→ added app "api" on 203.0.113.10
或者自动导入现有部署——代理检查目录并发现运行时、服务、仓库URL和分支:
You: "Import whatever is running at /opt/api on 203.0.113.10, call it 'api'"
Claude: calls devops_import
→ discovered docker runtime, compose file, 2 services
3.管理您的应用程序
注册后,您可以按名称管理应用程序:
"Deploy the API" → devops_deploy
"Show me the API logs" → devops_logs
"Restart the API" → devops_restart
"What's the status of the API?" → devops_status
"Check if the API health endpoint is up" → devops_health
"Run 'df -h' on the API server" → devops_exec
"Stop the worker" → devops_stop
工具参考
| 工具 | 说明 |
|---|---|
devops_list |
列出所有已注册的应用程序,可选择按主机筛选 |
devops_add |
注册新应用程序(需要名称、主机、service_name) |
devops_remove |
注销应用程序(不影响正在运行的服务) |
devops_update |
更新应用程序的配置(支持部分更新) |
devops_import |
从目录中自动发现和导入现有部署 |
devops_status |
从远程代理获取当前服务状态 |
devops_deploy |
在服务器上运行带有流式输出的部署命令 |
devops_restart |
重新启动服务(systemd或docker compose) |
devops_stop |
停止服务 |
devops_logs |
检索最近的服务日志(默认值:50行) |
devops_exec |
在服务器上执行shell命令(支持管道、重定向) |
devops_health |
根据应用程序配置的健康URL进行HTTP健康检查 |
devops_bootstrap |
在主机上安装或升级代理,并强化服务器 |
devops_version |
返回工具版本 |
devops_filter_add |
为主机添加自定义命令筛选器 |
devops_filter_list |
列出自定义命令筛选器(可选按主机) |
devops_filter_remove |
删除自定义命令筛选器 |
devops_filter_sync |
将筛选器和端口/重新启动/关闭设置同步到远程代理 |
devops_app_sync |
将应用程序配置从本地数据库推送到远程代理以进行自我重新部署 |
应用程序配置
注册或更新应用程序时,以下字段可用:
| 字段 | 必填 | 默认 | 描述 |
|---|---|---|---|
name |
yes | -- | 应用程序的唯一标识符 |
host |
是 | -- | 服务器主机名或IP |
service_name |
是 | -- | Systemd单元或Docker Compose服务名称 |
port |
没有 | 22 | SSH端口 |
user |
无 | root | SSH用户 |
runtime |
没有 | docker | docker 或 systemd |
compose_file |
no | -- | docker-compose.yaml(docker运行时)的路径 |
repo_url |
否 | -- | Git存储库URL |
branch |
no | main | Git分支 |
deploy_dir |
no | -- | 执行部署命令的目录 |
binary_path |
no | -- | 二进制文件路径(systemd运行时) |
health_check_url |
没有用于健康检查的HTTP端点 | ||
deploy_commands |
没有 | [] |
部署期间要运行的shell命令的JSON数组 |
notes |
否 | -- | 自由格式元数据 |
key_path |
没有 | ~/.ssh/id_ed25519 |
SSH私钥路径(默认:~/.SSH/id_edu25519,回退:~/.sssh/id_rsa) |
将代理部署到服务器
第一次(引导)
使用 devops_bootstrap它处理一切:配置文件、防火墙、代理二进制文件下载、systemd服务设置。
更新代理
要么跑 devops_bootstrap 再次(它检测现有代理并升级)或手动部署:
just agent-deploy your-server.com
这将构建Linux二进制文件,将其复制到服务器,并重新启动服务。
本地数据
应用程序元数据和命令审核日志存储在SQLite中:
$HOME/.local/share/devops/devops.db
用覆盖 DEVOPS_DB_PATH 环境变量。
发展
just test # Run all tests
just build # Build the binary
just clean # Remove built binary
测试使用内存中的SQLite和模拟代理(Unix套接字httptest服务器)。不需要真正的SSH连接或远程主机。
平台支持
- macOS(本地MCP工具)
- Linux(本地MCP工具和远程代理)
不支持Windows。
许可证
麻省理工学院