Files
晴天 d976ee2c33 feat: relay 模式 + SSH 远程部署 + 官网移动端适配 + 国内镜像源
- 新增 relay 模式: frp 中继引擎,TCP/UDP 全协议穿透
- 新增 relay server setup: SSH 远程安装 frps 服务端
- 新增 sshutil 包: 纯 Go SSH 连接/远程执行
- 官网: 移动端响应式适配 (480/768/900px 三断点)
- 官网: 修复 Star 按钮样式,特性卡片 11→12
- install.sh: 国内镜像源加速 (ghfast/gh-proxy/ghproxy)
- Docker Compose + install-relay.sh 服务端部署方案
2026-02-26 22:29:56 +08:00

63 lines
1.6 KiB
Go

package cmd
import (
"fmt"
"strconv"
"github.com/qingchencloud/cftunnel/internal/config"
"github.com/spf13/cobra"
)
var relayAddProto string
var relayAddLocal int
var relayAddRemote int
var relayAddDomain string
func init() {
relayAddCmd.Flags().StringVar(&relayAddProto, "proto", "tcp", "协议类型 (tcp/udp/http/https/stcp)")
relayAddCmd.Flags().IntVar(&relayAddLocal, "local", 0, "本地端口")
relayAddCmd.Flags().IntVar(&relayAddRemote, "remote", 0, "远程端口")
relayAddCmd.Flags().StringVar(&relayAddDomain, "domain", "", "自定义域名(HTTP 模式用)")
relayAddCmd.MarkFlagRequired("local")
relayCmd.AddCommand(relayAddCmd)
}
var relayAddCmd = &cobra.Command{
Use: "add <名称>",
Short: "添加中继穿透规则",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
name := args[0]
cfg, err := config.Load()
if err != nil {
return err
}
if cfg.Relay.Server == "" {
return fmt.Errorf("未配置中继服务器,请先执行 cftunnel relay init")
}
if cfg.FindRelayRule(name) != nil {
return fmt.Errorf("规则 %q 已存在", name)
}
rule := config.RelayRule{
Name: name,
Proto: relayAddProto,
LocalPort: relayAddLocal,
RemotePort: relayAddRemote,
Domain: relayAddDomain,
}
cfg.Relay.Rules = append(cfg.Relay.Rules, rule)
if err := cfg.Save(); err != nil {
return err
}
desc := fmt.Sprintf("localhost:%d", relayAddLocal)
if relayAddRemote > 0 {
desc += " → :" + strconv.Itoa(relayAddRemote)
}
fmt.Printf("✔ 规则已添加: %s (%s %s)\n", name, relayAddProto, desc)
return nil
},
}