diff --git a/.github/DISCUSSION_TEMPLATE/development.yml b/.github/DISCUSSION_TEMPLATE/development.yml new file mode 100644 index 0000000..5071ae0 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/development.yml @@ -0,0 +1,67 @@ +body: + - type: markdown + attributes: + value: | + Use this category for technical design and implementation discussion that is more concrete than an early idea but not yet ready to become an Issue or Pull Request. + + - type: dropdown + id: project + attributes: + label: Project + description: Which project or integration is this discussion about? + options: + - Zero Core + - ZNet Sink + - Zboard + - Documentation + - Cross-project / Integration + validations: + required: true + + - type: textarea + id: background + attributes: + label: Background + description: Describe the current behavior, technical context, and why this needs discussion. + validations: + required: true + + - type: textarea + id: constraints + attributes: + label: Constraints + description: List relevant compatibility, platform, protocol, operational, or product constraints. + + - type: textarea + id: design + attributes: + label: Proposed design + description: Describe the proposed approach, responsibilities, and expected behavior. + validations: + required: true + + - type: textarea + id: interfaces + attributes: + label: API / data model / configuration + description: Include relevant interfaces, schemas, configuration examples, or data-flow details when applicable. + + - type: dropdown + id: compatibility + attributes: + label: Compatibility / migration + description: What compatibility impact does this design have? + options: + - No compatibility impact expected + - Backward-compatible change + - Migration may be required + - Breaking change + - Unsure + validations: + required: true + + - type: textarea + id: open_questions + attributes: + label: Open questions + description: List decisions or trade-offs that still need discussion. diff --git a/.github/DISCUSSION_TEMPLATE/ideas.yml b/.github/DISCUSSION_TEMPLATE/ideas.yml new file mode 100644 index 0000000..7cf7049 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/ideas.yml @@ -0,0 +1,62 @@ +body: + - type: markdown + attributes: + value: | + Use this category for ideas that still benefit from discussion. Once the scope is concrete and actionable, follow-up work can move to the relevant project's Issue tracker. + + - type: dropdown + id: project + attributes: + label: Project + description: Which project or area would this idea affect? + options: + - Zero Core + - ZNet Sink + - Zboard + - Documentation + - Cross-project / Community + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem + description: What problem, limitation, or opportunity are you trying to address? + placeholder: Describe the user or developer problem before describing the solution. + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposal + description: Describe the behavior or capability you would like to see. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: What other approaches, workarounds, or existing solutions have you considered? + + - type: dropdown + id: compatibility + attributes: + label: Compatibility impact + description: What kind of compatibility impact do you expect, if any? + options: + - None expected + - Backward-compatible change + - Behavior change + - Breaking change + - Unsure + validations: + required: true + + - type: textarea + id: context + attributes: + label: Additional context + description: Add references, examples, screenshots, related discussions, or other useful context. diff --git a/.github/DISCUSSION_TEMPLATE/q-a.yml b/.github/DISCUSSION_TEMPLATE/q-a.yml new file mode 100644 index 0000000..fe91431 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/q-a.yml @@ -0,0 +1,54 @@ +body: + - type: markdown + attributes: + value: | + Ask a focused question about using ZeroDeNet projects. Search existing discussions first. For a reproducible bug or a concrete implementation task, use the corresponding project's Issue tracker instead. + + - type: dropdown + id: project + attributes: + label: Project + description: Which project is this question about? + options: + - Zero Core + - ZNet Sink + - Zboard + - Documentation + - Cross-project / Other + validations: + required: true + + - type: input + id: version + attributes: + label: Version + description: Relevant release, build, commit, or branch, if known. + placeholder: e.g. 0.0.16-rc.4, develop, or commit SHA + + - type: input + id: environment + attributes: + label: Environment + description: Relevant operating system, platform, deployment, or runtime details. + placeholder: e.g. Windows 11, Ubuntu 24.04, Docker, self-hosted + + - type: textarea + id: question + attributes: + label: Question + description: Describe what you are trying to do and where you are blocked. + placeholder: Include the expected result and the behavior you are seeing. + validations: + required: true + + - type: textarea + id: attempts + attributes: + label: What have you tried? + description: Share the approaches, configuration changes, or documentation you have already checked. + + - type: textarea + id: context + attributes: + label: Logs / configuration / additional context + description: Add only the details needed to understand the question. Remove tokens, credentials, subscription URLs, and other secrets before posting. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 0086358..b0a0d2f 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1 +1,8 @@ -blank_issues_enabled: true +blank_issues_enabled: false +contact_links: + - name: GitHub Discussions + url: https://github.com/orgs/zerodenet/discussions + about: 使用交流、问答、想法建议与开发讨论请在这里发起。 + - name: Telegram + url: https://t.me/zerodenet + about: 加入 ZeroDeNet Telegram 群组进行即时交流。 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..23cfbb4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Zero Network Org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 69f174d..8d147b5 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,185 @@ -# ZeroDeNet 项目文档 +# ZeroDeNet Documentation -ZeroDeNet 项目组的公开文档仓库。当前接入的独立项目: +Official documentation repository for ZeroDeNet projects, covering user guides, deployment instructions, configuration references, interface contracts, and contribution documentation. -- [Zero Core](https://github.com/zerodenet/core) -- [ZNet Sink](https://github.com/zerodenet/znet-sink) +[简体中文](./README.zh-CN.md) -## 本地开发 +## Documentation Sites -需要 Node.js 22 或更高版本,并启用 Corepack。 +- Production: https://docs.zerodenet.org +- Development preview: https://zerodenet.github.io/docs/ -```powershell +The production site is published from `main`, while the development preview is published from `develop`. + +## Projects + +| Project | Description | Repository | +| --- | --- | --- | +| Zero Core | Documentation for the ZeroDeNet network runtime, protocols, control interfaces, and deployment. | [zerodenet/core](https://github.com/zerodenet/core) | +| ZNet Sink | Usage, configuration, and platform compatibility documentation for the ZeroDeNet desktop proxy client. | [zerodenet/znet-sink](https://github.com/zerodenet/znet-sink) | +| Zboard | Deployment, initialization, node management, and usage documentation for the service operations platform. | [zerodenet/zboard](https://github.com/zerodenet/zboard) | + +Each project has its own navigation, page hierarchy, and documentation boundaries so that versions, configuration semantics, and usage guidance remain project-specific. + +## Documentation Scope + +This repository primarily contains public documentation for users, operators, and integration developers, including: + +- project introductions and capability overviews; +- installation, deployment, and initialization guides; +- configuration options and environment variables; +- node, protocol, and feature usage guides; +- public API, Webhook, gRPC, and related interface contracts; +- troubleshooting and common problems; +- compatibility, upgrade, and migration guidance; +- public contribution and collaboration guidance. + +Internal design notes, temporary investigations, development plans, test records, and unstable implementation proposals should remain in the relevant project repositories. + +## Repository Structure + +Each project's documentation lives in its own directory: + +```text +docs/ +└── projects/ + ├── core/ + ├── znet-sink/ + └── zboard/ +``` + +Project registration metadata is maintained in: + +```text +docs/.vitepress/projects.json +``` + +Navigation and sidebar configuration are maintained in: + +```text +docs/.vitepress/navigation.ts +``` + +When adding a page, make sure that: + +- the page is placed under the correct project directory; +- the page title and navigation label are clear; +- local links resolve correctly; +- the page is not inserted into another project's reading sequence; +- version and compatibility notes belong to the relevant project; +- code-related problems are routed to the corresponding code repository. + +## Reporting Documentation Problems + +For incorrect or missing documentation, broken links, or unclear wording, open an Issue in this repository. + +For application behavior, runtime errors, feature requests, or security issues, use the corresponding project repository: + +- [Zero Core Issues](https://github.com/zerodenet/core/issues) +- [ZNet Sink Issues](https://github.com/zerodenet/znet-sink/issues) +- [Zboard Issues](https://github.com/zerodenet/zboard/issues) + +## Branches and Publishing + +This repository uses the following publishing flow: + +```text +feature branch + ↓ +develop + ↓ +GitHub Pages development preview + ↓ +main + ↓ +production documentation site +``` + +- `develop`: receives documentation changes and publishes the development preview; +- `main`: contains reviewed documentation ready for production; +- feature branches: contain changes for a specific project, topic, or documentation batch. + +Documentation changes should normally merge into `develop` first. After reviewing the preview, they can be promoted to `main`. + +## Local Development + +Requirements: + +- Node.js 22 or later; +- pnpm; +- Corepack. + +Enable Corepack and install dependencies: + +```bash corepack enable pnpm install -pnpm dev ``` -默认开发地址为 `http://localhost:5173`。 +Start the local development server: + +```bash +pnpm dev +``` -## 质量检查 +Default address: -```powershell -pnpm check -pnpm check:build +```text +http://localhost:5173 ``` -`pnpm check` 检查项目注册、入口页、UTF-8、标题、本地链接、显式侧栏和跨项目链接边界;`pnpm check:build` 额外验证 VitePress 生产构建和构建产物。 +## Quality Checks -## 内容边界 +Run the basic documentation checks: -- `docs/projects//`:每个项目独立的使用文档、接口契约和贡献入口。 -- 项目侧栏、面包屑和上一页/下一页只连接同一项目内的页面。 -- 版本、兼容性、契约和贡献规则由对应项目维护,不设置全站共享版本。 -- 临时调查、内部实现计划和问题记录应留在对应代码仓库。 +```bash +pnpm check +``` -新增项目时,优先使用项目脚手架创建注册信息和入口页,然后由维护者补充显式导航: +Run the complete build validation: -```powershell -pnpm create:project -- --id example --name "Example" --description "项目简介" --repository "https://github.com/zerodenet/example" +```bash +pnpm check:build ``` -脚手架会创建项目注册信息和基础页面。维护者还需要在 `docs/.vitepress/navigation.ts` 中添加该项目自己的侧栏,并确保页面不进入其他项目的阅读序列。 +The checks cover: -## 单向导入 Core 公开文档 +- project registration metadata; +- project landing pages; +- Markdown headings; +- UTF-8 encoding; +- local links; +- project navigation and sidebars; +- cross-project link boundaries; +- the VitePress production build; +- generated build artifacts. -这是迁移期使用的单向导入工具。它只复制公开指南、协议、当前控制面契约和选定的稳定参考资料,不会导入历史控制面设计和测试记录: +Before submitting changes, run at least: -```powershell -pnpm migrate:core C:\path\to\core\docs +```bash pnpm check:build ``` -脚本会覆盖已映射的目标页面,并把原仓库内链接转换为独立文档站路由;未迁移的工程文档会链接回 Core 仓库,避免生成失效页面。 +## Adding a Project + +Use the project scaffold to create the initial registration metadata and landing page: + +```bash +pnpm create:project -- \ + --id example \ + --name "Example" \ + --description "Project description" \ + --repository "https://github.com/zerodenet/example" +``` + +After running the scaffold: + +1. Add the project introduction and usage documentation. +2. Add navigation and sidebar entries in `docs/.vitepress/navigation.ts`. +3. Review the reading order between project pages. +4. Run `pnpm check:build`. +5. Commit the changes to a feature branch and merge them into `develop` for preview. + +## License -迁移完成后,本仓库是 Core 公开文档的唯一维护位置。不要建立从本仓库回写 Core 的流程,也不要在两个仓库继续修改同一篇公开文档。Core 仓库后续只保留内部工程资料和指向本站的入口。 +Documentation in this repository is published under the license declared by this repository. Source code licenses are defined by the corresponding project repositories. diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..fe01453 --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,183 @@ +# ZeroDeNet Documentation + +ZeroDeNet 官方文档仓库,统一维护旗下开源项目的使用指南、部署说明、配置参考、接口契约与贡献文档。 + +## 在线文档 + +* 正式站点:https://docs.zerodenet.org +* 开发预览:https://zerodenet.github.io/docs/ + +正式站点基于 `main` 分支发布,开发预览基于 `develop` 分支发布。 + +## 收录项目 + +| 项目 | 说明 | 仓库 | +| --------- | ------------------------------ | ------------------------------------------------------------- | +| Zero Core | ZeroDeNet 核心服务及相关协议、接口与部署文档 | [zerodenet/core](https://github.com/zerodenet/core) | +| ZNet Sink | ZeroDeNet 桌面代理客户端的使用、配置与平台兼容文档 | [zerodenet/znet-sink](https://github.com/zerodenet/znet-sink) | +| ZBoard | 一站式机场面板管理平台的部署、初始化、节点管理与使用文档 | [zerodenet/zboard](https://github.com/zerodenet/zboard) | + +各项目在文档站中拥有独立的导航、页面结构和内容边界,避免不同项目的版本、配置和使用语义相互混淆。 + +## 文档范围 + +本仓库主要维护面向用户、部署人员和集成开发者的公开文档,包括: + +* 项目介绍与能力说明; +* 安装、部署和初始化指南; +* 配置项与环境变量说明; +* 节点、协议和功能使用指南; +* API、Webhook、gRPC 等公开接口契约; +* 常见问题与故障排查; +* 兼容性、升级和迁移说明; +* 面向贡献者的公开协作说明。 + +内部设计记录、临时调查、开发计划、测试记录和未稳定的实现方案,应保留在对应项目仓库中。 + +## 内容组织 + +每个项目的文档位于独立目录: + +```text +docs/ +└── projects/ + ├── core/ + ├── znet-sink/ + └── zboard/ +``` + +项目注册信息维护在: + +```text +docs/.vitepress/projects.json +``` + +导航与侧栏配置维护在: + +```text +docs/.vitepress/navigation.ts +``` + +新增页面时,应确保: + +* 页面位于对应项目目录中; +* 页面标题和导航名称清晰; +* 本地链接可以正常访问; +* 不将页面加入其他项目的阅读序列; +* 版本和兼容性说明归属于具体项目; +* 代码问题指向对应代码仓库处理。 + +## 提交文档问题 + +文档内容错误、缺失、链接失效或表达不清,可以在本仓库提交 Issue。 + +涉及程序行为、运行错误、功能需求或安全问题时,请前往对应项目仓库提交: + +* [Zero Core Issues](https://github.com/zerodenet/core/issues) +* [ZNet Sink Issues](https://github.com/zerodenet/znet-sink/issues) +* [ZBoard Issues](https://github.com/zerodenet/zboard/issues) + +## 分支与发布 + +本仓库采用以下分支流程: + +```text +功能分支 + ↓ +develop + ↓ +GitHub Pages 开发预览 + ↓ +main + ↓ +正式文档站 +``` + +* `develop`:接收文档变更并生成开发预览; +* `main`:保存已经确认并准备正式发布的文档; +* 功能分支:用于编写单个项目、主题或批次的文档变更。 + +文档变更应优先合并到 `develop`,确认预览效果后再同步到 `main`。 + +## 本地开发 + +需要: + +* Node.js 22 或更高版本; +* pnpm; +* Corepack。 + +启用 Corepack 并安装依赖: + +```bash +corepack enable +pnpm install +``` + +启动本地开发服务器: + +```bash +pnpm dev +``` + +默认访问地址: + +```text +http://localhost:5173 +``` + +## 质量检查 + +运行基础文档检查: + +```bash +pnpm check +``` + +运行完整构建检查: + +```bash +pnpm check:build +``` + +检查范围包括: + +* 项目注册信息; +* 项目入口页面; +* Markdown 标题; +* UTF-8 编码; +* 本地链接; +* 项目导航与侧栏; +* 跨项目链接边界; +* VitePress 生产构建; +* 构建产物完整性。 + +提交变更前,应至少运行: + +```bash +pnpm check:build +``` + +## 新增项目 + +可以使用项目脚手架创建基础注册信息和入口页面: + +```bash +pnpm create:project -- \ + --id example \ + --name "Example" \ + --description "项目简介" \ + --repository "https://github.com/zerodenet/example" +``` + +脚手架执行后,还需要: + +1. 补充项目介绍与使用文档; +2. 在 `docs/.vitepress/navigation.ts` 中添加导航和侧栏; +3. 检查项目页面之间的阅读顺序; +4. 运行 `pnpm check:build`; +5. 提交到功能分支并合并至 `develop` 进行预览。 + +## License + +本仓库中的文档内容按照仓库所声明的许可协议发布。各项目代码的许可协议以对应项目仓库为准。 diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 11ceb9a..27162b8 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -4,7 +4,7 @@ import { nav, sidebar } from './navigation' export default defineConfig({ base: process.env.DOCS_BASE || '/', title: 'ZeroDeNet', - description: 'ZeroDeNet 开源项目文档', + description: 'ZeroDeNet 项目文档与社区', lang: 'zh-CN', cleanUrls: true, lastUpdated: true, @@ -15,6 +15,10 @@ export default defineConfig({ head: [ ['meta', { name: 'theme-color', content: '#0d5bd7' }], ['meta', { property: 'og:site_name', content: 'ZeroDeNet' }], + ['meta', { + property: 'og:description', + content: 'ZeroDeNet 项目文档与社区', + }], ['meta', { name: 'robots', content: process.env.DOCS_PREVIEW === 'true' @@ -60,7 +64,7 @@ export default defineConfig({ lightModeSwitchTitle: '切换到浅色模式', darkModeSwitchTitle: '切换到深色模式', footer: { - message: 'ZeroDeNet 开源项目文档', + message: 'ZeroDeNet', }, }, }) diff --git a/docs/.vitepress/navigation.ts b/docs/.vitepress/navigation.ts index 564f3e9..e77020c 100644 --- a/docs/.vitepress/navigation.ts +++ b/docs/.vitepress/navigation.ts @@ -25,8 +25,39 @@ export const nav: DefaultTheme.NavItem[] = [ { text: 'Zero Core', link: '/projects/core/', activeMatch: '^/projects/core/' }, ], }, + { + text: '运营平台', + items: [ + { text: 'Zboard', link: '/projects/zboard/', activeMatch: '^/projects/zboard/' }, + ], + }, ], }, + { text: '使用场景', link: '/solutions/' }, + { + text: '社区', + items: [ + { text: '社区首页', link: '/community/' }, + { text: 'GitHub Discussions', link: 'https://github.com/orgs/zerodenet/discussions' }, + { text: 'Telegram', link: 'https://t.me/zerodenet' }, + ], + }, +] + +const solutionSidebar: DefaultTheme.SidebarItem[] = [ + page('使用场景', '/solutions/'), + group('项目', [ + page('全部项目', '/projects/'), + page('ZNet Sink', '/projects/znet-sink/'), + page('Zero Core', '/projects/core/'), + page('Zboard', '/projects/zboard/'), + ], false), +] + +const communitySidebar: DefaultTheme.SidebarItem[] = [ + page('社区', '/community/'), + page('问题反馈', '/community/#问题反馈'), + page('赞助、广告与友情链接', '/community/#赞助广告与友情链接'), ] const coreSidebar: DefaultTheme.SidebarItem[] = [ @@ -39,6 +70,7 @@ const coreSidebar: DefaultTheme.SidebarItem[] = [ ], false), group('日常管理', [ page('运行与观测', '/projects/core/guides/operations'), + page('HTTP / Mixed 与 URLTest', '/projects/core/guides/proxy-and-urltest'), page('安全热更新配置', '/projects/core/guides/hot-reload'), page('使用控制 API', '/projects/core/guides/control-api'), page('保护控制接口', '/projects/core/guides/control-security'), @@ -86,6 +118,7 @@ const sinkSidebar: DefaultTheme.SidebarItem[] = [ group('功能说明', [ page('功能总览', '/projects/znet-sink/guides/features'), page('订阅管理', '/projects/znet-sink/guides/subscriptions'), + page('本地代理与节点测速', '/projects/znet-sink/guides/proxy-and-probes'), ], false), group('帮助与诊断', [ page('故障排查', '/projects/znet-sink/guides/troubleshooting'), @@ -96,12 +129,35 @@ const sinkSidebar: DefaultTheme.SidebarItem[] = [ ]), ] +const zboardSidebar: DefaultTheme.SidebarItem[] = [ + page('Zboard 文档', '/projects/zboard/'), + group('开始使用', [ + page('用户指南入口', '/projects/zboard/guides/'), + page('安装与部署', '/projects/zboard/guides/installation'), + page('首次初始化', '/projects/zboard/guides/first-setup'), + ], false), + group('功能说明', [ + page('节点与协议服务管理', '/projects/zboard/guides/node-management'), + page('协议服务配置', '/projects/zboard/guides/protocol-services'), + page('订阅交付与流量展示', '/projects/zboard/guides/subscriptions-and-traffic'), + page('DNS 与证书管理', '/projects/zboard/guides/dns-and-certificates'), + page('故障排查', '/projects/zboard/guides/troubleshooting'), + ]), + group('参与项目', [ + page('参与 Zboard', '/projects/zboard/contributing/'), + ]), +] + export const sidebar: DefaultTheme.Sidebar = { + '/solutions/': solutionSidebar, + '/community/': communitySidebar, '/projects/core/': coreSidebar, '/projects/znet-sink/': sinkSidebar, + '/projects/zboard/': zboardSidebar, '/projects/': [ page('项目目录', '/projects/'), group('应用', [page('ZNet Sink', '/projects/znet-sink/')]), group('内核', [page('Zero Core', '/projects/core/')]), + group('运营平台', [page('Zboard', '/projects/zboard/')]), ], } diff --git a/docs/.vitepress/projects.json b/docs/.vitepress/projects.json index 474da7f..b1f8f58 100644 --- a/docs/.vitepress/projects.json +++ b/docs/.vitepress/projects.json @@ -2,8 +2,8 @@ { "id": "znet-sink", "name": "ZNet Sink", - "tagline": "安装、连接与日常代理管理", - "description": "面向桌面用户,提供配置、订阅、节点选择、连接状态和诊断功能。", + "tagline": "桌面代理客户端", + "description": "配置与订阅管理、节点选择、系统代理、连接状态和诊断。", "kind": "application", "status": "active", "repository": "https://github.com/zerodenet/znet-sink", @@ -16,8 +16,8 @@ { "id": "core", "name": "Zero Core", - "tagline": "协议、配置与控制面能力", - "description": "面向开发者和集成方,提供可裁剪的协议实现、运行时能力与控制接口。", + "tagline": "网络代理内核", + "description": "协议、路由、策略、运行时以及 HTTP、IPC、CLI 等控制接口。", "kind": "kernel", "status": "active", "repository": "https://github.com/zerodenet/core", @@ -26,5 +26,17 @@ "download": "https://github.com/zerodenet/core/releases/latest", "platforms": ["Windows", "macOS", "Linux"], "audiences": ["operator", "integrator", "contributor"] + }, + { + "id": "zboard", + "name": "Zboard", + "tagline": "代理服务运营管理", + "description": "基础设施、协议服务、节点组、商品、订单、订阅、配置交付和流量管理。", + "kind": "application", + "status": "preview", + "repository": "https://github.com/zerodenet/zboard", + "docsRoot": "/projects/zboard/", + "quickStart": "/projects/zboard/guides/installation", + "audiences": ["operator", "contributor"] } ] diff --git a/docs/.vitepress/theme/components/DiscussionFeed.vue b/docs/.vitepress/theme/components/DiscussionFeed.vue new file mode 100644 index 0000000..f39221e --- /dev/null +++ b/docs/.vitepress/theme/components/DiscussionFeed.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 2b5012a..859ff66 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,5 +1,6 @@ import DefaultTheme from 'vitepress/theme' import type { Theme } from 'vitepress' +import DiscussionFeed from './components/DiscussionFeed.vue' import ProjectCatalog from './components/ProjectCatalog.vue' import ProjectMeta from './components/ProjectMeta.vue' import Layout from './Layout.vue' @@ -9,6 +10,7 @@ export default { extends: DefaultTheme, Layout, enhanceApp({ app }) { + app.component('DiscussionFeed', DiscussionFeed) app.component('ProjectCatalog', ProjectCatalog) app.component('ProjectMeta', ProjectMeta) }, diff --git a/docs/community/index.md b/docs/community/index.md new file mode 100644 index 0000000..86cf7e3 --- /dev/null +++ b/docs/community/index.md @@ -0,0 +1,23 @@ +# 社区 + + + +## 即时交流 + +- [Telegram](https://t.me/zerodenet) — ZeroDeNet Telegram 群组 +- [GitHub](https://github.com/zerodenet) — 源码、Issue、Pull Request 与发布记录 + +## 问题反馈 + +明确的 Bug、功能缺陷或实现任务请提交到对应项目: + +| 项目 | Issue | +| --- | --- | +| Zero Core | [zerodenet/core/issues](https://github.com/zerodenet/core/issues) | +| ZNet Sink | [zerodenet/znet-sink/issues](https://github.com/zerodenet/znet-sink/issues) | +| Zboard | [zerodenet/zboard/issues](https://github.com/zerodenet/zboard/issues) | +| 文档 | [zerodenet/docs/issues](https://github.com/zerodenet/docs/issues) | + +## 赞助、广告与友情链接 + +合作联系:[Telegram](https://t.me/zerodenet)。 diff --git a/docs/index.md b/docs/index.md index 683fd51..3e322cd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,70 +4,78 @@ title: ZeroDeNet hero: name: ZeroDeNet - text: 让复杂网络能力简单可用 - tagline: 依据公开协议独立实现,将复杂的网络能力整理成易理解、易使用的产品,同时持续追求性能与可靠性。 + text: 网络工具与服务 + tagline: ZeroDeNet 维护 Zero Core、ZNet Sink 和 Zboard,分别用于网络运行时、桌面代理和服务运营。 actions: - theme: brand - text: 查看所有项目 + text: 查看项目 link: /projects/ - theme: alt - text: 开始使用 - link: /projects/znet-sink/guides/installation + text: 使用场景 + link: /solutions/ --- -
-

