花 5 刀买个 VPS 配合 Dokploy 和 MCP 网关,能不能把 Lovable 给替代了
用 Lovable 这种平台虽然爽,描述一下网站 agent 就写好了,直接点发布就行,但一个月得花 25 到 50 刀才能用上像样的档位。最让我不舒服的是代码全在人家那边,而且这个 agent 基本上就只会干这一件事。
既然我已经付了 Claude 的钱,手头又有台装了 Dokploy 的 VPS,其实只要解决 agent 怎么部署的问题就行。市面上像 MetaMCP 或 IBM 的 ContextForge 这种网关不少,但我没找到一个能同时满足多运行时、单容器、自带 OAuth 服务器且 UI 还能看顺眼的方案,干脆自己写了一个 Junctio。
这套方案怎么搭
首先得有个 5 刀的 VPS,内存 1GB 跑网关够用,但 Dokploy 本身需要 2GB 内存。整体链路是这样的:
- 基础环境:VPS + Dokploy
- 网关层:Junctio(我自己写的 MCP 网关,跑在 Dokploy 旁边的容器里)
- 服务端:官方的
@dokploy/mcp服务器,作为 stdio 进程运行在 Junctio 内部 - 交互端:Claude (Desktop/Code)、ChatGPT、Codex 或 Cursor
@dokploy/mcp,最后把工具通过 Streamable HTTP 暴露出来。
# Schema
AI Agent App --OAuth--> Junctio --stdio--> @dokploy/mcp --> Dokploy API
(API key lives here)
实际跑起来是什么样
我给 agent 发指令:“帮我给 X 做个落地页,推送到我的 GitHub,然后在 Dokploy 上部署到 x.example.com”。接下来的操作是自动的:agent 写代码、在 Dokploy 创建应用、关联仓库、绑定域名并触发构建。全过程也就几分钟,大部分时间都花在 Docker 构建上。
为了安全,所有工具调用都会在网关的请求日志里记录方法、工具名、上游状态和耗时,但不会存储 Body 内容,因为参数和结果里可能包含敏感数据,存下来就是个潜在的泄露点。
为什么非要搞个网关,直接用 npx 不行吗
很多人习惯在客户端直接跑 npx @dokploy/mcp,但实际场景里有几个坑:
第一是兼容性。claude.ai 网页版没有 stdio,虽然 Claude Desktop 或 Claude Code 可以启动本地 stdio 服务器,但浏览器端的 AI 或者 ChatGPT 连接器根本做不到,而且它们没法发送 API Key Header。用 Junctio 这种自定义连接器,背后有完整的 OAuth 授权服务器(支持 RFC 8414 元数据、动态客户端注册、PKCE 和同意屏幕),只要添加连接 URL 并在同意界面输入管理员密码就搞定了,不需要去折腾 Cloudflare Worker 包装或者单独搞鉴权服务。
第二是上下文污染。官方的 Dokploy MCP 服务器直接暴露了整个 API,目前有 600 多个工具。给 AI 塞这么多上下文,它经常会选错 application-* 相关的调用。我在 Junctio 里把服务器放在了命名空间下,隐藏了绝大多数工具,只留了大概 20 个最常用的(比如创建项目、创建应用、设置源、设置域名、部署、读日志),并加了一段简短的指令(比如“绝对不要删除,创建数据库前要询问”)。这样 AI 看到的工具集很精简,准确率高多了。
第三是 Key 的管理。如果用 stdio 模式,每台客户端机器的 mcp.json 里都要存一份 Dokploy API Key。用了网关后,Key 只存在服务器一个地方且加密存储,每个客户端分配独立的 OAuth 客户端或 API Key,我想撤权随时在 UI 里点掉就行。
部署配置参考
如果想试下这个结构,可以用下面的 Compose 配置:
services:
junctio:
image: ghcr.io/k2so-dev/junctio:latest
pull_policy: always
restart: unless-stopped
environment:
JUNCTIO_SECRET: ${JUNCTIO_SECRET:?set JUNCTIO_SECRET, e.g. openssl rand -hex 32}
JUNCTIO_BASE_URL: ${JUNCTIO_BASE_URL:?set JUNCTIO_BASE_URL, e.g. https://mcp.example.com}
JUNCTIO_TRUST_PROXY: "true"
JUNCTIO_ADMIN_TOKEN: ${JUNCTIO_ADMIN_TOKEN:-}
LOG_LEVEL: ${LOG_LEVEL:-info}
volumes:
- junctio-data
省钱是省了,但要是真跑出 502 错误,升级 VPS 的钱够买多少个 Supabase 账号?