用途
cyrus-setup-endpoint 用于为 Cyrus 实例配置公网 webhook 端点,让 Linear(以及其他集成)能够把 webhook 事件发送到你的 Cyrus 服务。它会写入或检查 ~/.cyrus/.env 中的环境变量,并补齐自托管场景需要的公共配置。
主要能力
- 检查现有配置:读取 ~/.cyrus/.env 中的 CYRUS_BASE_URL,若已设置则提示已配置,并跳过端点配置步骤。
- 支持三种端点方式:
- ngrok(推荐):官方说明免费账户自带一个静态域名,重启后地址保持不变;不需要把它说成付费功能或断言地址会变。
- Cloudflare Tunnel:永久地址,需要 Cloudflare 账号。
- 自有 URL:用户已经拥有公网 URL/域名。
- 写入 ngrok 配置:在 ~/.config/ngrok/ngrok.yml 中写入 version 3、agent.authtoken、endpoints(name 为 cyrus、url 为域名、upstream.url 为 3456),之后可用 ngrok start cyrus 启动。
- 写入公共配置(仅在缺失时添加):CYRUS_SERVER_PORT=3456、LINEAR_DIRECT_WEBHOOKS=true、CYRUS_HOST_EXTERNAL=true。官方说明 LINEAR_DIRECT_WEBHOOKS=true 启用 Linear 直连 webhook 签名验证,CYRUS_HOST_EXTERNAL=true 启用 Slack 与 GitHub 直连 webhook 签名验证,两者在 webhook 直接来自服务(而非经由 CYHOST 转发)的自托管场景中都是必需的。
使用方式
- 检查已有配置:
grep -E '^CYRUS_BASE_URL=' ~/.cyrus/.env 2>/dev/null
若已设置,提示用户已配置的 <value>,并说明如需重新配置,先从 ~/.cyrus/.env 移除 CYRUS_BASE_URL 再重新运行本技能,然后跳到第 4 步补充缺失的端口/webhook 配置。
-
询问用户选择端点方式:ngrok、Cloudflare Tunnel 或自有 URL。
-
按所选方式配置:
- ngrok:先用 which ngrok 检查是否安装;未安装时按平台安装(macOS: brew install ngrok;Linux: curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok-v3-stable-linux-amd64.tgz | sudo tar xvz -C /usr/local/bin)。引导用户在 https://dashboard.ngrok.com 登录,在 https://dashboard.ngrok.com/domains 复制免费静态域名,在 https://dashboard.ngrok.com/get-started/your-authtoken 复制 authtoken。随后创建 ~/.config/ngrok 目录并写入 ~/.config/ngrok/ngrok.yml(若已存在则合并)。authtoken 属于密钥,需用剪贴板写文件方式处理,例如 macOS 使用 pbpaste,通用回退使用 read -s 读取输入。最后写入 CYRUS_BASE_URL=https://<domain>,并提示用户在单独终端运行 ngrok start cyrus(需在启动 Cyrus 之前)。
- Cloudflare Tunnel:向用户索取 Cloudflare Tunnel token 与 tunnel 主机名(例如 cyrus.yourdomain.com)。token 为密钥,用剪贴板写入环境变量(macOS 使用 pbpaste,通用回退使用 read -s),然后写入 CYRUS_BASE_URL=https://<hostname>。
- 自有 URL:向用户索取 URL,校验其以 https:// 开头,然后写入 CYRUS_BASE_URL=<url>。
- 确保公共配置存在(仅在缺失时添加):
grep -q '^CYRUS_SERVER_PORT=' ~/.cyrus/.env 2>/dev/null || printf 'CYRUS_SERVER_PORT=3456\n' >> ~/.cyrus/.env grep -q '^LINEAR_DIRECT_WEBHOOKS=' ~/.cyrus/.env 2>/dev/null || printf 'LINEAR_DIRECT_WEBHOOKS=true\n' >> ~/.cyrus/.env grep -q '^CYRUS_HOST_EXTERNAL=' ~/.cyrus/.env 2>/dev/null || printf 'CYRUS_HOST_EXTERNAL=true\n' >> ~/.cyrus/.env
适用场景
- 自托管 Cyrus,且需要 Linear、Slack、GitHub 等服务的 webhook 直连到本实例。
- 没有固定公网地址,希望用 ngrok 免费静态域名快速暴露本地 3456 端口。
- 已拥有 Cloudflare 账号或自有域名,希望使用更永久的公网地址。
限制与安全注意事项
- 官方明确要求:禁止对 ~/.cyrus/.env 或 ~/.cyrus/ 内任何文件使用 Read、Edit、Write 工具;只能通过 Bash 命令(grep、printf >> 等)交互,密钥不得被读入对话上下文。
- ngrok 免费账户的静态域名数量与具体规则以 ngrok 官方说明为准,资料中仅说明每个免费账户拥有一个静态域名。
- Cloudflare Tunnel 需要 Cloudflare 账号。
- 自有 URL 方式要求 URL 以 https:// 开头。
- 关于具体的收费、价格、平台支持范围、运行效果等,除上述内容外,资料中暂未提供。