关于 aghost
aghost 是面向社交账号管理团队的发布与 Instagram 私信自动化服务,支持评论触发的私信流程、排期发布和跨平台分发。它通过仪表板、REST API 和 MCP 提供这些功能及 Agent 访问。
主要功能
- 01创建并监控评论转私信自动化
- 02排期发布关联自动化的 Instagram 帖子
- 03同步发布到 Facebook、LinkedIn、X、Threads 和 YouTube
- 04查看各渠道分析与投递活动
- 05读取收件箱对话并发送消息
适用场景
- 01自动向 Instagram 帖子评论者发送私信
- 02排期发布支持私信活动的 Instagram 帖子
- 03将内容发布到多个社交平台
- 04让 Agent 检查账号活动和收件箱对话
MCP 相关
通过 `/api/mcp` 的 HTTP MCP 端点提供 aghost 工作区操作,并使用工作区 API 密钥认证。Agent 工具涵盖自动化、Instagram 帖子、统计、账号、联系人、收件箱对话和消息。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://aghost.app/api/mcpclaude mcp add --transport http thinking-sound-lab-aghost https://aghost.app/api/mcp{"mcpServers":{"thinking-sound-lab-aghost":{"type":"http","url":"https://aghost.app/api/mcp"}}}在 Cursor 中打开{"servers":{"thinking-sound-lab-aghost":{"type":"http","url":"https://aghost.app/api/mcp"}}}在 VS Code 中打开{"mcpServers":{"thinking-sound-lab-aghost":{"type":"http","url":"https://aghost.app/api/mcp"}}}{"mcpServers":{"thinking-sound-lab-aghost":{"serverUrl":"https://aghost.app/api/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://aghost.app/api/mcp需要授权工具
详细介绍
aghost
面向 Instagram 的 Agent 自动化。
通过 MCP、REST API 或控制面板,创建、管理和监控评论转私信自动化,并安排其回复的 Instagram 帖子。控制面板还支持将内容同步发布到 Facebook、LinkedIn、X、Threads 和 YouTube,并提供各渠道的分析数据。所有套餐均包含 MCP 和 API 访问权限。
技术栈 · 架构 · 本地运行 · 配置 · API · MCP · 分析 · 品牌 · 搜索和 AI 助手 · 测试 · 部署
技术栈
| 层 | 技术 |
|---|---|
| Web | Next.js 营销网站和控制面板、Zustand、shadcn/ui · 部署在 Vercel 上 |
| API | 基于 Node.js 22 的 Fastify,packages/api 中的领域服务 · 部署在 AWS ECS 上 |
| 数据和身份验证 | Supabase Postgres 行级安全、Supabase Auth |
| 渠道 | Zernio 管理六个平台的账户、发布和分析;Instagram 自动化、收件箱和联系人 |
| 分析 | PostHog 用于产品事件、Web 分析和会话回放 |
| 基础设施 | 使用 TypeScript 的 AWS CDK、GitHub Actions、Turborepo、pnpm |
架构
flowchart LR
browser(["Browser"])
subgraph vercel["Vercel"]
web["Next.js<br/>site and dashboard"]
end
subgraph aws["AWS · default VPC"]
gateway["API Gateway<br/>HTTPS"] --> alb["Private<br/>load balancer"] --> api["Fastify API<br/>ECS Fargate"]
end
supabase[("Supabase<br/>Postgres and Auth")]
zernio["Zernio<br/>Instagram API"]
posthog["PostHog<br/>product analytics"]
browser -->|"pages and /api"| web
web -->|"/api/* rewrite"| gateway
web -->|"/relay/* rewrite"| posthog
api --> supabase
api <-->|"calls and webhooks"| zernio
api -->|"business events"| posthog
- 浏览器使用单一源。 页面和
/api共用 Web 应用的源;Next.js 会将/api/*重写到 API。本地运行时,同一代理会指向 Docker 中的 API。 - 应用中放 UI,软件包中放规则。 业务规则和服务提供方调用都位于
packages/api。Web 应用负责渲染 UI,并通过类型化客户端调用 API。 - 租户隔离。 Supabase 行级安全将读取范围限制在工作区内,API 会在执行特权写入前验证用户。账户 Webhook 更新及其去重账本条目会在同一事务中提交。
- 浏览器中不存放凭据。 服务提供方密钥保留在 API 中。会话 Cookie 设为 HttpOnly,并且在 HTTPS 源上使用 Secure 属性。
- Agent 访问。 REST 和 MCP 使用独立的路由模块和设置选项卡。工作区 API 密钥用于验证这两种接口;它们共用业务操作、验证逻辑和权限。密钥哈希仅供后端使用;完整令牌只会显示一次。
本地运行
你需要 Node.js 22 或更高版本、pnpm,以及带 Docker Compose 的 Docker。
pnpm install
pnpm dev
首次运行时会暂停并要求提供 Google OAuth 客户端:请参阅 Google 登录。
pnpm dev 会准备根目录下的 .env,在 Docker 中启动 Supabase 并应用待处理的迁移,在 Docker 中启动 API,然后在主机上启动 Next.js。API 更改会在容器内重新加载;Web 更改则使用热重载。
| 服务 | 地址 |
|---|---|
| Web 应用 | localhost:3000 |
| API | 127.0.0.1:4000 |
| Supabase Studio | localhost:54323 |
关闭 Web 进程后,Docker 服务仍会继续运行;运行 pnpm local:stop 可停止这些服务,同时保留数据库。
说明
此技术栈使用固定的本地端口,因此一次只能在一个工作区中运行。Supabase CLI 会通过
supabase/config.toml管理其容器,而compose.yaml会在 Supabase 的 Docker 网络上运行 API。
命令
| 命令 | 作用 |
|---|---|
pnpm dev | 启动 Docker 后端,然后启动 Web 应用 |
pnpm local:start | 仅启动或重建 Docker 后端。更改环境变量或依赖项后运行此命令 |
pnpm local:stop | 停止 API、webhook 隧道和 Supabase。保留数据库数据 |
pnpm local:logs | 持续输出 API 日志 |
pnpm local:status | 显示 API 容器 |
pnpm local:tunnel | 在你的机器上接收 Zernio webhook(见下文) |
pnpm db:status | 显示本地 Supabase 服务 |
pnpm db:types | 重新生成 packages/supabase/src/database.types.ts |
pnpm db:reset | 重置本地数据库。具有破坏性:仅适用于可丢弃的数据 |
Google 登录
Google 是唯一的登录方式,首次登录时会创建账户。Supabase 会与 Google 完成 OAuth 交换,因此 OAuth 客户端凭据由 Supabase 保存:
- 在 Google Cloud 控制台中,创建类型为 Web application 的 OAuth 客户端 ID。
- 将
http://127.0.0.1:54321/auth/v1/callback添加到其授权重定向 URI。 - 在根目录的
.env中设置SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID和SUPABASE_AUTH_EXTERNAL_GOOGLE_SECRET。
Supabase 会在启动时读取这两个值。更改它们后,或从登录设置不同的分支切换过来后,运行 pnpm local:stop,然后运行 pnpm dev。
在本地接收 Provider Webhook
当 Instagram 账户连接或断开,以及消息发送或接收时,Zernio 会通知 API。消息事件会安排或取消后续提醒。若要在本机接收这些事件,请运行:
pnpm local:tunnel
这会在 Docker 中启动一个 Cloudflare quick tunnel,无需 Cloudflare 账户。只有 /api/webhooks/zernio 和 /api/webhooks/dodo 是公开的;对于其他所有路径,Cloudflare 都会返回 404。配置好 Zernio 后,该命令会:
- 如果根目录
.env中的ZERNIO_WEBHOOK_SECRET为空,则生成该密钥。 - 创建或更新名为
aghost local tunnel的 Zernio Webhook,使其指向该隧道,并订阅account.connected、account.disconnected、message.sent和message.received。 - 要求 Zernio 通过隧道发送测试事件;如果未能送达,则命令会失败。
请设置 ZERNIO_API_KEY 或 Dodo 测试模式 API 密钥。配置好 Dodo 后,该命令还会注册本地订阅/付款 Webhook,将签名密钥存储在根目录 .env 中,并重新创建 API 容器。投递记录及其状态码会显示在 pnpm local:logs 中;401 表示签名与密钥不匹配。
每次启动隧道时,trycloudflare.com 地址都会变化,因此在运行 pnpm local:stop 或重启 Docker 后,请再次运行 pnpm local:tunnel。隧道停止期间,发往旧地址的投递会失败;你可以从 Zernio 的 Webhook 日志中重新发送。连接账户不依赖隧道:授权后,/accounts/callback 会直接从 Zernio 读取账户列表。
配置
仓库根目录的 .env 是唯一的本地配置文件。 模板位于 .env.example。pnpm dev 和 pnpm setup:local 会创建该文件并填入本地 Supabase 密钥,且不会覆盖你设置的值。请勿在 apps/server 或 apps/web 下添加环境变量文件。
| Variable | Read by | Purpose |
|---|---|---|
APP_URL | API, Web | 面向浏览器的源,用于源检查和规范链接 |
API_URL | Web | Next.js 转发 /api 请求的目标位置 |
API_PORT | API | API 监听的端口 |
API_HOST | API | API 监听的接口 |
SUPABASE_URL | API | 主机可访问的 Supabase 地址,也用于测试 |
SUPABASE_PUBLISHABLE_KEY | API | 由设置流程填入 |
SUPABASE_SECRET_KEY | API | 由设置流程填入 |
SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID | Supabase | 用于登录的 Google OAuth 客户端 |
SUPABASE_AUTH_EXTERNAL_GOOGLE_SECRET | Supabase | 该客户端的密钥 |
ZERNIO_API_URL | API | Zernio API |
ZERNIO_API_KEY | API | 启用 Instagram 功能;留空则无法使用 |
ZERNIO_WEBHOOK_SECRET | API | 验证 Webhook 签名;pnpm local:tunnel 会生成一个 |
DODO_PAYMENTS_ENVIRONMENT | API | 本地使用 test_mode;生产环境账单使用 live_mode |
DODO_PAYMENTS_API_KEY | API | 启用结账、套餐变更和账单门户 |
DODO_PAYMENTS_WEBHOOK_KEY | API | 验证 Dodo 订阅和付款 Webhook 签名 |
POSTHOG_KEY | API, Web | PostHog 项目密钥;留空则关闭分析 |
POSTHOG_HOST | API, Web | 项目所在区域的 PostHog 地址 |
仪表板、REST API 和 MCP 都需要套餐:登录后,应用只会显示付费墙,直到工作区订阅为止,因此请配置 Dodo,以便在本地使用。若要连接渠道,还需设置 ZERNIO_API_KEY。Pro、Growth 和 Business 每月分别收费 $29 / $39 / $49,可使用 1 / 2 / 10 组社交账号;每组在每个平台上包含一个账号,所有国家均以美元计费并包含税费。按年付费约可便宜 20%,需预先支付。请参阅定价和账单设置与渠道。没有 Dodo 凭据时,可以登录,但无法订阅。没有 Zernio 凭据时,Instagram 功能不可用;应用绝不会使用示例账号或分析数据作为替代。
- 只有
APP_URL、API_URL以及 PostHog 密钥和主机地址会传给 Next.js;PostHog 密钥本来就是公开的。Supabase、Zernio 和 Dodo 凭据仅传给 API 容器,Google 客户端仅传给 Supabase。Env 文件会被 Git 忽略,也不会包含在 Docker 镜像中。 - Compose 会将
http://supabase_kong_aghost:8000设为 API 容器的SUPABASE_URL,使其通过 Docker 网络与 Supabase 通信。 - 对于公开或隧道部署,请更新
APP_URL,并在 Supabase 的重定向 URL 中允许/api/auth/callback。Zernio 会将已授权的 Instagram 连接重定向到/accounts/callback。 - 部署环境会直接注入这些变量;无需 Env 文件。
API
打开 Settings → API,点击 + API key,并在对话框中为工作区密钥命名。创建后,请在关闭对话框前复制并保存密钥;完整密钥不会再显示。Agent 可以创建、编辑、暂停、启用和删除自动化;通过自动化安排、编辑和取消 Instagram 帖子;检查统计数据和投递活动;读取账号、帖子、联系人和收件箱对话;以及发送收件箱消息。
使用 Authorization: Bearer <key> 调用 <APP_URL>/api/v1。新密钥拥有完整的 Agent 访问权限,且永不过期;在 Settings 中撤销密钥即可停止访问。GET /api/v1/openapi.json 提供 REST API 契约。请求示例和部署要求请参阅 REST API 指南。
MCP
打开 Settings → MCP 查看端点和客户端配置。Copy skill 会向 Claude Code、Codex、Cursor 或其他 Agent 提供配置连接的说明。搭配 HTTP MCP 客户端和在 API 标签页中创建的密钥,使用 <APP_URL>/api/mcp。新密钥可使用所有 Aghost Agent 工具。Claude 自定义连接器等可登录 MCP 服务的应用只需要 URL:所有者在 aghost 中批准应用后,应用便会获得自己的密钥。
MCP 在与 API 相同的服务器上拥有独立的后端路由模块。有关客户端设置、可用工具和示例,请参阅 MCP 指南。
Analytics
PostHog 会端到端记录产品数据。浏览器通过同源 /relay 记录页面浏览、点击、Web Vitals、错误和会话回放。API 会记录发生的各种事件,无论操作来自仪表盘、通过 REST 或 MCP 连接的 Agent,还是 Webhook:注册、结账、订阅变更和收入、账号连接、自动化,以及每次 Agent 工具调用。浏览器和 API 事件会关联已登录用户的 ID,并按工作区分组。Instagram 用户的消息和联系人不会出现在会话回放中。
设置 POSTHOG_KEY 和 POSTHOG_HOST 即可启用。有关生产环境设置、事件目录及其可解答的问题,请参阅分析指南。
Brand
吉祥物就是 Logo。mascot.png 是唯一的源图像;apps/web/app 中的 favicon、Apple 图标和分享图像均由它生成。仪表盘使用 Inter。营销页面使用 Anton 标题和 Caveat 手写注释,正文则使用 Inter;Next.js 在本地提供这些字体。
| 颜色 | Hex | 用途 |
|---|---|---|
| Aghost Green | #22DC72 | 主色 |
| Blue | #145BFF | 强调色 |
| Cyan | #13C9D1 | 强调色 |
| Orange | #FFB213 | 强调色 |
| Red | #FF3B18 | 强调色 |
| Black | #000000 | 中性色 |
| Gray | #687280 | 中性色 |
| Off White | #F6F7F8 | 中性色 |
这些颜色是 globals.css 中的 Tailwind 令牌:bg-brand、bg-brand-blue、text-brand-gray 等。绿色按钮使用黑色文字,因为白色文字在 Aghost Green 背上过于浅淡,难以辨认。营销网站通过 notebook.css 中的作用域样式添加横线纸、方格纸、粉彩便签和带胶带的产品预览。仪表盘保持中性色调,仅使用 Logo。
搜索和 AI 助手
营销页面会向搜索引擎和 ChatGPT、Claude、Perplexity 等 AI 助手提供易于阅读的 HTML 页面。这些页面介绍 Instagram 评论转私信自动化、相关要求和支持的功能。Instagram 私信自动化指南说明了 aghost 在社交媒体管理中的定位:它会安排 Instagram 帖子,并同时安排回复这些帖子的自动化流程;它不管理其他社交网络。
- 一份文本,多处使用。
content.ts集中存放事实、步骤、功能和问题。页面、结构化数据和/llms.txt都读取该文件,因此爬虫看到的内容与访客看到的一致。 - Agent 访问。 首页、功能演示和专门的 Agent 页面介绍了 Claude Code、Codex、Cursor 或其他 MCP 客户端如何运行 aghost。
- 先提供答案。 指南开篇即定义产品,并使用描述性标题介绍设置、使用场景、要求和统计数据。页脚和功能页面链接让用户无需 JavaScript 也能发现该指南。
- 结构化数据。 首页使用 JSON-LD 将可见内容描述为
Organization、WebSite、WebApplication和FAQPage。指南则添加与可见面包屑相符的WebPage和BreadcrumbList数据。两者都不声称存在评论或评分。 - 爬取。
robots.ts允许公共页面爬虫访问,并为 Googlebot、Bingbot、OpenAI 搜索、Claude 搜索、Perplexity 搜索及其用户请求的抓取器设置了明确的规则组。每个规则组都禁止访问/api/,但公共设置技能/api/mcp/skill.md和分析中继/relay/除外。sitemap.ts列出了公共页面。已登录页面会返回noindex。 /llms.txt。 面向选择读取此文件的助手提供纯文本摘要。它会先链接到产品说明、功能、当前定价和支持信息,再介绍 Agent 设置。这是为了方便使用,并非建立索引的前提,也不保证内容会被引用。
规范链接、站点地图和结构化数据使用网站的公共来源:本地使用 APP_URL,在 Vercel 上使用项目的生产域名。
发布后,请确认生产来源正确、公共页面无需登录或通过机器人验证即可返回 HTTP 200,并且 CDN 或防火墙允许已验证的搜索爬虫访问。在 Google Search Console 和 Bing Webmaster Tools 中提交站点地图,然后检查索引状态和爬虫日志。本地检查无法确认生产环境中的索引状态或引用情况。
此实现遵循 OpenAI 的爬虫指南、Anthropic 的爬虫指南、Perplexity 的爬虫指南以及 Google 关于 AI 功能的指南。这些服务会自行选择要索引和引用的来源。允许爬取并提供有帮助的内容可以提高入选机会,但无法保证内容会针对任何关键词出现。
项目结构
.
├── apps
│ ├── web/ Next.js pages, UI features, and Zustand stores
│ └── server/ Fastify entry point and Dockerfiles
├── packages
│ ├── api/ Contracts, client, services, routes, Supabase and Zernio adapters
│ ├── env/ Validation of environment variables
│ ├── supabase/ Database clients and generated types
│ └── ui/ Shared shadcn components
├── infra/ AWS CDK app for the API
├── supabase/ CLI config and forward-only migrations
├── scripts/ Local setup, env, and verification helpers
├── .github/ CI and deployment workflows
├── compose.yaml Local API container, webhook tunnel, and Supabase network
└── .env.example The configuration template
测试
pnpm verify # unused code, types, lint, tests, and production builds
pnpm check:unused # unused files, dependencies, and exports across workspaces
pnpm verify:local # end-to-end checks against the running app
pnpm verify 会针对本地 Supabase 堆栈运行集成测试,因此请先使用 pnpm setup:local 或 pnpm dev 启动它。CI 则使用 pnpm setup:test,只启动测试所需的内容。Provider 适配器测试使用本地 HTTP 测试夹具,不会发送真实的 Instagram 消息。基础设施测试会离线合成两个 CDK 堆栈。
pnpm check:unused 也会在 CI 中运行。其 Knip 配置包含计费和 CDK 命令行入口,保留生成的 Supabase 辅助工具,并考虑通过配置加载的 PostCSS 和 CDK 依赖项。
OAuth 注册饱和度测试会耗尽全局的一分钟预算,因此在共享的本地堆栈上会跳过该测试。如果 .env 指向专用的本地 Supabase 数据库,可运行 AGHOST_TEST_ISOLATED_DATABASE=1 pnpm test 来包含该测试。CI 会在全新数据库上启用该测试;其他 OAuth 测试无需此标志即可运行。
应用运行后,pnpm verify:local 会检查页面、Next.js 代理以及 Google 登录流程的启动过程:HttpOnly PKCE Cookie、使用根目录 .env 中客户端发起的 Google 重定向,以及登录未完成时返回登录页面的流程。使用 Google 账号登录、浏览器交互和视觉检查属于单独的检查。
实时 OAuth 和评论转私信的投递需要 Zernio 凭据以及获授权的 Instagram 专业账号。
部署
flowchart LR
pr(["Pull request"]) --> checks["CI<br/>GitHub Actions"]
pr --> preview["Web preview<br/>Vercel"]
main(["Push to main"]) --> gate["CI"] --> migrate["Supabase<br/>migrations"] --> api["API<br/>AWS ECS"]
main --> web["Web<br/>Vercel"]
| 工作流 | 运行时机 | 步骤 |
|---|---|---|
ci.yml | 拉取请求、发布 | 格式检查、lint、类型检查、测试、构建 |
deploy.yml | 推送到 main、手动运行 | CI → 一个 Release 作业:迁移 → API |
actions/setup | 每个作业 | pnpm、Node.js 22 和依赖项 |
推送到 main 会在一个作业中发布后端,因此发布只需一次审批,且各步骤按顺序运行:先处理架构,再部署使用该架构的 API。只有 main 可以发布;其他分支会被工作流和 prod 环境拒绝。API 未更改时,部署会作为空操作完成:其映像仅使用服务器的程序包构建,因此 CDK 会发现映像已在 ECR 中,而 CloudFormation 会发现没有变更。
Vercel 上的 Web
营销网站和仪表板是同一个 Next.js 应用。Vercel 的 Git 集成会构建该应用:每个拉取请求都会生成预览版本,每次推送到 main 都会部署生产版本。GitHub 中不会存储 Vercel 凭据。
生产环境通过 https://aghost.app 提供服务;www.aghost.app 会重定向到该地址。
说明
Vercel 和 Release 作业会从同一次推送启动,并各自独立完成,通常 Vercel 会先完成。请确保 API 变更与当前已上线的 Web 应用兼容,或者先合并 API 变更。
Vercel CLI 不会读取 .gitignore,因此 .vercelignore 会将本地环境文件排除在开发者机器上的手动部署之外。
AWS 上的 API
infra/ 使用 AWS CDK 定义 API:
- 计算。 x86_64 Fargate 任务,数量根据 CPU 需求在 2 到 4 个之间。自动扩缩负责管理任务数量,因此部署不会重置任务数量。
- 地址。 API Gateway HTTPS 端点,无需域名、DNS 记录或证书。它通过 VPC 链路连接到私有负载均衡器。
- 网络。 账户的默认 VPC。任务会获取公有地址,用于向 Supabase、Zernio 和 ECR 发起出站调用;任务的安全组仅允许来自负载均衡器的流量,而负载均衡器仅允许来自 API Gateway 的流量。
- 镜像。 根据
turbo prune server --docker的输出构建:仅包含服务端的工作区包及其依赖项,不包含其他内容。 - 密钥。 Supabase 和 Zernio 凭据在任务启动时从 Secrets Manager 获取。
- 发布。 新任务必须通过
/api/health检查后,旧任务才会停止;如果发布始终未能通过健康检查,断路器会回滚发布。日志保留 30 天。 - 访问。 GitHub Actions 通过 OIDC 登录,无需存储 AWS 密钥。其角色只能使用
cdk bootstrap创建的角色。
infra
├── bin/app.ts Reads the stage's settings and creates the stacks
├── lib/config.ts Validates the settings and names any missing variable
├── lib/build-context.ts Prunes the repository to the server for the image
├── lib/stacks/api-stack.ts Default VPC, image, DNS zone, and credentials of a stage
├── lib/constructs/api-service.ts Fargate service, load balancer, health checks, scaling
├── lib/stacks/github-deploy-stack.ts The role GitHub Actions deploys with
└── test/ Assertions on the synthesized templates
一次性设置
1. AWS。 在仓库根目录下,使用管理员凭据运行:
export STAGE=prod AWS_ACCOUNT_ID=123456789012 AWS_REGION=ap-south-1 \
APP_URL=https://aghost.app SUPABASE_URL=https://your-project.supabase.co
pnpm --filter infra exec cdk bootstrap "aws://$AWS_ACCOUNT_ID/$AWS_REGION"
aws iam create-open-id-connect-provider \
--url https://token.actions.githubusercontent.com --client-id-list sts.amazonaws.com
aws secretsmanager create-secret --name aghost/prod/api --secret-string '{
"SUPABASE_PUBLISHABLE_KEY": "…",
"SUPABASE_SECRET_KEY": "…",
"ZERNIO_API_KEY": "…",
"ZERNIO_WEBHOOK_SECRET": "…",
"DODO_PAYMENTS_ENVIRONMENT": "live_mode",
"DODO_PAYMENTS_API_KEY": "…",
"DODO_PAYMENTS_WEBHOOK_KEY": "…"
}'
pnpm --filter infra exec cdk deploy --all
部署会输出第 3 步所需的 DeployRoleArn,以及 API 地址 ApiUrl,供第 2 步使用。
说明
如果账户中已存在
cdk bootstrap和create-open-id-connect-provider,则跳过它们;堆栈会使用现有资源。如果该区域的默认 VPC 已删除,请使用aws ec2 create-default-vpc重新创建。supabase projects api-keys --reveal会打印 Supabase 密钥;如果不加--reveal,密钥会被隐藏且无法使用。
2. Vercel。 创建一个根目录为 apps/web 的项目,将其连接到 GitHub 仓库,并在 Production 和 Preview 环境中添加 API_URL=<ApiUrl>。APP_URL 是 Vercel 为项目提供的访问地址。Web 应用会从 Vercel 自己的 VERCEL_PROJECT_PRODUCTION_URL 读取该地址,因此项目无需设置自己的 APP_URL;只有在规范链接中要发布不同地址时才需要设置。
3. GitHub。 在 Settings → Environments 下创建 prod,将其部署分支限制为 main,并添加:
| 名称 | 类型 | 值 |
|---|---|---|
AWS_ACCOUNT_ID | Variable | 12 位账户 ID |
AWS_REGION | Variable | 例如 ap-south-1 |
AWS_DEPLOY_ROLE_ARN | Variable | 第 1 步中的 DeployRoleArn |
APP_URL | Variable | Web 来源地址,例如 https://aghost.app |
SUPABASE_URL | Variable | https://<project>.supabase.co |
SUPABASE_PROJECT_ID | Variable | Supabase 项目的引用 ID |
SUPABASE_POOLER_URL | Variable | 项目的会话池地址 |
SUPABASE_ACCESS_TOKEN | Secret | 范围受限的 Supabase 访问令牌 |
在 Supabase 控制面板的 Account → Access Tokens 下创建令牌。将范围仅限定为此项目,并授予 Database: Read-write 权限。Release 作业会使用此令牌为迁移创建短期数据库角色,因此无需存储数据库密码。
GitHub 的运行器不支持 IPv6,而数据库的直接地址仅支持 IPv6,因此迁移通过 IPv4 会话池连接。其地址不含密码:postgresql://postgres.<project>@<pooler-host>:5432/postgres,可在控制面板的 Connect → Session pooler 下查看,也可通过 supabase link 保存到 supabase/.temp/pooler-url。
提示
在
prod环境中添加必需的审核者,以便在每次发布启动前进行审批。
4. Supabase、Google 和 Zernio。 在 Supabase 控制面板的 Authentication 下,使用 OAuth 客户端 ID 和密钥启用 Google 提供方,禁用 Email 提供方,并在重定向 URL 中允许 <APP_URL>/api/auth/callback。在 Google Cloud 控制台中,将 https://<project>.supabase.co/auth/v1/callback 添加到该客户端的已授权重定向 URI。将 Zernio Webhook 指向 <ApiUrl>/api/webhooks/zernio,使用相同的密钥,并订阅 account.connected、account.disconnected、message.sent 和 message.received。在 API 发布前应用 20261016090000_carousels_and_follow_ups.sql;请参阅功能发布流程。
说明
Google 登录会返回到
APP_URL,API 只接受来自其来源的写入请求。预览环境可以显示网站和控制面板,但无法从预览环境登录。
更改域名
将网站迁移到其他域名分为四个步骤,按以下顺序进行。直到第 3 步将登录地址切换到新域名之前,旧地址仍可用于登录。
- Vercel。 在项目的 Settings → Domains 中添加域名。如果 Vercel 的 Production 环境设置了
APP_URL,请将其更新为新的源站,或将其移除以使用VERCEL_PROJECT_PRODUCTION_URL。然后重新部署生产环境,使规范链接、站点地图和/llms.txt使用新域名。 - Supabase。 在 Authentication → URL Configuration 中,将站点 URL 设置为新的源站,并将
<new origin>/api/auth/callback添加到重定向 URL。 - GitHub。 在
prod环境中设置APP_URL,然后运行 Deploy 工作流。这样,API 会将登录、结账和 Instagram 连接重定向到新的源站,并且只接受来自该源站的仪表板写入请求。 - 旧地址。 在 Vercel 项目中添加路由规则,将旧地址的页面重定向到新源站,同时保留
/api:主机为<old address>,模式为^/(?!api/)(.*)$,目标为<new origin>/$1,状态码为 308。使用旧地址配置的 Agent 和 Webhook 仍可正常工作,因为 API 密钥和 Webhook 签名不与源站绑定。请锚定该模式;如果没有^,它也会匹配/api路径中的内容。
然后将新源站添加到 PostHog 项目的授权 URL 中,并将其站点地图提交到搜索引擎站长工具。
审查基础设施变更
使用 AWS 凭据和第 1 步中的变量,将变更与已部署的内容进行比较:
pnpm --filter infra exec cdk diff Aghost-prod-Api
合成过程会查询账户中的默认 VPC,因此需要凭据;测试使用录制的副本,可离线运行。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。