From 80eca629918eefe9e88131f84cd7f20de420281a Mon Sep 17 00:00:00 2001 From: okxlin Date: Sun, 27 Aug 2023 19:55:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0picx=E5=88=B0=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/picx/README.md | 95 ++++++++++++++++++++++++++++ apps/picx/data.yml | 20 ++++++ apps/picx/latest/.env.sample | 3 + apps/picx/latest/Dockerfile | 26 ++++++++ apps/picx/latest/data.yml | 17 +++++ apps/picx/latest/docker-compose.yml | 21 ++++++ apps/picx/latest/entrypoint.sh | 16 +++++ apps/picx/logo.png | Bin 0 -> 6794 bytes 8 files changed, 198 insertions(+) create mode 100644 apps/picx/README.md create mode 100644 apps/picx/data.yml create mode 100644 apps/picx/latest/.env.sample create mode 100644 apps/picx/latest/Dockerfile create mode 100644 apps/picx/latest/data.yml create mode 100644 apps/picx/latest/docker-compose.yml create mode 100644 apps/picx/latest/entrypoint.sh create mode 100644 apps/picx/logo.png diff --git a/apps/picx/README.md b/apps/picx/README.md new file mode 100644 index 00000000..e7e0a3c7 --- /dev/null +++ b/apps/picx/README.md @@ -0,0 +1,95 @@ +# 使用说明 +当第一次部署时,假如出现异常问题,如容器未找到等,解决方式如下: + +点击`已安装应用` > 找到应用 > 点`参数` > 点`编辑 `> 点`高级设置 `> 点击右下角`确认`。 + +采用的从源码编译镜像的方式,国内机子的话,假如因为各种网络原因,连接不上`github`, + +可以尝试修改应用目录下,即类似`/opt/1panel/apps/local/picx/picx/Dockerfile` 文件里的`github`源码链接,用诸如`ghproxy`等。 + +然后重建应用 + +# 原始相关 +*** + + +PicX + + +# PicX + +[![Author](https://img.shields.io/badge/author-XPoet-violet.svg)](https://github.com/XPoet) +[![Release](https://img.shields.io/github/release/XPoet/picx.svg)](https://github.com/XPoet/picx/releases) +[![License](https://img.shields.io/github/license/XPoet/picx.svg)](https://github.com/XPoet/picx/blob/master/LICENSE) +[![Stars](https://img.shields.io/github/stars/XPoet/picx)](https://github.com/XPoet/picx) +[![Issues](https://img.shields.io/github/issues/XPoet/picx)](https://github.com/XPoet/picx/issues) +[![Deploy](https://github.com/XPoet/picx/workflows/deploy/badge.svg)](https://github.com/XPoet/picx/actions/workflows/deploy.yml) +[![JavaScript Style Guide](https://img.shields.io/badge/code_style-Airbnb-hotpink.svg)](https://github.com/lin-123/javascript) + +**[PicX](https://picx.xpoet.cn)** 是一款基于 GitHub API 开发的图床工具,提供图片上传托管、生成图片链接和常用图片工具箱服务。 + +--- + +## 亮点 | Highlights + +- 在线使用,无需下载,无需安装。 +- 操作简单,文档完善,持续维护。 +- 代码开源,数据安全,免费使用。 + +## 如何使用 | How to use + +只需 [创建一个 GitHub Token](https://github.com/settings/tokens/new),在 [PicX 官网](https://picx.xpoet.cn) 使用 Token 完成图床配置即可。 + +**PicX 在线使用入口 >> https://picx.xpoet.cn** + +## 文档 | Documents + +官方文档入口 >> https://picx-docs.xpoet.cn + +通过阅读 **[快速开始](https://picx-docs.xpoet.cn/usage-guide/get-start.html)** 教程,可帮助你迅速上手 PicX 。 + +## 功能 | Features + +- [x] 支持 **[拖拽](https://picx-docs.xpoet.cn/usage-guide/upload.html#%E6%8B%96%E6%8B%BD%E5%9B%BE%E7%89%87)**、**[复制粘贴](https://picx-docs.xpoet.cn/usage-guide/upload.html#%E5%A4%8D%E5%88%B6%E7%B2%98%E8%B4%B4)**、**[选择文件](https://picx-docs.xpoet.cn/usage-guide/upload.html#%E9%80%89%E6%8B%A9%E6%96%87%E4%BB%B6)** 等方式进行选择图片 +- [x] 支持图片 **[重命名](https://picx-docs.xpoet.cn/usage-guide/upload.html#%E9%87%8D%E5%91%BD%E5%90%8D)**、**[哈希化](https://picx-docs.xpoet.cn/usage-guide/upload.html#%E5%93%88%E5%B8%8C%E5%8C%96)**(确保图片名唯一)和 **[设置命名前缀](https://picx-docs.xpoet.cn/usage-guide/upload.html#%E5%89%8D%E7%BC%80%E5%91%BD%E5%90%8D)** +- [x] 支持 **批量上传图片**、**[批量删除图片](https://picx-docs.xpoet.cn/usage-guide/management.html#%E5%88%A0%E9%99%A4-%E6%89%B9%E9%87%8F%E5%88%A0%E9%99%A4)** 和 **[批量复制图片链接](https://picx-docs.xpoet.cn/usage-guide/management.html#%E5%A4%8D%E5%88%B6-%E6%89%B9%E9%87%8F%E5%A4%8D%E5%88%B6%E9%93%BE%E6%8E%A5)** +- [x] 支持图床 **多级目录** 管理 (创建多级目录 / 查看多级目录下图片) +- [x] 支持 **[一键复制](https://picx-docs.xpoet.cn/usage-guide/upload.html#%E5%A4%8D%E5%88%B6%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5)** 图片链接和 **[自由转换 Markdown / HTML / BBCode 格式](https://picx-docs.xpoet.cn/usage-guide/settings.html#%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5%E6%A0%BC%E5%BC%8F%E8%AE%BE%E7%BD%AE)** +- [x] 内置 **[多种图片链接规则](https://picx-docs.xpoet.cn/usage-guide/settings.html#%E9%80%89%E6%8B%A9%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5%E8%A7%84%E5%88%99)**(Staticaly、jsDelivr、ChinaJsDelivr 等) +- [x] 支持 **[自定义配置图片链接规则](https://picx-docs.xpoet.cn/usage-guide/settings.html#%E9%85%8D%E7%BD%AE%E8%87%AA%E5%AE%9A%E4%B9%89%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5%E8%A7%84%E5%88%99)** +- [x] 支持 **[图片压缩](https://picx-docs.xpoet.cn/usage-guide/settings.html#%E5%9B%BE%E7%89%87%E5%8E%8B%E7%BC%A9%E8%AE%BE%E7%BD%AE)** (内置高效压缩算法,可配置在上传前自动压缩) +- [x] 支持配置 **[图片水印](https://picx-docs.xpoet.cn/usage-guide/settings.html#%E5%9B%BE%E7%89%87%E6%B0%B4%E5%8D%B0%E8%AE%BE%E7%BD%AE)** +- [x] 支持 **PWA** +- [x] 支持 **[暗夜模式](https://picx-docs.xpoet.cn/usage-guide/settings.html#%E4%B8%BB%E9%A2%98%E8%AE%BE%E7%BD%AE)** (自动切换 / 自由切换) +- [x] i18n(中文简体、中文繁体、英文) +- [x] 工具箱([图片压缩](https://picx-docs.xpoet.cn/usage-guide/toolbox.html#%E5%9B%BE%E7%89%87%E5%8E%8B%E7%BC%A9)、[图片转 Base64](https://picx-docs.xpoet.cn/usage-guide/toolbox.html#%E5%9B%BE%E7%89%87%E8%BD%AC-base64)、[图片水印](https://picx-docs.xpoet.cn/usage-guide/toolbox.html#%E5%9B%BE%E7%89%87%E6%B0%B4%E5%8D%B0)) + +## 贡献 | Contribution + +欢迎各种形式的贡献,包括但不限于:美化界面、增加功能、性能优化、修复 Bug、完善文档等。 + +> [PicX 贡献指南](https://picx-docs.xpoet.cn/user-notice/contribution-guide.html) + +### 致谢 + +这个项目的存在多亏了所有的贡献者,在此表示感谢。 + + + + + +## 反馈 | Feedback + +在使用过程中,如遇问题,请仔细阅读 **[官方文档](https://picx-docs.xpoet.cn)**,或给作者提 **[Issue](https://github.com/XPoet/picx/issues)**。 + +## 赞赏 | Appreciation + +PicX 的更新迭代依靠作者工作之外的时间,维护不易,如果对你有帮助,欢迎赞赏作者,支持开源。 + + + +## 许可 | License + +**[AGPL-3.0](https://github.com/XPoet/picx/blob/master/LICENSE)** + +Copyright © 2020-Present XPoet diff --git a/apps/picx/data.yml b/apps/picx/data.yml new file mode 100644 index 00000000..3221c513 --- /dev/null +++ b/apps/picx/data.yml @@ -0,0 +1,20 @@ +name: PicX +tags: + - 工具 +title: 一款基于 GitHub API 开发的图床工具 +type: 工具 +description: 一款基于 GitHub API 开发的图床工具 +additionalProperties: + key: picx + name: PicX + tags: + - Tool + shortDescZh: 一款基于 GitHub API 开发的图床工具 + shortDescEn: A picture bed tool based on GitHub API + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://picx.xpoet.cn + github: https://github.com/XPoet/picx + document: https://picx-docs.xpoet.cn diff --git a/apps/picx/latest/.env.sample b/apps/picx/latest/.env.sample new file mode 100644 index 00000000..62beff7c --- /dev/null +++ b/apps/picx/latest/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="picx" +PANEL_APP_PORT_HTTP="40131" +DATA_PATH="./data" diff --git a/apps/picx/latest/Dockerfile b/apps/picx/latest/Dockerfile new file mode 100644 index 00000000..2482f9da --- /dev/null +++ b/apps/picx/latest/Dockerfile @@ -0,0 +1,26 @@ +# 使用基于NGINX的稳定版本的Alpine Linux镜像作为基础镜像 +FROM nginx:stable-alpine-slim + +# 设置工作目录为/app +WORKDIR /app + +# 更新包信息并安装git和coreutils软件包 +RUN apk update && \ + apk add --no-cache git coreutils + +# 克隆名为"picx"的GitHub仓库的"gh-pages"分支 +RUN git clone -b gh-pages https://github.com/XPoet/picx + +# 将entrypoint.sh脚本文件复制到工作目录/app/ +COPY entrypoint.sh /app/ +# 赋予entrypoint.sh脚本文件可执行权限 +RUN chmod +x /app/entrypoint.sh + +# 指定要公开的端口 +EXPOSE 80 + +# 切换工作目录至NGINX的默认网页目录 +WORKDIR /usr/share/nginx/ + +# 定义容器启动时的默认命令,执行/app/entrypoint.sh脚本 +CMD ["sh", "-c", "/app/entrypoint.sh"] diff --git a/apps/picx/latest/data.yml b/apps/picx/latest/data.yml new file mode 100644 index 00000000..9d826de2 --- /dev/null +++ b/apps/picx/latest/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: 40131 + 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/picx/latest/docker-compose.yml b/apps/picx/latest/docker-compose.yml new file mode 100644 index 00000000..f5dab2c4 --- /dev/null +++ b/apps/picx/latest/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' +services: + picx: + build: + context: . + dockerfile: Dockerfile + image: picx:latest + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:80" + volumes: + - ${DATA_PATH}:/usr/share/nginx/html + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/picx/latest/entrypoint.sh b/apps/picx/latest/entrypoint.sh new file mode 100644 index 00000000..7f48a9b6 --- /dev/null +++ b/apps/picx/latest/entrypoint.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# 递归地将/app/picx/目录下的内容复制到nginx网页目录 +cp -r /app/picx/* /usr/share/nginx/html/ + +# 设置nginx网页目录的所有者和组为nginx,确保nginx服务器能够访问这些文件 +chown -R nginx:nginx /usr/share/nginx/html + +# 使用find命令递归地设置网页文件夹的权限为755,确保可读和可执行,但不可写 +find /usr/share/nginx/html -type d -exec chmod 755 {} \; + +# 使用find命令递归地设置网页文件的权限为644,确保所有者可读写,其他用户只可读 +find /usr/share/nginx/html -type f -exec chmod 644 {} \; + +# 启动nginx服务器,以前台方式运行 +nginx -g 'daemon off;' diff --git a/apps/picx/logo.png b/apps/picx/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..87f60be801318ad81f7bf78b43145d001895565a GIT binary patch literal 6794 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