正在建设

-

持续打磨核心能力

-

从底层协议到桌面体验,把复杂能力整理进清晰、一致的使用路径。

+
+

PROJECTS

+

项目

-
-
- - 协议实现 - 依据公开协议独立实现,持续完善兼容性与互操作验证。 - -
+ +
+ +
+

USE CASES

+

使用场景

+ +
- 路由与策略 - 统一配置、路由和策略模型,覆盖更多真实使用场景。 + 桌面代理 + ZNet Sink:配置与订阅管理、节点选择、系统代理、连接状态和诊断。
- 控制与集成 - 提供稳定的控制接口与集成边界,连接应用和运行时。 + 运行节点 + Zero Core:协议、路由、策略、出站组和控制接口。
- 桌面体验 - 简化安装、连接、订阅和日常代理管理流程。 + 应用集成 + 通过 HTTP、IPC 或 CLI 将 Zero Core 接入应用、GUI 或控制面。
- 文档与社区 - 持续整理文档与示例,欢迎问题、建议和代码贡献。 + 服务运营 + Zboard:基础设施、节点、订阅、订单、配置交付和流量管理。
-
-

所有项目

-

从文档进入使用

-

查看 ZeroDeNet 正在维护的项目,进入对应的指南与技术参考。

- - -
+
+

