停止维护

This commit is contained in:
qaq
2025-08-30 20:06:22 +08:00
parent 8f229f3f27
commit 170744fb04
26 changed files with 16 additions and 31285 deletions
+14 -121
View File
@@ -1,132 +1,25 @@
# flux-panel转发面板
本项目基于 [go-gost/gost](https://github.com/go-gost/gost) 和 [go-gost/x](https://github.com/go-gost/x) 两个开源库,实现了转发面板。
---
## 文档地址
- [文档地址](https://tes.cc)
---
## 特性
- 支持按 **隧道账号级别** 管理流量转发数量,可用于用户/隧道配额控制
- 支持 **TCP** 和 **UDP** 协议的转发
- 支持两种转发模式:**端口转发** 与 **隧道转发**
- 可针对 **指定用户的指定隧道进行限速** 设置
- 支持配置 **单向或双向流量计费方式**,灵活适配不同计费模型
- 提供灵活的转发策略配置,适用于多种网络代理场景
---
# 流量统计算法
## 流量流向定义
```
用户端 ←→ 转发服务器 ←→ 目标服务器/出口节点
```
### 数据流向说明
| 流向 | 描述 | 计费类型 |
|-----|-----|----------|
| 用户 → 转发服务器 | 用户发送到服务器的数据包 | 入站流量 |
| 转发服务器 → 目标服务器 | 服务器转发到目标的数据包 | 出站流量 |
| 目标服务器 → 转发服务器 | 目标服务器返回的数据包 | 入站流量 |
| 转发服务器 → 用户 | 服务器返回给用户的数据包 | 出站流量 |
## 计费模式
### 🔄 双向计费
统计所有方向的流量,包括:
- ✅ 用户 → 转发服务器
- ✅ 转发服务器 → 目标服务器
- ✅ 目标服务器 → 转发服务器
- ✅ 转发服务器 → 用户
**计费公式**:`总流量 = 入站流量 + 出站流量`
### ➡️ 单向计费
仅统计有效的转发流量,包括:
- ❌ 用户 → 转发服务器 (不计费)
- ✅ 转发服务器 → 目标服务器 (计费)
- ❌ 目标服务器 → 转发服务器 (不计费)
- ✅ 转发服务器 → 用户 (计费)
**计费公式**:`总流量 = 转发出站流量`
## 使用场景
- **双向计费**:适用于需要精确计量所有网络资源消耗的场景
- **单向计费**:适用于用户友好的计费模式,只对实际的数据转发服务收费
> 💡 **提示**:可以在创建隧道时选择不同的流量计算方式,灵活适配不同的业务需求
---
## 部署流程
### 源码编译部署
```bash
暂时没时间写,能源码部署的都是大佬,不差我这点文档
```
---
### Docker Compose部署
#### 快速部署
```bash
curl -L https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/panel_install.sh -o panel_install.sh && chmod +x panel_install.sh && ./panel_install.sh
```
#### 默认管理员账号
- **账号**: admin_user
- **密码**: admin_user
> ⚠️ 首次登录后请立即修改默认密码!
## 免责声明
本项目仅供个人学习与研究使用,基于开源项目进行二次开发。
本项目仅供个人学习与研究使用,基于开源项目进行二次开发。
使用本项目所带来的任何风险由使用者自行承担,包括但不限于:
使用本项目所带来的任何风险均由使用者自行承担,包括但不限于:
- 配置不当或使用错误导致的服务异常或不可用;
- 使用本项目引发的网络攻击、封禁、滥用等行为;
- 服务器因使用本项目被入侵、渗透、滥用导致的数据泄露、资源消耗或损失;
- 因违反当地法律法规所产生的任何法律责任。
- 配置不当或使用错误导致的服务异常或不可用;
- 使用本项目引发的网络攻击、封禁、滥用等行为;
- 服务器因使用本项目被入侵、渗透、滥用导致的数据泄露、资源消耗或损失;
- 因违反当地法律法规所产生的任何法律责任。
本项目为开源流量转发工具,仅供合法用途。
使用者应确保其使用行为符合所在国家或地区的法律法规。
本项目为开源的流量转发工具,仅限合法、合规用途。
使用者必须确保其使用行为符合所在国家或地区的法律法规。
作者不对因使用本项目导致的任何法律责任、经济损失或其他后果承担责任。
禁止将本项目用于任何违法或未经授权的行为,包括但不限于网络攻击、数据窃取、非法访问等。
**作者不对因使用本项目导致的任何法律责任、经济损失或其他后果承担责任。**
**禁止将本项目用于任何违法或未经授权的行为,包括但不限于网络攻击、数据窃取、非法访问等。**
如不同意上述条款,请勿使用本项目。
如不同意上述条款,请立即停止使用本项目。
作者对因使用本项目所造成的任何直接或间接损失概不负责,也不提供任何形式的担保或技术支持。
作者对因使用本项目所造成的任何直接或间接损失概不负责,亦不提供任何形式的担保、承诺或技术支持。
**本项目不再提供任何形式的维护、更新或技术支持。**
请确保在合法、合规、安全的前提下使用本项目。
---
## ⭐ 喝杯咖啡!
| 网络 | 地址 |
|------------|----------------------------------------------------------------------|
| BNB(BEP20) | `0x755492c03728851bbf855daa28a1e089f9aca4d1` |
| TRC20 | `TYh2L3xxXpuJhAcBWnt3yiiADiCSJLgUm7` |
| Aptos | `0xf2f9fb14749457748506a8281628d556e8540d1eb586d202cd8b02b99d369ef8` |
请务必在合法、合规、安全的前提下使用本项目。
---
**⭐ 如果这个项目对您有帮助,请给个 Star 支持一下!**
[![Star History Chart](https://api.star-history.com/svg?repos=bqlpfy/flux-panel&type=Date)](https://www.star-history.com/#bqlpfy/flux-panel&Date)
@@ -41,7 +41,7 @@ mybatis-plus:
jwt-secret: ${JWT_SECRET}
log-dir: ${LOG_DIR}
# 验证码配置
captcha:
init-default-resource: true
secondary:
+1 -1
View File
@@ -4,7 +4,7 @@ export type SiteConfig = typeof siteConfig;
// 缓存相关常量
const CACHE_PREFIX = 'vite_config_';
const VERSION = "1.3.4";
const VERSION = "1.3.5";
const APP_VERSION = "1.0.3";
const getInitialConfig = () => {
-275
View File
@@ -1,275 +0,0 @@
import {
useMediaQuery
} from "./chunk-ECKPOFXB.js";
import {
computed,
ref,
shallowRef,
watch
} from "./chunk-W6V53FDX.js";
// node_modules/vitepress/dist/client/theme-default/index.js
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/fonts.css";
// node_modules/vitepress/dist/client/theme-default/without-fonts.js
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/vars.css";
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/base.css";
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/icons.css";
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/utils.css";
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/components/custom-block.css";
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code.css";
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code-group.css";
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/components/vp-doc.css";
import "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/styles/components/vp-sponsor.css";
import VPBadge from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
import Layout from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/Layout.vue";
import { default as default2 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
import { default as default3 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPButton.vue";
import { default as default4 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue";
import { default as default5 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPFeatures.vue";
import { default as default6 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPHomeContent.vue";
import { default as default7 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPHomeFeatures.vue";
import { default as default8 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPHomeHero.vue";
import { default as default9 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPHomeSponsors.vue";
import { default as default10 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPImage.vue";
import { default as default11 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPLink.vue";
import { default as default12 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPNavBarSearch.vue";
import { default as default13 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPSocialLink.vue";
import { default as default14 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPSocialLinks.vue";
import { default as default15 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPSponsors.vue";
import { default as default16 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPTeamMembers.vue";
import { default as default17 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPTeamPage.vue";
import { default as default18 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageSection.vue";
import { default as default19 } from "/Users/helei/Downloads/gost/vitepress/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue";
// node_modules/vitepress/dist/client/theme-default/composables/local-nav.js
import { onContentUpdated } from "vitepress";
// node_modules/vitepress/dist/client/theme-default/composables/outline.js
import { getScrollOffset } from "vitepress";
// node_modules/vitepress/dist/client/theme-default/support/utils.js
import { withBase } from "vitepress";
// node_modules/vitepress/dist/client/theme-default/composables/data.js
import { useData as useData$ } from "vitepress";
var useData = useData$;
// node_modules/vitepress/dist/client/theme-default/support/utils.js
function ensureStartingSlash(path) {
return path.startsWith("/") ? path : `/${path}`;
}
// node_modules/vitepress/dist/client/theme-default/support/sidebar.js
function getSidebar(_sidebar, path) {
if (Array.isArray(_sidebar))
return addBase(_sidebar);
if (_sidebar == null)
return [];
path = ensureStartingSlash(path);
const dir = Object.keys(_sidebar).sort((a, b) => {
return b.split("/").length - a.split("/").length;
}).find((dir2) => {
return path.startsWith(ensureStartingSlash(dir2));
});
const sidebar = dir ? _sidebar[dir] : [];
return Array.isArray(sidebar) ? addBase(sidebar) : addBase(sidebar.items, sidebar.base);
}
function getSidebarGroups(sidebar) {
const groups = [];
let lastGroupIndex = 0;
for (const index in sidebar) {
const item = sidebar[index];
if (item.items) {
lastGroupIndex = groups.push(item);
continue;
}
if (!groups[lastGroupIndex]) {
groups.push({ items: [] });
}
groups[lastGroupIndex].items.push(item);
}
return groups;
}
function addBase(items, _base) {
return [...items].map((_item) => {
const item = { ..._item };
const base = item.base || _base;
if (base && item.link)
item.link = base + item.link;
if (item.items)
item.items = addBase(item.items, base);
return item;
});
}
// node_modules/vitepress/dist/client/theme-default/composables/sidebar.js
function useSidebar() {
const { frontmatter, page, theme: theme2 } = useData();
const is960 = useMediaQuery("(min-width: 960px)");
const isOpen = ref(false);
const _sidebar = computed(() => {
const sidebarConfig = theme2.value.sidebar;
const relativePath = page.value.relativePath;
return sidebarConfig ? getSidebar(sidebarConfig, relativePath) : [];
});
const sidebar = ref(_sidebar.value);
watch(_sidebar, (next, prev) => {
if (JSON.stringify(next) !== JSON.stringify(prev))
sidebar.value = _sidebar.value;
});
const hasSidebar = computed(() => {
return frontmatter.value.sidebar !== false && sidebar.value.length > 0 && frontmatter.value.layout !== "home";
});
const leftAside = computed(() => {
if (hasAside)
return frontmatter.value.aside == null ? theme2.value.aside === "left" : frontmatter.value.aside === "left";
return false;
});
const hasAside = computed(() => {
if (frontmatter.value.layout === "home")
return false;
if (frontmatter.value.aside != null)
return !!frontmatter.value.aside;
return theme2.value.aside !== false;
});
const isSidebarEnabled = computed(() => hasSidebar.value && is960.value);
const sidebarGroups = computed(() => {
return hasSidebar.value ? getSidebarGroups(sidebar.value) : [];
});
function open() {
isOpen.value = true;
}
function close() {
isOpen.value = false;
}
function toggle() {
isOpen.value ? close() : open();
}
return {
isOpen,
sidebar,
sidebarGroups,
hasSidebar,
hasAside,
leftAside,
isSidebarEnabled,
open,
close,
toggle
};
}
// node_modules/vitepress/dist/client/theme-default/composables/outline.js
var ignoreRE = /\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/;
var resolvedHeaders = [];
function getHeaders(range) {
const headers = [
...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")
].filter((el) => el.id && el.hasChildNodes()).map((el) => {
const level = Number(el.tagName[1]);
return {
element: el,
title: serializeHeader(el),
link: "#" + el.id,
level
};
});
return resolveHeaders(headers, range);
}
function serializeHeader(h) {
let ret = "";
for (const node of h.childNodes) {
if (node.nodeType === 1) {
if (ignoreRE.test(node.className))
continue;
ret += node.textContent;
} else if (node.nodeType === 3) {
ret += node.textContent;
}
}
return ret.trim();
}
function resolveHeaders(headers, range) {
if (range === false) {
return [];
}
const levelsRange = (typeof range === "object" && !Array.isArray(range) ? range.level : range) || 2;
const [high, low] = typeof levelsRange === "number" ? [levelsRange, levelsRange] : levelsRange === "deep" ? [2, 6] : levelsRange;
return buildTree(headers, high, low);
}
function buildTree(data, min, max) {
resolvedHeaders.length = 0;
const result = [];
const stack = [];
data.forEach((item) => {
const node = { ...item, children: [] };
let parent = stack[stack.length - 1];
while (parent && parent.level >= node.level) {
stack.pop();
parent = stack[stack.length - 1];
}
if (node.element.classList.contains("ignore-header") || parent && "shouldIgnore" in parent) {
stack.push({ level: node.level, shouldIgnore: true });
return;
}
if (node.level > max || node.level < min)
return;
resolvedHeaders.push({ element: node.element, link: node.link });
if (parent)
parent.children.push(node);
else
result.push(node);
stack.push(node);
});
return result;
}
// node_modules/vitepress/dist/client/theme-default/composables/local-nav.js
function useLocalNav() {
const { theme: theme2, frontmatter } = useData();
const headers = shallowRef([]);
const hasLocalNav = computed(() => {
return headers.value.length > 0;
});
onContentUpdated(() => {
headers.value = getHeaders(frontmatter.value.outline ?? theme2.value.outline);
});
return {
headers,
hasLocalNav
};
}
// node_modules/vitepress/dist/client/theme-default/without-fonts.js
var theme = {
Layout,
enhanceApp: ({ app }) => {
app.component("Badge", VPBadge);
}
};
var without_fonts_default = theme;
export {
default2 as VPBadge,
default3 as VPButton,
default4 as VPDocAsideSponsors,
default5 as VPFeatures,
default6 as VPHomeContent,
default7 as VPHomeFeatures,
default8 as VPHomeHero,
default9 as VPHomeSponsors,
default10 as VPImage,
default11 as VPLink,
default12 as VPNavBarSearch,
default13 as VPSocialLink,
default14 as VPSocialLinks,
default15 as VPSponsors,
default16 as VPTeamMembers,
default17 as VPTeamPage,
default18 as VPTeamPageSection,
default19 as VPTeamPageTitle,
without_fonts_default as default,
useLocalNav,
useSidebar
};
//# sourceMappingURL=@theme_index.js.map
File diff suppressed because one or more lines are too long
-40
View File
@@ -1,40 +0,0 @@
{
"hash": "3d30e436",
"configHash": "78039c44",
"lockfileHash": "ca3783c8",
"browserHash": "eddd3d68",
"optimized": {
"vue": {
"src": "../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
"file": "vue.js",
"fileHash": "9cd164eb",
"needsInterop": false
},
"vitepress > @vue/devtools-api": {
"src": "../../../node_modules/@vue/devtools-api/dist/index.js",
"file": "vitepress___@vue_devtools-api.js",
"fileHash": "a5ce2655",
"needsInterop": false
},
"vitepress > @vueuse/core": {
"src": "../../../node_modules/@vueuse/core/index.mjs",
"file": "vitepress___@vueuse_core.js",
"fileHash": "4b1f897e",
"needsInterop": false
},
"@theme/index": {
"src": "../../../node_modules/vitepress/dist/client/theme-default/index.js",
"file": "@theme_index.js",
"fileHash": "1d6687dc",
"needsInterop": false
}
},
"chunks": {
"chunk-ECKPOFXB": {
"file": "chunk-ECKPOFXB.js"
},
"chunk-W6V53FDX": {
"file": "chunk-W6V53FDX.js"
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
-3
View File
@@ -1,3 +0,0 @@
{
"type": "module"
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -1,583 +0,0 @@
import {
DefaultMagicKeysAliasMap,
StorageSerializers,
TransitionPresets,
assert,
breakpointsAntDesign,
breakpointsBootstrapV5,
breakpointsElement,
breakpointsMasterCss,
breakpointsPrimeFlex,
breakpointsQuasar,
breakpointsSematic,
breakpointsTailwind,
breakpointsVuetify,
breakpointsVuetifyV2,
breakpointsVuetifyV3,
bypassFilter,
camelize,
clamp,
cloneFnJSON,
computedAsync,
computedEager,
computedInject,
computedWithControl,
containsProp,
controlledRef,
createEventHook,
createFetch,
createFilterWrapper,
createGlobalState,
createInjectionState,
createRef,
createReusableTemplate,
createSharedComposable,
createSingletonPromise,
createTemplatePromise,
createUnrefFn,
customStorageEventName,
debounceFilter,
defaultDocument,
defaultLocation,
defaultNavigator,
defaultWindow,
executeTransition,
extendRef,
formatDate,
formatTimeAgo,
get,
getLifeCycleTarget,
getSSRHandler,
hasOwn,
hyphenate,
identity,
increaseWithUnit,
injectLocal,
invoke,
isClient,
isDef,
isDefined,
isIOS,
isObject,
isWorker,
makeDestructurable,
mapGamepadToXbox360Controller,
noop,
normalizeDate,
notNullish,
now,
objectEntries,
objectOmit,
objectPick,
onClickOutside,
onElementRemoval,
onKeyDown,
onKeyPressed,
onKeyStroke,
onKeyUp,
onLongPress,
onStartTyping,
pausableFilter,
promiseTimeout,
provideLocal,
provideSSRWidth,
pxValue,
rand,
reactify,
reactifyObject,
reactiveComputed,
reactiveOmit,
reactivePick,
refAutoReset,
refDebounced,
refDefault,
refThrottled,
refWithControl,
resolveRef,
resolveUnref,
set,
setSSRHandler,
syncRef,
syncRefs,
templateRef,
throttleFilter,
timestamp,
toArray,
toReactive,
toRef,
toRefs,
toValue,
tryOnBeforeMount,
tryOnBeforeUnmount,
tryOnMounted,
tryOnScopeDispose,
tryOnUnmounted,
unrefElement,
until,
useActiveElement,
useAnimate,
useArrayDifference,
useArrayEvery,
useArrayFilter,
useArrayFind,
useArrayFindIndex,
useArrayFindLast,
useArrayIncludes,
useArrayJoin,
useArrayMap,
useArrayReduce,
useArraySome,
useArrayUnique,
useAsyncQueue,
useAsyncState,
useBase64,
useBattery,
useBluetooth,
useBreakpoints,
useBroadcastChannel,
useBrowserLocation,
useCached,
useClipboard,
useClipboardItems,
useCloned,
useColorMode,
useConfirmDialog,
useCountdown,
useCounter,
useCssVar,
useCurrentElement,
useCycleList,
useDark,
useDateFormat,
useDebounceFn,
useDebouncedRefHistory,
useDeviceMotion,
useDeviceOrientation,
useDevicePixelRatio,
useDevicesList,
useDisplayMedia,
useDocumentVisibility,
useDraggable,
useDropZone,
useElementBounding,
useElementByPoint,
useElementHover,
useElementSize,
useElementVisibility,
useEventBus,
useEventListener,
useEventSource,
useEyeDropper,
useFavicon,
useFetch,
useFileDialog,
useFileSystemAccess,
useFocus,
useFocusWithin,
useFps,
useFullscreen,
useGamepad,
useGeolocation,
useIdle,
useImage,
useInfiniteScroll,
useIntersectionObserver,
useInterval,
useIntervalFn,
useKeyModifier,
useLastChanged,
useLocalStorage,
useMagicKeys,
useManualRefHistory,
useMediaControls,
useMediaQuery,
useMemoize,
useMemory,
useMounted,
useMouse,
useMouseInElement,
useMousePressed,
useMutationObserver,
useNavigatorLanguage,
useNetwork,
useNow,
useObjectUrl,
useOffsetPagination,
useOnline,
usePageLeave,
useParallax,
useParentElement,
usePerformanceObserver,
usePermission,
usePointer,
usePointerLock,
usePointerSwipe,
usePreferredColorScheme,
usePreferredContrast,
usePreferredDark,
usePreferredLanguages,
usePreferredReducedMotion,
usePreferredReducedTransparency,
usePrevious,
useRafFn,
useRefHistory,
useResizeObserver,
useSSRWidth,
useScreenOrientation,
useScreenSafeArea,
useScriptTag,
useScroll,
useScrollLock,
useSessionStorage,
useShare,
useSorted,
useSpeechRecognition,
useSpeechSynthesis,
useStepper,
useStorage,
useStorageAsync,
useStyleTag,
useSupported,
useSwipe,
useTemplateRefsList,
useTextDirection,
useTextSelection,
useTextareaAutosize,
useThrottleFn,
useThrottledRefHistory,
useTimeAgo,
useTimeout,
useTimeoutFn,
useTimeoutPoll,
useTimestamp,
useTitle,
useToNumber,
useToString,
useToggle,
useTransition,
useUrlSearchParams,
useUserMedia,
useVModel,
useVModels,
useVibrate,
useVirtualList,
useWakeLock,
useWebNotification,
useWebSocket,
useWebWorker,
useWebWorkerFn,
useWindowFocus,
useWindowScroll,
useWindowSize,
watchArray,
watchAtMost,
watchDebounced,
watchDeep,
watchIgnorable,
watchImmediate,
watchOnce,
watchPausable,
watchThrottled,
watchTriggerable,
watchWithFilter,
whenever
} from "./chunk-ECKPOFXB.js";
import "./chunk-W6V53FDX.js";
export {
DefaultMagicKeysAliasMap,
StorageSerializers,
TransitionPresets,
assert,
computedAsync as asyncComputed,
refAutoReset as autoResetRef,
breakpointsAntDesign,
breakpointsBootstrapV5,
breakpointsElement,
breakpointsMasterCss,
breakpointsPrimeFlex,
breakpointsQuasar,
breakpointsSematic,
breakpointsTailwind,
breakpointsVuetify,
breakpointsVuetifyV2,
breakpointsVuetifyV3,
bypassFilter,
camelize,
clamp,
cloneFnJSON,
computedAsync,
computedEager,
computedInject,
computedWithControl,
containsProp,
computedWithControl as controlledComputed,
controlledRef,
createEventHook,
createFetch,
createFilterWrapper,
createGlobalState,
createInjectionState,
reactify as createReactiveFn,
createRef,
createReusableTemplate,
createSharedComposable,
createSingletonPromise,
createTemplatePromise,
createUnrefFn,
customStorageEventName,
debounceFilter,
refDebounced as debouncedRef,
watchDebounced as debouncedWatch,
defaultDocument,
defaultLocation,
defaultNavigator,
defaultWindow,
computedEager as eagerComputed,
executeTransition,
extendRef,
formatDate,
formatTimeAgo,
get,
getLifeCycleTarget,
getSSRHandler,
hasOwn,
hyphenate,
identity,
watchIgnorable as ignorableWatch,
increaseWithUnit,
injectLocal,
invoke,
isClient,
isDef,
isDefined,
isIOS,
isObject,
isWorker,
makeDestructurable,
mapGamepadToXbox360Controller,
noop,
normalizeDate,
notNullish,
now,
objectEntries,
objectOmit,
objectPick,
onClickOutside,
onElementRemoval,
onKeyDown,
onKeyPressed,
onKeyStroke,
onKeyUp,
onLongPress,
onStartTyping,
pausableFilter,
watchPausable as pausableWatch,
promiseTimeout,
provideLocal,
provideSSRWidth,
pxValue,
rand,
reactify,
reactifyObject,
reactiveComputed,
reactiveOmit,
reactivePick,
refAutoReset,
refDebounced,
refDefault,
refThrottled,
refWithControl,
resolveRef,
resolveUnref,
set,
setSSRHandler,
syncRef,
syncRefs,
templateRef,
throttleFilter,
refThrottled as throttledRef,
watchThrottled as throttledWatch,
timestamp,
toArray,
toReactive,
toRef,
toRefs,
toValue,
tryOnBeforeMount,
tryOnBeforeUnmount,
tryOnMounted,
tryOnScopeDispose,
tryOnUnmounted,
unrefElement,
until,
useActiveElement,
useAnimate,
useArrayDifference,
useArrayEvery,
useArrayFilter,
useArrayFind,
useArrayFindIndex,
useArrayFindLast,
useArrayIncludes,
useArrayJoin,
useArrayMap,
useArrayReduce,
useArraySome,
useArrayUnique,
useAsyncQueue,
useAsyncState,
useBase64,
useBattery,
useBluetooth,
useBreakpoints,
useBroadcastChannel,
useBrowserLocation,
useCached,
useClipboard,
useClipboardItems,
useCloned,
useColorMode,
useConfirmDialog,
useCountdown,
useCounter,
useCssVar,
useCurrentElement,
useCycleList,
useDark,
useDateFormat,
refDebounced as useDebounce,
useDebounceFn,
useDebouncedRefHistory,
useDeviceMotion,
useDeviceOrientation,
useDevicePixelRatio,
useDevicesList,
useDisplayMedia,
useDocumentVisibility,
useDraggable,
useDropZone,
useElementBounding,
useElementByPoint,
useElementHover,
useElementSize,
useElementVisibility,
useEventBus,
useEventListener,
useEventSource,
useEyeDropper,
useFavicon,
useFetch,
useFileDialog,
useFileSystemAccess,
useFocus,
useFocusWithin,
useFps,
useFullscreen,
useGamepad,
useGeolocation,
useIdle,
useImage,
useInfiniteScroll,
useIntersectionObserver,
useInterval,
useIntervalFn,
useKeyModifier,
useLastChanged,
useLocalStorage,
useMagicKeys,
useManualRefHistory,
useMediaControls,
useMediaQuery,
useMemoize,
useMemory,
useMounted,
useMouse,
useMouseInElement,
useMousePressed,
useMutationObserver,
useNavigatorLanguage,
useNetwork,
useNow,
useObjectUrl,
useOffsetPagination,
useOnline,
usePageLeave,
useParallax,
useParentElement,
usePerformanceObserver,
usePermission,
usePointer,
usePointerLock,
usePointerSwipe,
usePreferredColorScheme,
usePreferredContrast,
usePreferredDark,
usePreferredLanguages,
usePreferredReducedMotion,
usePreferredReducedTransparency,
usePrevious,
useRafFn,
useRefHistory,
useResizeObserver,
useSSRWidth,
useScreenOrientation,
useScreenSafeArea,
useScriptTag,
useScroll,
useScrollLock,
useSessionStorage,
useShare,
useSorted,
useSpeechRecognition,
useSpeechSynthesis,
useStepper,
useStorage,
useStorageAsync,
useStyleTag,
useSupported,
useSwipe,
useTemplateRefsList,
useTextDirection,
useTextSelection,
useTextareaAutosize,
refThrottled as useThrottle,
useThrottleFn,
useThrottledRefHistory,
useTimeAgo,
useTimeout,
useTimeoutFn,
useTimeoutPoll,
useTimestamp,
useTitle,
useToNumber,
useToString,
useToggle,
useTransition,
useUrlSearchParams,
useUserMedia,
useVModel,
useVModels,
useVibrate,
useVirtualList,
useWakeLock,
useWebNotification,
useWebSocket,
useWebWorker,
useWebWorkerFn,
useWindowFocus,
useWindowScroll,
useWindowSize,
watchArray,
watchAtMost,
watchDebounced,
watchDeep,
watchIgnorable,
watchImmediate,
watchOnce,
watchPausable,
watchThrottled,
watchTriggerable,
watchWithFilter,
whenever
};
//# sourceMappingURL=vitepress___@vueuse_core.js.map
@@ -1,7 +0,0 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}
-343
View File
@@ -1,343 +0,0 @@
import {
BaseTransition,
BaseTransitionPropsValidators,
Comment,
DeprecationTypes,
EffectScope,
ErrorCodes,
ErrorTypeStrings,
Fragment,
KeepAlive,
ReactiveEffect,
Static,
Suspense,
Teleport,
Text,
TrackOpTypes,
Transition,
TransitionGroup,
TriggerOpTypes,
VueElement,
assertNumber,
callWithAsyncErrorHandling,
callWithErrorHandling,
camelize,
capitalize,
cloneVNode,
compatUtils,
compile,
computed,
createApp,
createBaseVNode,
createBlock,
createCommentVNode,
createElementBlock,
createHydrationRenderer,
createPropsRestProxy,
createRenderer,
createSSRApp,
createSlots,
createStaticVNode,
createTextVNode,
createVNode,
customRef,
defineAsyncComponent,
defineComponent,
defineCustomElement,
defineEmits,
defineExpose,
defineModel,
defineOptions,
defineProps,
defineSSRCustomElement,
defineSlots,
devtools,
effect,
effectScope,
getCurrentInstance,
getCurrentScope,
getCurrentWatcher,
getTransitionRawChildren,
guardReactiveProps,
h,
handleError,
hasInjectionContext,
hydrate,
hydrateOnIdle,
hydrateOnInteraction,
hydrateOnMediaQuery,
hydrateOnVisible,
initCustomFormatter,
initDirectivesForSSR,
inject,
isMemoSame,
isProxy,
isReactive,
isReadonly,
isRef,
isRuntimeOnly,
isShallow,
isVNode,
markRaw,
mergeDefaults,
mergeModels,
mergeProps,
nextTick,
normalizeClass,
normalizeProps,
normalizeStyle,
onActivated,
onBeforeMount,
onBeforeUnmount,
onBeforeUpdate,
onDeactivated,
onErrorCaptured,
onMounted,
onRenderTracked,
onRenderTriggered,
onScopeDispose,
onServerPrefetch,
onUnmounted,
onUpdated,
onWatcherCleanup,
openBlock,
popScopeId,
provide,
proxyRefs,
pushScopeId,
queuePostFlushCb,
reactive,
readonly,
ref,
registerRuntimeCompiler,
render,
renderList,
renderSlot,
resolveComponent,
resolveDirective,
resolveDynamicComponent,
resolveFilter,
resolveTransitionHooks,
setBlockTracking,
setDevtoolsHook,
setTransitionHooks,
shallowReactive,
shallowReadonly,
shallowRef,
ssrContextKey,
ssrUtils,
stop,
toDisplayString,
toHandlerKey,
toHandlers,
toRaw,
toRef,
toRefs,
toValue,
transformVNodeArgs,
triggerRef,
unref,
useAttrs,
useCssModule,
useCssVars,
useHost,
useId,
useModel,
useSSRContext,
useShadowRoot,
useSlots,
useTemplateRef,
useTransitionState,
vModelCheckbox,
vModelDynamic,
vModelRadio,
vModelSelect,
vModelText,
vShow,
version,
warn,
watch,
watchEffect,
watchPostEffect,
watchSyncEffect,
withAsyncContext,
withCtx,
withDefaults,
withDirectives,
withKeys,
withMemo,
withModifiers,
withScopeId
} from "./chunk-W6V53FDX.js";
export {
BaseTransition,
BaseTransitionPropsValidators,
Comment,
DeprecationTypes,
EffectScope,
ErrorCodes,
ErrorTypeStrings,
Fragment,
KeepAlive,
ReactiveEffect,
Static,
Suspense,
Teleport,
Text,
TrackOpTypes,
Transition,
TransitionGroup,
TriggerOpTypes,
VueElement,
assertNumber,
callWithAsyncErrorHandling,
callWithErrorHandling,
camelize,
capitalize,
cloneVNode,
compatUtils,
compile,
computed,
createApp,
createBlock,
createCommentVNode,
createElementBlock,
createBaseVNode as createElementVNode,
createHydrationRenderer,
createPropsRestProxy,
createRenderer,
createSSRApp,
createSlots,
createStaticVNode,
createTextVNode,
createVNode,
customRef,
defineAsyncComponent,
defineComponent,
defineCustomElement,
defineEmits,
defineExpose,
defineModel,
defineOptions,
defineProps,
defineSSRCustomElement,
defineSlots,
devtools,
effect,
effectScope,
getCurrentInstance,
getCurrentScope,
getCurrentWatcher,
getTransitionRawChildren,
guardReactiveProps,
h,
handleError,
hasInjectionContext,
hydrate,
hydrateOnIdle,
hydrateOnInteraction,
hydrateOnMediaQuery,
hydrateOnVisible,
initCustomFormatter,
initDirectivesForSSR,
inject,
isMemoSame,
isProxy,
isReactive,
isReadonly,
isRef,
isRuntimeOnly,
isShallow,
isVNode,
markRaw,
mergeDefaults,
mergeModels,
mergeProps,
nextTick,
normalizeClass,
normalizeProps,
normalizeStyle,
onActivated,
onBeforeMount,
onBeforeUnmount,
onBeforeUpdate,
onDeactivated,
onErrorCaptured,
onMounted,
onRenderTracked,
onRenderTriggered,
onScopeDispose,
onServerPrefetch,
onUnmounted,
onUpdated,
onWatcherCleanup,
openBlock,
popScopeId,
provide,
proxyRefs,
pushScopeId,
queuePostFlushCb,
reactive,
readonly,
ref,
registerRuntimeCompiler,
render,
renderList,
renderSlot,
resolveComponent,
resolveDirective,
resolveDynamicComponent,
resolveFilter,
resolveTransitionHooks,
setBlockTracking,
setDevtoolsHook,
setTransitionHooks,
shallowReactive,
shallowReadonly,
shallowRef,
ssrContextKey,
ssrUtils,
stop,
toDisplayString,
toHandlerKey,
toHandlers,
toRaw,
toRef,
toRefs,
toValue,
transformVNodeArgs,
triggerRef,
unref,
useAttrs,
useCssModule,
useCssVars,
useHost,
useId,
useModel,
useSSRContext,
useShadowRoot,
useSlots,
useTemplateRef,
useTransitionState,
vModelCheckbox,
vModelDynamic,
vModelRadio,
vModelSelect,
vModelText,
vShow,
version,
warn,
watch,
watchEffect,
watchPostEffect,
watchSyncEffect,
withAsyncContext,
withCtx,
withDefaults,
withDirectives,
withKeys,
withMemo,
withModifiers,
withScopeId
};
//# sourceMappingURL=vue.js.map
-7
View File
@@ -1,7 +0,0 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}
-20
View File
@@ -1,20 +0,0 @@
import { defineConfig } from 'vitepress'
export default defineConfig({
title: 'flux-panel',
description: '基于gost的转发面板',
themeConfig: {
nav: [
{ text: '首页', link: '/' },
{ text: '快速开始', link: '/getting-started' },
{ text: '使用指南', link: '/guide' },
{ text: '常见问题', link: '/faq' }
],
socialLinks: [
{ icon: 'github', link: 'https://github.com/bqlpfy/flux-panel' },
{ icon: 'telegram', link: 'https://t.me/+wdVDni1fdyI0YzE1'}
]
}
})
-44
View File
@@ -1,44 +0,0 @@
# 常见问题
::: tip 需要帮助?
📱 [加入 Telegram 群组](https://t.me/+wdVDni1fdyI0YzE1) | 🐛 [GitHub Issues](https://github.com/bqlpfy/flux-panel/issues) | 🚀 [快速开始](/getting-started)
:::
## 面板管理脚本
安装、更新、卸载面板均使用同一条命令,运行后在菜单中选择对应操作:
```bash
curl -L https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/panel_install.sh -o panel_install.sh && chmod +x panel_install.sh && ./panel_install.sh
```
## 节点管理脚本
节点的“更新”和“卸载”可直接使用以下命令,安装脚本请前往面板系统的“节点管理”页面复制获取:
```bash
curl -L https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/install.sh -o ./install.sh && chmod +x ./install.sh && ./install.sh
```
## 日志查看
### 查看后端服务日志
当后端服务出现问题时,可以通过以下命令查看实时日志:
```bash
docker logs -f springboot-backend
```
按 `Ctrl+C` 退出日志查看
### 查看节点日志
当转发功能出现问题时,可以通过以下命令查看gost服务日志:
```bash
journalctl -u gost -f
```
按 `Ctrl+C` 退出日志查看
-137
View File
@@ -1,137 +0,0 @@
# 快速开始
本指南将帮助您快速安装和配置flux-panel,让您在几分钟内开始使用流量转发功能。
::: tip 需要帮助?
📱 [加入 Telegram 群组](https://t.me/+wdVDni1fdyI0YzE1) | 🐛 [GitHub Issues](https://github.com/bqlpfy/flux-panel/issues) | 🤔 [常见问题](/faq)
:::
## 系统要求
在开始之前,请确保您的系统满足以下要求:
- **操作系统**: Linux,**推荐纯净系统安装**
- **Docker**: 20.10+
- **Docker Compose**: 1.29+ 或 Docker 内置 compose 命令
- **内存**: 至少 1GB RAM
- **存储**: 至少 1GB 可用空间
- **网络**: 确保相关端口未被占用
## 一键安装(推荐)
我们提供了交互式安装脚本,会自动检测系统环境并引导您完成配置:
```bash
curl -L https://raw.githubusercontent.com/bqlpfy/flux-panel/refs/heads/main/panel_install.sh -o panel_install.sh && chmod +x panel_install.sh && ./panel_install.sh
```
### 安装流程说明
1. **运行脚本后选择操作**:
```
===============================================
面板管理脚本
===============================================
请选择操作:
1. 安装面板 ← 选择这个
2. 更新面板
3. 卸载面板
4. 退出
===============================================
```
2. **输入配置参数**:
- **面板服务器地址**: 需要节点服务器能正常访问的地址
- **前端端口**: 默认 6366
- **后端端口**: 默认 6365
3. **自动化处理**:
- 检测 Docker 环境
- 自动检测 IPv6 支持并选择合适的配置
- 生成随机的数据库配置
- 下载并启动服务
### 配置示例
```bash
当前面板服务器地址: 192.168.1.100 # 或您的公网IP
前端端口(默认 6366): 6366 # 直接回车使用默认值
后端端口(默认 6365): 6365 # 直接回车使用默认值
```
## 验证安装
### 1. 检查服务状态
```bash
# 使用 docker-compose
docker-compose ps
# 或使用 docker compose
docker compose ps
```
您应该看到以下服务都处于 `Up` 状态:
- `gost-mysql` - 数据库服务
- `springboot-backend` - 后端 API 服务
- `vue-frontend` - 前端 Web 界面
### 2. 访问 Web 界面
打开浏览器访问:`http://your-server-ip:6366`
### 3. 登录系统
使用默认管理员账号登录:
- **用户名**: `admin_user`
- **密码**: `admin_user`
⚠️ **重要**: 首次登录后请立即修改默认密码!
## IPv6 支持
脚本会自动检测系统的 IPv6 支持:
- ✅ **支持 IPv6**: 自动使用 IPv6 配置文件并配置 Docker IPv6 支持
- ⚠️ **不支持 IPv6**: 使用 IPv4 配置文件
### Docker IPv6 配置
如果检测到 IPv6 支持,脚本会自动配置:
```json
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80"
}
```
## 端口说明
| 端口 | 服务 | 说明 | 可配置 |
|------|------|------|--------|
| 6366 | Web 界面 | 前端管理界面 | ✅ |
| 6365 | API 服务 | 后端 REST API | ✅ |
| 3306 | MySQL | 数据库服务(容器内部) | ❌ |
| 动态分配 | 转发端口 | 用户创建的转发规则 | ✅ |
## 获取帮助
如果在安装过程中遇到问题:
1. **💬 Telegram 群组**(推荐)
- [立即加入](https://t.me/+wdVDni1fdyI0YzE1)
- 实时技术支持,快速响应
2. **🔍 故障排除**
- 查看安装日志和错误信息
- 检查系统要求是否满足
- 验证 Docker 和网络配置
3. **🐛 GitHub Issues**
- [报告安装问题](https://github.com/bqlpfy/flux-panel/issues/new)
- 查看 [已知问题](https://github.com/bqlpfy/flux-panel/issues)
4. **📖 文档资源**
- [使用指南](/guide) - 详细的操作教程
- [常见问题](/faq) - 快速解决方案和管理操作指南
-303
View File
@@ -1,303 +0,0 @@
# 使用指南
flux-panel是一个基于 go-gost 的现代化转发面板,提供了直观的 Web 界面来管理网络流量转发。
::: tip 需要帮助?
📱 [加入 Telegram 群组](https://t.me/+wdVDni1fdyI0YzE1) | 🐛 [GitHub Issues](https://github.com/bqlpfy/flux-panel/issues) | 🤝 [参与贡献](https://github.com/bqlpfy/flux-panel/pulls)
:::
## 项目介绍
### 核心功能
- 🔄 **TCP/UDP/TLS 端口转发**: 支持多种协议的流量转发
- 👥 **用户管理**: 按账号级别管理流量转发数量和流量限额
- 📊 **流量统计**: 支持双向/单向计费模式,实时监控
- ⚡ **限速控制**: 可创建限速规则进行精细化流量控制
- 🖥️ **节点管理**: 分布式节点部署和监控
- 🚇 **隧道管理**: 灵活的隧道配置和管理
- 🔒 **安全可控**: 内置认证系统,权限分级管理
### 技术架构
- **前端**: vite + next UI
- **后端**: Spring Boot + MySQL
- **转发引擎**: go-gost
- **部署方式**: Docker Compose
## 第一步:登录系统
安装完成后,打开浏览器访问面板地址:
```
http://your-server-ip:6366
```
使用默认管理员账号登录:
- **用户名**: `admin_user`
- **密码**: `admin_user`
## 第二步:修改默认密码
登录后**务必立即修改默认密码**:
## 第三步:创建节点
节点是运行转发服务的服务器,需要先创建节点才能部署转发服务。
### 添加节点
1. 在左侧菜单点击 **"节点管理"**
2. 点击 **"新增节点"** 按钮
3. 填写节点信息:
- **节点名称**: 自定义名称(如:香港节点-01)
- **服务器IP**: 节点服务器的IP地址
- **入口IP**: 节点服务器的IP地址
- **端口范围**: 该节点允许分配的端口范围(如:20000-30000),用于后续转发端口的分配和管理
::: tip 特殊情况
如果NAT服务器端口范围不连续,可以输入 `1-65535`,然后在添加转发时手动指定端口。
:::
4. 点击 **"确定"** 保存节点
### IP地址说明
**服务器IP**:
- 用于创建隧道转发时入口-出口两台服务器之间的通信地址
- 通常是服务器的主要通信IP
- 确保入口和出口节点能够通过此IP互相访问
**入口IP**:
- 用于展示在转发页面,面向用户的访问地址
- 适用于有多个IP的服务器(如多线BGP)
**兜底**:
- 实在理解不到说明你没这个需求,都填节点的公网ip就行
## 第四步:安装节点Agent
创建节点后,需要在对应的服务器上安装agent程序。
### 获取安装命令
1. 在节点列表中找到刚创建的节点
2. 点击节点卡片中的 **"复制"** 按钮
3. 系统会自动复制安装命令到剪贴板
### 执行安装
在目标服务器上执行复制的安装命令:
```bash
# 示例安装命令(实际命令请从面板复制)
curl -L https://your-panel-server:6365/agent/install | bash -s -- --server=your-panel-server:6365 --token=your-node-token
```
::: warning 安装须知
- 安装或者更新时如果 `/etc/gost/` 下存在 `gost.json`,安装命令会跳过生成,使用当前存在的配置
- gost执行文件会强制更新
:::
### 验证安装
安装完成后,回到面板查看节点状态:
- 节点状态应该变为 🟢 **在线**
- 可以看到CPU使用率、内存使用率等系统信息
## 第五步:创建隧道
隧道定义了流量的入口和出口节点。
### 添加隧道
1. 在左侧菜单点击 **"隧道管理"**
2. 点击 **"新增隧道"** 按钮
3. 配置隧道参数:
**基本信息**:
- **隧道名称**: 自定义名称(如:Web服务隧道)
- **隧道类型**:
- **端口转发**: 在单个节点上进行直接端口映射
- **隧道转发**: 在入口节点和出口节点之间建立隧道连接
- **流量计算**:
- 单向计算(仅上传):仅计算上传流量
- 双向计算:计算上传和下载的总流量
- **流量倍率**: 计费倍率(默认1.0,设置为2.0表示按实际流量的2倍计费,范围:0.0-100.0)
**入口配置**:
- **入口节点**: 选择流量入口节点
- **监听地址**:
::: tip 说明
部分专线需要监听指定内网IP才能成功转发端口,所以才诞生了这两个配置。如果不理解就按照说明填写,服务器只有v4就填写 `0.0.0.0`,支持v6或者只有v6就填写 `[::]`
:::
**出口配置**(仅隧道转发类型需要):
- **协议类型**: 保持默认即可,如有特殊需求可选择:
- **出口节点**: 选择流量出口节点
4. 点击 **"创建"** 保存隧道
## 第六步:创建转发
转发规则定义了具体的端口映射关系。
### 添加转发
1. 在左侧菜单点击 **"转发管理"**
2. 点击 **"新增转发"** 按钮
3. 配置转发参数:
**基本信息**:
- **转发名称**: 自定义名称(如:SSH转发)
- **选择隧道**: 选择已创建的隧道
**端口配置**:
- **入口端口**:
- **端口**: 手动指定端口号
- **留空自动分配**: 系统自动分配可用端口
- 建议:先选择隧道以查看端口范围,留空将自动分配可用端口
**目标配置**:
- **远程地址**: 最终目标服务地址,支持多种格式:
- IPv4:`192.168.1.100:8080`
- IPv6:`[2001:db8::1]:8080`
- 域名:`example.com:8080`
::: tip
支持输入多个远程地址,多个地址时可选择负载均衡模式。
:::
4. 点击 **"确定"** 保存转发规则
## 第七步:用户管理(可选)
如果需要多用户使用,可以创建普通用户账号并分配资源。
### 创建用户
1. 在左侧菜单点击 **"用户管理"**
2. 点击 **"新增用户"** 按钮
3. 填写用户信息:
**基本信息**:
- **用户名**: 登录用户名
- **密码**: 登录密码(系统会自动加密显示)
**资源限制**:
- **流量(GB)**: 总流量限额,如需无限制可设置较大数值(如999999)
- **转发数量**: 可创建的转发数量,如需无限制可设置较大数值(如999999)
- **过期时间**: 账号有效期,可选择具体日期
- **流量重置**: 流量重置周期,默认"每月1号(0点重置)"
**账号状态**:
- **正常**: 用户可正常使用
- **禁用**: 暂停用户使用
4. 点击 **"确定"** 创建用户
### 分配隧道权限
创建用户后,需要为用户分配具体的隧道使用权限:
1. 在用户列表中找到目标用户
2. 点击用户的 **"隧道权限管理"** 按钮
3. 在弹出窗口中配置权限:
**分配新隧道权限**:
- **选择隧道**: 选择要分配给用户的隧道
- **流量限制(GB)**: 该隧道的流量限额
- **转发数量**: 该隧道允许创建的转发数量
- **到期时间**: 该隧道权限的有效期
- **限速规则**: 选择是否应用限速(默认"不限速")
4. 点击 **"分配权限"** 保存配置
**权限管理**:
- 在"已有隧道权限"列表中可以查看用户的所有隧道权限
- 显示每个隧道的状态、流量统计、转发数量、限速规则、到期时间
- 可以编辑或删除现有权限
### 权限优先级说明
系统采用两级权限管理,优先级如下:
**用户级别权限(优先级最高)**:
- 用户的流量限额和转发数量限制影响该用户的所有转发
- 即使隧道权限设置更大的限额,也不能超过用户级别的总限制
- 例如:用户总流量100GB,即使单个隧道分配200GB,用户实际最多只能使用100GB
**隧道级别权限**:
- 隧道的流量和转发数量限制只影响对应的隧道
- 在用户总限额范围内,进一步细分到具体隧道的使用限制
- 例如:用户总流量100GB,可以分配给隧道A 60GB,隧道B 40GB
## 第八步:限速规则(可选)
如果需要对特定用户或隧道进行限速,需要先创建限速规则。
### 创建限速规则
1. 在左侧菜单点击 **"限速规则"**
2. 点击 **"新增限速"** 按钮
3. 配置限速参数:
**基本配置**:
- **规则名称**: 自定义限速规则名称(如:游戏隧道限速)
- **速度限制**: 设置带宽限制值
- 单位:Mbps(兆比特每秒)
- 范围:1-1000000 Mbps
- 例如:100 表示限制带宽为100Mbps
- **绑定隧道**: 选择要应用此限速规则的隧道
4. 点击 **"确定"** 保存限速规则
## 第九步:API流量信息查询(可选)
- 本项目为sub-store提供流量查询API以便查询流量日期信息
- 格式如下
```
http(s)://<面板连接地址>/api/v1/open_api/sub_store?user=<用户名>&pwd=<密码>&tunnel=<隧道ID>
```
- 修改完成后填入sub-store订阅流量信息栏即可实现查询
**注意**
- “&tunnel=隧道id”为可选项,若不填写则返回全部流量查询信息
- 管理员无此查询权限
- 请妥善保存上述信息,避免因用户信息泄漏而造成的损失
## 获取帮助
### 社区支持
如果在使用过程中遇到问题或有功能建议,推荐以下方式获取帮助:
1. **💬 Telegram 群组**(推荐)
- [立即加入](https://t.me/+wdVDni1fdyI0YzE1)
- 实时讨论,快速回复
- 与其他用户交流经验
2. **🐛 GitHub Issues**
- [报告问题](https://github.com/bqlpfy/flux-panel/issues/new)
- 查看 [已知问题](https://github.com/bqlpfy/flux-panel/issues)
- 提交功能建议
3. **📖 文档资源**
- [快速开始指南](/getting-started)
- [常见问题解答](/faq)
### 联系开发者
对于紧急问题:
- **GitHub**: [@bqlpfy](https://github.com/bqlpfy)
- **Telegram**: [加入群组](https://t.me/+wdVDni1fdyI0YzE1) 直接联系
## 免责声明
本项目仅供个人学习与研究使用,基于开源项目进行二次开发。使用本项目所带来的任何风险由使用者自行承担。请确保在合法、合规、安全的前提下使用本项目。
-69
View File
@@ -1,69 +0,0 @@
---
layout: home
hero:
name: "Flux"
text: "基于gost的转发面板"
tagline: "功能强大的流量转发管理平台,支持灵活的流量计费和限速功能"
actions:
- theme: brand
text: "DreamCloud"
link: https://whmcs.as211392.com/
- theme: brand
text: 快速开始
link: /getting-started
- theme: alt
text: 查看源码
link: https://github.com/bqlpfy/flux-panel
features:
- icon: 🔄
title: 多协议支持
details: 支持 TCP 和 UDP 协议的转发,满足各种网络代理需求
- icon: 👥
title: 账号级别管理
details: 支持按隧道账号级别管理流量转发数量,可用于用户/隧道配额控制
- icon: 🚀
title: 双模式转发
details: 支持端口转发与隧道转发两种模式,灵活适配不同场景
- icon: ⚡
title: 精细化限速
details: 可针对指定用户的指定隧道进行限速设置,提供精准的流量控制
- icon: 💰
title: 灵活计费
details: 支持配置单向或双向流量计费方式,灵活适配不同计费模型
- icon: 🔒
title: 安全可控
details: 内置轻量级 Agent 端 API 服务,强制启用自签发 SSL,安全可控
- icon: 📊
title: 实时监控
details: 提供实时的流量统计和监控功能,让您随时掌握服务状态
- icon: 🐳
title: 容器化部署
details: 支持 Docker Compose 一键部署,简化安装和维护流程
---
## 社区支持
如果您在使用过程中遇到问题或有功能建议,欢迎:
- 📱 [加入 Telegram 群组](https://t.me/+wdVDni1fdyI0YzE1)
- 🐛 [报告问题](https://github.com/bqlpfy/flux-panel/issues)
- 💡 [功能建议](https://github.com/bqlpfy/flux-panel/issues)
- 🤝 [参与贡献](https://github.com/bqlpfy/flux-panel/pulls)
## 免责声明
本项目仅供个人学习与研究使用,基于开源项目进行二次开发。使用本项目所带来的任何风险由使用者自行承担。请确保在合法、合规、安全的前提下使用本项目。
---
**本网站由 [DreamCloud](https://whmcs.as211392.com/) 提供防御支持**
-2422
View File
File diff suppressed because it is too large Load Diff
-23
View File
@@ -1,23 +0,0 @@
{
"name": "flux-panel-docs",
"version": "1.0.0",
"description": "flux-panel转发面板文档",
"type": "module",
"scripts": {
"dev": "vitepress dev",
"build": "vitepress build",
"preview": "vitepress preview"
},
"devDependencies": {
"vitepress": "^1.6.3"
},
"keywords": [
"gost",
"proxy",
"forward",
"panel",
"documentation"
],
"author": "bqlpfy",
"license": "Apache-2.0"
}
-15
View File
@@ -1,15 +0,0 @@
# Favicon 说明
此文件是 favicon.ico 的占位符。
在实际部署时,请替换为项目的真实图标文件。
推荐的图标规格:
- 16x16 px
- 32x32 px
- 48x48 px
- ICO 格式
可以使用在线工具生成 favicon:
- https://favicon.io/
- https://realfavicongenerator.net/
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB