mcpField
I
inngest-cli

inngest-cli

github.com/inngest开发29827 次安装4 周前更新
代码仓库

关于 inngest-cli

inngest-cli 是面向 TypeScript 的技能,介绍如何用 Inngest CLI 进行本地开发、测试和自托管生产部署。内容涵盖 Dev Server、Docker、故障排查及可选的 MCP 连接。

主要功能

  1. 01启动并配置本地 Dev Server
  2. 02发现应用并检查服务端点
  3. 03本地测试函数并发送事件
  4. 04以可自托管方式运行 Inngest
  5. 05配置本地与 Cloud MCP 连接

适用场景

  1. 01针对本地服务器开发 Inngest 函数
  2. 02发送测试事件并检查端点配置
  3. 03在自托管生产环境运行 Inngest

MCP 相关

介绍用于本地 Dev Server 操作的可选 `inngest-dev` MCP 连接,以及用于已部署资源的 `inngest-cloud`。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/inngest/inngest-skills --skill inngest-cli

安装后在 Claude Code 中输入/inngest-cli确认已加载。

附带文件references/local-mcp.md

详细介绍

Inngest CLI

掌握 Inngest CLI,用于本地开发、测试和可自托管的生产环境。CLI 提供 Dev Server,这是 Inngest Platform 功能完备的开源本地版本。

这些技能专注于 TypeScript。 如需 Python 或 Go 的指南,请参阅 Inngest 文档中的语言专属指南。核心概念适用于所有语言。

使用此技能进行 CLI 设置、Dev Server 工作流、本地测试、Docker、MCP 和自托管服务操作。如需通过 inngest api 检查运行记录/跟踪信息,请在可用时使用 inngest-api-cli。

安装

# npx (recommended — always latest)
npx inngest-cli@latest dev

# yarn
yarn dlx inngest-cli@latest dev

# pnpm
pnpm dlx inngest-cli@latest dev

# Global install
npm install -g inngest-cli

# Docker
docker pull inngest/inngest

如果你的 npm 配置禁用了生命周期脚本,且缺少二进制文件,请使用 npx --ignore-scripts=false inngest-cli@latest dev 重试。Bun 默认不支持生命周期脚本,因此即使在 Bun 项目中,也建议使用 npx 运行 CLI。

inngest dev — 本地 Dev Server

启动 Inngest 的内存中本地版本,并在 http://localhost:8288 提供浏览器界面。

# Auto-discover apps on common ports/endpoints
npx inngest-cli@latest dev

# Specify your app URL
npx inngest-cli@latest dev -u http://localhost:3000/api/inngest

# Custom port
npx inngest-cli@latest dev -p 9999

# Multiple apps
npx inngest-cli@latest dev \
  -u http://localhost:3000/api/inngest \
  -u http://localhost:4000/api/inngest

# Disable auto-discovery (use with -u)
npx inngest-cli@latest dev --no-discovery -u http://localhost:3000/api/inngest
CLI 标志
标志简写默认值描述
--sdk-url-uhttp://localhost:3000/api/inngest应用服务端点 URL
--port-p8288Dev Server 端口
--hostDev Server 主机
--no-discoveryfalse禁用应用自动发现
--no-pollfalse禁止轮询应用以检查变更
--config配置文件路径
--connect-gateway-port8289Connect 网关端点端口
--persistfalse在重启之间保留数据
--poll-interval5应用轮询检查间隔(秒)
--queue-workers100执行器工作线程数
--retry-interval0线性重试间隔(秒)
--tick150执行器队列轮询间隔(毫秒)
自动发现

如果未指定 --no-discovery,Dev Server 会自动扫描常见端口和端点:

扫描的端口: 常见开发端口,包括 3000、3030 等

扫描的端点:

  • /api/inngest
  • /x/inngest
  • /.netlify/functions/inngest
  • /.redwood/functions/inngest

配置文件

在项目根目录中创建 inngest.json(或 .yaml、.toml)。CLI 会逐级向上遍历目录以查找该文件。

{
  "sdk-url": [
    "http://localhost:3000/api/inngest",
    "http://localhost:3030/api/inngest"
  ],
  "no-discovery": true
}
# inngest.yaml
sdk-url:
  - "http://localhost:3000/api/inngest"
  - "http://localhost:3030/api/inngest"
no-discovery: true

环境变量

