From 19eb8393d4f8b1e1da91e3916a3ef557c0ee52ee Mon Sep 17 00:00:00 2001 From: okxlin Date: Mon, 7 Oct 2024 14:09:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=B0=83=E6=95=B4filecodebox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/filecodebox/README.md | 289 ++++--------------------------------- apps/filecodebox/data.yml | 13 +- apps/filecodebox/logo.png | Bin 7045 -> 6396 bytes 3 files changed, 36 insertions(+), 266 deletions(-) diff --git a/apps/filecodebox/README.md b/apps/filecodebox/README.md index 17f3b2ba..5d6918a4 100644 --- a/apps/filecodebox/README.md +++ b/apps/filecodebox/README.md @@ -1,266 +1,37 @@ -# 使用说明 +
+

文件快递柜-轻量

+

匿名口令分享文本,文件,像拿快递一样取文件

+
+ + +--- + + +
+ 简体中文 | + English | + 部署教程 | + 常见问题 +
+ +## 使用说明 - 后端地址:`/#/admin` - 后台密码:`FileCodeBox2023` -# 原始相关 -*** -
-

文件快递柜-轻量

-

FileCodeBox-Lite

-

匿名口令分享文本,文件,像拿快递一样取文件

-

交流Q群:739673698,欢迎各位集思广益,项目构思重构中

