From 071df529f0a29c75ff6e240a9ffa7ed26db8893e Mon Sep 17 00:00:00 2001 From: okxlin Date: Sun, 2 Jul 2023 18:15:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0cloudreve=E5=88=B0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cloudreve/3.8.0/.env.sample | 4 + apps/cloudreve/3.8.0/data.yml | 24 ++++++ apps/cloudreve/3.8.0/data/cloudreve.db | 0 apps/cloudreve/3.8.0/data/conf.ini | 0 apps/cloudreve/3.8.0/docker-compose.yml | 22 +++++ apps/cloudreve/README.md | 104 +++++++++++++++++++++++ apps/cloudreve/data.yml.bak | 20 +++++ apps/cloudreve/latest/.env.sample | 4 + apps/cloudreve/latest/data.yml | 24 ++++++ apps/cloudreve/latest/data/cloudreve.db | 0 apps/cloudreve/latest/data/conf.ini | 0 apps/cloudreve/latest/docker-compose.yml | 22 +++++ apps/cloudreve/logo.png | Bin 0 -> 12022 bytes 13 files changed, 224 insertions(+) create mode 100644 apps/cloudreve/3.8.0/.env.sample create mode 100644 apps/cloudreve/3.8.0/data.yml create mode 100644 apps/cloudreve/3.8.0/data/cloudreve.db create mode 100644 apps/cloudreve/3.8.0/data/conf.ini create mode 100644 apps/cloudreve/3.8.0/docker-compose.yml create mode 100644 apps/cloudreve/README.md create mode 100644 apps/cloudreve/data.yml.bak create mode 100644 apps/cloudreve/latest/.env.sample create mode 100644 apps/cloudreve/latest/data.yml create mode 100644 apps/cloudreve/latest/data/cloudreve.db create mode 100644 apps/cloudreve/latest/data/conf.ini create mode 100644 apps/cloudreve/latest/docker-compose.yml create mode 100644 apps/cloudreve/logo.png diff --git a/apps/cloudreve/3.8.0/.env.sample b/apps/cloudreve/3.8.0/.env.sample new file mode 100644 index 00000000..b3b1122f --- /dev/null +++ b/apps/cloudreve/3.8.0/.env.sample @@ -0,0 +1,4 @@ +CONTAINER_NAME="cloudreve" +PANEL_APP_PORT_HTTP="40033" +UPLOAD_PATH="./data/uploads" +TMP_PATH="./data/data" \ No newline at end of file diff --git a/apps/cloudreve/3.8.0/data.yml b/apps/cloudreve/3.8.0/data.yml new file mode 100644 index 00000000..5b4d7f9c --- /dev/null +++ b/apps/cloudreve/3.8.0/data.yml @@ -0,0 +1,24 @@ +additionalProperties: + formFields: + - default: 40033 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data/uploads + edit: true + envKey: UPLOAD_PATH + labelEn: The upload file save path + labelZh: 上传文件保存路径 + required: true + type: text + - default: ./data/data + edit: true + envKey: TMP_PATH + labelEn: Temp folder path + labelZh: 临时文件夹路径 + required: true + type: text diff --git a/apps/cloudreve/3.8.0/data/cloudreve.db b/apps/cloudreve/3.8.0/data/cloudreve.db new file mode 100644 index 00000000..e69de29b diff --git a/apps/cloudreve/3.8.0/data/conf.ini b/apps/cloudreve/3.8.0/data/conf.ini new file mode 100644 index 00000000..e69de29b diff --git a/apps/cloudreve/3.8.0/docker-compose.yml b/apps/cloudreve/3.8.0/docker-compose.yml new file mode 100644 index 00000000..fcb02453 --- /dev/null +++ b/apps/cloudreve/3.8.0/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3' +services: + cloudreve: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:5212" + volumes: + - "${UPLOAD_PATH}:/cloudreve/uploads" + - "${TMP_PATH}:/data" + - "./data/conf.ini:/cloudreve/conf.ini" + - "./data/cloudreve.db:/cloudreve/cloudreve.db" + - "./data/avatar:/cloudreve/avatar" + image: cloudreve/cloudreve:3.8.0 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/cloudreve/README.md b/apps/cloudreve/README.md new file mode 100644 index 00000000..2e918951 --- /dev/null +++ b/apps/cloudreve/README.md @@ -0,0 +1,104 @@ +[English Version](https://github.com/cloudreve/Cloudreve/blob/master/README.md) + +

+
+ +
+ Cloudreve +
+

+ +

支持多家云存储驱动的公有云文件系统.

+ +

+ + GitHub Test Workflow + + + + + + + + + + + +

+

+ 主页 • + 演示站 • + 讨论社区 • + 文档 • + 下载 • + Telegram 群组 • + 许可证 +

