关于 cloudflare-tunnel-setup
用于从头配置 Cloudflare Tunnel 的交互式 Skill,面向需要为服务设置远程访问的运维人员。它涵盖前置检查、控制面板与令牌配置、容器重启、主机名设置及连通性验证。
主要功能
- 01检查配置前置条件
- 02指导在控制面板创建隧道
- 03在 .env 中配置令牌
- 04重启并检查 cloudflared
- 05设置公共主机名并验证访问
适用场景
- 01为全新安装创建隧道
- 02替换无效或过期的隧道令牌
- 03迁移基础设施后配置远程访问
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dawiddutoit/ custom-claude --skill cloudflare-tunnel-setup安装后在 Claude Code 中输入/cloudflare-tunnel-setup确认已加载。
附带文件examples/examples.mdreferences/reference.md
详细介绍
Cloudflare Tunnel 设置技能
从零开始设置新的 Cloudflare Tunnel 的交互式指南。
快速开始
在需要以下操作时运行此技能:
- 创建新的 Cloudflare Tunnel
- 替换已过期或无效的隧道令牌
- 为全新安装设置远程访问
**最低要求:**Cloudflare 账户、托管在 Cloudflare 上的域名,以及已安装 Docker。
目录
- 何时使用此技能
- 此技能的功能
- 说明
- 3.1 检查前提条件
- 3.2 在控制面板中创建隧道
- 3.3 在 .env 中配置令牌
- 3.4 重启 Cloudflared 容器
- 3.5 配置公共主机名
- 3.6 验证连接
- 支持文件
- 预期结果
- 要求
- 应避免的问题
何时使用此技能
明确触发条件:
- “设置 Cloudflare Tunnel”
- “创建新隧道”
- “配置远程访问”
- “替换隧道令牌”
- “从零开始配置隧道”
隐含触发条件:
- 全新安装网络基础设施
- 隧道令牌已过期或无效
- .env 中缺少 CLOUDFLARE_TUNNEL_TOKEN
- 将基础设施迁移到新硬件
调试触发条件:
- “找不到隧道令牌”
- “cloudflared 容器无法启动”
- “.env 中没有 CLOUDFLARE_TUNNEL_TOKEN”
此技能的功能
- 检查前提条件 - 确认 .env 文件存在,且 docker-compose 中包含 cloudflared
- 指导创建隧道 - 提供 Cloudflare 控制面板的分步说明
- 配置令牌 - 将隧道令牌添加到 .env 文件
- 重启容器 - 重启 cloudflared 以应用新令牌
- 指导设置主机名 - 提供配置公共主机名的说明
- 验证连接 - 确认隧道已连接并正常工作
说明
3.1 检查前提条件
步骤 1:确认 .env 文件存在
ls -la /home/dawiddutoit/projects/network/.env
如果文件不存在,请从示例创建:
cp /home/dawiddutoit/projects/network/.env.example /home/dawiddutoit/projects/network/.env
步骤 2:检查是否存在 CLOUDFLARE_TUNNEL_TOKEN
grep -E "^CLOUDFLARE_TUNNEL_TOKEN" /home/dawiddutoit/projects/network/.env
可能的结果:
- 行存在且有值:令牌已配置(检查是否有效)
- 行存在但为空或为占位符:需要填写真实令牌
- 未找到该行:需要添加令牌
步骤 3:确认 docker-compose 中包含 cloudflared 服务
grep -A 10 "cloudflared:" /home/dawiddutoit/projects/network/docker-compose.yml
如果缺少 cloudflared 服务,则需要添加。服务定义请参阅 references/reference.md。
3.2 在控制面板中创建隧道
向用户提供以下说明:
- 前往:https://one.dash.cloudflare.com -> Access -> Tunnels
- 点击“Create a tunnel” -> 选择“Cloudflared”连接器
- 为隧道命名(例如,“pi-home”)-> 选择“Docker”作为连接器类型
- 复制隧道令牌(
--token后面的长 Base64 字符串) - 安全保存令牌
**令牌格式:**经过 Base64 编码的 JSON,包含账户 ID、隧道 ID 和密钥。
3.3 在 .env 中配置令牌
步骤 1:检查当前令牌状态
grep "CLOUDFLARE_TUNNEL_TOKEN" /home/dawiddutoit/projects/network/.env
步骤 2:添加或更新令牌
如果该行已存在,请更新它;如果不存在,请添加。
# If line exists, use sed to replace
# If not, append to file
# The token should look like:
# CLOUDFLARE_TUNNEL_TOKEN=eyJhIjoiYWJjZDEyMzQ...
使用 Edit 工具更新 .env:
- 查找现有的
CLOUDFLARE_TUNNEL_TOKEN=行 - 将其替换为新的令牌值
- 如果该行不存在,则添加新行
验证令牌格式:
# Token should be base64 decodable
TUNNEL_TOKEN=$(grep "CLOUDFLARE_TUNNEL_TOKEN=" /home/dawiddutoit/projects/network/.env | cut -d'=' -f2)
echo "$TUNNEL_TOKEN" | base64 -d 2>/dev/null | python3 -c "import sys, json; d=json.load(sys.stdin); print('Valid token for account:', d.get('a', 'unknown'))"
3.4 重启 Cloudflared 容器
步骤 1:重启容器
cd /home/dawiddutoit/projects/network && docker compose restart cloudflared
或者,如果容器尚不存在:
cd /home/dawiddutoit/projects/network && docker compose up -d cloudflared
步骤 2:检查容器是否正在运行
docker ps | grep cloudflared
预期输出:
CONTAINER ID IMAGE STATUS NAMES
abc123... cloudflare/cloudflared:latest Up X seconds cloudflared
步骤 3:检查日志,确认连接成功
docker logs cloudflared --tail 30
查找以下成功标志:
INF Registered tunnel connection connIndex=0 location=...
INF Registered tunnel connection connIndex=1 location=...
INF Registered tunnel connection connIndex=2 location=...
INF Registered tunnel connection connIndex=3 location=...
已注册 4 个连接 = 隧道运行正常(每个 Cloudflare 边缘位置有 2 个连接)
如果出现错误:
token is invalid:令牌复制错误或已过期already registered:另一个实例正在使用相同令牌(请停止其他实例)network error:检查互联网连接
3.5 配置公共主机名
隧道连接后,在 Cloudflare 控制面板中配置服务:
- 前往:https://one.dash.cloudflare.com -> Access -> Tunnels
- 点击隧道名称 -> Configure -> Public Hostname -> Add
- 为每项服务输入子域名、域名(temet.ai)、类型(HTTP)和 URL
主机名示例:
| 服务 | 子域名 | URL |
|---|---|---|
| Pi-hole | pihole | pihole:80 |
| Webhook | webhook | webhook:9000 |
| Jaeger | jaeger | 192.168.68.135:16686 |
URL 格式:
- Docker 容器:
container:port(例如,pihole:80) - 主机服务:
host-ip:port(例如,192.168.68.135:16686) - LAN 设备:
device-ip:port(例如,192.168.68.105:80)
重要: 后端请使用 HTTP(而非 HTTPS)。在 Linux 上不要使用 host.docker.internal。
3.6 验证连通性
步骤 1:验证隧道已注册
docker logs cloudflared 2>&1 | grep -E "Registered tunnel|connIndex"
预期结果: 出现 4 条 "Registered tunnel connection" 消息
步骤 2:在控制面板中检查隧道状态
Go to: https://one.dash.cloudflare.com
Navigate to: Access -> Tunnels
Status should show: "HEALTHY" with green indicator
步骤 3:测试外部访问(使用移动数据或外部网络)
# From a device NOT on home network:
curl -I https://pihole.temet.ai
# Expected: HTTP 302 (redirect to Cloudflare Access) or HTTP 200 (if no auth)
步骤 4:运行诊断脚本(可选)
./scripts/cf-tunnel-config.sh show
支持文件
| 文件 | 用途 |
|---|---|
references/reference.md | Docker-compose 服务定义、令牌格式详情 |
examples/examples.md | 常见设置的配置示例 |
预期结果
成功:
- .env 中包含 CLOUDFLARE_TUNNEL_TOKEN
- cloudflared 容器正在运行
- 日志中注册了 4 个隧道连接
- 控制面板中隧道显示为 "HEALTHY"
- 可通过外部网络访问 *.temet.ai 上的服务
部分成功:
- 已配置令牌,但尚未设置主机名(已提供用户提醒)
- 隧道已连接,但服务返回 502(后端配置问题)
失败迹象:
- 日志中出现 "token is invalid" -> 从控制面板重新复制令牌
- 容器不断重启 -> 检查令牌格式
- 注册连接数为 0 -> 网络/防火墙问题
要求
环境:
- 拥有域名的 Cloudflare 账户
- 已安装 Docker 和 Docker Compose
- 网络连接
- 项目根目录中的
.env文件
账户/访问权限:
- Cloudflare 控制面板访问权限
- 已启用 Zero Trust(免费套餐即可)
所需工具:
- Read、Write、Edit(用于配置 .env)
- Bash(用于运行 docker 命令和验证)
- Grep(用于检查现有配置)
应避免的问题
- 不要将隧道令牌提交到 git(仅保存在 .env 中)
- 不要在 Linux 主机上使用
host.docker.internal - 不要为内部服务后端使用 HTTPS URL
- 不要在不同环境之间共享隧道令牌
- 不要跳过验证步骤(3.6)
- 隧道连接后不要忘记配置公共主机名
- 不要在 .env 中留有占位令牌值
备注
- 隧道令牌不会过期,但可以在控制面板中撤销
- 每条隧道可以有多个连接器(用于冗余)
- 隧道配置更改会自动生效(无需重启)
- 使用
./scripts/cf-tunnel-config.sh configure通过 API 更新入口配置 - 如需身份验证,请在隧道设置完成后使用
configure-google-oauthskill - 现有的
troubleshoot-tunnel-connectivityskill 可处理运行中隧道的问题