🏗️ refactor proxy handling to replace stcpModel with visitorsModel and enhance configuration structure in ServerService

This commit is contained in:
刘嘉伟 2025-02-26 14:56:10 +08:00
parent f77605a73d
commit f0d8c20f4d
7 changed files with 85 additions and 69 deletions

View File

@ -200,7 +200,7 @@
// httpUser: m.httpUser || "", // httpUser: m.httpUser || "",
// httpPassword: m.httpPassword || "", // httpPassword: m.httpPassword || "",
// // 以下为stcp参数 // // 以下为stcp参数
// stcpModel: "visited", // visitorsModel: "visitorsProvider",
// serverName: "", // serverName: "",
// secretKey: m?.secretKey || "", // secretKey: m?.secretKey || "",
// bindAddr: "", // bindAddr: "",
@ -234,7 +234,7 @@
// httpUser: m.httpUser || "", // httpUser: m.httpUser || "",
// httpPassword: m.httpPassword || "", // httpPassword: m.httpPassword || "",
// // 以下为stcp参数 // // 以下为stcp参数
// stcpModel: "visitors", // visitorsModel: "visitors",
// serverName: m?.serverName, // serverName: m?.serverName,
// secretKey: m?.secretKey || "", // secretKey: m?.secretKey || "",
// bindAddr: m?.bindAddr, // bindAddr: m?.bindAddr,

View File

@ -58,7 +58,7 @@
// } // }
// [[${ // [[${
// (m.type === "stcp" || m.type === "xtcp" || m.type === "sudp") && // (m.type === "stcp" || m.type === "xtcp" || m.type === "sudp") &&
// m.stcpModel === "visitors" // m.visitorsModel === "visitors"
// ? "visitors" // ? "visitors"
// : "proxies" // : "proxies"
// }]] // }]]
@ -105,12 +105,12 @@
// //
// break; // break;
// case "xtcp": // case "xtcp":
// if (m.stcpModel === "visitors") { // if (m.visitorsModel === "visitors") {
// toml += `keepTunnelOpen = ${m.keepTunnelOpen}\n`; // toml += `keepTunnelOpen = ${m.keepTunnelOpen}\n`;
// } // }
// case "stcp": // case "stcp":
// case "sudp": // case "sudp":
// if (m.stcpModel === "visitors") { // if (m.visitorsModel === "visitors") {
// // 访问者 // // 访问者
// toml += `serverName = "${m.serverName}" // toml += `serverName = "${m.serverName}"
// bindAddr = "${m.bindAddr}" // bindAddr = "${m.bindAddr}"
@ -119,7 +119,7 @@
// toml += `fallbackTo = "${m.fallbackTo}" // toml += `fallbackTo = "${m.fallbackTo}"
// fallbackTimeoutMs = ${m.fallbackTimeoutMs || 500}\n`; // fallbackTimeoutMs = ${m.fallbackTimeoutMs || 500}\n`;
// } // }
// } else if (m.stcpModel === "visited") { // } else if (m.visitorsModel === "visitorsProvider") {
// // 被访问者 // // 被访问者
// toml += `localIP = "${m.localIp}" // toml += `localIP = "${m.localIp}"
// localPort = ${m.localPort}\n`; // localPort = ${m.localPort}\n`;
@ -274,12 +274,12 @@
// } // }
// break; // break;
// case "xtcp": // case "xtcp":
// if (m.stcpModel === "visitors") { // if (m.visitorsModel === "visitors") {
// ini += `keep_tunnel_open = ${m.keepTunnelOpen}\n`; // ini += `keep_tunnel_open = ${m.keepTunnelOpen}\n`;
// } // }
// case "stcp": // case "stcp":
// case "sudp": // case "sudp":
// if (m.stcpModel === "visitors") { // if (m.visitorsModel === "visitors") {
// // 访问者 // // 访问者
// ini += ` // ini += `
// role = visitor // role = visitor
@ -291,7 +291,7 @@
// fallback_to = ${m.fallbackTo} // fallback_to = ${m.fallbackTo}
// fallback_timeout_ms = ${m.fallbackTimeoutMs || 500}\n`; // fallback_timeout_ms = ${m.fallbackTimeoutMs || 500}\n`;
// } // }
// } else if (m.stcpModel === "visited") { // } else if (m.visitorsModel === "visitorsProvider") {
// // 被访问者 // // 被访问者
// ini += ` // ini += `
// local_ip = "${m.localIp}" // local_ip = "${m.localIp}"