-
- -![banner](https://fastly.jsdelivr.net/gh/vastsa/FileCodeBox@V1.6/static/banners/img_1.png) - ---- - -[简体中文](https://github.com/vastsa/FileCodeBox/blob/master/readme.md) | [English](https://github.com/vastsa/FileCodeBox/blob/master/readme_en.md) - ## 主要特色 -- [x] 轻量简洁:Fastapi+Sqlite3+Vue2+ElementUI -- [x] 轻松上传:复制粘贴,拖拽选择 -- [x] 多种类型:文本,文件 -- [x] 防止爆破:错误次数限制 -- [x] 防止滥用:IP限制上传次数 -- [x] 口令分享:随机口令,存取文件,自定义次数以及有效期 -- [x] 国际化:支持中文和英文 -- [x] 匿名分享:无需注册,无需登录 -- [x] 管理面板:查看所有文件,删除文件 -- [x] 一键部署:docker一键部署 -- [x] 自由拓展:S3协议、本地文件流,可根据需求在storage文件中新增存储引擎 -- [x] 简单明了:适合新手练手项目 - -## 部署方式 - -### Docker一键部署 - -#### 2.0版本,开发中 - -默认信息 - -后端地址:`/#/admin` - -后台密码:`FileCodeBox2023` - -AMD & ARM - -一键安装 - -```bash -docker run -d --restart=always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:beta - -``` - -一键更新 - -```bash -docker pull lanol/filecodebox:beta && docker stop filecodebox && docker rm filecodebox && docker run -d --restart=always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:beta -``` - -#### 1.6版本AMD - -```bash -docker run -d --restart=always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:latest -``` - -#### 1.6版本ARM - -```bash -docker run -d --restart=always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:arm -``` - -### 宝塔部署 - -https://www.yuque.com/lxyo/work/lc1oe0xqk8t9b976 - -### 更新方式 - -```bash -// 更新 -docker pull lanol/filecodebox:beta -// 停止容器并删除 -docker stop filecodebox && docker rm filecodebox -// 重新运行容器 -docker run -d --restart=always -p 12345:12345 -v /opt/FileCodeBox/:/app/data --name filecodebox lanol/filecodebox:latest -``` - -### 1.6版本注意 - -这一版改变比较大,如果出现问题可以尝试清空/opt/FileCodeBox目录,有问题欢迎反馈留言 -注意,如果是第一次安装,请查看docker日志获取初始密码和后台地址,参考指令 -后台本地文件列表,需要将服务器文件移动至目录/opt/FileCodeBox/data/locals,这样就可以显示了。 - -```bash -docker logs filecodebox - -``` - -### 其他方式 - -仅供参考,历史版本->[部署文档](https://www.yuque.com/lxyo/work/zd0kvzy7fofx6w7v) - -## 预览 - -### 例站 - -[https://share.lanol.cn](https://share.lanol.cn) - -### 暗黑模式 - - - - - - - -
-寄文件 - - -寄文件 - -
- -### 寄件 - - - - - - - - - -
-寄文件 - -寄文本 -
-寄文本 -
- -### 取件 - - - - - - - - - -
-取件 - -取件码错误 -
-取文件 -
- -### 管理 - - - - - - - - - -
-admin - -admin -
-admin -
- -## 配置文件(1.7及以下版本才需要) - -如果需要修改配置,可以将该文件放在`/opt/FileCodeBox/`目录下,并命名为`.env`,然后重启容器即可。 -如果不是Docker,则需要在项目同目录下新建一个`data`文件夹,然后在创建`.env`文件 - -```dotenv -# 端口 -PORT=12345 -# Sqlite数据库文件 -DATABASE_URL=sqlite+aiosqlite:///database.db -# 静态文件夹 -DATA_ROOT=./static -# 静态文件夹URL -STATIC_URL=/static -# 开启上传 -ENABLE_UPLOAD=True -# 错误次数 -ERROR_COUNT=5 -# 错误限制分钟数 -ERROR_MINUTE=10 -# 上传次数 -UPLOAD_COUNT=60 -# 上传限制分钟数 -UPLOAD_MINUTE=1 -# 删除过期文件的间隔(分钟) -DELETE_EXPIRE_FILES_INTERVAL=10 -# 管理地址 -ADMIN_ADDRESS=admin -# 管理密码 -ADMIN_PASSWORD=admin -# 文件大小限制,默认10MB -FILE_SIZE_LIMIT=10 -# 网站标题 -TITLE=文件快递柜 -# 网站描述 -DESCRIPTION=FileCodeBox,文件快递柜,口令传送箱,匿名口令分享文本,文件,图片,视频,音频,压缩包等文件 -# 网站关键词 -KEYWORDS=FileCodeBox,文件快递柜,口令传送箱,匿名口令分享文本,文件,图片,视频,音频,压缩包等文件 -# 存储引擎 -STORAGE_ENGINE=filesystem -# 如果使用阿里云OSS服务的话需要额外创建如下参数: -# 阿里云账号AccessKey -KeyId=阿里云账号AccessKey -# 阿里云账号AccessKeySecret -KeySecret=阿里云账号AccessKeySecret -# 阿里云OSS Bucket的地域节点 -OSS_ENDPOINT=阿里云OSS Bucket的地域节点 -# 阿里云OSS Bucket的BucketName -BUCKET_NAME=阿里云OSS Bucket的BucketName -``` - -## 状态 - -![Alt](https://repobeats.axiom.co/api/embed/7a6c92f1d96ee57e6fb67f0df371528397b0c9ac.svg "Repobeats analytics image") - -## Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=vastsa/FileCodeBox&type=Date)](https://star-history.com/#vastsa/FileCodeBox&Date) - -## 赞赏 - - - - - - -
-支付宝 -支付宝 - -微信 -微信 -
- -## 常见问题 - -1. 413 Request Entity Too Large - Nginx限制: - 找到自己主机的nginx.conf配置文件,打开 - 在http{}中加入 client_max_body_size 10m; - 然后重启nginx - -## 免责声明 - -本项目开源仅供学习使用,不得用于任何违法用途,否则后果自负,与本人无关。使用请保留项目地址谢谢。 +- [x] **轻量简洁:** 项目基于Fastapi + Sqlite3 + Vue3 + ElementUI +- [x] **轻松上传:** 支持复制粘贴和拖拽选择 +- [x] **多种类型:** 支持文本和文件 +- [x] **防止爆破:** 错误次数限制 +- [x] **防止滥用:** IP限制上传次数 +- [x] **口令分享:** 随机口令,存取文件,自定义次数及有效期 +- [x] **国际化:** 支持中文简体、繁体以及英文等 +- [x] **匿名分享:** 无需注册,无需登录 +- [x] **管理面板:** 查看和删除文件 +- [x] **一键部署:** 支持Docker一键部署 +- [x] **自由拓展:** 支持S3协议和本地文件流,可根据需求在storage文件中新增存储引擎 +- [x] **简单明了:** 适合新手练手项目 +- [x] **终端下载:** 终端命令`wget https://share.lanol.cn/share/select?code=83432` diff --git a/apps/filecodebox/data.yml b/apps/filecodebox/data.yml index 901b4ca4..58f31505 100644 --- a/apps/filecodebox/data.yml +++ b/apps/filecodebox/data.yml @@ -1,15 +1,14 @@ -name: 文件快递柜-轻量 (FileCodeBox-Lite) +name: FileCodeBox tags: - - 工具 -title: 匿名口令分享文本,文件,像拿快递一样取文件 -type: 工具 -description: 匿名口令分享文本,文件,像拿快递一样取文件 + - 实用工具 +title: 文件快递柜-匿名口令分享文本,文件,像拿快递一样取文件 +description: 文件快递柜-匿名口令分享文本,文件,像拿快递一样取文件 additionalProperties: key: filecodebox - name: 文件快递柜-轻量 (FileCodeBox-Lite) + name: FileCodeBox tags: - Tool - shortDescZh: 匿名口令分享文本,文件,像拿快递一样取文件 + shortDescZh: 文件快递柜-匿名口令分享文本,文件,像拿快递一样取文件 shortDescEn: Anonymous Passcode Sharing Text, Files, Like Taking Express Delivery for Files type: tool crossVersionUpdate: true diff --git a/apps/filecodebox/logo.png b/apps/filecodebox/logo.png index 1e1313c0a1730bc3a3a60879da88ea085ea9d65d..1b010a4f6ae543bad1c2f6c7bd58db731c5888cb 100644 GIT binary patch literal 6396 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 literal 7045 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