变量描述
INNGEST_DEV=1 启用 Dev Mode(禁用签名验证)。=0 强制使用 Cloud 模式。也可接受 URL(例如 http://localhost:8288)。未设置时默认为 Cloud 模式。
INNGEST_BASE_URLSDK 与 Inngest 通信使用的主机(例如 http://localhost:8288)。大多数情况下保持未设置。
INNGEST_EVENT_KEY用于发送事件的身份验证密钥。本地可使用任意虚拟值——Dev Server 不会验证此值。
INNGEST_SIGNING_KEY保护 Inngest 与应用之间的请求。**生产环境中必需。**决定同步内容发送到哪个 Inngest 环境。
INNGEST_SIGNING_KEY_FALLBACK用于签名密钥轮换的备用密钥(v3.18.0+)。
INNGEST_SERVE_ORIGINInngest 用于访问应用的完整源 URL(例如 https://my-app.com)。会根据请求标头自动推断;AWS Lambda、代理或隧道场景下请显式设置。
INNGEST_SERVE_PATHserve 端点的 URL 路径(例如 /api/inngest)。大多数情况下会自动推断。
INNGEST_STREAMING启用响应流式传输(true/false)。扩展 Vercel 和边缘运行时的超时限制。
INNGEST_ENV目标 Inngest Environment。某些平台会自动检测。

调试 Serve 端点

验证你的 serve() 端点配置是否正确:

curl -s http://localhost:3000/api/inngest | jq
{
  "message": "Inngest endpoint configured correctly.",
  "hasEventKey": false,
  "hasSigningKey": false,
  "functionsFound": 3
}

如果 functionsFound 为 0,请检查是否已将函数传入 serve() 调用。

在本地测试函数

通过 SDK 发送事件
import { Inngest } from "inngest";

const inngest = new Inngest({ id: "my-app" });

await inngest.send({
  name: "user/signup.completed",
  data: {
    userId: "user_123",
    email: "[email protected]",
  },
});
通过 curl 发送事件
curl -X POST "http://localhost:8288/e/test" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "user/signup.completed",
    "data": {
      "userId": "user_123",
      "email": "[email protected]"
    }
  }'

URL 路径中的事件密钥(上例中的 test)在本地可以是任意值。

使用 @inngest/test 进行单元测试

需要 inngest@>=4.0.0。

npm install -D @inngest/test
import { InngestTestEngine } from "@inngest/test";
import { helloWorld } from "./functions";

// Execute full function
const t = new InngestTestEngine({ function: helloWorld });
const { result } = await t.execute();
expect(result).toEqual("Hello World!");

// Test a single step
const { result: stepResult } = await t.executeStep("calculate-price");
expect(stepResult).toEqual(123);

// Assert step state
const { state } = await t.execute();
await expect(state["my-step"]).resolves.toEqual("output");
await expect(state["risky-step"]).rejects.toThrowError("failed");

// Mock events
const { result: eventResult } = await t.execute({
  events: [{ name: "demo/event.sent", data: { message: "Hi!" } }],
});

// Mock step responses
const { result: mockResult } = await t.execute({
  steps: [{ id: "external-api-call", handler() { return { status: "ok" }; } }],
});

// Mock sleep/waitForEvent (pause-inducing steps require mocking)
await t.execute({
  steps: [{ id: "wait-one-day", handler() {} }],
});

使用测试框架的标准模拟功能(jest.mock、vi.mock 等)模拟外部依赖——@inngest/test 仅处理 Inngest 专属的模拟。

Docker 设置

独立运行
docker run -p 8288:8288 -p 8289:8289 \
  inngest/inngest \
  inngest dev -u http://host.docker.internal:3000/api/inngest

使用 host.docker.internal 访问运行在主机上的应用(在 Docker Desktop 上开箱即用)。在 Linux 上,添加 --add-host=host.docker.internal:host-gateway,或使用等效的主机访问方式。

Docker Compose
services:
  app:
    build: ./app
    environment:
      - INNGEST_DEV=1
      - INNGEST_BASE_URL=http://inngest:8288
    ports:
      - "3000:3000"
  inngest:
    image: inngest/inngest
    command: "inngest dev -u http://app:3000/api/inngest"
    ports:
      - "8288:8288"
      - "8289:8289"

端口 8288 是主服务和 UI。端口 8289 是 connect() WebSocket 网关。

**重要:**在应用上设置 INNGEST_DEV=1——TypeScript SDK 默认使用 Cloud 模式,这会跳过 Dev Server。

MCP 服务(AI 开发工具)

这些插件捆绑了 inngest-cloud,用于通过 OAuth 访问已部署的资源。 本地 Dev Server MCP 是一个单独的可选连接,名称为 inngest-dev。 两者可以在同一个编码会话中使用。如需本地 MCP 设置或连接 故障排查,请阅读本地 MCP 设置。

对于 Dev Server 上的应用和运行,请使用已配置的本地连接 (默认为 inngest-dev;保留现有连接的名称)。对于已部署的资源,使用 inngest-cloud,并选择目标账户和环境。如果目标不明确,请先确认, 再调用任一服务。切勿因为本地服务离线而从本地切换到 Cloud。

阅读每个服务的实时工具架构。本地工具包括应用、函数、事件、 运行和跟踪操作,以及内嵌的文档搜索。可用工具和输入取决于 正在运行的 Dev Server 版本。

inngest start — 可自托管的生产环境

以可自托管的生产服务模式运行 Inngest。这与 inngest dev 不同——此命令用于生产工作负载。

inngest start --event-key <key> --signing-key <key>
标志短标志默认值描述
--port-p8288服务端口
--signing-key用于请求签名的十六进制密钥(字符数必须为偶数)
--event-key应用的身份验证密钥(可重复指定)
--sdk-url-u应用服务 URL(可重复指定)
--redis-uri外部 Redis 连接
--postgres-uri外部 PostgreSQL 连接
--sqlite-dirSQLite 数据库目录
--poll-interval0应用同步轮询间隔(秒)
--queue-workers100执行器工作线程数
--connect-gateway-port8289Connect 网关端口
--retry-interval0线性重试间隔(秒)
--tick150执行器队列轮询间隔(毫秒)
--no-ui禁用 Web UI 和 GraphQL API
--postgres-conn-max-idle-time5PostgreSQL 空闲连接生命周期(分钟)
--postgres-conn-max-lifetime30PostgreSQL 连接最大复用时间(分钟)
--postgres-max-idle-conns10PostgreSQL 最大空闲连接数
--postgres-max-open-conns100PostgreSQL 最大打开连接数

还可使用 --log-level、--verbose 和 --json 等全局标志。对于环境变量,请参阅当前 CLI 和部署文档;不要假设每个标志都有对应的 INNGEST_ 环境变量。

默认持久化方式:内存中的 Redis + 位于 ./.inngest/main.db 的 SQLite。生产环境请使用外部 Redis 和 PostgreSQL。

部署工作流

从本地开发到生产环境
  1. 在本地开发,使用 inngest dev——无需密钥,也无需为生产环境修改代码
  2. 将应用部署到托管平台
  3. 与 Inngest 同步,使用以下三种方法之一:
# Option 1: Curl from CI/CD
curl -X PUT https://your-app.com/api/inngest --fail-with-body

# Option 2: Vercel/Netlify integrations (automatic on deploy)

# Option 3: Manual sync via Inngest Cloud dashboard
  1. 在生产环境中设置环境变量:
INNGEST_EVENT_KEY=<your-event-key>
INNGEST_SIGNING_KEY=<your-signing-key>

从本地开发迁移到生产环境时无需修改代码。SDK 会自动检测环境。

特定平台注意事项

平台注意事项
Express需要 express.json() 中间件;默认请求体大小限制为 100kb,需要增大以处理 Inngest 负载(最高 4MB)
AWS Lambda必须显式设置 INNGEST_SERVE_ORIGIN 和 INNGEST_SERVE_PATH——自动推断会失败
Firebase Cloud Functions必须设置 INNGEST_SERVE_PATH 环境变量
DigitalOcean Functionsserve() 配置中必须同时设置 serveOrigin 和 servePath
Cloudflare Workers (Wrangler --remote)需要使用隧道(ngrok/localtunnel)连接 Dev Server
Supabase Edge FunctionsservePath 必须与函数名称一致——Supabase 会重写请求路径
Google Cloud Run (1st gen)不受官方支持;可能导致签名验证错误
Docker必须设置 INNGEST_DEV=1——SDK 默认使用 Cloud 模式
外部 Webhook(Stripe、Clerk)本地测试需要使用隧道解决方案(ngrok、localtunnel)

快速参考

# Start dev server with auto-discovery
npx inngest-cli@latest dev

# Start with explicit app URL
npx inngest-cli@latest dev -u http://localhost:3000/api/inngest

# Check serve endpoint health
curl -s http://localhost:3000/api/inngest | jq

# Send test event via curl
curl -X POST http://localhost:8288/e/test -d '{"name": "test/event", "data": {}}'

# Sync after deploy (CI/CD)
curl -X PUT https://your-app.com/api/inngest --fail-with-body

# Self-hosted production
inngest start --event-key <key> --signing-key <key>

故障排除

问题原因解决方案
Dev Server 未找到函数应用未运行或端口错误先启动应用;使用 -u 指定正确的 URL
调试输出中显示 functionsFound: 0未将函数传递给 serve()确认传递给 serve() 的数组中包含所有函数
SDK 连接到 Cloud 而非 Dev Server未设置 INNGEST_DEV在环境中设置 INNGEST_DEV=1
函数同步到了错误的 Inngest 环境签名密钥错误检查 INNGEST_SIGNING_KEY 是否与目标环境匹配
Inngest 控制面板中出现重复应用应用 id 已更改在不同部署中保持 new Inngest({ id }) 中的 id 稳定不变
Webhook 事件未到达 Dev Server未配置隧道对于外部 Webhook 来源,请使用 ngrok 或 localtunnel
控制面板中显示“未关联同步”自动同步静默失败检查集成日志;手动重新同步

有关 SDK 安装,请参阅 inngest-setup;有关函数配置,请参阅 inngest-durable-functions。

评论

支持 Markdown