← 返回
未分类 Key

cftunnel

Expose local services to the internet via Cloudflare Tunnels. CLI (npx cftunnel) and Node.js library for creating tunnels, configuring ingress routes, managi...
通过 Cloudflare Tunnel 将本地服务暴露到互联网,提供 CLI(npx cftunnel)和 Node.js 库,用于创建隧道、配置入口路由、管理等。
pirumpi pirumpi 来源
未分类 clawhub v1.1.0 1 版本 100000 Key: 需要
★ 0
Stars
📥 356
下载
💾 0
安装
1
版本
#latest

概述

cftunnel — Cloudflare Tunnel Manager for AI Agents

Expose local services to the internet via Cloudflare Tunnels. Use this skill when you need to make a locally running application accessible at a public HTTPS URL.

Flow: Start a local service (e.g. on port 3000) → cftunnel creates a tunnel + DNS route → the service is live at https://hostname.domain.com.

Authentication

Set these environment variables before running any command:

# Option A: API Key + Email (most common)
export CLOUDFLARE_API_KEY=<api-key>
export CLOUDFLARE_EMAIL=<account-email>

# Option B: API Token (scoped, if available)
export CLOUDFLARE_API_TOKEN=<api-token>

# Always required:
export CLOUDFLARE_ACCOUNT_ID=<account-id>

Quick Reference

Expose a local service (fastest path)

If a tunnel and cloudflared are already running (check with tunnel list), just add a route and DNS:

# 1. Add ingress route to existing tunnel
npx cftunnel route add <tunnel-id> --hostname <hostname> --service http://localhost:<port>

# 2. Create DNS CNAME
npx cftunnel dns create --zone-id <zone-id> --hostname <hostname> --tunnel-id <tunnel-id>

Create everything from scratch (one command)

npx cftunnel quickstart \
  --name <tunnel-name> \
  --hostname <hostname> \
  --service http://localhost:<port> \
  --zone-id <zone-id>

Then run the connector: npx cftunnel run

Programmatic usage (Node.js library)

import { createClient, quickstart } from 'cftunnel';

const client = createClient({ apiKey: '...', apiEmail: '...' });
const result = await quickstart(client, {
  accountId: '...',
  name: 'my-app',
  hostname: 'app.example.com',
  service: 'http://localhost:3000',
  zoneId: '...',
});
console.log(result.run_cmd);

All Commands

Tunnel lifecycle

CommandPurpose
------
npx cftunnel tunnel listList all tunnels. Find existing tunnel IDs and check status (healthy/down/inactive).
npx cftunnel tunnel create Create a new tunnel. Returns tunnel ID and secret. Add --config-src local for YAML-managed config.
npx cftunnel tunnel get Get tunnel details including connection status.
npx cftunnel tunnel delete Delete a tunnel. Must have no active connections.
npx cftunnel tunnel token Get the token needed to run cloudflared. Returns run_cmd and install_cmd.

Ingress routes (hostname → local service mapping)

CommandPurpose
------
npx cftunnel route list Show current ingress rules. Always has a catch-all 404 as last rule.
npx cftunnel route add --hostname --service Add a route. Preserves existing routes, appends before catch-all. Optional --path for path filtering.
npx cftunnel route remove --hostname Remove a route by hostname.
npx cftunnel route set --route host1=svc1 --route host2=svc2Replace ALL routes. Use for bulk configuration.

DNS records

CommandPurpose
------
npx cftunnel dns create --zone-id --hostname --tunnel-id Create proxied CNAME pointing hostname to tunnel. Required for the hostname to resolve.
npx cftunnel dns list --zone-id List all DNS records in the zone.
npx cftunnel dns delete --zone-id Delete a DNS record.

Running the connector

CommandPurpose
------
npx cftunnel run Run cloudflared in foreground. Auto-detects cloudflared from PATH or npm package.
npx cftunnel run --install-serviceInstall cloudflared as a persistent system service (survives reboots).

Decision Guide

"I need to expose port N on a domain"

→ Check tunnel list for a healthy tunnel. If one exists, use route add + dns create. If not, use quickstart.

"I need to add another service to an existing tunnel"

route add + dns create. One tunnel can serve many hostnames.

"I need to change where a hostname points"

route remove --hostname X then route add --hostname X --service . DNS stays the same.

"I need to take a service offline"

route remove --hostname X and optionally dns delete .

"The tunnel exists but cloudflared isn't running"

npx cftunnel run or use tunnel token to get the token for manual cloudflared invocation.