COMMUNITY

+

社区

-
-
-

参与社区,共建更好的网络工具

-

欢迎提交问题、建议或代码,帮助 ZeroDeNet 持续改进。

+
+
+ + 社区 + 讨论、问题反馈、合作与社区入口。 + +
+
+ + Telegram + ZeroDeNet Telegram 群组。 + +
+
+ + GitHub + 源码、Issue、Pull Request 和发布记录。 + +
-
diff --git a/docs/projects/core/control-plane/breaking-changes.md b/docs/projects/core/control-plane/breaking-changes.md index 5e4634b..56d75d6 100644 --- a/docs/projects/core/control-plane/breaking-changes.md +++ b/docs/projects/core/control-plane/breaking-changes.md @@ -25,12 +25,46 @@ | 版本 | 影响面 | 迁移结论 | |------|--------|----------| -| `Unreleased` | 构建脚本、事件消费者、Webhook 接收端 | 公开 Cargo feature 改用 kebab-case;引擎生成的 `event_id` 增加每次启动唯一的随机 epoch;开发期固定中心 API 被撤销,Connector 收缩为通用 Webhook 事件投递;认证项速率改为 Zero 主体策略聚合 | +| `Unreleased` | - | No pending compatibility changes | +| `0.0.15` | - | No pending compatibility changes | +| `0.0.15-rc.4` | - | No pending compatibility changes | +| `0.0.15-rc.3` | Diagnostics API 消费者、Connector 运维与事件 Sink | `diagnostics.trace_route` 改为执行真实会话路由追踪;Connector 对事实事件施加有界内存与可选 outbox 背压,采样事件改为仅 best-effort 且不持久化;默认重试次数由 3 调整为 10 | +| `0.0.15-rc.2` | 构建脚本、事件消费者、Webhook 接收端 | 公开 Cargo feature 改用 kebab-case;引擎生成的 `event_id` 增加每次启动唯一的随机 epoch;开发期固定中心 API 被撤销,Connector 收缩为通用 Webhook 事件投递;认证项速率改为 Zero 主体策略聚合 | | `0.0.15-rc.1` | 进程内 Rust `EventSource`、事件 Sink | Rust 实现者必须迁移到实时 `EventStream`;IPC/HTTP/gRPC GUI wire 无变化 | | `0.0.15-rc` | GUI flow 生命周期 | 订阅 ACK 后以 `flow.snapshot` 建立活动连接基线,再合并 flow 增量 | ## Unreleased + + +## 0.0.15 + + + +## 0.0.15-rc.4 + + + +## 0.0.15-rc.3 + +### Diagnostics 路由追踪使用真实会话语义 + +`diagnostics.trace_route` 现在构造 TCP 或 UDP 会话并复用代理运行时的路由追踪路径。域名规则没有直接命中且路由需要解析 IP 时,会通过真实 DNS 解析结果再次匹配 IP 规则。响应中的 `effective_mode`、`route_action` 和 `matched_rule` 因此反映实际运行时决策,不再使用简化推断。依赖旧诊断结果的控制端应以新结果为准。 + +### Connector backlog 改为有界工作集 + +Connector 不再让慢速或失联 Sink 导致进程内待投递队列无界增长: + +- 配置 outbox 时,事实事件先写入持久化 journal,内存只保留有界工作集,其余记录按空位从磁盘分页恢复; +- 未配置 outbox 时,事实事件通过停止继续消费事件源施加背压,不会静默丢弃; +- `flow.updated` 与 `stats.sampled` 是可丢弃采样,只做 best-effort 投递、不会写入 outbox;工作集已满时优先替换同一 Sink 的旧采样,不驱逐事实事件; +- `api.dispatcher.max_in_memory_deliveries = 0` 表示 outbox-only 模式,因此必须同时配置 `api.outbox_path`; +- `max_retry_attempts` 默认值由 `3` 调整为 `10`,显式配置不受影响。 + +事件 Sink 不应把吞吐采样当作可靠事实流;需要恢复保证的消费者应使用事实事件并配置 outbox。 + +## 0.0.15-rc.2 + ### 撤销开发期固定中心 API 项目尚未发布 Connector 合同,因此开发期的节点注册、同步、traffic、presence、访问配置和私有命令设计直接撤销,不保留兼容层。 @@ -147,4 +181,4 @@ IPC、HTTP SSE 和 gRPC 的 wire 格式保持 `zero.api.v1` / `zero.event.v1`, - GUI/SDK/面板的明确迁移步骤; - 对应回归测试位置。 -开发期间只在版本矩阵和 `## Unreleased` 下登记,不预判最终发布版本,也不写入 Cargo 的 `-dev` 构建号。完整测试通过后,由 `scripts/release.ps1` 或 `scripts/release.sh` 将矩阵行、章节标题和 workspace 版本一起封板;禁止手工分别修改这些位置。 +开发期间只在版本矩阵和 `## Unreleased` 下登记,不预判最终发布版本,也不写入 Cargo 的 `-dev.N` 构建号。完整测试通过后,由 `Prepare Release` 工作流或 `scripts/release.sh` 将矩阵行、章节标题和 workspace 版本一起封板;禁止手工分别修改这些位置。 diff --git a/docs/projects/core/guides/index.md b/docs/projects/core/guides/index.md index db9394a..ea763df 100644 --- a/docs/projects/core/guides/index.md +++ b/docs/projects/core/guides/index.md @@ -11,6 +11,7 @@ ## 管理运行中的节点 - [运行与观测](./operations):状态、流、策略、事件、日志和 Connector 积压。 +- [HTTP / Mixed 代理入口与 URLTest](./proxy-and-urltest):标准 HTTP 代理、QUIC 域名、并发测速和 GUI 等待语义。 - [安全热更新配置](./hot-reload):校验、应用、确认和失败回滚。 - [使用控制 API](./control-api):HTTP、IPC、CLI 和 gRPC 的选择与调用。 - [保护控制接口](./control-security):Bearer、TLS、mTLS 和远程访问边界。 diff --git a/docs/projects/core/guides/proxy-and-urltest.md b/docs/projects/core/guides/proxy-and-urltest.md new file mode 100644 index 0000000..ca58f66 --- /dev/null +++ b/docs/projects/core/guides/proxy-and-urltest.md @@ -0,0 +1,96 @@ +# HTTP / Mixed 代理入口与 URLTest + +本页说明 HTTP、Mixed、QUIC 出站和 URLTest 的当前运行行为。升级内核后,客户端和控制器应按这些语义处理请求、测速结果和配置切换。 + +## HTTP 与 Mixed 入站 + +| 入站类型 | 接受的请求 | +|----------|------------| +| `http` | HTTP CONNECT、标准 HTTP forward-proxy 请求 | +| `mixed` | SOCKS5 TCP、SOCKS5 UDP ASSOCIATE、HTTP CONNECT、标准 HTTP forward-proxy 请求 | + +标准 HTTP forward-proxy 请求使用绝对形式的目标地址,例如: + +```http +GET http://example.com/status HTTP/1.1 +Host: example.com +``` + +Zero 会解析目标地址,按正常路由规则选择出站,再将请求头转换为目标服务器可接受的 origin-form 后转发。请求体和其他头字段会继续沿所选出站传输。 + +HTTPS 仍通过 CONNECT 建立隧道。Zero 不会在本地代理入口解密 HTTPS 内容。 + +可用以下命令验证: + +```bash +curl -x http://127.0.0.1:8080 http://example.com/ +curl -x http://127.0.0.1:7890 https://example.com/ +``` + +如果使用 `mixed`,同一个端口也可以被 SOCKS5 客户端使用。 + +## 路由语义 + +HTTP forward-proxy 请求与 CONNECT、SOCKS5 请求使用同一套路由模型: + +- 域名目标可以命中域名规则; +- 已解析或直接提供的 IP 目标可以命中 IP/CIDR 规则; +- 未命中规则时执行 `route.final`; +- 拒绝动作会在建立上游连接前终止请求。 + +不要为普通 HTTP 请求另建一套旁路转发规则。 + +## QUIC 出站地址与 SNI + +Hysteria2 和 VLESS QUIC 出站的 `server` 可以填写域名。连接时会解析 A/AAAA 记录,去重后依次尝试可用地址,并根据目标地址族创建 IPv4 或 IPv6 UDP endpoint。 + +对于 VLESS QUIC: + +- `server` 决定实际连接的网络端点; +- QUIC/TLS 的 `server_name` 决定证书校验和 SNI; +- 两者可以不同,例如连接一个接入域名,同时使用证书对应的服务名。 + +当日志出现 `quic resolve` 时检查 DNS;出现 `quic connection` 时继续检查 UDP 可达性、端口、SNI、证书和服务端协议配置。域名不应再被当作 `SocketAddr` 直接解析。 + +## URLTest 探测模型 + +一个 URLTest 组会并发探测成员,而不是逐个串行等待。当前行为包括: + +- 全进程最多同时运行 8 个真实探测; +- 不同 URLTest 组和单节点诊断共享同一个并发上限; +- 同一份活动配置中,相同目标和相同 URL 的并发请求会合并为一次真实探测; +- 一轮探测运行期间再次触发同一组,不会在后面重复排队一整轮; +- 手动探测完成后会重新计算下一次周期时间; +- 结果快照保持配置中的成员顺序,不受实际完成顺序影响。 + +并发上限用于避免大量节点同时建立真实连接造成资源尖峰;它不代表一个组最多只能包含 8 个成员。 + +## 控制器与 GUI 接入建议 + +触发策略组测速时,直接请求该 URLTest 组,不要先展开成员并逐一重复测速。一个 URLTest 组作为另一个 selector 的成员时,也应把它视为一个策略目标。 + +界面等待结果时建议: + +1. 记录触发时间和当前配置身份; +2. 等待新的 `policy.probe.completed` 事件; +3. 如果事件丢失,可接受触发时间之后的新鲜策略快照; +4. 配置切换后立即结束旧配置的等待状态; +5. 不要仅依靠固定短超时判断整组失败。 + +成员较多时,整组完成时间取决于共享并发上限、单次网络超时和其他同时运行的探测。 + +## 常见问题 + +### 普通 HTTP 请求仍失败 + +先确认客户端确实把代理配置为 HTTP 代理,并检查请求是否使用绝对形式。然后查看路由最终动作、目标解析和上游连接错误。 + +### QUIC 域名可解析但连接失败 + +分别检查解析结果中的 IPv4/IPv6 地址、UDP 防火墙、端口、服务端监听和 TLS `server_name`。解析成功不代表每个返回地址都可用。 + +### URLTest 重复消耗流量 + +不要同时对父组、URLTest 组和其全部成员发起独立请求。Zero 会合并同一目标的同时请求,但跨时间或不同探测 URL 仍会产生新的真实连接。 + +相关配置见[运行模式与出站组](/projects/core/configuration/modes-and-groups)和[协议配置示例](/projects/core/protocols/configuration)。 diff --git a/docs/projects/core/index.md b/docs/projects/core/index.md index c2487af..a309e56 100644 --- a/docs/projects/core/index.md +++ b/docs/projects/core/index.md @@ -1,13 +1,11 @@ -# Zero Core 使用手册 +# Zero Core -Zero Core 是可裁剪的网络代理内核。本手册从“把节点运行起来”开始,说明如何配置协议、管理运行中的节点、接入外部系统和处理故障。实现设计与仓库工程规则不属于这里的主线。 +Zero Core 是可裁剪的网络代理内核,可作为本地网关、边缘节点或服务器运行,并提供 CLI、HTTP、IPC 等控制接口。 ## 第一次使用 -按顺序完成: - 1. [安装与构建](./guides/installation):准备 Rust、选择 feature 并得到 `zero` 可执行文件。 2. [启动第一个节点](./guides/quickstart):使用一个可直接验证的本地 Mixed 入站配置启动 Zero。 3. [配置基础](./guides/configuration-basics):加入代理出站、路由和运行参数。 @@ -18,6 +16,7 @@ Zero Core 是可裁剪的网络代理内核。本手册从“把节点运行起 | 目标 | 从这里开始 | |------|------------| | 增加或修改 VLESS、VMess、Trojan 等节点 | [协议配置](./protocols/) | +| 使用 HTTP/Mixed 本地代理、QUIC 域名或 URLTest | [代理入口与 URLTest](./guides/proxy-and-urltest) | | 不重启进程地更新凭证、监听器或路由 | [安全热更新配置](./guides/hot-reload) | | 用脚本或服务管理 Zero | [使用控制 API](./guides/control-api) | | 跨主机安全访问 HTTP/gRPC | [保护控制接口](./guides/control-security) | @@ -35,7 +34,7 @@ Zero Core 是可裁剪的网络代理内核。本手册从“把节点运行起 | 强类型服务端集成 | 可选 gRPC | | 节点主动上报事件 | 可选 Connector Webhook | -HTTP、IPC 和 gRPC 调用的是同一组 Zero 查询与命令。Connector 只负责事件投递,不是另一套节点管理 API。 +HTTP、IPC 和 gRPC 调用的是同一组 Zero 查询与命令。Connector 负责事件投递。 ## 查字段和协议 diff --git a/docs/projects/core/protocols/configuration.md b/docs/projects/core/protocols/configuration.md index e2d3f58..a73711a 100644 --- a/docs/projects/core/protocols/configuration.md +++ b/docs/projects/core/protocols/configuration.md @@ -218,6 +218,35 @@ Mixed 同时接受 SOCKS5 TCP、SOCKS5 UDP ASSOCIATE 和 HTTP CONNECT。 } ``` +### VLESS REALITY + Vision + +```json +{ + "tag": "vless-reality-vision-out", + "protocol": { + "type": "vless", + "server": "edge.example.com", + "port": 443, + "id": "11111111-2222-3333-4444-555555555555", + "flow": "xtls-rprx-vision", + "reality": { + "public_key": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "short_id": "0123456789abcdef", + "server_name": "www.cloudflare.com", + "client_fingerprint": "chrome" + } + } +} +``` + +`xtls-rprx-vision` 使用 Xray 兼容的 VLESS Addons 和 Vision 数据阶段语义。当前已验证边界是 **REALITY 上的 TCP 出站**: + +- 不能与 `mux_concurrency` 组合; +- UDP 会被配置校验或运行时明确拒绝; +- `reality.client_fingerprint` 支持 `chrome`、`firefox`、`safari` 和 `edge`,默认 `chrome`; +- 历史 Zero 私有请求头加密格式只以 `flow: zero-aead-v1` 保留,它不与 Xray Vision 互通; +- 旧别名 `xtls-rprx-vision-udp443` 已拒绝,必须显式迁移到标准 Vision 或 `zero-aead-v1`。 + ### VMess ```json @@ -334,7 +363,7 @@ Mixed 同时接受 SOCKS5 TCP、SOCKS5 UDP ASSOCIATE 和 HTTP CONNECT。 ## 传输和高级字段 -VLESS、VMess 等协议还支持 TLS、REALITY、WebSocket、gRPC、H2、HTTP Upgrade、XHTTP、MUX 和 UDP 相关组合。不要仅凭字段存在就任意叠加;组合限制见[完整配置字段](/projects/core/configuration/)和[协议能力矩阵](/projects/core/reference/protocol-capabilities)。 +VLESS、VMess 等协议还支持 TLS、REALITY、WebSocket、gRPC、H2、QUIC、HTTP Upgrade、XHTTP、MUX 和 UDP 相关组合。不要仅凭字段存在就任意叠加;组合限制见[完整配置字段](/projects/core/configuration/)和[协议能力矩阵](/projects/core/reference/protocol-capabilities)。 完成配置后: diff --git a/docs/projects/core/reference/protocol-capabilities.md b/docs/projects/core/reference/protocol-capabilities.md index 255414b..f42cd97 100644 --- a/docs/projects/core/reference/protocol-capabilities.md +++ b/docs/projects/core/reference/protocol-capabilities.md @@ -54,6 +54,25 @@ IPC: | `vmess` | `partial` | 部分 | 部分 | 部分 | 部分 | 部分 | | `mieru` | `supported` | 支持 | 支持 | 支持 | 支持 | 不支持 | +## VLESS 组合边界 + +VLESS 顶层保持 `partial`,因为不同 flow、传输、MUX 和 UDP 路径的成熟度不同。当前开发线中需要特别区分: + +| 组合 | 当前结论 | +|------|----------| +| 普通 VLESS TCP + TLS/REALITY | 可用;仍需检查所选传输和发行物 capability | +| REALITY + `xtls-rprx-vision` + TCP 出站 | 已按 Xray Vision 线协议实现并完成真实进程互操作验证 | +| `xtls-rprx-vision` + `mux_concurrency` | 不支持,配置必须拆分 | +| `xtls-rprx-vision` + UDP | 不支持,会明确拒绝 | +| `zero-aead-v1` | Zero 私有兼容 flow,不是 Xray Vision | +| `xtls-rprx-vision-udp443` | 已废弃并拒绝,不再作为别名猜测 | +| Mux.Cool TCP / XUDP | 分别由 `mux_concurrency` / `xudp_concurrency` 启用,不依赖 Vision flow | +| XHTTP `stream-one` | 支持单条 H2/H2C 双向流;部署前仍需验证对端版本和链路组合 | + +REALITY 客户端的 `client_fingerprint` 支持 `chrome`、`firefox`、`safari`、`edge`,默认 `chrome`。它只改变 REALITY 客户端 ClientHello;普通 TLS 和 REALITY 入站不读取该字段。 + +不要把“某一条真实互操作路径通过”扩大解释为所有传输、UDP、MUX 和中继组合都已具备相同成熟度。配置示例见[协议配置示例](/projects/core/protocols/configuration)。 + ## 部署时如何判断 对于每个节点配置: diff --git a/docs/projects/index.md b/docs/projects/index.md index c8043d4..bae7699 100644 --- a/docs/projects/index.md +++ b/docs/projects/index.md @@ -1,7 +1,5 @@ -# 项目文档 +# 项目 -这里列出 ZeroDeNet 对外维护的独立项目。每个项目都有自己的开始路径、下载地址、源码地址、文档目录和维护规则;项目之间不共享阅读序列。 +ZeroDeNet 当前维护以下项目。 - -后续新增项目时,也会以同样的独立文档域接入,而不是挂在现有项目的侧栏或上一页/下一页序列中。 diff --git a/docs/projects/zboard/contributing/index.md b/docs/projects/zboard/contributing/index.md new file mode 100644 index 0000000..42d1fb5 --- /dev/null +++ b/docs/projects/zboard/contributing/index.md @@ -0,0 +1,15 @@ +# 参与 Zboard + +Zboard 的代码、版本规划和实现讨论维护在项目仓库中。 + +## 文档贡献 + +公开使用文档位于本仓库: + +- 修正文档错误; +- 补充部署和运维经验; +- 完善用户使用流程。 + +## 项目贡献 + +开发、Issue 和技术讨论请访问 [Zboard 仓库](https://github.com/zerodenet/zboard)。 diff --git a/docs/projects/zboard/guides/dns-and-certificates.md b/docs/projects/zboard/guides/dns-and-certificates.md new file mode 100644 index 0000000..28cf2fb --- /dev/null +++ b/docs/projects/zboard/guides/dns-and-certificates.md @@ -0,0 +1,120 @@ +# DNS 与证书管理 + +Zboard 可以通过供应商账号维护节点域名记录,并在节点上签发和续期协议服务使用的证书。DNS 记录、证书资产和协议服务保持独立,便于分别审计和重试。 + +## 托管 DNS 记录 + +创建 DNS 记录时需要选择供应商账号、目标节点、域名、记录类型和值。当前托管记录以 Cloudflare Zone 和 record ID 作为远端身份。 + +创建后可编辑: + +- 目标节点; +- A/AAAA 记录值; +- TTL; +- Cloudflare 代理状态。 + +供应商账号、完整域名和记录类型属于身份字段,不能原地修改。需要改变这些字段时,删除旧记录后重新创建。 + +保存修改会立即进入供应商同步。编辑页面使用 revision 防止两个会话互相覆盖;出现冲突时刷新记录后重新提交。 + +## 删除 DNS 记录 + +删除操作会先删除 Zboard 保存的那个 Cloudflare record ID,再移除本地期望状态: + +- 远端删除成功后,删除面板记录; +- 供应商返回 404 时,视为远端已经不存在,可以继续清理本地记录; +- 鉴权、权限或其他供应商错误会保留面板记录,便于修复后重试; +- 同一记录有同步操作正在运行时,不允许并发删除。 + +Zboard 不会按域名模糊删除其他记录。 + +## 创建证书 + +创建托管证书时需要确定: + +- 目标节点; +- 一个或多个域名; +- ACME 环境; +- 验证方式; +- 联系邮箱; +- 自动续期策略。 + +目标节点、域名、环境、验证方式和供应商身份定义了证书资产边界,创建后不可原地修改。需要改变这些字段时,新建证书并重新绑定协议服务。 + +可编辑字段包括: + +- 显示名称; +- ACME 联系邮箱; +- HTTP-01 Webroot; +- 是否自动续期; +- 提前续期天数,范围为 1–60 天。 + +签发或续期正在运行时不能编辑证书。编辑同样使用 revision 冲突保护。 + +## HTTP-01 Webroot + +HTTP-01 Webroot 要求域名的 80 端口最终把: + +```text +/.well-known/acme-challenge/ +``` + +映射到所选节点上的 Webroot 目录。 + +签发前,Zboard 会在节点 Webroot 写入一次性测试文件,再从公开域名请求该地址并比较返回内容。节点优先使用 `curl`,没有时使用 `wget`;只允许 HTTP/HTTPS 请求和重定向。 + +预检失败通常表示: + +- A/AAAA 记录未指向目标节点; +- 80 端口不可达; +- 反向代理没有把 challenge 路径映射到 Webroot; +- HTTP 被跳转到错误位置; +- 返回内容被应用路由或缓存替换。 + +仅控制端缺少到某个 IPv6 地址的路由时,不会直接认定远端 AAAA 不可用;明确的连接拒绝或超时仍会阻止签发。 + +## DNS-01 Cloudflare + +DNS-01 需要供应商账号提供有效的 Cloudflare API Token。Zboard 在节点上准备 Certbot Cloudflare 插件时按以下顺序尝试: + +1. 使用系统包管理器安装 `python3-certbot-dns-cloudflare` 或发行版对应包; +2. 如果发行版没有该包,在 `/opt/zboard-certbot` 创建隔离 Python virtual environment; +3. 如果 venv 不可用,再把 Certbot 和插件安装到 `/opt/zboard-certbot-packages`,通过独立 wrapper 运行。 + +每一步都会检查 Certbot 是否真正列出 `dns-cloudflare` 插件。系统包、venv 和 pip target 都失败时,任务会返回明确错误,而不是继续执行一个缺少插件的 Certbot。 + +节点至少需要: + +- root 权限; +- 可用的系统包管理器或 Python 3; +- 到 Python 包源和 ACME 服务的网络; +- 足够的磁盘空间; +- 正确权限的 Cloudflare Token。 + +## 证书绑定与续期 + +证书签发成功后,可以绑定到同一节点的 TLS 协议服务。绑定前确认域名覆盖、有效期和证书状态。 + +启用自动续期时,Zboard 根据“提前续期天数”计算下一次续期时间。修改该值会重新计算计划。续期失败不会删除当前证书文件;处理错误后可以重试。 + +## 常见错误 + +### HTTP-01 返回 unauthorized + +不要只检查 DNS 解析。直接从公网请求 challenge URL,确认内容等于测试 token,并检查 HTTPS 跳转是否仍能访问同一 Webroot。 + +### 找不到 `python3-certbot-dns-cloudflare` + +这是发行版仓库缺包,不代表只能放弃 DNS-01。查看任务日志是否继续尝试 venv 和 pip target;若全部失败,补齐 Python、venv/pip 或节点外网访问后重试。 + +### 找不到 `python3-venv` + +某些发行版按 Python 次版本提供 venv 包。自动流程会尝试对应的 `pythonX.Y-venv`,随后还有 pip target 回退。仍失败时检查软件源配置和 Python 安装完整性。 + +### DNS 删除后面板记录仍存在 + +查看供应商返回错误。除远端 404 外,鉴权和权限错误会保留本地记录,这是为了避免面板误认为远端资源已经删除。 + +### 证书无法编辑 + +确认没有签发或续期任务正在运行,并刷新页面获取最新 revision。资产身份字段需要新建证书,不能通过编辑修改。 diff --git a/docs/projects/zboard/guides/first-setup.md b/docs/projects/zboard/guides/first-setup.md new file mode 100644 index 0000000..1c1a051 --- /dev/null +++ b/docs/projects/zboard/guides/first-setup.md @@ -0,0 +1,22 @@ +# 首次初始化 + +完成部署后,需要初始化管理员、基础配置和节点环境。 + +## 初始化流程 + +1. 创建管理员账户; +2. 配置站点基础信息; +3. 配置节点连接凭证; +4. 验证数据库、缓存和运行环境; +5. 开始添加节点资源。 + +## 安全建议 + +- 管理员密码使用高强度随机密码; +- SSH 凭证使用最小权限; +- 不在日志中记录明文凭证; +- 定期轮换外部服务密钥。 + +## 下一步 + +继续阅读[节点与协议服务管理](./node-management)。 diff --git a/docs/projects/zboard/guides/index.md b/docs/projects/zboard/guides/index.md new file mode 100644 index 0000000..f8a5232 --- /dev/null +++ b/docs/projects/zboard/guides/index.md @@ -0,0 +1,15 @@ +# Zboard 用户指南 + +从这里开始了解 Zboard 的部署、初始化、节点接入和日常运营。 + +## 推荐阅读顺序 + +1. [安装与部署](./installation) +2. [首次初始化](./first-setup) +3. [节点与协议服务管理](./node-management) +4. [协议服务配置](./protocol-services) +5. [订阅交付与流量展示](./subscriptions-and-traffic) +6. [DNS 与证书管理](./dns-and-certificates) +7. [故障排查](./troubleshooting) + +节点资产、协议服务、订阅模板和证书是独立资源。先完成节点接入,再按实际业务启用协议、订阅和基础设施自动化能力。 diff --git a/docs/projects/zboard/guides/installation.md b/docs/projects/zboard/guides/installation.md new file mode 100644 index 0000000..0b8435b --- /dev/null +++ b/docs/projects/zboard/guides/installation.md @@ -0,0 +1,46 @@ +# 安装与部署 + +Zboard 推荐使用 Docker Compose 部署。生产部署需要准备 MySQL 8、Redis 和外部 Docker 网络。 + +具体镜像标签、Compose 文件和环境变量示例以对应版本的 Zboard 发布包为准,不要在生产环境使用浮动的 `latest` 标签。 + +## 前置条件 + +- Docker Engine +- Docker Compose v2 +- MySQL 8 数据库 +- Redis 服务 + +## 配置环境变量 + +至少需要配置: + +- `ZBOARD_DATA_SOURCE`:MySQL 连接地址; +- `ZBOARD_REDIS_ADDR`:Redis 地址; +- `ZBOARD_JWT_SECRET`:登录令牌密钥; +- `ZBOARD_CREDENTIAL_ENCRYPTION_KEY`:凭证加密密钥。 + +## 启动服务 + +准备环境变量后启动: + +```bash +docker compose up -d +``` + +启动后检查健康状态: + +```text +GET /readyz +``` + +首次访问管理地址时,根据引导完成管理员初始化。 + +## 部署建议 + +- 使用反向代理处理公网 HTTPS; +- 不直接暴露管理接口到公网; +- 定期备份数据库和凭证加密密钥; +- 升级前保留当前镜像和数据库备份。 + +下一步阅读[首次初始化](./first-setup)。 diff --git a/docs/projects/zboard/guides/node-management.md b/docs/projects/zboard/guides/node-management.md new file mode 100644 index 0000000..c5b38c7 --- /dev/null +++ b/docs/projects/zboard/guides/node-management.md @@ -0,0 +1,89 @@ +# 节点与协议服务管理 + +Zboard 将基础设施节点、协议服务和商业订阅分离管理。节点描述可运维的服务器,协议服务描述对外提供的网络能力,节点组和订阅模板决定用户最终获得什么。 + +## 资源关系 + +```text +供应商账号 / VPS 节点资产 + ↓ + Zero 安装与运行状态 + ↓ + Protocol Service + ↓ + Node Group + ↓ + Subscription Delivery +``` + +DNS 记录和托管证书关联到节点与协议服务,但仍是独立资产。 + +## 节点接入 + +节点接入通常包含: + +1. 配置 VPS 基础信息和 SSH 凭证; +2. 验证 SSH 连接和系统环境; +3. 安装或关联指定版本的 Zero; +4. 检查控制接口和 Connector; +5. 创建协议服务; +6. 发布配置并检查运行状态和事件上报。 + +节点显示“在线”只能证明基础连接或控制面可用。协议服务是否可用还取决于配置验证、端口监听、证书、实际内核能力和最近一次发布结果。 + +## Zero 版本选择 + +节点可以选择明确的 Zero 发行版本。选择时应区分正式版和预发布版,并按语义版本比较,不要按字符串排序。 + +不同协议能力有最低版本要求,例如 Trojan/Hysteria2 托管用户和 Mieru 用户归属。Zboard 会在创建或发布前检查所选节点版本;不满足要求时先升级节点,不应通过共享占位凭据绕过限制。 + +## 协议服务 + +协议服务负责描述: + +- 协议和监听端口; +- TLS、REALITY 和传输方式; +- 客户端订阅模板; +- 托管证书; +- 流量倍率和运营名称; +- 所属节点及最近发布状态。 + +协议服务配置支持复用、审计和重新发布,但运行时仍绑定到具体节点。详细字段和版本边界见[协议服务配置](./protocol-services)。 + +## 发布流程 + +一次完整发布应完成: + +1. 根据协议服务和订阅用户能力编译 Zero 配置; +2. 在目标节点运行配置校验; +3. 原子替换或激活配置; +4. 检查进程、服务监听和控制接口; +5. 确认 Connector 已接入; +6. 更新协议服务的实际发布状态。 + +任何一步失败都不应把未验证能力提前暴露给订阅。修复首个错误后重新发布,并保留失败任务和审计记录。 + +## 节点组与运营配置 + +节点加入并发布协议服务后,可以进一步关联: + +- 节点组; +- 套餐和 SKU; +- 订阅模板; +- 流量倍率和统计规则; +- DNS 记录与证书。 + +节点组引用协议服务,而不是直接引用一台裸服务器。这样可以在迁移服务或调整传输时保持上层商业配置稳定。 + +## 日常检查 + +- 节点 Zero 版本与期望版本一致; +- 最近发布状态成功; +- 协议端口和控制接口可达; +- Connector 持续上报事件; +- DNS 记录指向正确节点; +- 证书在有效期内且绑定关系正确; +- 订阅预览包含预期节点和本地 Mixed 入口; +- 流量记录能够归属到订阅用户。 + +Zero 的底层协议能力、配置模型和控制接口请参考 [Zero Core 项目仓库](https://github.com/zerodenet/core)。 diff --git a/docs/projects/zboard/guides/protocol-services.md b/docs/projects/zboard/guides/protocol-services.md new file mode 100644 index 0000000..580fa49 --- /dev/null +++ b/docs/projects/zboard/guides/protocol-services.md @@ -0,0 +1,75 @@ +# 协议服务配置 + +协议服务描述节点对外提供的协议、传输和订阅客户端配置。Zboard 会同时生成 Zero 服务端配置与客户端订阅片段,并在保存和发布前校验两端是否一致。 + +## 配置流程 + +1. 选择已接入且内核版本满足要求的节点; +2. 选择协议和监听端口; +3. 配置 TLS、REALITY 或传输参数; +4. 保存协议服务; +5. 发布到节点并等待验证、激活和运行状态检查完成; +6. 将协议服务加入节点组和订阅模板。 + +协议服务保存成功不等于节点已经运行该配置。以最近一次成功发布状态为准。 + +## VLESS 与 VMess 传输 + +VLESS 和 VMess 可以选择: + +- **TCP**:原始 TCP 传输,也是默认选择; +- **WebSocket**:需要以 `/` 开头的路径,可配置请求头; +- **gRPC**:需要一个明确的 Service Name。 + +服务端和客户端必须使用相同传输。Zboard 会拒绝以下组合: + +- 同时启用 WebSocket 和 gRPC; +- 服务端与客户端传输类型不同; +- WebSocket 路径不以 `/` 开头; +- 两端 WebSocket 路径或请求头不一致; +- 两端 gRPC Service Name 不一致; +- VLESS REALITY 与 WebSocket 或 gRPC 同时使用。 + +VLESS REALITY 当前固定使用原始 TCP。VMess 仍要求 TLS,选择传输不会取消该要求。 + +订阅导出时,Zboard 会把内部统一的传输字段转换为各客户端需要的表示形式。不要在生成结果中手工维护另一套不一致的传输参数。 + +## 托管订阅用户 + +VLESS、Trojan、Hysteria2 和 Mieru 等协议可以在订阅发布时注入当前订阅用户的凭据。协议服务模板只保存服务级和传输级默认值,不应保存供所有用户共享的占位凭据。 + +内核最低版本要求: + +| 能力 | 最低 Zero 版本 | +|------|----------------| +| Trojan / Hysteria2 托管订阅用户 | `0.0.15-rc.3` | +| Mieru 用户归属 | `0.0.15-rc.4` | + +不满足版本要求时,Zboard 会阻止使用对应托管模式,不会静默退化为共享密码。升级节点内核并重新发布协议服务后再继续。 + +## 发布状态与订阅交付 + +对于依赖内核托管用户能力的协议,订阅交付以成功发布到该节点的实际能力为边界: + +- 只有配置验证、激活、服务健康和 Connector 确认全部完成后,才视为可发布托管凭据; +- 发布失败不会提前切换订阅输出; +- 降级到旧内核并成功重新发布后,订阅输出也会回到与旧内核兼容的模式。 + +不要仅根据 Zboard 进程的全局设置判断某个节点是否支持托管用户。 + +## 证书绑定 + +使用 TLS 的协议服务可以绑定已签发且可用的托管证书。证书必须属于目标节点,并覆盖服务使用的域名。证书正在签发、续期、已过期或状态异常时,不应发布新的协议配置。 + +证书创建和续期见[DNS 与证书管理](./dns-and-certificates)。 + +## 保存前检查 + +- 节点内核版本和能力满足协议要求; +- 监听端口未与其他服务冲突; +- 服务端与客户端传输完全一致; +- TLS 域名、SNI 和证书覆盖范围一致; +- REALITY 只与受支持的 TCP 组合使用; +- 协议服务名称能够直接作为订阅节点名称展示。 + +发布后继续检查节点运行状态和最近事件。若发布失败,先处理第一条验证或运行错误,不要通过重复发布覆盖错误现场。 diff --git a/docs/projects/zboard/guides/subscriptions-and-traffic.md b/docs/projects/zboard/guides/subscriptions-and-traffic.md new file mode 100644 index 0000000..c52f3db --- /dev/null +++ b/docs/projects/zboard/guides/subscriptions-and-traffic.md @@ -0,0 +1,136 @@ +# 订阅交付与流量展示 + +Zboard 从协议服务、节点组、订阅模板和用户订阅生成客户端配置。公开订阅链接的授权边界始终是**单个订阅**,筛选参数和输出模板只能缩小该订阅已经授权的内容,不能聚合或扩展到同一账号下的其他订阅。 + +## 订阅生成链路 + +```text +协议服务 → 节点组 → 订阅模板 → 用户订阅 → 单订阅访问令牌 → 客户端输出 +``` + +协议服务决定节点、凭据、启用状态和交付顺序,节点组决定可选范围,订阅模板决定策略组、规则集、本地入口和客户端格式。修改任一层后,应通过管理端预览确认最终输出。 + +禁用协议服务后,该服务会同时从公开订阅输出和节点运行时发布中移除;重新启用后通过现有发布流程恢复。 + +## 单订阅访问边界 + +每个公开订阅 URL 只绑定一个 `subscription_id`。Zboard 会依次验证令牌、用户归属、订阅状态、有效期和剩余流量,然后只从该订阅解析节点、协议端点和凭据。 + +筛选是只读投影,不是授权机制: + +- `plan`、`sku`、`node_group`、`protocol`、`region`、`tag`、`exclude_tag` 和 `q` 只能继续减少结果; +- 筛选不能选择同一账号下的另一份订阅,也不能增加未授权节点或凭据; +- 合法筛选没有匹配项时返回有效的空订阅,而不是越过边界回退到其他订阅; +- `Subscription-Userinfo` 和配额元数据只描述令牌绑定的订阅,不跨订阅累计。 + +登录用户按目标订阅管理访问凭据: + +| 方法 | 路径 | 作用 | +|------|------|------| +| `GET` | `/api/v1/account/subscriptions/{id}/access` | 读取或按需创建该订阅的访问链接 | +| `POST` | `/api/v1/account/subscriptions/{id}/access/rotate` | 只轮换该订阅的令牌 | +| `DELETE` | `/api/v1/account/subscriptions/{id}/access` | 只撤销该订阅的令牌 | + +旧的账号级聚合访问接口已经移除。没有 `subscription_id` 的历史聚合令牌会在数据协调时失效,并为每份可用订阅分别创建访问令牌。 + +## 客户端识别与输出格式 + +公开交付只接受明确的订阅客户端 User-Agent。当前内置识别包括: + +- 严格的 `ZNet-Sink/<版本>`,例如 `ZNet-Sink/0.0.16-rc.7`; +- Clash / Mihomo; +- sing-box。 + +浏览器、`curl`、空 User-Agent 或仅包含 `ZNet-Sink` 子串的伪造值会在令牌解析前进入订阅伪装跳转,避免公开接口泄露令牌是否存在。 + +输出格式使用规范名称: + +| 名称 | 表示 | +|------|------| +| `zero` | Base64 编码的 Zero JSON | +| `clash` | Clash / Mihomo 原生表示 | +| `sing-box` | sing-box 原生表示 | + +`zero-json`、`zero-base64-json`、`znet-sink` 等历史别名会归一化到 `zero`,不能借助旧名称请求明文 Zero JSON。管理端预览可以保持可读,但公开 Zero 交付只输出编码文本。 + +Base64 不是加密。真正的安全边界仍然是随机令牌、HTTPS、令牌轮换与撤销,以及避免在日志、截图和工单中公开完整 URL。 + +## 无效订阅链接 + +无效、已撤销或非客户端请求会返回不可缓存的 HTTP 302,并跳转到系统配置中的“订阅伪装跳转地址”。该值留空时使用站点公开访问地址。 + +伪装跳转不能替代令牌安全,也不应被客户端当作有效订阅响应。排查同步失败时应同时检查响应状态、最终 URL、User-Agent 和订阅令牌状态。 + +## 本地 Mixed 端口 + +版本 2 订阅模板包含 `mixed_port`,默认值为 `7890`,允许范围为 `1–65535`。 + +Zboard 会为不同客户端生成可直接运行的本地入口: + +| 输出格式 | 本地入口 | +|----------|----------| +| ZNet Sink / Zero | loopback `mixed` 入站 | +| Clash / Mihomo | `mixed-port` 和 loopback 绑定 | +| sing-box | loopback `mixed` 入站 | + +因此订阅内容不依赖客户端在导入后临时补建入口。端口已被占用时,应在订阅模板中修改 `mixed_port`,而不是手工编辑每个用户的生成结果。 + +## 托管规则与 ZRS + +Zboard 托管的规则集由平台维护,而不是由节点内核临时生成: + +1. 管理端写入或导入规则源; +2. Zboard 归一化并校验为 canonical Zero Rule IR; +3. 内置的固定版本 `zero-rule` 编译器生成 ZRS; +4. 只有验证通过的 ZRS 才会成为 Zero 客户端可引用的发布产物; +5. Clash 和 sing-box 输出继续使用各自的规则表示。 + +Zero 客户端拿到的是 ZRS 产物,不是公开的 IR 文本。规则元数据保存在数据库,源文件和编译产物保存在 `ZBOARD_MANAGED_RULE_HOST_DIR`,容器内挂载到 `/var/lib/zboard/artifacts/rules`。 + +数据库与托管规则目录必须作为一个备份、恢复和回滚单元;蓝绿实例也必须共享同一可写规则目录。只恢复数据库而不恢复匹配的规则快照,会造成元数据与发布产物不一致。 + +## 策略组输出 + +手动 selector 会保留 `DIRECT` 和 `REJECT` 作为固定选择。URLTest 和 fallback 组不会包含它们,因为它们不是可探测节点。 + +订阅中的节点名称默认沿用协议服务名称,不再附加内部端点或订阅 ID。名称为空时才使用协议名作为回退。协议服务的交付顺序是所有渲染器共享的权威顺序,端点 ID 只作为稳定的最终排序条件。 + +默认延迟测试地址为: + +```text +http://www.gstatic.com/generate_204 +``` + +系统只会迁移旧的内置默认值,不会覆盖运营人员自定义的测速 URL。 + +## 流量计费与趋势语义 + +Zboard 以 Zero 上报并成功归属到订阅用户的完成流量事实为来源: + +1. Zero 建立并记录真实连接; +2. 完成事实包含连接的上下行字节和用户归属; +3. Zboard 幂等写入流量记录; +4. 应用协议服务或套餐配置的计费倍率; +5. 累加该订阅的已用流量; +6. 剩余流量由套餐额度减去已用流量得到。 + +客户端本地显示一次测速成功,不代表服务端一定建立了可归属连接。Zboard 不会根据客户端报告凭空生成流量费用。 + +管理端和个人中心的趋势图从后端按时间范围聚合的结果读取,并使用订阅、用户、节点等业务标签展示关联实体;前端不应拉取全量原始明细后自行聚合。 + +后台存储和计费使用精确字节。界面根据数值自动显示 B、KB、MB 或 GB;单位变化只影响显示,不改变数据库、API 或计费结果。 + +## 排查订阅与流量 + +订阅无法导入时,依次确认: + +1. 请求使用受支持的订阅客户端 User-Agent; +2. 令牌未撤销且令牌绑定的用户、订阅处于有效状态; +3. HTTP 响应不是伪装跳转; +4. 客户端选择了正确模板或自动检测; +5. `zero` 响应能够完整 Base64 解码,且不是明文 JSON; +6. 生成配置包含 loopback Mixed 入口; +7. 节点组至少包含已启用、可发布的协议服务; +8. 引用的托管规则 ZRS URL 可读取且与当前数据库快照匹配。 + +流量未增加时,确认节点侧是否存在归属到该订阅用户的完成事件。只有客户端本地探测记录、但节点没有会话和字节事实时,应排查客户端到节点的实际连接路径,而不是修改计费逻辑。 diff --git a/docs/projects/zboard/guides/troubleshooting.md b/docs/projects/zboard/guides/troubleshooting.md new file mode 100644 index 0000000..17f5569 --- /dev/null +++ b/docs/projects/zboard/guides/troubleshooting.md @@ -0,0 +1,107 @@ +# 故障排查 + +## 服务无法启动 + +检查: + +- MySQL 连接是否可用; +- Redis 是否正常运行; +- 环境变量是否完整; +- JWT 和凭证加密密钥是否满足要求; +- 容器磁盘空间和 inode 是否充足; +- `/readyz` 是否返回数据库和应用就绪状态。 + +如果镜像构建或同步失败,不要只看最后的 Docker 错误。先确认失败发生在构建、数据库备份、候选启动还是应用切换阶段,再决定是否需要清理可重建缓存。 + +## 节点无法上线或发布失败 + +检查: + +1. SSH 凭证和节点网络是否可用; +2. 节点上的 Zero 版本是否与选择值一致; +3. 配置校验返回的第一条字段错误; +4. 监听端口是否冲突; +5. 证书文件和规则资源是否可访问; +6. 激活后的服务、控制接口和 Connector 是否健康。 + +协议服务保存成功不代表发布成功。依赖托管用户能力时,还要确认节点实际内核版本满足最低要求,并完成一次成功发布。 + +## 协议配置校验失败 + +VLESS/VMess 常见原因: + +- 服务端和客户端选择了不同传输; +- WebSocket 路径没有以 `/` 开头; +- 两端 WebSocket 路径或请求头不同; +- 两端 gRPC Service Name 不同; +- 同时配置 WebSocket 和 gRPC; +- VLESS REALITY 使用了非 TCP 传输; +- VMess 缺少要求的 TLS 配置。 + +Trojan/Hysteria2 托管订阅用户需要 Zero `0.0.15-rc.3` 或更高版本;Mieru 用户归属需要 `0.0.15-rc.4` 或更高版本。详细说明见[协议服务配置](./protocol-services)。 + +## 订阅配置异常 + +确认: + +- 节点服务最近一次发布成功; +- 订阅令牌未撤销,用户和订阅状态有效; +- 订阅模板、节点组成员和策略组引用正确; +- `mixed_port` 在 `1–65535` 范围内且未被占用; +- 客户端使用正确的模板或 User-Agent; +- ZNet Sink/native 响应按 Base64 文本解码; +- HTTP 响应不是无效令牌触发的 302 伪装跳转。 + +Base64 不是加密。不要把完整订阅 URL、令牌或解码后的凭据放进公开日志。 + +## 流量已上报但剩余额度看起来不变 + +先区分计算和显示: + +- 数据库和 API 使用精确字节; +- 管理端会自动显示 B、KB、MB 或 GB; +- 小于 1 MiB 的记录不应再显示成固定的 `0 MiB`; +- 剩余流量等于套餐额度减去计费后的已用流量。 + +检查原始流量字节、协议服务倍率、订阅累计已用值和套餐额度。客户端本地测速成功但节点没有归属到该用户的 `flow.completed` 时,不会产生面板计费记录。 + +## DNS 更新或删除失败 + +- 检查 Cloudflare Token 的 Zone 和 DNS 编辑权限; +- 确认记录保存的 Zone/record ID 与远端一致; +- revision 冲突时刷新后重试; +- 同步任务运行期间不要并发删除; +- 远端 404 会按已删除处理,其他供应商错误会保留本地记录。 + +更改供应商账号、完整域名或记录类型需要删除后重建。 + +## HTTP-01 证书 unauthorized + +依次检查: + +1. A/AAAA 是否指向目标节点; +2. 公网 80 端口是否可达; +3. `/.well-known/acme-challenge/` 是否映射到配置的 Webroot; +4. HTTP/HTTPS 重定向后是否仍返回相同测试 token; +5. CDN、反向代理、应用路由或缓存是否改写内容。 + +Zboard 会先写入临时 token 并从域名请求验证。预检失败时先修复 Webroot 映射,不要直接重复申请。 + +## DNS-01 缺少 Certbot Cloudflare 插件 + +自动任务会依次尝试: + +1. 系统 `python3-certbot-dns-cloudflare` 包; +2. `/opt/zboard-certbot` Python venv; +3. `/opt/zboard-certbot-packages` pip target 和 wrapper。 + +出现 `Unable to locate package python3-certbot-dns-cloudflare` 或 `python3-venv has no installation candidate` 时,继续查看后续回退日志。全部失败才需要人工修复 Python、pip/venv、软件源、外网访问或磁盘空间。 + +## 证书无法编辑或绑定 + +- 签发或续期运行中不能编辑; +- revision 冲突时刷新页面; +- 节点、域名、环境和 challenge 类型属于不可变身份,需要新建证书; +- 绑定时确认证书属于同一节点、覆盖协议域名且状态可用。 + +详细流程见[DNS 与证书管理](./dns-and-certificates)。 diff --git a/docs/projects/zboard/index.md b/docs/projects/zboard/index.md new file mode 100644 index 0000000..18046f6 --- /dev/null +++ b/docs/projects/zboard/index.md @@ -0,0 +1,40 @@ +# Zboard + + + +Zboard 是代理服务运营管理平台,用于管理 VPS、协议服务、节点组、商品、订单、订阅、配置交付、流量、DNS 和证书。 + +## 开始使用 + +1. 阅读[部署指南](./guides/installation)。 +2. 完成[首次初始化](./guides/first-setup)。 +3. 接入基础设施并配置[节点与协议服务](./guides/node-management)。 +4. 根据客户端和商业模型配置[订阅交付与流量](./guides/subscriptions-and-traffic)。 +5. 需要自动维护域名和 TLS 时配置[DNS 与证书](./guides/dns-and-certificates)。 + +## 核心能力 + +- 管理 VPS 资产、供应商账号、SSH 凭证和节点生命周期; +- 管理 VLESS、VMess、Shadowsocks、Trojan、Hysteria2、Mieru 等协议服务; +- 为 VLESS/VMess 配置 TCP、WebSocket、gRPC 和受支持的 TLS/REALITY 组合; +- 生成面向 ZNet Sink、Clash/Mihomo、sing-box 的可直接运行订阅配置; +- 管理用户、套餐、订单、订阅、流量额度和计费倍率; +- 管理 Cloudflare DNS 记录以及 HTTP-01、DNS-01 证书签发与续期; +- 接收节点运行事件并进行运营审计。 + +```text +节点资产 → 协议服务 → 节点组 → 套餐 / SKU → 订单 → 订阅 + ↘ DNS 记录 / 托管证书 ↗ +``` + +协议服务配置、节点实际发布状态和订阅交付状态分别记录。节点完成配置验证、激活、健康检查和事件接入后,相关订阅配置才进入交付流程。 + +## 文档入口 + +- [用户指南](./guides/) +- [部署指南](./guides/installation) +- [节点与协议服务管理](./guides/node-management) +- [协议服务配置](./guides/protocol-services) +- [订阅交付与流量展示](./guides/subscriptions-and-traffic) +- [DNS 与证书管理](./guides/dns-and-certificates) +- [参与 Zboard](./contributing/) diff --git a/docs/projects/znet-sink/guides/data-and-diagnostics.md b/docs/projects/znet-sink/guides/data-and-diagnostics.md index dced3ca..4fa30b1 100644 --- a/docs/projects/znet-sink/guides/data-and-diagnostics.md +++ b/docs/projects/znet-sink/guides/data-and-diagnostics.md @@ -1,19 +1,50 @@ # 数据与诊断 -ZNet Sink 将应用设置、代理配置、订阅、规则和运行记录保存在本地数据目录。 +ZNet Sink 将应用设置、代理配置、订阅、规则和运行记录保存在本地数据目录。连接页面以实时 IPC 事件为主要数据源,并在客户端维护有界历史,不把内核查询结果当作长期数据库。 ## 查看实际路径 不同系统和安装方式的目录不同,不应依赖文档中的固定路径。打开“设置 → 通用”或“设置 → 关于”,使用界面提供的打开、定位操作查看当前实例实际使用的目录。 +## 实时连接 + +专业模式的连接页面会先用内核快照建立活动连接基线,再合并后续生命周期事件。实时列表支持暂停刷新、筛选、查看详情和终止连接等操作。 + +连接记录会保留内核返回的结构化字段与原始 wire 元数据。后台协调只用于修复遗漏状态,不应持续制造可见日志,也不会用轮询结果覆盖更新的事件状态。 + +## 历史连接 + +连接完成后,客户端把完成事实写入独立的本地历史存储: + +- 历史与活动连接分开保存,内核重启后仍可查看已落盘记录; +- 页面使用无限滚动按需读取,而不是一次加载全部记录; +- 筛选条件在历史存储查询前生效,切换筛选时会重置游标; +- 存储具有数量和时间边界,会按墙上时间清理过旧记录; +- 同一 flow 标识被复用时,仍按完成事件和生命周期顺序保留正确记录。 + +本地历史用于诊断和界面展示,不是服务端计费或审计事实来源。 + +## 详情与原始帧 + +点击连接可打开统一的详情对话框,查看: + +- 连接时间、生命周期、路由、出站和流量字段; +- 内核原始记录中提供的查询 ID、revision、来源等元数据; +- 与该连接关联的 IPC 请求、响应和事件帧; +- 可直接复制的结构化详情和原始诊断报文。 + +详情对话框在实时更新时会保持当前标签和选中记录,内容区独立滚动,避免页面、弹窗和代码块形成多重滚动。 + +原始帧可能包含地址、域名、标签和错误上下文。复制或公开前必须检查敏感信息。 + ## 日志与调试 -专业模式提供: +专业模式还提供: - 应用日志和内核日志; -- 实时连接与本地连接记录; -- IPC 调试帧; -- 内核能力和运行状态。 +- 节点测速的原始 IPC 诊断; +- 内核能力和运行状态; +- 连接与策略事件的原始帧。 日志页用于日常筛选和复制;调试页更接近原始控制面数据,不应把其中未经检查的内容直接公开。 @@ -27,6 +58,8 @@ ZNet Sink 将应用设置、代理配置、订阅、规则和运行记录保存 诊断包仍可能包含本机路径、版本、时间和网络错误上下文。发送给第三方前请再次检查。 -## 清理日志 +## 清理日志与历史 清理日志不会删除代理配置、订阅、规则、应用设置或内核文件。应用或内核继续运行时会按需生成新的日志。 + +清理连接历史只删除客户端保存的诊断记录,不会修改内核当前连接,也不会回滚 Zboard 已接收的流量事实。 diff --git a/docs/projects/znet-sink/guides/features.md b/docs/projects/znet-sink/guides/features.md index b877cb8..a6a6c3d 100644 --- a/docs/projects/znet-sink/guides/features.md +++ b/docs/projects/znet-sink/guides/features.md @@ -7,13 +7,16 @@ - 从本地文件导入配置,或直接粘贴 JSON 创建配置; - 将一份配置设为当前配置,并在连接前完成客户端自检; - 开启或关闭系统代理,查看当前连接状态和阻塞原因; -- TUN 与系统代理作为两个独立入口管理。 +- TUN 与系统代理作为两个独立入口管理; +- 为订阅配置准备可直接使用的本地 Mixed 入口,默认端口为 `7890`。 -第一次使用可按[安装与首次启动](./installation)和[完成第一次连接](./first-connection)顺序操作。 +第一次使用可按[安装与首次启动](./installation)和[完成第一次连接](./first-connection)顺序操作。本地入口、Windows 系统代理和代理终端的具体语义见[本地代理、系统代理与节点测速](./proxy-and-probes)。 ## 订阅管理 -客户端可以保存远程订阅、手动同步或按周期更新,并将支持的订阅内容转换为本地配置。当前支持的格式和转换边界见[订阅管理](./subscriptions)。 +客户端可以保存远程订阅、手动同步或按周期更新,并将支持的订阅内容转换为本地配置。原生 Zero 内容会优先按原生字段处理;转换和迁移时会保留当前支持的协议字段,并确保订阅配置包含可用的本地代理入口。 + +当前支持的格式和转换边界见[订阅管理](./subscriptions)。 订阅地址可能包含凭据。客户端文档、截图和问题反馈中都不应公开完整地址。 @@ -21,6 +24,15 @@ 连接服务运行后,可以查看节点和策略组状态、切换策略组选中项,并在全局、规则和直连模式之间切换。实际可选项由当前配置和客户端显示的运行能力决定。 +节点页会处理单节点探测、URLTest 策略快照、嵌套策略组和配置隔离的延迟历史。切换配置后,同名节点不会直接继承上一份配置的历史;大量节点的策略测速会使用自适应等待时间。 + +## 桌面代理集成 + +- Windows 系统代理使用当前 Mixed 地址,并保存接管前的原始代理和绕过设置; +- 托盘可以复制代理环境变量; +- Windows 托盘可以打开已注入 HTTP、HTTPS、SOCKS5 和 NO_PROXY 变量的新终端; +- 代理终端的变量只作用于该终端和子进程。 + ## 界面模式 - **简约模式**:保留概览、配置、订阅和设置,适合安装后直接连接和日常切换; @@ -32,8 +44,10 @@ “设置 → 内核”用于安装、选择和查看客户端所需的内核组件。版本管理会区分稳定版、测试版和每日构建;日常使用优先选择稳定版。 +协议、传输、URLTest 和控制接口能力以当前内核返回的能力信息为准。客户端升级不代表已选择的内核也自动升级。 + ## 日志与诊断 客户端可以查看应用日志、内核日志、能力信息和运行状态,并导出诊断资料。导出前仍应复核是否包含私人信息,具体范围见[数据与诊断](./data-and-diagnostics)。 -出现启动、连接、订阅或系统代理问题时,按[故障排查](./troubleshooting)逐项检查。 +出现启动、连接、订阅、系统代理或测速问题时,按[故障排查](./troubleshooting)逐项检查。 diff --git a/docs/projects/znet-sink/guides/index.md b/docs/projects/znet-sink/guides/index.md index d44b7bf..6166125 100644 --- a/docs/projects/znet-sink/guides/index.md +++ b/docs/projects/znet-sink/guides/index.md @@ -5,7 +5,9 @@ 1. [安装与首次启动](./installation) 2. [完成第一次连接](./first-connection) 3. [订阅管理](./subscriptions) -4. [数据与诊断](./data-and-diagnostics) -5. [故障排查](./troubleshooting) +4. [本地代理、系统代理与节点测速](./proxy-and-probes) +5. [功能总览](./features) +6. [数据与诊断](./data-and-diagnostics) +7. [故障排查](./troubleshooting) -这些页面只描述 ZNet Sink 的安装、界面和用户操作,不扩展到其他项目的配置或开发接口。 +这些页面描述 ZNet Sink 的安装、界面和用户操作。涉及内核字段和协议能力时,以当前 Zero Core 文档及客户端显示的能力信息为准。 diff --git a/docs/projects/znet-sink/guides/proxy-and-probes.md b/docs/projects/znet-sink/guides/proxy-and-probes.md new file mode 100644 index 0000000..de16f2e --- /dev/null +++ b/docs/projects/znet-sink/guides/proxy-and-probes.md @@ -0,0 +1,90 @@ +# 本地代理、系统代理与节点测速 + +本页说明 ZNet Sink 如何准备本地代理入口、接管系统代理、打开代理终端,以及如何展示节点和 URLTest 的测速结果。 + +## 本地代理入口 + +订阅同步后,客户端需要一条可供桌面应用连接的本地入站。对于订阅生成的配置,ZNet Sink 按以下规则处理: + +1. 如果配置已经包含完整可用的 `mixed`、`http` 或 `socks5` 本地入站,保留用户配置; +2. 如果本地入站存在但缺少监听地址或端口,补全为客户端管理的 Mixed 入站; +3. 如果配置只有 TUN 或完全没有本地代理入站,添加一个 loopback Mixed 入站; +4. 新生成的受管入口默认使用 `127.0.0.1:7890`。 + +Mixed 入口同时供 HTTP 和 SOCKS5 客户端使用。代理端口可以在“设置 → 常规”中调整;修改后,客户端会同步受管配置和系统代理目标。 + +自定义配置中完整且可用的本地入站不会被强制改成 7890。 + +## 系统代理 + +开启系统代理前,客户端会确认内核正在运行且本地代理端口已经监听。关闭代理或退出客户端时,只恢复 ZNet Sink 接管前保存的系统设置。 + +Windows 上会保存原始 `ProxyServer`、绕过列表和自动配置地址,恢复时不会把原来按协议拆分的代理地址压缩成新的格式。ZNet Sink 自己启用代理时使用 Windows 接受的单一 `主机:端口` 形式,由 Mixed 入站同时处理 HTTP 和 SOCKS5 请求。 + +如果系统代理状态与预期不符,先检查: + +- 当前配置中的本地入站地址和端口; +- 内核是否实际监听该端口; +- 是否存在其他应用同时修改系统代理; +- Windows 的绕过列表或 PAC 是否来自接管前的旧设置。 + +系统代理主要覆盖遵循操作系统 HTTP/HTTPS 代理设置的 TCP 应用。它不等同于 TUN,也不会自动接管所有 UDP、WebRTC 或 DNS 流量。 + +## 打开代理终端 + +Windows 托盘菜单中的“打开终端”会: + +1. 启动或连接当前内核; +2. 等待本地代理端口可用; +3. 打开可见的 PowerShell 终端; +4. 为该终端进程注入代理环境变量。 + +注入值如下: + +| 变量 | 值 | +|------|----| +| `HTTP_PROXY` / `HTTPS_PROXY` | `http://:` | +| `ALL_PROXY` | `socks5h://:` | +| `NO_PROXY` | `localhost,127.0.0.1,::1` | + +客户端同时设置大写和小写变量,以兼容不同命令行工具。该功能只影响新打开的终端及其子进程,不会修改全局用户环境变量。 + +## 节点与 URLTest 测速 + +节点页会把单节点探测、策略组快照和本地历史合并为当前显示结果: + +- URLTest 组使用内核返回的成员快照和当前选中项; +- 当 URLTest 作为另一个组中的节点卡片出现时,单点测速只探测它当前实际生效的出站,不递归重测全部成员; +- 手动等待期间到达的新鲜定时结果也可以完成本次等待; +- 本地先显示的超时可以被随后到达的有效结果替换; +- 嵌套 URLTest 卡片使用自身策略组的历史,不沿用父组的旧值; +- 批量测速会去重父组中已经由 URLTest 负责探测的成员; +- 进度数字按本次实际目标数量计算,不再把策略组展开数量误当作单点目标; +- 即使批量完成事件丢失,全部成员的终态或看门狗超时也会清除加载状态。 + +策略组等待时间会根据成员数量调整,并设置上限。大量节点不应使用固定的短超时判断失败。探测失败会归一化为可读错误,同时保留原始 IPC 请求、响应和错误供复制排查。 + +Windows 不稳定支持区域旗帜 emoji,因此节点卡片使用旗帜图片渲染已识别国家/地区,避免显示为字母或方框。 + +## 历史记录的作用域 + +延迟历史同时绑定: + +- 当前配置; +- 配置中的节点和策略组结构; +- 被探测的节点或策略 tag。 + +切换配置后,不会把同名节点或 URLTest 组在上一份配置中的历史直接合并到新配置。配置首次加载过程中产生的临时作用域会在身份稳定后迁移,避免悬浮历史消失。 + +## 排查顺序 + +测速结果长时间不更新时: + +1. 确认当前配置和内核运行状态一致; +2. 检查应用日志中的 `probe`、`policy.probe.completed` 和超时记录; +3. 在诊断详情中复制对应的 `policies.probe`、`diagnostics.probe_outbound` 或查询帧; +4. 确认切换配置后页面已加载新的策略快照; +5. 避免连续点击父组、子 URLTest 和全部成员; +6. 等待一次完整批次结束后再重试。 + +本地代理无法使用时,先在“设置 → 常规”确认代理端口,再检查[故障排查](./troubleshooting)。 diff --git a/docs/projects/znet-sink/guides/subscriptions.md b/docs/projects/znet-sink/guides/subscriptions.md index 44f439e..762095c 100644 --- a/docs/projects/znet-sink/guides/subscriptions.md +++ b/docs/projects/znet-sink/guides/subscriptions.md @@ -4,13 +4,18 @@ ## 支持的格式 -当前支持: +编辑器使用三个规范选项: -- Zero JSON -- Zero Base64 JSON -- Clash YAML -- Clash Base64 YAML -- 自动检测上述格式 +- `自动检测` +- `Zero` +- `Clash` + +其中: + +- `Zero` 只接受 **Base64 编码的 Zero JSON**; +- 明文 Zero JSON 不再属于外部订阅格式,即使选择自动检测也会明确拒绝; +- `Clash` 可以识别当前支持的 YAML 或 Base64 YAML 表示; +- `zero-base64-json`、`base64-json`、`znet-sink`、`clash-yaml` 等历史名称会在本地归一化,不再作为界面中的独立格式。 Clash 内容会转换为 Zero 配置。转换能力不等同于完整兼容所有 Clash 扩展字段;同步完成后仍应检查生成的节点、策略组和规则。 @@ -22,7 +27,30 @@ Clash 内容会转换为 Zero 配置。转换能力不等同于完整兼容所 4. 根据需要选择手动更新或 30 分钟、1 小时、6 小时、12 小时、24 小时的更新周期。 5. 保存并执行同步。 -同步成功后,订阅会创建或更新一份本地代理配置。新生成的配置不会无条件抢占当前配置;需要时请在“配置”页确认并启用。 +“自动检测”会作为真实源格式保存,不会根据当前本地生成配置被强制改写为 Zero 或 Clash。同步成功后,订阅会创建或更新一份本地代理配置;新生成的配置不会无条件抢占当前配置,需要时请在“配置”页确认并启用。 + +## User-Agent + +User-Agent 留空时,客户端发送: + +```text +ZNet-Sink/<当前版本> +``` + +例如 `ZNet-Sink/0.0.16-rc.7`。填写自定义值后,该值会**完全覆盖**默认 User-Agent,不会在末尾追加 ZNet-Sink 标识。 + +Zboard 的公开订阅接口要求严格的 `ZNet-Sink/<版本>` 格式。使用 Zboard 链接时通常应保持留空;只有其他订阅服务明确要求特定 User-Agent 时才覆盖。历史版本曾在自定义值末尾追加客户端标识,现有记录会在迁移时清理该旧格式。 + +## 本地代理入口 + +订阅配置需要包含可供桌面应用连接的本地入站。同步时 ZNet Sink 会: + +- 保留完整可用的自定义 `mixed`、`http` 或 `socks5` 入站; +- 补全不完整的本地代理入站; +- 对只有 TUN 或没有本地入站的配置添加受管 Mixed 入站; +- 新建受管入口时默认使用 `127.0.0.1:7890`。 + +受管入口的端口可以在“设置 → 常规”中修改。完整行为见[本地代理、系统代理与节点测速](./proxy-and-probes)。 ## 同步语义 @@ -30,6 +58,15 @@ Clash 内容会转换为 Zero 配置。转换能力不等同于完整兼容所 - 手动同步会立即拉取远端内容。 - 同步失败会保留错误信息,原有可用配置不会因为一次网络失败被当作成功结果覆盖。 - Clash `rule-providers` 和引用它们的规则会按客户端当前支持边界转换为本地规则集。 +- Zero 配置中的当前支持字段会尽量保留,包括 Mieru 等协议的原生字段。 +- 旧版本生成的订阅配置会在同步时串行迁移,避免同一记录被多个更新任务同时改写。 +- 曾被旧逻辑从 `auto` 强制保存为明文 `zero-json`、且没有自定义 User-Agent 的记录,会迁回真实的自动检测语义。 + +## Base64 响应 + +Zero 订阅必须以 Base64 文本返回。Base64 不是加密;解码后仍可能包含节点地址和订阅凭据。 + +如果同步得到网页、跳转页、明文 Zero JSON 或其他非订阅内容,自动检测会失败。此时检查 HTTP 状态、最终 URL、User-Agent、订阅令牌和服务端输出格式,而不是反复切换旧的 JSON/YAML 别名。 ## 安全提示 diff --git a/docs/projects/znet-sink/guides/troubleshooting.md b/docs/projects/znet-sink/guides/troubleshooting.md index ab313d0..e160c1c 100644 --- a/docs/projects/znet-sink/guides/troubleshooting.md +++ b/docs/projects/znet-sink/guides/troubleshooting.md @@ -9,6 +9,8 @@ 3. 配置是否包含可用的本地入站和出站; 4. 本地监听端口是否被其他程序占用。 +订阅配置没有本地入站时,客户端通常会补建受管 Mixed 入口。仍提示缺少入口时,检查配置是否包含格式错误的 `inbounds` 数组,或当前代理端口是否超出 `1–65535`。 + ## 内核启动后仍无法连接 客户端会等待内核健康检查和本地代理端口。如果这里失败: @@ -24,19 +26,39 @@ - 确认概览中的系统代理状态为“已开启”; - 检查目标应用是否自行覆盖系统代理; -- 检查当前本地代理地址、端口与内核实际监听是否一致; -- 如果使用 TUN,确认 TUN 状态和系统权限,不要把 TUN 与系统代理状态混为一谈。 +- 检查“设置 → 常规”的代理端口与内核实际 Mixed 监听是否一致; +- 如果使用 TUN,确认 TUN 状态和系统权限,不要把 TUN 与系统代理状态混为一谈; +- Windows 上检查是否有其他程序同时修改 `ProxyServer`、绕过列表或 PAC。 + +可以从托盘打开代理终端,用 `curl` 或包管理器验证注入的 HTTP/SOCKS5 环境变量。该终端可用而其他应用不可用时,问题通常在应用自身的代理设置。 ## 订阅同步失败 - 检查 URL 是否仍然有效; - 检查网络是否允许访问订阅服务; - 将格式切换为明确的 Zero JSON、Zero Base64 JSON、Clash YAML 或 Clash Base64 YAML; -- 查看错误是否来自下载、Base64 解码、YAML/JSON 解析还是 Clash 转换。 +- 查看错误是否来自下载、重定向、Base64 解码、YAML/JSON 解析还是 Clash 转换; +- 如果响应最终跳转到普通网页,检查服务端令牌和订阅模板,不要把网页强制按 Base64 解析。 + +一次同步失败不会覆盖原有可用配置。 ## 节点或测速状态没有更新 -节点选择和测速结果通过运行时事件更新。先确认事件连接正常,再检查 `policy.probe.completed` 是否到达。不要用重复点击或轮询代替事件链路排查。 +节点选择和测速结果通过运行时事件和策略快照更新。先确认事件连接正常,再检查 `policy.probe.completed` 是否到达。 + +还应确认: + +- 当前页面显示的配置与内核活动配置一致; +- 切换配置后没有继续等待旧配置的测速; +- 父 selector 中的 URLTest 没有同时被展开为全部成员重复测速; +- 成员较多时已经等待自适应超时窗口; +- 超时后到达的新鲜结果是否更新了卡片和悬浮历史。 + +不要用连续点击或高频轮询代替事件链路排查。完整语义见[本地代理、系统代理与节点测速](./proxy-and-probes)。 + +## 打开终端没有反应 + +Windows 托盘终端依赖 `pwsh.exe` 或 `powershell.exe`。检查应用日志中的 `tray: open terminal`、内核启动、本地代理监听和进程创建记录。终端只有在本地代理端口可用后才会打开。 ## 仍无法定位 @@ -45,5 +67,6 @@ - ZNet Sink 版本; - 内核版本; - 操作系统与架构; +- 当前配置名称以及是否刚发生过配置切换; - 可以稳定复现的步骤; - 首次出现的错误,而不是只截取最后一条连带错误。 diff --git a/docs/projects/znet-sink/index.md b/docs/projects/znet-sink/index.md index 789bc25..fba9d71 100644 --- a/docs/projects/znet-sink/index.md +++ b/docs/projects/znet-sink/index.md @@ -2,7 +2,7 @@ -ZNet Sink 是面向桌面用户的跨平台代理客户端。文档以完成日常使用任务为主,不要求用户先理解内核协议或控制接口。 +ZNet Sink 是跨平台代理客户端,提供配置与订阅管理、节点选择、系统代理、连接状态和诊断。默认集成 Zero Core,并可通过适配接入其他运行时。 ## 第一次使用 diff --git a/docs/solutions/index.md b/docs/solutions/index.md new file mode 100644 index 0000000..4115f26 --- /dev/null +++ b/docs/solutions/index.md @@ -0,0 +1,48 @@ +# 使用场景 + +## 桌面代理 + +在 Windows、macOS 或 Linux 上使用代理,可以从 [ZNet Sink](/projects/znet-sink/) 开始。 + +ZNet Sink 提供配置与订阅管理、节点选择、系统代理、连接状态和诊断。默认集成 Zero Core,也可以按适配能力接入其他运行时。 + +- [安装 ZNet Sink](/projects/znet-sink/guides/installation) +- [完成第一次连接](/projects/znet-sink/guides/first-connection) +- [功能说明](/projects/znet-sink/guides/features) + +## 运行节点 + +[Zero Core](/projects/core/) 可作为本地网关、边缘节点或服务器运行,提供协议、路由、策略、出站组以及 HTTP、IPC、CLI 等控制接口。 + +- [快速开始](/projects/core/guides/quickstart) +- [配置基础](/projects/core/guides/configuration-basics) +- [协议配置](/projects/core/protocols/) + +## 应用集成 + +应用、GUI 或控制服务可以通过 Zero Core 的 HTTP、IPC、CLI 等控制接口管理运行时。 + +- [控制接口总览](/projects/core/control-plane/) +- [GUI 接入](/projects/core/guides/gui-integration) +- [Connector Webhook](/projects/core/guides/connector-integration) + +## 服务运营 + +[Zboard](/projects/zboard/) 用于管理 VPS、协议服务、节点组、商品、订单、订阅、配置交付和流量。 + +Zboard 可以管理 Zero Core 节点,也可以通过适配接入外部节点或运行时。Zboard 当前处于预览阶段。 + +- [部署 Zboard](/projects/zboard/guides/installation) +- [节点与协议服务管理](/projects/zboard/guides/node-management) +- [订阅交付与流量展示](/projects/zboard/guides/subscriptions-and-traffic) + +## 常见组合 + +| 需求 | 入口 | +| --- | --- | +| 桌面代理 | ZNet Sink | +| 自建节点 | Zero Core | +| 自己开发客户端或控制面 | Zero Core 控制接口 | +| 管理节点和订阅业务 | Zboard | +| ZNet Sink 使用 Zero 运行时 | ZNet Sink + Zero Core | +| Zboard 管理 Zero 节点 | Zboard + Zero Core |