+ + +![Screenshot](https://raw.githubusercontent.com/cloudreve/docs/master/images/homepage.png) + +## :sparkles: 特性 + +* :cloud: 支持本机、从机、七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDrive (包括世纪互联版) 、S3兼容协议 作为存储端 +* :outbox_tray: 上传/下载 支持客户端直传,支持下载限速 +* 💾 可对接 Aria2 离线下载,可使用多个从机节点分担下载任务 +* 📚 在线 压缩/解压缩、多文件打包下载 +* 💻 覆盖全部存储策略的 WebDAV 协议支持 +* :zap: 拖拽上传、目录上传、流式上传处理 +* :card_file_box: 文件拖拽管理 +* :family_woman_girl_boy: 多用户、用户组、多存储策略 +* :link: 创建文件、目录的分享链接,可设定自动过期 +* :eye_speech_bubble: 视频、图像、音频、 ePub 在线预览,文本、Office 文档在线编辑 +* :art: 自定义配色、黑暗模式、PWA 应用、全站单页应用、国际化支持 +* :rocket: All-In-One 打包,开箱即用 +* 🌈 ... ... + +## :hammer_and_wrench: 部署 + +下载适用于您目标机器操作系统、CPU架构的主程序,直接运行即可。 + +```shell +# 解压程序包 +tar -zxvf cloudreve_VERSION_OS_ARCH.tar.gz + +# 赋予执行权限 +chmod +x ./cloudreve + +# 启动 Cloudreve +./cloudreve +``` + +以上为最简单的部署示例,您可以参考 [文档 - 起步](https://docs.cloudreve.org/) 进行更为完善的部署。 + +## :gear: 构建 + +自行构建前需要拥有 `Go >= 1.18`、`node.js`、`yarn`、`zip`, [goreleaser](https://goreleaser.com/intro/) 等必要依赖。 + +#### 安装 goreleaser + +```shell +go install github.com/goreleaser/goreleaser@latest +``` + +#### 克隆代码 + +```shell +git clone --recurse-submodules https://github.com/cloudreve/Cloudreve.git +``` + +#### 编译项目 + +```shell +goreleaser build --clean --single-target --snapshot +``` + +## :alembic: 技术栈 + +* [Go](https://golang.org/) + [Gin](https://github.com/gin-gonic/gin) +* [React](https://github.com/facebook/react) + [Redux](https://github.com/reduxjs/redux) + [Material-UI](https://github.com/mui-org/material-ui) + +## :scroll: 许可证 + +GPL V3 diff --git a/apps/cloudreve/data.yml.bak b/apps/cloudreve/data.yml.bak new file mode 100644 index 00000000..79454714 --- /dev/null +++ b/apps/cloudreve/data.yml.bak @@ -0,0 +1,20 @@ +name: Cloudreve +tags: + - 工具 +title: 支持多家云存储的云盘系统 +type: 工具 +description: 支持多家云存储的云盘系统 +additionalProperties: + key: cloudreve + name: Cloudreve + tags: + - Tool + shortDescZh: 支持多家云存储的云盘系统 + shortDescEn: A cloud disk system that supports multiple cloud storage + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://cloudreve.org/ + github: https://github.com/cloudreve/Cloudreve + document: https://docs.cloudreve.org/ diff --git a/apps/cloudreve/latest/.env.sample b/apps/cloudreve/latest/.env.sample new file mode 100644 index 00000000..b3b1122f --- /dev/null +++ b/apps/cloudreve/latest/.env.sample @@ -0,0 +1,4 @@ +CONTAINER_NAME="cloudreve" +PANEL_APP_PORT_HTTP="40033" +UPLOAD_PATH="./data/uploads" +TMP_PATH="./data/data" \ No newline at end of file diff --git a/apps/cloudreve/latest/data.yml b/apps/cloudreve/latest/data.yml new file mode 100644 index 00000000..5b4d7f9c --- /dev/null +++ b/apps/cloudreve/latest/data.yml @@ -0,0 +1,24 @@ +additionalProperties: + formFields: + - default: 40033 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data/uploads + edit: true + envKey: UPLOAD_PATH + labelEn: The upload file save path + labelZh: 上传文件保存路径 + required: true + type: text + - default: ./data/data + edit: true + envKey: TMP_PATH + labelEn: Temp folder path + labelZh: 临时文件夹路径 + required: true + type: text diff --git a/apps/cloudreve/latest/data/cloudreve.db b/apps/cloudreve/latest/data/cloudreve.db new file mode 100644 index 00000000..e69de29b diff --git a/apps/cloudreve/latest/data/conf.ini b/apps/cloudreve/latest/data/conf.ini new file mode 100644 index 00000000..e69de29b diff --git a/apps/cloudreve/latest/docker-compose.yml b/apps/cloudreve/latest/docker-compose.yml new file mode 100644 index 00000000..0519d328 --- /dev/null +++ b/apps/cloudreve/latest/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3' +services: + cloudreve: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:5212" + volumes: + - "${UPLOAD_PATH}:/cloudreve/uploads" + - "${TMP_PATH}:/data" + - "./data/conf.ini:/cloudreve/conf.ini" + - "./data/cloudreve.db:/cloudreve/cloudreve.db" + - "./data/avatar:/cloudreve/avatar" + image: cloudreve/cloudreve:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/cloudreve/logo.png b/apps/cloudreve/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..11fd1a355be434f81c5f08fef137bb8f669fa1d1 GIT binary patch literal 12022 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 Urr!7KA^-pY07*qoM6N<$g2cy#wg3PC literal 0 HcmV?d00001