From 4f8d6211bb907e26a8139b0b48623487fef1ea4f Mon Sep 17 00:00:00 2001 From: FunMC Date: Mon, 23 Feb 2026 07:51:34 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E5=92=8C=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=88=86=E7=A6=BB=E4=B8=BA?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - server/: 中继服务端 + Web管理面板 + 部署脚本(独立项目) - client/: Electron桌面客户端(独立项目) - web/ 和 deploy/ 移入 server/ 目录 - 各项目独立 README.md 和 .gitignore - 顶层 README 作为项目总览 --- README.md | 244 +++++-------------- client/.gitignore | 4 + client/README.md | 94 +++++++ server/.gitignore | 6 + server/README.md | 116 +++++++++ {deploy => server/deploy}/install.sh | 0 {web => server/web}/index.html | 0 {web => server/web}/package-lock.json | 0 {web => server/web}/package.json | 0 {web => server/web}/postcss.config.js | 0 {web => server/web}/public/vite.svg | 0 {web => server/web}/src/App.tsx | 0 {web => server/web}/src/api.ts | 0 {web => server/web}/src/index.css | 0 {web => server/web}/src/main.tsx | 0 {web => server/web}/src/pages/AddNode.tsx | 0 {web => server/web}/src/pages/CreateRoom.tsx | 0 {web => server/web}/src/pages/Dashboard.tsx | 0 {web => server/web}/src/pages/Nodes.tsx | 0 {web => server/web}/src/pages/Rooms.tsx | 0 {web => server/web}/tailwind.config.js | 0 {web => server/web}/tsconfig.json | 0 {web => server/web}/tsconfig.node.json | 0 {web => server/web}/vite.config.ts | 0 24 files changed, 275 insertions(+), 189 deletions(-) create mode 100644 client/.gitignore create mode 100644 client/README.md create mode 100644 server/.gitignore create mode 100644 server/README.md rename {deploy => server/deploy}/install.sh (100%) rename {web => server/web}/index.html (100%) rename {web => server/web}/package-lock.json (100%) rename {web => server/web}/package.json (100%) rename {web => server/web}/postcss.config.js (100%) rename {web => server/web}/public/vite.svg (100%) rename {web => server/web}/src/App.tsx (100%) rename {web => server/web}/src/api.ts (100%) rename {web => server/web}/src/index.css (100%) rename {web => server/web}/src/main.tsx (100%) rename {web => server/web}/src/pages/AddNode.tsx (100%) rename {web => server/web}/src/pages/CreateRoom.tsx (100%) rename {web => server/web}/src/pages/Dashboard.tsx (100%) rename {web => server/web}/src/pages/Nodes.tsx (100%) rename {web => server/web}/src/pages/Rooms.tsx (100%) rename {web => server/web}/tailwind.config.js (100%) rename {web => server/web}/tsconfig.json (100%) rename {web => server/web}/tsconfig.node.json (100%) rename {web => server/web}/vite.config.ts (100%) diff --git a/README.md b/README.md index ec3af24..d6274a7 100644 --- a/README.md +++ b/README.md @@ -1,205 +1,71 @@ -# FunMC - Minecraft 联机平台 +# FunConnect - Minecraft 联机平台 一个支持多节点中继的 Minecraft 联机平台,让玩家无需公网IP即可轻松联机。 -## 功能特性 - -- **TCP 中继代理** - 自动转发 Minecraft 网络流量,支持 Java 版和基岩版 -- **多节点集群** - 支持添加多台 Ubuntu 中继服务器,自动负载均衡 -- **房间系统** - 创建/加入房间,支持密码保护 -- **Web 管理面板** - 现代化 UI,支持任意平台浏览器访问 -- **实时状态** - WebSocket 实时推送服务器状态 -- **一键部署** - 提供 Ubuntu 自动安装脚本和 systemd 服务 - -## 架构设计 - -``` -┌─────────────────────────────────────────────┐ -│ Web 管理面板 │ -│ (React + TailwindCSS) │ -└──────────────────┬──────────────────────────┘ - │ HTTP/WebSocket -┌──────────────────▼──────────────────────────┐ -│ 主节点 (Master) │ -│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ -│ │ REST API │ │ 房间管理 │ │ 节点管理 │ │ -│ └──────────┘ └──────────┘ └──────────────┘ │ -│ ┌──────────────────────────────────────┐ │ -│ │ TCP 中继引擎 │ │ -│ └──────────────────────────────────────┘ │ -└──────────────────┬──────────────────────────┘ - │ 心跳 + API - ┌─────────────┼─────────────┐ - ▼ ▼ ▼ -┌─────────┐ ┌─────────┐ ┌─────────┐ -│ 工作节点1 │ │ 工作节点2 │ │ 工作节点N │ -│ (Ubuntu) │ │ (Ubuntu) │ │ (Ubuntu) │ -└─────────┘ └─────────┘ └─────────┘ -``` - -## 快速开始 - -### 前置条件 - -- Node.js 18+ -- Ubuntu 20.04+ (中继服务器) - -### 本地开发 - -```bash -# 1. 安装服务端依赖 -cd server -npm install - -# 2. 创建配置文件 -cp .env.example .env -# 编辑 .env 设置 IS_MASTER=true - -# 3. 启动服务端 -npm run dev - -# 4. 安装 Web 客户端依赖 -cd ../web -npm install - -# 5. 启动 Web 客户端 -npm run dev -``` - -访问 http://localhost:5173 打开管理面板。 - -### Ubuntu 服务器部署 - -#### 部署主节点 - -```bash -# 上传项目文件到服务器后 -sudo bash deploy/install.sh master relay-master -``` - -#### 部署工作节点 - -```bash -sudo bash deploy/install.sh worker relay-node-2 -# 按提示输入主节点 URL -``` - -### 添加新节点 - -1. 在新的 Ubuntu 服务器上部署工作节点 -2. 在 Web 管理面板「节点管理」→「添加节点」中注册 -3. 节点会自动加入集群并接收心跳检查 - -## 使用流程 - -### 房主(开服方) - -1. 启动本地 Minecraft 服务器(或开启局域网模式) -2. 在 Web 面板创建房间,记录房间号 -3. 运行 FunMC 客户端连接中继服务器,注册为房主 -4. 将房间号分享给好友 - -### 玩家(加入方) - -1. 获取房间号 -2. 在 Minecraft 中添加服务器,地址填写 `中继服务器IP:25565` -3. 使用 FunMC 客户端连接中继服务器,输入房间号加入 - -## 桌面客户端 - -FunConnect 桌面客户端基于 Electron 构建,提供图形化界面连接中继服务器。 - -### 功能 -- **连接服务器** - 输入中继服务器地址一键连接 -- **浏览房间** - 查看所有在线联机房间 -- **创建房间** - 将本地MC服务器共享给好友 -- **加入房间** - 输入房间号,自动建立本地代理,MC中添加 `127.0.0.1:25566` 即可联机 -- **自定义窗口** - 无边框设计,现代化MC风格UI - -### 运行客户端 - -```bash -cd client -npm install -npm run dev -``` - -### 打包客户端 - -```bash -cd client -npm run dist -# 输出到 client/release/ 目录 -``` +本仓库包含 **两个独立项目**,可分别独立开发、部署和运行。 ## 项目结构 ``` FunConnect/ -├── server/ # 中继服务端 -│ ├── src/ -│ │ ├── index.ts # 主入口 -│ │ ├── config.ts # 配置管理 -│ │ ├── logger.ts # 日志系统 -│ │ ├── relay.ts # TCP 中继引擎 -│ │ ├── room.ts # 房间管理 -│ │ ├── node-manager.ts # 多节点管理 -│ │ ├── api.ts # REST API 路由 -│ │ └── websocket.ts # WebSocket 实时通信 -│ ├── .env.example # 配置示例 -│ ├── package.json -│ └── tsconfig.json -├── web/ # Web 管理面板 -│ ├── src/ -│ │ ├── main.tsx # 入口 -│ │ ├── App.tsx # 路由和布局 -│ │ ├── api.ts # API 客户端 -│ │ ├── index.css # TailwindCSS 样式 -│ │ └── pages/ -│ │ ├── Dashboard.tsx # 仪表盘 -│ │ ├── Rooms.tsx # 房间列表 -│ │ ├── CreateRoom.tsx # 创建房间 -│ │ ├── Nodes.tsx # 节点管理 -│ │ └── AddNode.tsx # 添加节点 -│ ├── package.json -│ └── vite.config.ts -├── client/ # Electron 桌面客户端 -│ ├── src/main/ -│ │ ├── index.ts # Electron 主进程 -│ │ ├── preload.ts # 预加载脚本 -│ │ ├── api-client.ts # API 客户端 -│ │ ├── relay-client.ts # TCP 中继连接 -│ │ └── local-proxy.ts # 本地代理服务器 -│ ├── renderer/ -│ │ ├── index.html # 客户端界面 -│ │ ├── style.css # 样式 -│ │ └── app.js # 交互逻辑 -│ └── package.json -├── deploy/ -│ └── install.sh # Ubuntu 一键部署脚本 -└── README.md +├── server/ # 服务端(中继服务器 + Web 管理面板 + 部署脚本) +└── client/ # 客户端(Electron 桌面应用) ``` -## API 文档 +## 服务端 (`server/`) -| 方法 | 路径 | 说明 | -|------|------|------| -| GET | `/api/health` | 健康检查 | -| GET | `/api/stats` | 服务器统计 | -| GET | `/api/rooms` | 房间列表 | -| POST | `/api/rooms` | 创建房间 | -| DELETE | `/api/rooms/:id` | 删除房间 | -| GET | `/api/nodes` | 节点列表(主节点) | -| POST | `/api/nodes/register` | 注册节点(主节点) | -| DELETE | `/api/nodes/:id` | 移除节点(主节点) | -| GET | `/api/nodes/best` | 获取最佳节点(主节点) | -| GET | `/api/cluster/rooms` | 集群房间列表(主节点) | +中继服务器 + Web 管理面板,部署在 Ubuntu 服务器上。 -## 技术栈 +- **TCP 中继引擎** - 转发 Minecraft 流量,支持 Java 版和基岩版 +- **多节点集群** - 主节点 + 工作节点架构,水平扩展 +- **房间系统** - 创建/加入/密码保护/过期清理 +- **流量监控** - 实时统计各房间流量 +- **Token 认证** - 保护写操作 API +- **Web 管理面板** - React + TailwindCSS 可视化管理 +- **一键部署** - Ubuntu 自动安装脚本 + systemd 服务 -- **服务端**: Node.js, TypeScript, Express, WebSocket -- **Web 面板**: React 18, Vite, TailwindCSS, Lucide Icons -- **部署**: Ubuntu, systemd, Bash +```bash +cd server +npm install +cp .env.example .env +npm run dev +``` + +详细文档见 [server/README.md](server/README.md) + +## 客户端 (`client/`) + +Electron 跨平台桌面客户端,支持 Windows / macOS / Linux。 + +- **连接服务器** - 输入中继地址一键连接 +- **房间管理** - 浏览/创建/加入联机房间 +- **本地代理** - 自动建立本地代理,MC 添加 `127.0.0.1:25566` 即可联机 +- **设置持久化** - 记住服务器地址、玩家名等偏好 +- **系统托盘** - 最小化到托盘后台运行 + +```bash +cd client +npm install +npm run dev +``` + +详细文档见 [client/README.md](client/README.md) + +## 架构 + +``` +┌───────────────┐ ┌──────────────────────────┐ +│ FunConnect │ TCP │ 中继服务器 (Ubuntu) │ +│ 桌面客户端 │◄─────►│ server/ 项目独立部署 │ +│ client/ │ │ ┌─────────┐ ┌──────────┐ │ +└───────────────┘ │ │ TCP中继 │ │ REST API │ │ + │ └─────────┘ └──────────┘ │ +┌───────────────┐ │ ┌──────────────────────┐ │ +│ Minecraft │ TCP │ │ Web 管理面板 │ │ +│ 游戏客户端 │◄─────►│ │ (React + Vite) │ │ +└───────────────┘ │ └──────────────────────┘ │ + └──────────────────────────┘ +``` ## License diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..5fa3220 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +dist/ +release/ +*.log diff --git a/client/README.md b/client/README.md new file mode 100644 index 0000000..994301f --- /dev/null +++ b/client/README.md @@ -0,0 +1,94 @@ +# FunConnect Client + +Minecraft 联机桌面客户端,基于 Electron 构建,支持 Windows / macOS / Linux。 + +## 功能 + +- **连接服务器** - 输入中继服务器地址一键连接 +- **浏览房间** - 查看所有在线联机房间 +- **创建房间** - 将本地 MC 服务器共享给好友 +- **加入房间** - 输入房间号,自动建立本地代理 +- **设置持久化** - 记住服务器地址、玩家名、端口等偏好 +- **系统托盘** - 最小化到托盘,后台运行 +- **自动重连** - 连接断开后自动尝试重新连接 + +## 快速开始 + +### 安装依赖 + +```bash +npm install +``` + +> 如果 Electron 下载慢,使用国内镜像: +> ```bash +> ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm install +> ``` + +### 开发模式 + +```bash +npm run dev +``` + +### 打包发布 + +```bash +npm run dist +# 输出到 release/ 目录 +``` + +## 使用方法 + +### 房主(创建房间) + +1. 启动客户端,输入中继服务器地址并连接 +2. 进入「创建房间」页面 +3. 填写房间名称、本地MC端口(默认25565)、游戏版本等信息 +4. 点击「创建房间」,获得房间号 +5. 将房间号分享给好友 + +### 玩家(加入房间) + +1. 启动客户端,输入中继服务器地址并连接 +2. 进入「加入房间」或在「房间列表」中点击加入 +3. 输入房间号和中继服务器地址 +4. 连接成功后,在 Minecraft 中添加服务器 `127.0.0.1:25566` +5. 开始联机! + +## 项目结构 + +``` +client/ +├── src/main/ +│ ├── index.ts # Electron 主进程 +│ ├── preload.ts # 预加载脚本(IPC桥接) +│ ├── api-client.ts # REST API 客户端 +│ ├── relay-client.ts # TCP 中继连接 +│ └── local-proxy.ts # 本地代理服务器 +├── renderer/ +│ ├── index.html # 客户端界面 +│ ├── style.css # 样式 +│ └── app.js # 交互逻辑 +├── package.json +└── tsconfig.json +``` + +## 配置说明 + +设置页面中可配置: + +| 设置项 | 默认值 | 说明 | +|--------|--------|------| +| 玩家名称 | Player | 在房间中显示的名字 | +| 本地端口 | 25566 | MC连接的本地代理端口 | +| 自动重连 | 开启 | 连接断开后自动重连 | +| 最小化到托盘 | 开启 | 关闭窗口时隐藏到系统托盘 | + +## 技术栈 + +- **Electron 28** - 跨平台桌面框架 +- **TypeScript** - 主进程开发 +- **electron-store** - 设置持久化 +- **Axios** - HTTP 请求 +- **electron-builder** - 打包发布 diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..1da3fcd --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +.env +*.log +web/node_modules/ +web/dist/ diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..fe83394 --- /dev/null +++ b/server/README.md @@ -0,0 +1,116 @@ +# FunConnect Server + +Minecraft 联机中继服务端,包含 TCP 中继引擎、REST API、WebSocket 实时通信、Web 管理面板。 + +## 功能 + +- **TCP 中继引擎** - 转发 Minecraft 客户端与服务端之间的流量 +- **多节点集群** - 支持主节点 + 工作节点架构,水平扩展 +- **房间管理** - 创建、加入、密码验证、过期清理 +- **玩家管理** - 玩家列表、踢出玩家 +- **流量监控** - 实时统计各房间流量 +- **Token 认证** - 保护写操作 API +- **Web 管理面板** - React + Vite + TailwindCSS 构建的可视化管理界面 + +## 快速开始 + +### 安装依赖 + +```bash +# 服务端 +npm install + +# Web 管理面板 +cd web && npm install +``` + +### 配置 + +复制 `.env.example` 为 `.env` 并修改: + +```bash +cp .env.example .env +``` + +关键配置项: +- `API_PORT` - HTTP API 端口(默认 3000) +- `RELAY_PORT` - TCP 中继端口(默认 25565) +- `IS_MASTER` - 是否为主节点 +- `SECRET` - API 认证密钥(留空则不启用认证) + +### 启动 + +```bash +# 开发模式 +npm run dev + +# 生产模式 +npm run build +npm start +``` + +### 启动 Web 管理面板 + +```bash +cd web +npm run dev +# 访问 http://localhost:5173 +``` + +### Ubuntu 一键部署 + +```bash +chmod +x deploy/install.sh +sudo ./deploy/install.sh +``` + +## 项目结构 + +``` +server/ +├── src/ +│ ├── index.ts # 主入口 +│ ├── config.ts # 配置管理 +│ ├── logger.ts # 日志系统 +│ ├── relay.ts # TCP 中继引擎 +│ ├── room.ts # 房间管理 +│ ├── node-manager.ts # 多节点管理 +│ ├── api.ts # REST API +│ └── websocket.ts # WebSocket 实时通信 +├── web/ # Web 管理面板 +│ ├── src/ +│ │ ├── App.tsx # 主组件 +│ │ ├── api.ts # API 客户端 +│ │ └── pages/ # 页面组件 +│ └── package.json +├── deploy/ +│ └── install.sh # Ubuntu 部署脚本 +├── .env.example +├── package.json +└── tsconfig.json +``` + +## API 文档 + +| 方法 | 路径 | 说明 | 认证 | +|------|------|------|------| +| GET | `/api/health` | 健康检查 | 否 | +| GET | `/api/stats` | 服务器统计 | 否 | +| GET | `/api/rooms` | 房间列表 | 否 | +| POST | `/api/rooms` | 创建房间 | 是 | +| GET | `/api/rooms/:id` | 房间详情 + 玩家列表 | 否 | +| POST | `/api/rooms/:id/join` | 加入验证(密码校验)| 是 | +| POST | `/api/rooms/:id/kick/:pid` | 踢出玩家 | 是 | +| DELETE | `/api/rooms/:id` | 删除房间 | 是 | +| GET | `/api/traffic` | 流量统计 | 否 | +| GET | `/api/nodes` | 节点列表(主节点)| 否 | +| POST | `/api/nodes/register` | 注册节点 | 是 | +| DELETE | `/api/nodes/:id` | 移除节点 | 是 | + +## 技术栈 + +- **Node.js + TypeScript** +- **Express** - HTTP API +- **ws** - WebSocket +- **Winston** - 日志 +- **React 18 + Vite + TailwindCSS** - Web 管理面板 diff --git a/deploy/install.sh b/server/deploy/install.sh similarity index 100% rename from deploy/install.sh rename to server/deploy/install.sh diff --git a/web/index.html b/server/web/index.html similarity index 100% rename from web/index.html rename to server/web/index.html diff --git a/web/package-lock.json b/server/web/package-lock.json similarity index 100% rename from web/package-lock.json rename to server/web/package-lock.json diff --git a/web/package.json b/server/web/package.json similarity index 100% rename from web/package.json rename to server/web/package.json diff --git a/web/postcss.config.js b/server/web/postcss.config.js similarity index 100% rename from web/postcss.config.js rename to server/web/postcss.config.js diff --git a/web/public/vite.svg b/server/web/public/vite.svg similarity index 100% rename from web/public/vite.svg rename to server/web/public/vite.svg diff --git a/web/src/App.tsx b/server/web/src/App.tsx similarity index 100% rename from web/src/App.tsx rename to server/web/src/App.tsx diff --git a/web/src/api.ts b/server/web/src/api.ts similarity index 100% rename from web/src/api.ts rename to server/web/src/api.ts diff --git a/web/src/index.css b/server/web/src/index.css similarity index 100% rename from web/src/index.css rename to server/web/src/index.css diff --git a/web/src/main.tsx b/server/web/src/main.tsx similarity index 100% rename from web/src/main.tsx rename to server/web/src/main.tsx diff --git a/web/src/pages/AddNode.tsx b/server/web/src/pages/AddNode.tsx similarity index 100% rename from web/src/pages/AddNode.tsx rename to server/web/src/pages/AddNode.tsx diff --git a/web/src/pages/CreateRoom.tsx b/server/web/src/pages/CreateRoom.tsx similarity index 100% rename from web/src/pages/CreateRoom.tsx rename to server/web/src/pages/CreateRoom.tsx diff --git a/web/src/pages/Dashboard.tsx b/server/web/src/pages/Dashboard.tsx similarity index 100% rename from web/src/pages/Dashboard.tsx rename to server/web/src/pages/Dashboard.tsx diff --git a/web/src/pages/Nodes.tsx b/server/web/src/pages/Nodes.tsx similarity index 100% rename from web/src/pages/Nodes.tsx rename to server/web/src/pages/Nodes.tsx diff --git a/web/src/pages/Rooms.tsx b/server/web/src/pages/Rooms.tsx similarity index 100% rename from web/src/pages/Rooms.tsx rename to server/web/src/pages/Rooms.tsx diff --git a/web/tailwind.config.js b/server/web/tailwind.config.js similarity index 100% rename from web/tailwind.config.js rename to server/web/tailwind.config.js diff --git a/web/tsconfig.json b/server/web/tsconfig.json similarity index 100% rename from web/tsconfig.json rename to server/web/tsconfig.json diff --git a/web/tsconfig.node.json b/server/web/tsconfig.node.json similarity index 100% rename from web/tsconfig.node.json rename to server/web/tsconfig.node.json diff --git a/web/vite.config.ts b/server/web/vite.config.ts similarity index 100% rename from web/vite.config.ts rename to server/web/vite.config.ts