Files
cftunnel/cmd/init.go
T
admin b350914b00 docs: init 命令引导信息全面中文化
- API 令牌创建步骤改为 Cloudflare 中文界面术语
- 明确列出 3 条权限配置(账户/区域)
- 账户 ID 获取路径中文化
2026-02-22 21:14:10 +08:00

91 lines
2.7 KiB
Go

package cmd
import (
"context"
"fmt"
"strings"
"github.com/charmbracelet/huh"
"github.com/qingchencloud/cftunnel/internal/cfapi"
"github.com/qingchencloud/cftunnel/internal/config"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(initCmd)
}
var initCmd = &cobra.Command{
Use: "init",
Short: "交互式初始化:输入 Token → 选域名 → 创建隧道",
RunE: func(cmd *cobra.Command, args []string) error {
fmt.Println("=== Cloudflare Tunnel 初始化向导 ===")
fmt.Println()
fmt.Println("需要以下信息(首次使用请先创建 API 令牌):")
fmt.Println()
fmt.Println(" 1. API 令牌获取方式:")
fmt.Println(" 登录 Cloudflare → 右上角头像 → 我的个人资料 → API 令牌 → 创建令牌")
fmt.Println(" 选择「创建自定义令牌」→「开始使用」,配置以下 3 条权限:")
fmt.Println()
fmt.Println(" 账户 | Cloudflare Tunnel | 编辑")
fmt.Println(" 区域 | DNS | 编辑")
fmt.Println(" 区域 | 区域 | 读取")
fmt.Println()
fmt.Println(" 区域资源选「包括 → 特定区域 → 你的域名」")
fmt.Println()
fmt.Println(" 2. 账户 ID 获取方式:")
fmt.Println(" Cloudflare 首页 → 点击你的域名 → 右侧栏「账户 ID」")
fmt.Println()
var apiToken, accountID, tunnelName string
err := huh.NewForm(
huh.NewGroup(
huh.NewInput().Title("API 令牌 (API Token)").Value(&apiToken).Placeholder("在 Cloudflare 控制台创建"),
huh.NewInput().Title("账户 ID (Account ID)").Value(&accountID).Placeholder("32 位十六进制字符串"),
huh.NewInput().Title("隧道名称").Value(&tunnelName).Placeholder("my-tunnel"),
),
).Run()
if err != nil {
return err
}
apiToken = strings.TrimSpace(apiToken)
accountID = strings.TrimSpace(accountID)
tunnelName = strings.TrimSpace(tunnelName)
if tunnelName == "" {
tunnelName = "my-tunnel"
}
client := cfapi.New(apiToken, accountID)
ctx := context.Background()
// 创建隧道
fmt.Println("正在创建隧道...")
tunnel, err := client.CreateTunnel(ctx, tunnelName)
if err != nil {
return err
}
fmt.Printf("隧道已创建: %s (%s)\n", tunnel.Name, tunnel.ID)
// 获取 Token
token, err := client.GetTunnelToken(ctx, tunnel.ID)
if err != nil {
return err
}
// 保存配置
cfg := &config.Config{
Version: 1,
Auth: config.AuthConfig{APIToken: apiToken, AccountID: accountID},
Tunnel: config.TunnelConfig{ID: tunnel.ID, Name: tunnel.Name, Token: token},
}
if err := cfg.Save(); err != nil {
return err
}
fmt.Printf("配置已保存到 %s\n", config.Path())
fmt.Println("\n下一步: cftunnel add <名称> <端口> --domain <域名>")
return nil
},
}