View File

@ -5,6 +5,8 @@ class GlobalConstant {
public static TOML_EXT = ".toml"; public static TOML_EXT = ".toml";
public static GZ_EXT = ".gz"; public static GZ_EXT = ".gz";
public static TAR_GZ_EXT = ".tar.gz"; public static TAR_GZ_EXT = ".tar.gz";
public static LOCAL_IP = "127.0.0.1";
public static FRPC_LOGIN_FAIL_EXIT = false;
public static FRP_ARCH_VERSION_MAPPING = { public static FRP_ARCH_VERSION_MAPPING = {
win32_x64: ["window", "amd64"], win32_x64: ["window", "amd64"],

View File

@ -56,50 +56,64 @@ class ServerService extends BaseService<OpenSourceFrpcDesktopServer> {
const proxies = await this._proxyDao.findAll(); const proxies = await this._proxyDao.findAll();
const enabledProxies = proxies const enabledProxies = proxies
.filter(f => f.status === 1) .filter(f => f.status === 1)
.filter(f => f.visitorsModel !== "visitors")
.map(proxy => { .map(proxy => {
if (proxy.type === "tcp") { if (proxy.type === "tcp" || proxy.type === "udp") {
const { return {
_id, name: proxy.name,
status, type: proxy.type,
basicAuth, localIP: proxy.localIP,
bindAddr, localPort: parseInt(proxy.localPort),
subdomain, remotePort: parseInt(proxy.remotePort)
httpUser, };
httpPassword, } else if (proxy.type === "http" || proxy.type === "https") {
fallbackTo,
fallbackTimeoutMs,
https2http,
https2httpCaFile,
https2httpKeyFile,
stcpModel,
customDomains,
locations,
hostHeaderRewrite,
keepTunnelOpen,
secretKey,
serverName,
...frpProxyConfig
} = proxy;
frpProxyConfig.localPort = parseInt(frpProxyConfig.localPort);
frpProxyConfig.remotePort = parseInt(frpProxyConfig.remotePort);
return frpProxyConfig;
} else {
const { _id, status, ...frpProxyConfig } = proxy; const { _id, status, ...frpProxyConfig } = proxy;
return frpProxyConfig; return frpProxyConfig;
} else if (
proxy.type === "stcp" ||
proxy.type === "xtcp" ||
proxy.type === "sudp"
) {
return {
name: proxy.name,
type: proxy.type,
localIP: proxy.localIP,
localPort: parseInt(proxy.localPort),
secretKey: proxy.secretKey
};
} }
}); });
const enableVisitors = proxies
.filter(f => f.status === 1)
.filter(f => f.visitorsModel === "visitors")
.map(proxy => {
return {
name: proxy.name,
type: proxy.type,
// serverUser: proxy.serverUser,
serverName: proxy.serverName,
secretKey: proxy.secretKey,
bindAddr: proxy.bindAddr,
bindPort: proxy.bindPort,
// keepTunnelOpen: proxy.keepTunnelOpen
// maxRetriesAnHour: proxy.maxRetriesAnHour,
// minRetryInterval: proxy.minRetryInterval,
};
});
const { frpcVersion, _id, system, ...commonConfig } = server; const { frpcVersion, _id, system, ...commonConfig } = server;
const frpcConfig = { ...commonConfig }; const frpcConfig = { ...commonConfig };
frpcConfig.log.to = PathUtils.getFrpcLogFilePath(); frpcConfig.log.to = PathUtils.getFrpcLogFilePath();
frpcConfig.loginFailExit = false; frpcConfig.loginFailExit = GlobalConstant.FRPC_LOGIN_FAIL_EXIT;
frpcConfig.webServer.addr = "127.0.0.1"; frpcConfig.webServer.addr = GlobalConstant.LOCAL_IP;
const toml = TOML.stringify({ ...frpcConfig, proxies: enabledProxies }); const toml = TOML.stringify({
...frpcConfig,
proxies: enabledProxies,
visitors: enableVisitors
});
fs.writeFileSync( fs.writeFileSync(outputPath, toml, { flag: "w" });
outputPath, // 配置文件目录
toml, // 配置文件内容
{ flag: "w" }
);
} }
async importTomlConfig() { async importTomlConfig() {

View File

@ -56,7 +56,7 @@ const defaultForm: FrpcProxy = {
localPort: "8080", localPort: "8080",
remotePort: "8080", remotePort: "8080",
customDomains: [""], customDomains: [""],
stcpModel: "visitors", visitorsModel: "visitors",
serverName: "", serverName: "",
secretKey: "", secretKey: "",
bindAddr: "", bindAddr: "",
@ -84,14 +84,14 @@ const editForm = ref<FrpcProxy>(_.cloneDeep(defaultForm));
*/ */
const proxyTypes = ref(["http", "https", "tcp", "udp", "stcp", "xtcp", "sudp"]); const proxyTypes = ref(["http", "https", "tcp", "udp", "stcp", "xtcp", "sudp"]);
const stcpModels = ref([ const visitorsModels = ref([
{ {
label: "访问者", label: "访问者",
value: "visitors" value: "visitors"
}, },
{ {
label: "被访问者", label: "被访问者",
value: "visited" value: "visitorsProvider"
} }
]); ]);
@ -132,7 +132,7 @@ const editFormRules = reactive<FormRules>({
trigger: "blur" trigger: "blur"
} }
], ],
stcpModel: [{ required: true, message: "请选择stcp模式", trigger: "blur" }], visitorsModel: [{ required: true, message: "请选择stcp模式", trigger: "blur" }],
secretKey: [ secretKey: [
{ required: true, message: "请输入stcp共享密钥", trigger: "blur" } { required: true, message: "请输入stcp共享密钥", trigger: "blur" }
], ],
@ -188,12 +188,12 @@ const isXtcp = computed(() => {
return editForm.value.type === "xtcp"; return editForm.value.type === "xtcp";
}); });
const isStcpVisited = computed(() => { const isStcpvisitorsProvider = computed(() => {
return ( return (
(editForm.value.type === "stcp" || (editForm.value.type === "stcp" ||
editForm.value.type === "sudp" || editForm.value.type === "sudp" ||
editForm.value.type === "xtcp") && editForm.value.type === "xtcp") &&
editForm.value.stcpModel === "visited" editForm.value.visitorsModel === "visitorsProvider"
); );
}); });
@ -202,7 +202,7 @@ const isStcpVisitors = computed(() => {
(editForm.value.type === "stcp" || (editForm.value.type === "stcp" ||
editForm.value.type === "sudp" || editForm.value.type === "sudp" ||
editForm.value.type === "xtcp") && editForm.value.type === "xtcp") &&
editForm.value.stcpModel === "visitors" editForm.value.visitorsModel === "visitors"
); );
}); });
@ -382,13 +382,13 @@ const allowCopyAccessAddress = (proxy: FrpcProxy) => {
) { ) {
return false; return false;
} }
if (proxy.type === "stcp" && proxy.stcpModel === "visited") { if (proxy.type === "stcp" && proxy.visitorsModel === "visitorsProvider") {
return false; return false;
} }
if (proxy.type === "xtcp" && proxy.stcpModel === "visited") { if (proxy.type === "xtcp" && proxy.visitorsModel === "visitorsProvider") {
return false; return false;
} }
if (proxy.type === "sudp" && proxy.stcpModel === "visited") { if (proxy.type === "sudp" && proxy.visitorsModel === "visitorsProvider") {
return false; return false;
} }
return true; return true;
@ -401,10 +401,10 @@ const handleCopyAccessAddress = (proxy: FrpcProxy) => {
) { ) {
return; return;
} }
if (proxy.type === "stcp" && proxy.stcpModel === "visited") { if (proxy.type === "stcp" && proxy.visitorsModel === "visitorsProvider") {
return; return;
} }
if (proxy.type === "xtcp" && proxy.stcpModel === "visited") { if (proxy.type === "xtcp" && proxy.visitorsModel === "visitorsProvider") {
return; return;
} }
let accessAddressStr = ""; let accessAddressStr = "";
@ -637,7 +637,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' || (proxy.type === 'stcp' ||
proxy.type === 'xtcp' || proxy.type === 'xtcp' ||
proxy.type === 'sudp') && proxy.type === 'sudp') &&
proxy.stcpModel === 'visitors' proxy.visitorsModel === 'visitors'
" "
size="small" size="small"
> >
@ -649,7 +649,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' || (proxy.type === 'stcp' ||
proxy.type === 'xtcp' || proxy.type === 'xtcp' ||
proxy.type === 'sudp') && proxy.type === 'sudp') &&
proxy.stcpModel === 'visited' proxy.visitorsModel === 'visitorsProvider'
" "
>被访问者 >被访问者
</el-tag> </el-tag>
@ -722,7 +722,7 @@ onUnmounted(() => {
(proxy.type !== 'stcp' && (proxy.type !== 'stcp' &&
proxy.type !== 'xtcp' && proxy.type !== 'xtcp' &&
proxy.type !== 'sudp') || proxy.type !== 'sudp') ||
proxy.stcpModel !== 'visitors' proxy.visitorsModel !== 'visitors'
" "
> >
<p class="text-[#ADADAD] font-bold">内网地址</p> <p class="text-[#ADADAD] font-bold">内网地址</p>
@ -739,7 +739,7 @@ onUnmounted(() => {
(proxy.type !== 'stcp' && (proxy.type !== 'stcp' &&
proxy.type !== 'xtcp' && proxy.type !== 'xtcp' &&
proxy.type !== 'sudp') || proxy.type !== 'sudp') ||
proxy.stcpModel !== 'visitors' proxy.visitorsModel !== 'visitors'
" "
> >
<p class="text-[#ADADAD] font-bold">内网端口</p> <p class="text-[#ADADAD] font-bold">内网端口</p>
@ -752,7 +752,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' || (proxy.type === 'stcp' ||
proxy.type === 'xtcp' || proxy.type === 'xtcp' ||
proxy.type === 'sudp') && proxy.type === 'sudp') &&
proxy.stcpModel === 'visitors' proxy.visitorsModel === 'visitors'
" "
> >
<p class="text-[#ADADAD] font-bold">访问者名称</p> <p class="text-[#ADADAD] font-bold">访问者名称</p>
@ -765,7 +765,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' || (proxy.type === 'stcp' ||
proxy.type === 'xtcp' || proxy.type === 'xtcp' ||
proxy.type === 'sudp') && proxy.type === 'sudp') &&
proxy.stcpModel === 'visitors' proxy.visitorsModel === 'visitors'
" "
> >
<p class="text-[#ADADAD] font-bold">绑定地址</p> <p class="text-[#ADADAD] font-bold">绑定地址</p>
@ -778,7 +778,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' || (proxy.type === 'stcp' ||
proxy.type === 'xtcp' || proxy.type === 'xtcp' ||
proxy.type === 'sudp') && proxy.type === 'sudp') &&
proxy.stcpModel === 'visitors' proxy.visitorsModel === 'visitors'
" "
> >
<p class="text-[#ADADAD] font-bold">绑定端口</p> <p class="text-[#ADADAD] font-bold">绑定端口</p>
@ -834,10 +834,10 @@ onUnmounted(() => {
</el-col> </el-col>
<template v-if="isStcp || isSudp || isXtcp"> <template v-if="isStcp || isSudp || isXtcp">
<el-col :span="12"> <el-col :span="12">
<el-form-item :label="`${editForm.type}模式:`" prop="stcpModel"> <el-form-item :label="`${editForm.type}模式:`" prop="visitorsModel">
<el-radio-group v-model="editForm.stcpModel"> <el-radio-group v-model="editForm.visitorsModel">
<el-radio <el-radio
v-for="p in stcpModels" v-for="p in visitorsModels"
:key="p.value" :key="p.value"
:label="p.label" :label="p.label"
:value="p.value" :value="p.value"
@ -902,7 +902,7 @@ onUnmounted(() => {
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
<template v-if="!(isStcp || isXtcp || isSudp) || isStcpVisited"> <template v-if="!(isStcp || isXtcp || isSudp) || isStcpvisitorsProvider">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="内网地址:" prop="localIP"> <el-form-item label="内网地址:" prop="localIP">
<el-autocomplete <el-autocomplete

2
types/frp.d.ts vendored
View File

@ -63,7 +63,7 @@ interface FrpcProxyConfig {
customDomains: string[]; customDomains: string[];
locations: string[]; locations: string[];
hostHeaderRewrite: string; hostHeaderRewrite: string;
stcpModel: string; visitorsModel: string;
serverName: string; serverName: string;
secretKey: string; secretKey: string;
bindAddr: string; bindAddr: string;

2
types/global.d.ts vendored
View File

@ -21,7 +21,7 @@ declare global {
localPort: any; localPort: any;
remotePort: string; remotePort: string;
customDomains: string[]; customDomains: string[];
stcpModel: string; visitorsModel: string;
serverName: string; serverName: string;
secretKey: string; secretKey: string;
bindAddr: string; bindAddr: string;