- 公网反代:Nginx 状态卡片(版本 / 运行状态 / 配置校验 / 端口监听) - 部署设置第一、二梯队(HTTPS 开关、安全头、限流、连接数、仅中国大陆 IP) - 隧道检测兼容 frps v0.68 / v0.71(V2 与旧版端点) - 恢复被清空的 internal/frp/store.go、internal/api/ddns_handler.go、web/src/views/DdnsView.vue
71 lines
2.1 KiB
Go
71 lines
2.1 KiB
Go
package frp
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/fonu/fonu/internal/config"
|
|
)
|
|
|
|
func Generate(cfg config.Config, frpCfg Config, authToken string, httpPort, httpsPort int) (string, error) {
|
|
if strings.TrimSpace(frpCfg.ServerAddr) == "" {
|
|
return "", fmt.Errorf("FRP 服务器地址未配置")
|
|
}
|
|
if strings.TrimSpace(authToken) == "" {
|
|
return "", fmt.Errorf("FRP 认证 Token 未配置")
|
|
}
|
|
domains := normalizeDomains(frpCfg.CustomDomains)
|
|
if len(domains) == 0 {
|
|
return "", fmt.Errorf("请至少填写一个穿透域名")
|
|
}
|
|
if httpPort <= 0 || httpsPort <= 0 {
|
|
return "", fmt.Errorf("Nginx 端口未配置")
|
|
}
|
|
|
|
var b strings.Builder
|
|
b.WriteString(fmt.Sprintf("serverAddr = %q\n", frpCfg.ServerAddr))
|
|
b.WriteString(fmt.Sprintf("serverPort = %d\n\n", frpCfg.ServerPort))
|
|
|
|
b.WriteString(fmt.Sprintf("log.to = %q\n", tomlPath(cfg.FrpLogPath())))
|
|
b.WriteString("log.level = \"info\"\n\n")
|
|
|
|
b.WriteString("auth.method = \"token\"\n")
|
|
b.WriteString(fmt.Sprintf("auth.token = %q\n\n", authToken))
|
|
|
|
if frpCfg.TLSEnabled {
|
|
b.WriteString("transport.tls.enable = true\n\n")
|
|
} else {
|
|
b.WriteString("transport.tls.enable = false\n\n")
|
|
}
|
|
|
|
b.WriteString("[[proxies]]\n")
|
|
b.WriteString("name = \"fonu-nginx-http\"\n")
|
|
b.WriteString("type = \"http\"\n")
|
|
b.WriteString("localIP = \"127.0.0.1\"\n")
|
|
b.WriteString(fmt.Sprintf("localPort = %d\n", httpPort))
|
|
b.WriteString(fmt.Sprintf("customDomains = %s\n\n", formatTOMLStringArray(domains)))
|
|
|
|
b.WriteString("[[proxies]]\n")
|
|
b.WriteString("name = \"fonu-nginx-https\"\n")
|
|
b.WriteString("type = \"https\"\n")
|
|
b.WriteString(fmt.Sprintf("customDomains = %s\n", formatTOMLStringArray(domains)))
|
|
b.WriteString("[proxies.plugin]\n")
|
|
b.WriteString("type = \"https2https\"\n")
|
|
b.WriteString(fmt.Sprintf("localAddr = \"127.0.0.1:%d\"\n", httpsPort))
|
|
|
|
return b.String(), nil
|
|
}
|
|
|
|
func tomlPath(path string) string {
|
|
return filepath.ToSlash(filepath.Clean(path))
|
|
}
|
|
|
|
func formatTOMLStringArray(items []string) string {
|
|
parts := make([]string, 0, len(items))
|
|
for _, item := range items {
|
|
parts = append(parts, fmt.Sprintf("%q", item))
|
|
}
|
|
return "[" + strings.Join(parts, ", ") + "]"
|
|
}
|