From 1796417b4cd23e188ca3d20decebbc3053aa0f24 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Fri, 18 Jul 2025 12:18:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20Readeck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- apps/readeck/0.19.1/data.yml | 111 +++++++++++++++++++++++ apps/readeck/0.19.1/docker-compose.yml | 30 ++++++ apps/readeck/0.19.1/envs/default.env | 2 + apps/readeck/0.19.1/envs/global.env | 2 + apps/readeck/0.19.1/scripts/init.sh | 17 ++++ apps/readeck/0.19.1/scripts/uninstall.sh | 10 ++ apps/readeck/0.19.1/scripts/upgrade.sh | 17 ++++ apps/readeck/README.md | 66 ++++++++++++++ apps/readeck/data.yml | 14 +++ apps/readeck/logo.png | Bin 0 -> 16970 bytes apps/readeck/logo.svg | 16 ++++ 11 files changed, 285 insertions(+) create mode 100644 apps/readeck/0.19.1/data.yml create mode 100644 apps/readeck/0.19.1/docker-compose.yml create mode 100644 apps/readeck/0.19.1/envs/default.env create mode 100644 apps/readeck/0.19.1/envs/global.env create mode 100644 apps/readeck/0.19.1/scripts/init.sh create mode 100644 apps/readeck/0.19.1/scripts/uninstall.sh create mode 100644 apps/readeck/0.19.1/scripts/upgrade.sh create mode 100644 apps/readeck/README.md create mode 100644 apps/readeck/data.yml create mode 100644 apps/readeck/logo.png create mode 100644 apps/readeck/logo.svg diff --git a/apps/readeck/0.19.1/data.yml b/apps/readeck/0.19.1/data.yml new file mode 100644 index 000000000..a522211d2 --- /dev/null +++ b/apps/readeck/0.19.1/data.yml @@ -0,0 +1,111 @@ +additionalProperties: + formFields: + - default: "/home/readeck" + edit: true + envKey: READECK_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "/" + edit: true + envKey: READECK_SERVER_PREFIX + labelZh: 前缀路径 + labelEn: Prefix path + required: false + type: text + - default: "" + edit: true + envKey: READECK_ALLOWED_HOSTS + labelZh: HTTP 请求中允许的主机名列表 + labelEn: HTTP request allowed host name list + required: false + type: text + - default: "" + edit: true + envKey: READECK_SERVER_BASE_URL + labelZh: 绑定域名 + labelEn: Binding domain + required: false + type: text + - default: 24 + edit: true + envKey: READECK_PUBLIC_SHARE_TTL + labelZh: 分享有效期 + labelEn: Share validity period + required: true + type: number + - default: "smtp.qq.com" + edit: true + envKey: READECK_MAIL_HOST + labelZh: 邮件服务器 + labelEn: Mail Server + required: false + type: text + - default: 465 + edit: true + envKey: READECK_MAIL_PORT + labelZh: 邮件服务器 端口 + labelEn: Mail Server Port + required: false + type: number + - default: "" + edit: true + envKey: READECK_MAIL_USERNAME + labelZh: 邮件鉴权 用户名 + labelEn: Mail Username + required: false + type: text + - default: "" + edit: true + envKey: READECK_MAIL_PASSWORD + labelZh: 邮件鉴权 密码 + labelEn: Mail Password + required: false + type: password + - default: "" + edit: true + envKey: READECK_MAIL_FROM + labelZh: 邮件发送者 + labelEn: Mail Sender + required: false + type: text + - default: "" + edit: true + envKey: READECK_MAIL_FROMNOREPLY + labelZh: 邮件发送者 (无回复) + labelEn: Mail Sender (No Reply) + required: false + type: text + - default: "false" + edit: true + envKey: READECK_MAIL_INSECURE + labelZh: 服务器证书验证 + labelEn: Server certificate verification + required: false + type: select + values: + - label: 不验证 + value: "true" + - label: 验证 + value: "false" + - default: "" + edit: true + envKey: READECK_MAIL_ENCRYPTION + labelZh: SMTP 主机 加密方式 + labelEn: SMTP Host Encryption Method + required: false + type: select + values: + - label: StartTLS + value: "starttls" + - label: SSL/TLS + value: "ssltls" diff --git a/apps/readeck/0.19.1/docker-compose.yml b/apps/readeck/0.19.1/docker-compose.yml new file mode 100644 index 000000000..04d93347c --- /dev/null +++ b/apps/readeck/0.19.1/docker-compose.yml @@ -0,0 +1,30 @@ +networks: + 1panel-network: + external: true + +services: + readeck: + image: codeberg.org/readeck/readeck:0.19.1 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP} + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + healthcheck: + test: [ "CMD", "/bin/readeck", "healthcheck", "-config", "config.toml" ] + interval: 30s + timeout: 2s + retries: 3 + volumes: + - ${READECK_ROOT_PATH}/data:/data + environment: + - TZ=Asia/Shanghai + - READECK_LOG_LEVEL=info + - READECK_SERVER_HOST=0.0.0.0 + - READECK_SERVER_PORT=${PANEL_APP_PORT_HTTP} diff --git a/apps/readeck/0.19.1/envs/default.env b/apps/readeck/0.19.1/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/readeck/0.19.1/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/readeck/0.19.1/envs/global.env b/apps/readeck/0.19.1/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/readeck/0.19.1/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/readeck/0.19.1/scripts/init.sh b/apps/readeck/0.19.1/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/readeck/0.19.1/scripts/init.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/readeck/0.19.1/scripts/uninstall.sh b/apps/readeck/0.19.1/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/readeck/0.19.1/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/readeck/0.19.1/scripts/upgrade.sh b/apps/readeck/0.19.1/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/readeck/0.19.1/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/readeck/README.md b/apps/readeck/README.md new file mode 100644 index 000000000..c73d8c4c8 --- /dev/null +++ b/apps/readeck/README.md @@ -0,0 +1,66 @@ +# Readeck + +Readeck 是一个简单的网络应用程序,可让您保存您喜欢并希望永久保留的网页的宝贵可读内容。 +将其视为书签管理器和稍后阅读工具。 + +![Readeck](https://file.lifebus.top/imgs/readeck_cover.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 简介 + +Readeck 是一个开源的网页内容存档工具,它不仅能像普通书签管理器一样保存链接,还能将网页内容(包括文字、图片甚至视频)完整打包成离线文件。 +就算原网站倒闭跑路,你保存的内容依然妥妥存在自己的服务器里! + +## 特性 + +### 🔖 书签 + +喜欢你正在阅读的页面?把链接粘贴到 Readeck 就完成了! + +### 📸 文章、图片和视频 + +Readeck 会保存网页的可读内容,方便您稍后阅读。它还能检测页面内容是图片还是视频,并相应地调整处理方式。 + +### ⭐ 标签、收藏、存档 + +将书签移动到档案或收藏夹并添加任意数量的标签。 + +### 🖍️ 亮点 + +突出显示书签的重要内容,以便以后轻松找到。 + +### 🗃️ 收藏集 + +如果您需要一个专门的部分来存储过去两周内标有“cat”的所有书签,Readeck 可让您将此搜索查询保存到一个集合中,以便您以后访问它。 + +### 📖 电子书导出 + +还有什么比在电子阅读器上阅读你收藏的文章更棒的呢?你可以将任何文章导出为电子书文件 (EPUB)。你甚至可以将整个收藏集导出为一本书! + +除此之外,如果您的电子阅读器支持 OPDS,您可以直接从电子阅读器访问 Readeck 的目录和收藏。 + +### 🔎 全文搜索 + +无论您需要从文章中查找模糊的文字,还是查找具有特定标签或来自特定网站的所有文章,我们都能满足您的需求! + +### 🚀 快! + +Readeck 是对那些看似枯燥乏味却久经考验的技术产品的现代诠释。它保证了极快的响应时间和流畅的用户体验。 + +### 🔒 专为保护您的隐私和长期存档而打造 + +你喜欢的这篇文章明年还会上线吗?十年后呢?也许不会;也许它连文字和图片都消失了。出于这个原因,也为了保护你的隐私,当你保存链接时,所有文字和图片都会存储在你的 +Readeck 实例中。 +除视频外,您的浏览器不会向外部网站发出任何请求。 + +### 🧩 浏览器扩展 + +想在浏览时保存一些内容以供日后使用?无需复制粘贴链接。安装浏览器扩展程序,一键保存书签! + ++ [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/readeck/) ++ [Google Chrome](https://chromewebstore.google.com/detail/readeck/jnmcpmfimecibicbojhopfkcbmkafhee) + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/readeck/data.yml b/apps/readeck/data.yml new file mode 100644 index 000000000..be5edb244 --- /dev/null +++ b/apps/readeck/data.yml @@ -0,0 +1,14 @@ +additionalProperties: + key: readeck + name: Readeck + tags: + - WebSite + - Local + shortDescZh: 网页内容存档工具 + shortDescEn: web content archiving tool + type: website + crossVersionUpdate: true + limit: 0 + website: https://readeck.org/ + github: https://codeberg.org/readeck/readeck/ + document: https://readeck.org/ diff --git a/apps/readeck/logo.png b/apps/readeck/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a32d613d7ce6b5e9e5d39b1e0db242dac1afb3a4 GIT binary patch literal 16970 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 + + + + + + + +