Service URL Formats

The --service flag accepts these protocols:

FormatExampleUse case
---------
http://host:porthttp://localhost:3000HTTP web apps, APIs
https://host:porthttps://localhost:8443HTTPS backends
tcp://host:porttcp://localhost:5432Databases, raw TCP
ssh://host:portssh://localhost:22SSH access
unix:///pathunix:///tmp/app.sockUnix socket apps
http_status:CODEhttp_status:404Static status response (catch-all)

Output Format

All commands output JSON to stdout. Progress/errors go to stderr.

Parse with jq:

TUNNEL_ID=$(npx cftunnel tunnel create my-app | jq -r '.id')
TOKEN=$(npx cftunnel tunnel token $TUNNEL_ID | jq -r '.token')

Common Patterns

Pattern 1: Deploy a new web app

cd /path/to/app && npm start &

npx cftunnel quickstart \
  --name my-web-app \
  --hostname app.example.com \
  --service http://localhost:8080 \
  --zone-id <zone-id>

npx cftunnel run <tunnel-id-from-output>

Pattern 2: Add subdomain to existing tunnel

npx cftunnel tunnel list | jq '.[] | select(.status == "healthy")'

npx cftunnel route add <tunnel-id> --hostname api.example.com --service http://localhost:4000
npx cftunnel dns create --zone-id <zone-id> --hostname api.example.com --tunnel-id <tunnel-id>

Pattern 3: Swap service behind a hostname

npx cftunnel route remove <tunnel-id> --hostname app.example.com
npx cftunnel route add <tunnel-id> --hostname app.example.com --service http://localhost:9000

Pattern 4: Clean teardown

npx cftunnel route remove <tunnel-id> --hostname app.example.com
npx cftunnel dns list --zone-id <zone-id>
npx cftunnel dns delete <record-id> --zone-id <zone-id>
npx cftunnel tunnel delete <tunnel-id>

Pattern 5: Programmatic usage in agent code

import { createClient, createTunnel, addRoute, createDNS } from 'cftunnel';

const client = createClient(); // reads from env vars
const tunnel = await createTunnel(client, { accountId: '...', name: 'my-app' });
await addRoute(client, {
  accountId: '...',
  tunnelId: tunnel.id,
  hostname: 'app.example.com',
  service: 'http://localhost:3000',
});
await createDNS(client, {
  zoneId: '...',
  hostname: 'app.example.com',
  tunnelId: tunnel.id,
});

Important Notes

  • A tunnel must have cloudflared running to serve traffic. Creating a tunnel and routes alone is not enough.
  • The catch-all http_status:404 rule is always appended automatically. Do not add it manually.
  • DNS CNAME records must be proxied through Cloudflare (orange cloud). This is set automatically.
  • One tunnel can serve multiple hostnames. Prefer reusing existing healthy tunnels over creating new ones.
  • route set replaces ALL routes. Use route add/route remove for incremental changes.
  • If cloudflared is already running as a service, route changes take effect immediately (no restart needed).

Global Flags

FlagEnv VarDescription
---------
--api-tokenCLOUDFLARE_API_TOKENCloudflare API token (bearer auth)
--api-keyCLOUDFLARE_API_KEYCloudflare API key (requires --api-email)
--api-emailCLOUDFLARE_EMAILCloudflare account email
--account-idCLOUDFLARE_ACCOUNT_IDCloudflare account ID

版本历史

共 1 个版本

  • v1.1.0 当前
    2026-05-07 11:28 安全 安全

安全检测

腾讯云安全 (Keen)

安全,无风险
查看报告

腾讯云安全 (Sanbu)

安全,无风险
查看报告

🔗 相关推荐

it-ops-security

MoltGuard - Security & Antivirus & Guardrails

thomaslwang
MoltGuard — OpenClaw 安全守卫,由 OpenGuardrails 提供。安装后可防止您和您的用户受到提示注入、数据泄露及恶意行为的侵害。
★ 116 📥 30,999
ai-agent

Kyndlo Events

pirumpi
通过工作流驱动的Kyndlo活动任务创建和验证事件。调用时,代理必须遵循下面的强制性分步引导流程。
★ 0 📥 505
it-ops-security

OpenClaw Backup

alex3alex
备份与恢复 OpenClaw 数据。适用于创建备份、设置自动备份计划、从备份恢复或管理备份轮转。处理 ~/.openclaw 目录归档并包含适当的排除规则。
★ 90 📥 31,039