From 44d4fca8389450bc5265f9323a3dff8ed0364b3c Mon Sep 17 00:00:00 2001 From: okxlin Date: Wed, 19 Jul 2023 21:45:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0mcsmanager=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mcsmanager-daemon/3.4.0/.env.sample | 3 + apps/mcsmanager-daemon/3.4.0/data.yml | 18 ++ .../3.4.0/docker-compose.yml | 19 ++ apps/mcsmanager-daemon/README.md | 244 ++++++++++++++++++ apps/mcsmanager-daemon/data.yml | 20 ++ apps/mcsmanager-daemon/latest/.env.sample | 3 + apps/mcsmanager-daemon/latest/data.yml | 18 ++ .../latest/docker-compose.yml | 19 ++ apps/mcsmanager-daemon/logo.png | Bin 0 -> 10382 bytes apps/mcsmanager-web/9.9.0/.env.sample | 3 + apps/mcsmanager-web/9.9.0/data.yml | 18 ++ apps/mcsmanager-web/9.9.0/docker-compose.yml | 18 ++ apps/mcsmanager-web/README.md | 244 ++++++++++++++++++ apps/mcsmanager-web/data.yml | 20 ++ apps/mcsmanager-web/latest/.env.sample | 3 + apps/mcsmanager-web/latest/data.yml | 18 ++ apps/mcsmanager-web/latest/docker-compose.yml | 18 ++ apps/mcsmanager-web/logo.png | Bin 0 -> 10382 bytes 18 files changed, 686 insertions(+) create mode 100644 apps/mcsmanager-daemon/3.4.0/.env.sample create mode 100644 apps/mcsmanager-daemon/3.4.0/data.yml create mode 100644 apps/mcsmanager-daemon/3.4.0/docker-compose.yml create mode 100644 apps/mcsmanager-daemon/README.md create mode 100644 apps/mcsmanager-daemon/data.yml create mode 100644 apps/mcsmanager-daemon/latest/.env.sample create mode 100644 apps/mcsmanager-daemon/latest/data.yml create mode 100644 apps/mcsmanager-daemon/latest/docker-compose.yml create mode 100644 apps/mcsmanager-daemon/logo.png create mode 100644 apps/mcsmanager-web/9.9.0/.env.sample create mode 100644 apps/mcsmanager-web/9.9.0/data.yml create mode 100644 apps/mcsmanager-web/9.9.0/docker-compose.yml create mode 100644 apps/mcsmanager-web/README.md create mode 100644 apps/mcsmanager-web/data.yml create mode 100644 apps/mcsmanager-web/latest/.env.sample create mode 100644 apps/mcsmanager-web/latest/data.yml create mode 100644 apps/mcsmanager-web/latest/docker-compose.yml create mode 100644 apps/mcsmanager-web/logo.png diff --git a/apps/mcsmanager-daemon/3.4.0/.env.sample b/apps/mcsmanager-daemon/3.4.0/.env.sample new file mode 100644 index 00000000..775c2932 --- /dev/null +++ b/apps/mcsmanager-daemon/3.4.0/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="mcsmanager-daemon" +PANEL_APP_PORT_HTTP="40057" +DATA_PATH="./data" diff --git a/apps/mcsmanager-daemon/3.4.0/data.yml b/apps/mcsmanager-daemon/3.4.0/data.yml new file mode 100644 index 00000000..646f7f54 --- /dev/null +++ b/apps/mcsmanager-daemon/3.4.0/data.yml @@ -0,0 +1,18 @@ +additionalProperties: + formFields: + - default: 40057 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + diff --git a/apps/mcsmanager-daemon/3.4.0/docker-compose.yml b/apps/mcsmanager-daemon/3.4.0/docker-compose.yml new file mode 100644 index 00000000..3df0e9b8 --- /dev/null +++ b/apps/mcsmanager-daemon/3.4.0/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + mcsm-daemon: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:24444" + volumes: + - "${DATA_PATH}:/opt/mcsmanager/daemon/data" + - /var/run/docker.sock:/var/run/docker.sock + image: alisaqaq/mcsmanager-daemon:3.4.0 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/mcsmanager-daemon/README.md b/apps/mcsmanager-daemon/README.md new file mode 100644 index 00000000..6e39d997 --- /dev/null +++ b/apps/mcsmanager-daemon/README.md @@ -0,0 +1,244 @@ +MCSManagerLogo.png + +
+ +[![Status](https://img.shields.io/badge/npm-v6.14.15-blue.svg)](https://www.npmjs.com/) +[![Status](https://img.shields.io/badge/node-v14.17.6-blue.svg)](https://nodejs.org/en/download/) +[![Status](https://img.shields.io/badge/License-Apache%202.0-red.svg)](https://github.com/MCSManager) + +[官方网站](http://mcsmanager.com/) | [使用文档](https://docs.mcsmanager.com/) | [团队主页](https://github.com/MCSManager) | [面板端项目](https://github.com/MCSManager/MCSManager) | [网页前端项目](https://github.com/MCSManager/UI) | [守护进程项目](https://github.com/MCSManager/Daemon) + + +中文 QQ 群:https://jq.qq.com/?_wv=1027&k=Pgl9ScGw + +中文 TG 群:https://t.me/MCSManager_dev + +爱发电赞助:https://afdian.net/a/mcsmanager + +
+ +## 这是什么? + + +MCSManager 面板(简称:MCSM 面板)是一款开源,分布式,轻量级,快速部署,支持大部分游戏服务端和控制台程序的管理面板 + +
+ +## 软件特性 + +软件在 Minecraft 和其他游戏社区内中已有一定的流行程度,它可以帮助你集中管理多个物理服务器,动态在任何主机上创建游戏服务端,并且提供安全可靠的多用户权限系统,可以很轻松的帮助你管理多个服务器,一直在为 Minecraft,Terraria,Steam 游戏服务器管理员,运维人员和个人开发者提供健康的软件支持。 + + +![截图.png](https://public-link.oss-cn-shenzhen.aliyuncs.com/mcsm_picture/MCSM9.png) + +![Screenshot.png](https://mcsmanager.com/main2.png) + +QQ20221207-174328@2x + + +
+ +## 运行环境 + +控制面板可运行在 Windows 与 Linux 平台,无需数据库与任何系统配置,只需安装 node 环境即可快速运行,属于轻量级的 Minecraft 服务端控制面板。 + +必须 `Node 14.17.0` 以上,无需数据库和更改任何系统配置,开箱即可运行。 + +
+ +## 配置/数据文件 + +配置文件: `data/SystemConfig/config.json` + +用户数据文件:`data/User/*.json` + +远程守护进程配置:`data/RemoteServiceConfig/*.json` + +
+ +## 软件文档 + +地址:[https://docs.mcsmanager.com/](https://docs.mcsmanager.com/) + +
+ +## 安装 + +### Windows + +对于 Windows 系统,**已整合成直接运行版本,下载即可运行**(使用管理员权限运行): + +前往:[https://mcsmanager.com/](https://mcsmanager.com/) + +
+ + +### Linux + +**一行命令快速安装** + +```bash +// 国内用户专用 gitee 加速源 +wget -qO- https://gitee.com/mcsmanager/script/raw/master/setup_cn.sh | bash + +// 或原始源(科学上网) +wget -qO- https://raw.githubusercontent.com/mcsmanager/Script/master/setup.sh | bash +``` + +- 脚本仅适用于 AMD64 架构 Ubuntu/Centos/Debian/Archlinux。 +- 执行完成后,使用 `systemctl start mcsm-{web,daemon}` 即可启动面板服务。 +- 面板代码与运行环境自动安装在 `/opt/mcsmanager/` 目录下。 + +
+ +**Linux 手动安装** + +- 若一键安装不起作用,则可以尝试此步骤手动安装。 + +```bash +# 切换到安装目录。如果不存在,请提前用'mkdir /opt/'创建它。 +cd /opt/ +# 下载运行时环境(Node.js)。如果你已经安装了Node.js 14+,请忽略此步骤。 +wget https://nodejs.org/dist/v14.17.6/node-v14.17.6-linux-x64.tar.gz +# 解压档案 +tar -zxvf node-v14.17.6-linux-x64.tar.gz +# 添加程序到系统环境变量 +ln -s /opt/node-v14.17.6-linux-x64/bin/node /usr/bin/node +ln -s /opt/node-v14.17.6-linux-x64/bin/npm /usr/bin/npm + +# 准备好安装目录 +mkdir /opt/mcsmanager/ +cd /opt/mcsmanager/ + +# 下载MCSManager +wget https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz +tar -zxf mcsmanager_linux_release.tar.gz + +# 安装依赖库 +./install-dependency.sh + +# 请打开两个终端或屏幕 + +# 先启动守护程序 +./start-daemon.sh + +# 启动网络服务(在第二个终端) +./start-web.sh + +# 为网络界面访问http://localhost:23333/ +# 一般来说,网络应用会自动扫描并连接到本地守护进程。 +``` + +- 注意,这种安装方式不会自动注册面板到系统服务(Service),所以必须使用 `screen` 软件来管理。 + +
+ +## 更新版本 + +参考: https://github.com/MCSManager/MCSManager/wiki/Update-MCSManager + +> 如果你不是特别需要新版本的功能,或者不是为了修复安全隐患,那就不建议更新。 + +
+ +## 项目体系 + +整个软件运行需要三个项目的互相配合才可运行,您普通安装的代码是编译再整合后的产物。 + +[**控制面板端**](https://github.com/MCSManager/MCSManager) + +- 角色:控制中心 +- 责任:负责提供网页前端的后端接口,提供 API 接口,用户数据管理和对守护进程进行通信和授权。 + +[**网页前端**](https://github.com/MCSManager/UI) + +- 角色:控制中心的用户交互界面 +- 责任:以网页形式展示数据,发送请求,并且拥有与守护进程通信的能力,此项目最终产物是纯静态文件。 + +[**守护进程**](https://github.com/MCSManager/Daemon) + +- 角色:被控端 +- 责任:控制本地主机的所有实例,真实进程的实际管理者,拥有与任何对象的通信能力。 + +
+ +## 搭建开发环境 + +此段落面向开发人员,普通用户无需关注也无需执行。 + +所有项目全部以开发环境运行后,便可以进行开发与预览,请务必遵循开源协议。 + +**控制面板端(MCSManager)** + +```bash +git clone https://github.com/MCSManager/MCSManager.git +cd MCSManager +npm install +npm run start +# 默认将采用 ts-node 直接执行 Typescript 代码 +# 默认运行在 23333 端口 +``` + +**网页前端(UI)** + +```bash +git clone https://github.com/MCSManager/UI.git +cd UI +npm install +npm run serve +# 访问 http://localhost:8080/ 即可预览界面 +# 所有 API 请求将自动转发到 23333 端口 +``` + +**守护进程(Daemon)** + +```bash +git clone https://github.com/MCSManager/Daemon.git +cd Daemon +npm install +npm run start +# 运行后请在控制面板端连接本守护进程 +# 默认运行在 24444 端口 +``` + +
+ +## 浏览器兼容性 + +- 支持 `Chrome` `Firefox` `Safari` `Opera` 等现代主流浏览器。 +- 已放弃支持 `IE` 浏览器。 + +
+ +## 国际化 + +MCSManager 已支持中文,英文两种语言,已经实现国际化全面覆盖。 + +软件国际化由 [Lazy](https://github.com/LazyCreeper),[KevinLu2000](https://github.com/KevinLu2000),[zijiren233](https://github.com/zijiren233) 和 [Unitwk](https://github.com/unitwk) 共同完成 + +
+ +## 贡献 + +如果你在使用过程中发现任何问题,可以 [提交 Issue](https://github.com/MCSManager/MCSManager/issues/new/choose) 或自行 Fork 修改后提交 Pull Request。 + +代码需要保持现有格式,不得格式化多余代码,具体可[参考这里](https://github.com/MCSManager/MCSManager/issues/544)。 + +
+ +## 问题报告 + +欢迎发现的任何问题进行反馈,必当及时修复。 + +若发现严重安全漏洞又不便公开发布,请发送邮件至: mcsmanager-dev@outlook.com。 + +安全问题修复后将在代码中附加漏洞发现者姓名。 + +
+ + +## 源代码协议 + +源代码遵循 Apache-2.0 协议。 + +版权所有 2022 MCSManager 开发团队。 diff --git a/apps/mcsmanager-daemon/data.yml b/apps/mcsmanager-daemon/data.yml new file mode 100644 index 00000000..c400ef5f --- /dev/null +++ b/apps/mcsmanager-daemon/data.yml @@ -0,0 +1,20 @@ +name: MCSManager Daemon +tags: + - 工具 +title: 支持大部分游戏服务端和控制台程序的管理面板(后端) +type: 工具 +description: 支持大部分游戏服务端和控制台程序的管理面板(后端) +additionalProperties: + key: mcsmanager-daemon + name: MCSManager Daemon + tags: + - Tool + shortDescZh: 支持大部分游戏服务端和控制台程序的管理面板(后端) + shortDescEn: Distributed, Docker-supported, Multilingual, and Lightweight control panel for Minecraft server and more (daemon) + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://hub.docker.com/r/alisaqaq/mcsmanager-web + github: https://github.com/MCSManager/MCSManager + document: https://docs.mcsmanager.com/ diff --git a/apps/mcsmanager-daemon/latest/.env.sample b/apps/mcsmanager-daemon/latest/.env.sample new file mode 100644 index 00000000..775c2932 --- /dev/null +++ b/apps/mcsmanager-daemon/latest/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="mcsmanager-daemon" +PANEL_APP_PORT_HTTP="40057" +DATA_PATH="./data" diff --git a/apps/mcsmanager-daemon/latest/data.yml b/apps/mcsmanager-daemon/latest/data.yml new file mode 100644 index 00000000..646f7f54 --- /dev/null +++ b/apps/mcsmanager-daemon/latest/data.yml @@ -0,0 +1,18 @@ +additionalProperties: + formFields: + - default: 40057 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + diff --git a/apps/mcsmanager-daemon/latest/docker-compose.yml b/apps/mcsmanager-daemon/latest/docker-compose.yml new file mode 100644 index 00000000..2f8c349e --- /dev/null +++ b/apps/mcsmanager-daemon/latest/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + mcsm-daemon: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:24444" + volumes: + - "${DATA_PATH}:/opt/mcsmanager/daemon/data" + - /var/run/docker.sock:/var/run/docker.sock + image: alisaqaq/mcsmanager-daemon:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/mcsmanager-daemon/logo.png b/apps/mcsmanager-daemon/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0a74847887c591f019da5af8f2219e21e379b5 GIT binary patch literal 10382 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 + +
+ +[![Status](https://img.shields.io/badge/npm-v6.14.15-blue.svg)](https://www.npmjs.com/) +[![Status](https://img.shields.io/badge/node-v14.17.6-blue.svg)](https://nodejs.org/en/download/) +[![Status](https://img.shields.io/badge/License-Apache%202.0-red.svg)](https://github.com/MCSManager) + +[官方网站](http://mcsmanager.com/) | [使用文档](https://docs.mcsmanager.com/) | [团队主页](https://github.com/MCSManager) | [面板端项目](https://github.com/MCSManager/MCSManager) | [网页前端项目](https://github.com/MCSManager/UI) | [守护进程项目](https://github.com/MCSManager/Daemon) + + +中文 QQ 群:https://jq.qq.com/?_wv=1027&k=Pgl9ScGw + +中文 TG 群:https://t.me/MCSManager_dev + +爱发电赞助:https://afdian.net/a/mcsmanager + +
+ +## 这是什么? + + +MCSManager 面板(简称:MCSM 面板)是一款开源,分布式,轻量级,快速部署,支持大部分游戏服务端和控制台程序的管理面板 + +
+ +## 软件特性 + +软件在 Minecraft 和其他游戏社区内中已有一定的流行程度,它可以帮助你集中管理多个物理服务器,动态在任何主机上创建游戏服务端,并且提供安全可靠的多用户权限系统,可以很轻松的帮助你管理多个服务器,一直在为 Minecraft,Terraria,Steam 游戏服务器管理员,运维人员和个人开发者提供健康的软件支持。 + + +![截图.png](https://public-link.oss-cn-shenzhen.aliyuncs.com/mcsm_picture/MCSM9.png) + +![Screenshot.png](https://mcsmanager.com/main2.png) + +QQ20221207-174328@2x + + +
+ +## 运行环境 + +控制面板可运行在 Windows 与 Linux 平台,无需数据库与任何系统配置,只需安装 node 环境即可快速运行,属于轻量级的 Minecraft 服务端控制面板。 + +必须 `Node 14.17.0` 以上,无需数据库和更改任何系统配置,开箱即可运行。 + +
+ +## 配置/数据文件 + +配置文件: `data/SystemConfig/config.json` + +用户数据文件:`data/User/*.json` + +远程守护进程配置:`data/RemoteServiceConfig/*.json` + +
+ +## 软件文档 + +地址:[https://docs.mcsmanager.com/](https://docs.mcsmanager.com/) + +
+ +## 安装 + +### Windows + +对于 Windows 系统,**已整合成直接运行版本,下载即可运行**(使用管理员权限运行): + +前往:[https://mcsmanager.com/](https://mcsmanager.com/) + +
+ + +### Linux + +**一行命令快速安装** + +```bash +// 国内用户专用 gitee 加速源 +wget -qO- https://gitee.com/mcsmanager/script/raw/master/setup_cn.sh | bash + +// 或原始源(科学上网) +wget -qO- https://raw.githubusercontent.com/mcsmanager/Script/master/setup.sh | bash +``` + +- 脚本仅适用于 AMD64 架构 Ubuntu/Centos/Debian/Archlinux。 +- 执行完成后,使用 `systemctl start mcsm-{web,daemon}` 即可启动面板服务。 +- 面板代码与运行环境自动安装在 `/opt/mcsmanager/` 目录下。 + +
+ +**Linux 手动安装** + +- 若一键安装不起作用,则可以尝试此步骤手动安装。 + +```bash +# 切换到安装目录。如果不存在,请提前用'mkdir /opt/'创建它。 +cd /opt/ +# 下载运行时环境(Node.js)。如果你已经安装了Node.js 14+,请忽略此步骤。 +wget https://nodejs.org/dist/v14.17.6/node-v14.17.6-linux-x64.tar.gz +# 解压档案 +tar -zxvf node-v14.17.6-linux-x64.tar.gz +# 添加程序到系统环境变量 +ln -s /opt/node-v14.17.6-linux-x64/bin/node /usr/bin/node +ln -s /opt/node-v14.17.6-linux-x64/bin/npm /usr/bin/npm + +# 准备好安装目录 +mkdir /opt/mcsmanager/ +cd /opt/mcsmanager/ + +# 下载MCSManager +wget https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz +tar -zxf mcsmanager_linux_release.tar.gz + +# 安装依赖库 +./install-dependency.sh + +# 请打开两个终端或屏幕 + +# 先启动守护程序 +./start-daemon.sh + +# 启动网络服务(在第二个终端) +./start-web.sh + +# 为网络界面访问http://localhost:23333/ +# 一般来说,网络应用会自动扫描并连接到本地守护进程。 +``` + +- 注意,这种安装方式不会自动注册面板到系统服务(Service),所以必须使用 `screen` 软件来管理。 + +
+ +## 更新版本 + +参考: https://github.com/MCSManager/MCSManager/wiki/Update-MCSManager + +> 如果你不是特别需要新版本的功能,或者不是为了修复安全隐患,那就不建议更新。 + +
+ +## 项目体系 + +整个软件运行需要三个项目的互相配合才可运行,您普通安装的代码是编译再整合后的产物。 + +[**控制面板端**](https://github.com/MCSManager/MCSManager) + +- 角色:控制中心 +- 责任:负责提供网页前端的后端接口,提供 API 接口,用户数据管理和对守护进程进行通信和授权。 + +[**网页前端**](https://github.com/MCSManager/UI) + +- 角色:控制中心的用户交互界面 +- 责任:以网页形式展示数据,发送请求,并且拥有与守护进程通信的能力,此项目最终产物是纯静态文件。 + +[**守护进程**](https://github.com/MCSManager/Daemon) + +- 角色:被控端 +- 责任:控制本地主机的所有实例,真实进程的实际管理者,拥有与任何对象的通信能力。 + +
+ +## 搭建开发环境 + +此段落面向开发人员,普通用户无需关注也无需执行。 + +所有项目全部以开发环境运行后,便可以进行开发与预览,请务必遵循开源协议。 + +**控制面板端(MCSManager)** + +```bash +git clone https://github.com/MCSManager/MCSManager.git +cd MCSManager +npm install +npm run start +# 默认将采用 ts-node 直接执行 Typescript 代码 +# 默认运行在 23333 端口 +``` + +**网页前端(UI)** + +```bash +git clone https://github.com/MCSManager/UI.git +cd UI +npm install +npm run serve +# 访问 http://localhost:8080/ 即可预览界面 +# 所有 API 请求将自动转发到 23333 端口 +``` + +**守护进程(Daemon)** + +```bash +git clone https://github.com/MCSManager/Daemon.git +cd Daemon +npm install +npm run start +# 运行后请在控制面板端连接本守护进程 +# 默认运行在 24444 端口 +``` + +
+ +## 浏览器兼容性 + +- 支持 `Chrome` `Firefox` `Safari` `Opera` 等现代主流浏览器。 +- 已放弃支持 `IE` 浏览器。 + +
+ +## 国际化 + +MCSManager 已支持中文,英文两种语言,已经实现国际化全面覆盖。 + +软件国际化由 [Lazy](https://github.com/LazyCreeper),[KevinLu2000](https://github.com/KevinLu2000),[zijiren233](https://github.com/zijiren233) 和 [Unitwk](https://github.com/unitwk) 共同完成 + +
+ +## 贡献 + +如果你在使用过程中发现任何问题,可以 [提交 Issue](https://github.com/MCSManager/MCSManager/issues/new/choose) 或自行 Fork 修改后提交 Pull Request。 + +代码需要保持现有格式,不得格式化多余代码,具体可[参考这里](https://github.com/MCSManager/MCSManager/issues/544)。 + +
+ +## 问题报告 + +欢迎发现的任何问题进行反馈,必当及时修复。 + +若发现严重安全漏洞又不便公开发布,请发送邮件至: mcsmanager-dev@outlook.com。 + +安全问题修复后将在代码中附加漏洞发现者姓名。 + +
+ + +## 源代码协议 + +源代码遵循 Apache-2.0 协议。 + +版权所有 2022 MCSManager 开发团队。 diff --git a/apps/mcsmanager-web/data.yml b/apps/mcsmanager-web/data.yml new file mode 100644 index 00000000..5dc1b4e9 --- /dev/null +++ b/apps/mcsmanager-web/data.yml @@ -0,0 +1,20 @@ +name: MCSManager Web +tags: + - 工具 +title: 支持大部分游戏服务端和控制台程序的管理面板(前端) +type: 工具 +description: 支持大部分游戏服务端和控制台程序的管理面板(前端) +additionalProperties: + key: mcsmanager-web + name: MCSManager Web + tags: + - Tool + shortDescZh: 支持大部分游戏服务端和控制台程序的管理面板(前端) + shortDescEn: Distributed, Docker-supported, Multilingual, and Lightweight control panel for Minecraft server and more (webui) + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://hub.docker.com/r/alisaqaq/mcsmanager-web + github: https://github.com/MCSManager/MCSManager + document: https://docs.mcsmanager.com/ diff --git a/apps/mcsmanager-web/latest/.env.sample b/apps/mcsmanager-web/latest/.env.sample new file mode 100644 index 00000000..0c21b86f --- /dev/null +++ b/apps/mcsmanager-web/latest/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="mcsmanager-web" +PANEL_APP_PORT_HTTP="40056" +DATA_PATH="./data" diff --git a/apps/mcsmanager-web/latest/data.yml b/apps/mcsmanager-web/latest/data.yml new file mode 100644 index 00000000..9853a74d --- /dev/null +++ b/apps/mcsmanager-web/latest/data.yml @@ -0,0 +1,18 @@ +additionalProperties: + formFields: + - default: 40056 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text + diff --git a/apps/mcsmanager-web/latest/docker-compose.yml b/apps/mcsmanager-web/latest/docker-compose.yml new file mode 100644 index 00000000..60c3bcce --- /dev/null +++ b/apps/mcsmanager-web/latest/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' +services: + mcsm-web: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:23333" + volumes: + - "${DATA_PATH}:/opt/mcsmanager/web/data" + image: alisaqaq/mcsmanager-web:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/mcsmanager-web/logo.png b/apps/mcsmanager-web/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0a74847887c591f019da5af8f2219e21e379b5 GIT binary patch literal 10382 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