mcpField
A
aghost

aghost

远程服务
aghost.app社交媒体02 天前更新

关于 aghost

aghost 是面向社交账号管理团队的发布与 Instagram 私信自动化服务,支持评论触发的私信流程、排期发布和跨平台分发。它通过仪表板、REST API 和 MCP 提供这些功能及 Agent 访问。

主要功能

  1. 01创建并监控评论转私信自动化
  2. 02排期发布关联自动化的 Instagram 帖子
  3. 03同步发布到 Facebook、LinkedIn、X、Threads 和 YouTube
  4. 04查看各渠道分析与投递活动
  5. 05读取收件箱对话并发送消息

适用场景

  1. 01自动向 Instagram 帖子评论者发送私信
  2. 02排期发布支持私信活动的 Instagram 帖子
  3. 03将内容发布到多个社交平台
  4. 04让 Agent 检查账号活动和收件箱对话

MCP 相关

通过 `/api/mcp` 的 HTTP MCP 端点提供 aghost 工作区操作,并使用工作区 API 密钥认证。Agent 工具涵盖自动化、Instagram 帖子、统计、账号、联系人、收件箱对话和消息。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://aghost.app/api/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
Streamable HTTPhttps://aghost.app/api/mcp需要授权

工具

详细介绍

aghost 吉祥物,一个带有四个彩色光球的绿色幽灵

aghost

面向 Instagram 的 Agent 自动化。

通过 MCP、REST API 或控制面板,创建、管理和监控评论转私信自动化,并安排其回复的 Instagram 帖子。控制面板还支持将内容同步发布到 Facebook、LinkedIn、X、Threads 和 YouTube,并提供各渠道的分析数据。所有套餐均包含 MCP 和 API 访问权限。

部署

技术栈 · 架构 · 本地运行 · 配置 · API · MCP · 分析 · 品牌 · 搜索和 AI 助手 · 测试 · 部署


技术栈

层技术
WebNext.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
API127.0.0.1:4000
Supabase Studiolocalhost: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 保存:

  1. 在 Google Cloud 控制台中,创建类型为 Web application 的 OAuth 客户端 ID。
  2. 将 http://127.0.0.1:54321/auth/v1/callback 添加到其授权重定向 URI。
  3. 在根目录的 .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 后,该命令会:

  1. 如果根目录 .env 中的 ZERNIO_WEBHOOK_SECRET 为空,则生成该密钥。
  2. 创建或更新名为 aghost local tunnel 的 Zernio Webhook,使其指向该隧道,并订阅 account.connected、account.disconnected、message.sent 和 message.received。
  3. 要求 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 下添加环境变量文件。

VariableRead byPurpose
APP_URLAPI, Web面向浏览器的源,用于源检查和规范链接
API_URLWebNext.js 转发 /api 请求的目标位置
API_PORTAPIAPI 监听的端口
API_HOSTAPIAPI 监听的接口
SUPABASE_URLAPI主机可访问的 Supabase 地址,也用于测试
SUPABASE_PUBLISHABLE_KEYAPI由设置流程填入
SUPABASE_SECRET_KEYAPI由设置流程填入
SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_IDSupabase用于登录的 Google OAuth 客户端
SUPABASE_AUTH_EXTERNAL_GOOGLE_SECRETSupabase该客户端的密钥
ZERNIO_API_URLAPIZernio API
ZERNIO_API_KEYAPI启用 Instagram 功能;留空则无法使用
ZERNIO_WEBHOOK_SECRETAPI验证 Webhook 签名;pnpm local:tunnel 会生成一个
DODO_PAYMENTS_ENVIRONMENTAPI本地使用 test_mode;生产环境账单使用 live_mode
DODO_PAYMENTS_API_KEYAPI启用结账、套餐变更和账单门户
DODO_PAYMENTS_WEBHOOK_KEYAPI验证 Dodo 订阅和付款 Webhook 签名
POSTHOG_KEYAPI, WebPostHog 项目密钥;留空则关闭分析
POSTHOG_HOSTAPI, 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_IDVariable12 位账户 ID
AWS_REGIONVariable例如 ap-south-1
AWS_DEPLOY_ROLE_ARNVariable第 1 步中的 DeployRoleArn
APP_URLVariableWeb 来源地址,例如 https://aghost.app
SUPABASE_URLVariablehttps://<project>.supabase.co
SUPABASE_PROJECT_IDVariableSupabase 项目的引用 ID
SUPABASE_POOLER_URLVariable项目的会话池地址
SUPABASE_ACCESS_TOKENSecret范围受限的 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 步将登录地址切换到新域名之前,旧地址仍可用于登录。

  1. Vercel。 在项目的 Settings → Domains 中添加域名。如果 Vercel 的 Production 环境设置了 APP_URL,请将其更新为新的源站,或将其移除以使用 VERCEL_PROJECT_PRODUCTION_URL。然后重新部署生产环境,使规范链接、站点地图和 /llms.txt 使用新域名。
  2. Supabase。 在 Authentication → URL Configuration 中,将站点 URL 设置为新的源站,并将 <new origin>/api/auth/callback 添加到重定向 URL。
  3. GitHub。 在 prod 环境中设置 APP_URL,然后运行 Deploy 工作流。这样,API 会将登录、结账和 Instagram 连接重定向到新的源站,并且只接受来自该源站的仪表板写入请求。
  4. 旧地址。 在 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,因此需要凭据;测试使用录制的副本,可离线运行。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。