From 80a3d929668b4f7ad63bed3f3e45003f2fc1f168 Mon Sep 17 00:00:00 2001 From: okxlin <61420215+okxlin@users.noreply.github.com> Date: Fri, 31 Jul 2026 06:39:18 +0800 Subject: [PATCH] feat: add PdfDing --- apps/pdfding/1.11.0/.env.sample | 9 ++ apps/pdfding/1.11.0/data.yml | 153 +++++++++++++++++++++++ apps/pdfding/1.11.0/docker-compose.yml | 32 +++++ apps/pdfding/1.11.0/scripts/init.sh | 9 ++ apps/pdfding/1.11.0/scripts/uninstall.sh | 2 + apps/pdfding/1.11.0/scripts/upgrade.sh | 3 + apps/pdfding/README.md | 39 ++++++ apps/pdfding/data.yml | 31 +++++ apps/pdfding/latest/.env.sample | 9 ++ apps/pdfding/latest/data.yml | 153 +++++++++++++++++++++++ apps/pdfding/latest/docker-compose.yml | 32 +++++ apps/pdfding/latest/scripts/init.sh | 9 ++ apps/pdfding/latest/scripts/uninstall.sh | 2 + apps/pdfding/latest/scripts/upgrade.sh | 3 + apps/pdfding/logo.png | Bin 0 -> 2724 bytes 15 files changed, 486 insertions(+) create mode 100644 apps/pdfding/1.11.0/.env.sample create mode 100644 apps/pdfding/1.11.0/data.yml create mode 100644 apps/pdfding/1.11.0/docker-compose.yml create mode 100755 apps/pdfding/1.11.0/scripts/init.sh create mode 100755 apps/pdfding/1.11.0/scripts/uninstall.sh create mode 100755 apps/pdfding/1.11.0/scripts/upgrade.sh create mode 100644 apps/pdfding/README.md create mode 100644 apps/pdfding/data.yml create mode 100644 apps/pdfding/latest/.env.sample create mode 100644 apps/pdfding/latest/data.yml create mode 100644 apps/pdfding/latest/docker-compose.yml create mode 100755 apps/pdfding/latest/scripts/init.sh create mode 100755 apps/pdfding/latest/scripts/uninstall.sh create mode 100755 apps/pdfding/latest/scripts/upgrade.sh create mode 100644 apps/pdfding/logo.png diff --git a/apps/pdfding/1.11.0/.env.sample b/apps/pdfding/1.11.0/.env.sample new file mode 100644 index 000000000..7ebc054bb --- /dev/null +++ b/apps/pdfding/1.11.0/.env.sample @@ -0,0 +1,9 @@ +CONTAINER_NAME=pdfding +PANEL_APP_PORT_HTTP=8000 +PDFDING_HOST_NAME=* +PDFDING_SECRET_KEY=replace-with-a-random-application-secret +PDFDING_CSRF_COOKIE_SECURE=FALSE +PDFDING_SESSION_COOKIE_SECURE=FALSE +PDFDING_DISABLE_USER_SIGNUP=FALSE +PDFDING_ACCOUNT_PROTOCOL=http +TZ=Asia/Shanghai diff --git a/apps/pdfding/1.11.0/data.yml b/apps/pdfding/1.11.0/data.yml new file mode 100644 index 000000000..bf8878942 --- /dev/null +++ b/apps/pdfding/1.11.0/data.yml @@ -0,0 +1,153 @@ +additionalProperties: + formFields: + - default: 8000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: Порт HTTP + ms: Port HTTP + pt-br: Porta HTTP + required: true + rule: paramPort + type: number + - default: "*" + edit: true + envKey: PDFDING_HOST_NAME + labelEn: Allowed Hosts + labelZh: 允许的主机 + label: + en: Allowed Hosts + zh: 允许的主机 + zh-Hant: 允許的主機 + ja: 許可するホスト + ko: 허용된 호스트 + ru: Разрешенные хосты + ms: Hos yang dibenarkan + pt-br: Hosts permitidos + required: true + type: text + - default: "" + edit: true + envKey: PDFDING_SECRET_KEY + labelEn: Application Secret + labelZh: 应用密钥 + label: + en: Application Secret + zh: 应用密钥 + zh-Hant: 應用程式密鑰 + ja: アプリケーションシークレット + ko: 애플리케이션 비밀 키 + ru: Секрет приложения + ms: Rahsia aplikasi + pt-br: Segredo do aplicativo + random: true + required: true + rule: paramComplexity + type: password + - default: "FALSE" + edit: true + envKey: PDFDING_CSRF_COOKIE_SECURE + labelEn: Secure CSRF Cookie + labelZh: 安全 CSRF Cookie + label: + en: Secure CSRF Cookie + zh: 安全 CSRF Cookie + zh-Hant: 安全 CSRF Cookie + ja: セキュア CSRF Cookie + ko: 보안 CSRF Cookie + ru: Защищенный CSRF Cookie + ms: Cookie CSRF selamat + pt-br: Cookie CSRF seguro + required: true + type: select + values: + - label: "Disabled" + value: "FALSE" + - label: "Enabled" + value: "TRUE" + - default: "FALSE" + edit: true + envKey: PDFDING_SESSION_COOKIE_SECURE + labelEn: Secure Session Cookie + labelZh: 安全会话 Cookie + label: + en: Secure Session Cookie + zh: 安全会话 Cookie + zh-Hant: 安全工作階段 Cookie + ja: セキュアセッション Cookie + ko: 보안 세션 Cookie + ru: Защищенный Cookie сеанса + ms: Cookie sesi selamat + pt-br: Cookie de sessão seguro + required: true + type: select + values: + - label: "Disabled" + value: "FALSE" + - label: "Enabled" + value: "TRUE" + - default: "FALSE" + edit: true + envKey: PDFDING_DISABLE_USER_SIGNUP + labelEn: Disable User Signup + labelZh: 禁止用户注册 + label: + en: Disable User Signup + zh: 禁止用户注册 + zh-Hant: 禁止使用者註冊 + ja: ユーザー登録を無効化 + ko: 사용자 가입 비활성화 + ru: Отключить регистрацию пользователей + ms: Lumpuhkan pendaftaran pengguna + pt-br: Desativar cadastro de usuários + required: true + type: select + values: + - label: "No" + value: "FALSE" + - label: "Yes" + value: "TRUE" + - default: http + edit: true + envKey: PDFDING_ACCOUNT_PROTOCOL + labelEn: Public URL Scheme + labelZh: 公共 URL 协议 + label: + en: Public URL Scheme + zh: 公共 URL 协议 + zh-Hant: 公開 URL 通訊協定 + ja: 公開 URL スキーム + ko: 공개 URL 스킴 + ru: Схема публичного URL + ms: Skema URL awam + pt-br: Esquema da URL pública + required: true + type: select + values: + - label: HTTP + value: http + - label: HTTPS + value: https + - default: Asia/Shanghai + edit: true + envKey: TZ + labelEn: Time Zone + labelZh: 时区 + label: + en: Time Zone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text diff --git a/apps/pdfding/1.11.0/docker-compose.yml b/apps/pdfding/1.11.0/docker-compose.yml new file mode 100644 index 000000000..0390f00c3 --- /dev/null +++ b/apps/pdfding/1.11.0/docker-compose.yml @@ -0,0 +1,32 @@ +services: + pdfding: + image: "mrmn/pdfding:v1.11.0" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:8000" + volumes: + - "./data/db:/home/nonroot/pdfding/db" + - "./data/media:/home/nonroot/pdfding/media" + environment: + - TZ=${TZ} + - SECRET_KEY=${PDFDING_SECRET_KEY} + - HOST_NAME=${PDFDING_HOST_NAME} + - CSRF_COOKIE_SECURE=${PDFDING_CSRF_COOKIE_SECURE} + - SESSION_COOKIE_SECURE=${PDFDING_SESSION_COOKIE_SECURE} + - DISABLE_USER_SIGNUP=${PDFDING_DISABLE_USER_SIGNUP} + - ACCOUNT_DEFAULT_HTTP_PROTOCOL=${PDFDING_ACCOUNT_PROTOCOL} + healthcheck: + test: ["CMD-SHELL", "wget -q -O - http://127.0.0.1:8000/healthz >/dev/null || exit 1"] + interval: 10s + timeout: 5s + start_period: 30s + retries: 12 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/pdfding/1.11.0/scripts/init.sh b/apps/pdfding/1.11.0/scripts/init.sh new file mode 100755 index 000000000..bd556b2af --- /dev/null +++ b/apps/pdfding/1.11.0/scripts/init.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +umask 027 +mkdir -p -- "$ROOT_DIR/data/db" "$ROOT_DIR/data/media" +chown 1000:1000 -- "$ROOT_DIR/data/db" "$ROOT_DIR/data/media" 2>/dev/null || true +chmod 0750 -- "$ROOT_DIR/data/db" "$ROOT_DIR/data/media" diff --git a/apps/pdfding/1.11.0/scripts/uninstall.sh b/apps/pdfding/1.11.0/scripts/uninstall.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/pdfding/1.11.0/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/pdfding/1.11.0/scripts/upgrade.sh b/apps/pdfding/1.11.0/scripts/upgrade.sh new file mode 100755 index 000000000..9879df4c3 --- /dev/null +++ b/apps/pdfding/1.11.0/scripts/upgrade.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -euo pipefail +exit 0 diff --git a/apps/pdfding/README.md b/apps/pdfding/README.md new file mode 100644 index 000000000..d1e99a932 --- /dev/null +++ b/apps/pdfding/README.md @@ -0,0 +1,39 @@ +# PdfDing + +## 产品介绍 + +PdfDing 是一个自托管的 PDF 管理、阅读与编辑工具,支持跨设备阅读进度、工作区与集合、标签、批量操作、分享、批注、签名和双因素认证。 + +## 主要功能 + +- 在浏览器中上传、管理、阅读和编辑 PDF +- 使用工作区、集合、多级标签、收藏和归档组织文档 +- 添加高亮、评论、绘图、文本和签名 +- 通过链接或二维码分享 PDF 和集合 +- 支持本地账户、OIDC 单点登录和双因素认证 + +## 访问说明 + +- 安装后访问 `http://<服务器 IP>:<配置端口>` 并注册首个本地账户 +- 默认配置适用于 HTTP 直连;通过 HTTPS 反向代理访问时,请将公开 URL 协议设为 HTTPS、启用安全 Cookie,并将允许的主机设置为实际域名 +- 数据库和上传的 PDF 分别保存在版本目录的 `data/db` 与 `data/media` 中 + +## Introduction + +PdfDing is a self-hosted PDF manager, viewer and editor with reading progress, workspaces, collections, tags, sharing, annotations, signatures and two-factor authentication. + +## Features + +- Upload, organize, read and edit PDFs in a browser +- Organize documents with workspaces, collections, nested tags, starring and archiving +- Add highlights, comments, drawings, text and signatures +- Share PDFs and collections by link or QR code +- Use local accounts, OIDC single sign-on and two-factor authentication + +## Access + +- Open `http://:` and register the first local account +- The defaults are intended for direct HTTP access; select HTTPS as the public URL scheme, enable secure cookies and set the actual host when using an HTTPS reverse proxy +- The SQLite database and uploaded PDFs are stored under `data/db` and `data/media` in the selected version directory + +Official documentation: diff --git a/apps/pdfding/data.yml b/apps/pdfding/data.yml new file mode 100644 index 000000000..92514685b --- /dev/null +++ b/apps/pdfding/data.yml @@ -0,0 +1,31 @@ +name: PdfDing +tags: +- Tool +title: 自托管 PDF 管理、阅读与编辑工具 +description: 自托管 PDF 管理、阅读与编辑工具 +additionalProperties: + key: pdfding + name: PdfDing + tags: + - Tool + shortDescZh: 自托管 PDF 管理、阅读与编辑工具 + shortDescEn: A self-hosted PDF manager, viewer and editor + description: + en: A self-hosted PDF manager, viewer and editor + zh: 自托管 PDF 管理、阅读与编辑工具 + zh-Hant: 自架 PDF 管理、閱讀與編輯工具 + ja: セルフホスト型の PDF 管理、閲覧、編集ツール + ko: 자체 호스팅 PDF 관리, 보기 및 편집 도구 + ru: Самостоятельно размещаемый менеджер, просмотрщик и редактор PDF + ms: Pengurus, pemapar dan penyunting PDF hos kendiri + pt-br: Gerenciador, visualizador e editor de PDF auto-hospedado + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://www.pdfding.com + github: https://github.com/mrmn2/PdfDing + document: https://docs.pdfding.com/getting_started/docker/ + architectures: + - amd64 + - arm64 diff --git a/apps/pdfding/latest/.env.sample b/apps/pdfding/latest/.env.sample new file mode 100644 index 000000000..7ebc054bb --- /dev/null +++ b/apps/pdfding/latest/.env.sample @@ -0,0 +1,9 @@ +CONTAINER_NAME=pdfding +PANEL_APP_PORT_HTTP=8000 +PDFDING_HOST_NAME=* +PDFDING_SECRET_KEY=replace-with-a-random-application-secret +PDFDING_CSRF_COOKIE_SECURE=FALSE +PDFDING_SESSION_COOKIE_SECURE=FALSE +PDFDING_DISABLE_USER_SIGNUP=FALSE +PDFDING_ACCOUNT_PROTOCOL=http +TZ=Asia/Shanghai diff --git a/apps/pdfding/latest/data.yml b/apps/pdfding/latest/data.yml new file mode 100644 index 000000000..bf8878942 --- /dev/null +++ b/apps/pdfding/latest/data.yml @@ -0,0 +1,153 @@ +additionalProperties: + formFields: + - default: 8000 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: Порт HTTP + ms: Port HTTP + pt-br: Porta HTTP + required: true + rule: paramPort + type: number + - default: "*" + edit: true + envKey: PDFDING_HOST_NAME + labelEn: Allowed Hosts + labelZh: 允许的主机 + label: + en: Allowed Hosts + zh: 允许的主机 + zh-Hant: 允許的主機 + ja: 許可するホスト + ko: 허용된 호스트 + ru: Разрешенные хосты + ms: Hos yang dibenarkan + pt-br: Hosts permitidos + required: true + type: text + - default: "" + edit: true + envKey: PDFDING_SECRET_KEY + labelEn: Application Secret + labelZh: 应用密钥 + label: + en: Application Secret + zh: 应用密钥 + zh-Hant: 應用程式密鑰 + ja: アプリケーションシークレット + ko: 애플리케이션 비밀 키 + ru: Секрет приложения + ms: Rahsia aplikasi + pt-br: Segredo do aplicativo + random: true + required: true + rule: paramComplexity + type: password + - default: "FALSE" + edit: true + envKey: PDFDING_CSRF_COOKIE_SECURE + labelEn: Secure CSRF Cookie + labelZh: 安全 CSRF Cookie + label: + en: Secure CSRF Cookie + zh: 安全 CSRF Cookie + zh-Hant: 安全 CSRF Cookie + ja: セキュア CSRF Cookie + ko: 보안 CSRF Cookie + ru: Защищенный CSRF Cookie + ms: Cookie CSRF selamat + pt-br: Cookie CSRF seguro + required: true + type: select + values: + - label: "Disabled" + value: "FALSE" + - label: "Enabled" + value: "TRUE" + - default: "FALSE" + edit: true + envKey: PDFDING_SESSION_COOKIE_SECURE + labelEn: Secure Session Cookie + labelZh: 安全会话 Cookie + label: + en: Secure Session Cookie + zh: 安全会话 Cookie + zh-Hant: 安全工作階段 Cookie + ja: セキュアセッション Cookie + ko: 보안 세션 Cookie + ru: Защищенный Cookie сеанса + ms: Cookie sesi selamat + pt-br: Cookie de sessão seguro + required: true + type: select + values: + - label: "Disabled" + value: "FALSE" + - label: "Enabled" + value: "TRUE" + - default: "FALSE" + edit: true + envKey: PDFDING_DISABLE_USER_SIGNUP + labelEn: Disable User Signup + labelZh: 禁止用户注册 + label: + en: Disable User Signup + zh: 禁止用户注册 + zh-Hant: 禁止使用者註冊 + ja: ユーザー登録を無効化 + ko: 사용자 가입 비활성화 + ru: Отключить регистрацию пользователей + ms: Lumpuhkan pendaftaran pengguna + pt-br: Desativar cadastro de usuários + required: true + type: select + values: + - label: "No" + value: "FALSE" + - label: "Yes" + value: "TRUE" + - default: http + edit: true + envKey: PDFDING_ACCOUNT_PROTOCOL + labelEn: Public URL Scheme + labelZh: 公共 URL 协议 + label: + en: Public URL Scheme + zh: 公共 URL 协议 + zh-Hant: 公開 URL 通訊協定 + ja: 公開 URL スキーム + ko: 공개 URL 스킴 + ru: Схема публичного URL + ms: Skema URL awam + pt-br: Esquema da URL pública + required: true + type: select + values: + - label: HTTP + value: http + - label: HTTPS + value: https + - default: Asia/Shanghai + edit: true + envKey: TZ + labelEn: Time Zone + labelZh: 时区 + label: + en: Time Zone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text diff --git a/apps/pdfding/latest/docker-compose.yml b/apps/pdfding/latest/docker-compose.yml new file mode 100644 index 000000000..7ae2d4b3f --- /dev/null +++ b/apps/pdfding/latest/docker-compose.yml @@ -0,0 +1,32 @@ +services: + pdfding: + image: "mrmn/pdfding:latest" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:8000" + volumes: + - "./data/db:/home/nonroot/pdfding/db" + - "./data/media:/home/nonroot/pdfding/media" + environment: + - TZ=${TZ} + - SECRET_KEY=${PDFDING_SECRET_KEY} + - HOST_NAME=${PDFDING_HOST_NAME} + - CSRF_COOKIE_SECURE=${PDFDING_CSRF_COOKIE_SECURE} + - SESSION_COOKIE_SECURE=${PDFDING_SESSION_COOKIE_SECURE} + - DISABLE_USER_SIGNUP=${PDFDING_DISABLE_USER_SIGNUP} + - ACCOUNT_DEFAULT_HTTP_PROTOCOL=${PDFDING_ACCOUNT_PROTOCOL} + healthcheck: + test: ["CMD-SHELL", "wget -q -O - http://127.0.0.1:8000/healthz >/dev/null || exit 1"] + interval: 10s + timeout: 5s + start_period: 30s + retries: 12 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/pdfding/latest/scripts/init.sh b/apps/pdfding/latest/scripts/init.sh new file mode 100755 index 000000000..bd556b2af --- /dev/null +++ b/apps/pdfding/latest/scripts/init.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +umask 027 +mkdir -p -- "$ROOT_DIR/data/db" "$ROOT_DIR/data/media" +chown 1000:1000 -- "$ROOT_DIR/data/db" "$ROOT_DIR/data/media" 2>/dev/null || true +chmod 0750 -- "$ROOT_DIR/data/db" "$ROOT_DIR/data/media" diff --git a/apps/pdfding/latest/scripts/uninstall.sh b/apps/pdfding/latest/scripts/uninstall.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/pdfding/latest/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/pdfding/latest/scripts/upgrade.sh b/apps/pdfding/latest/scripts/upgrade.sh new file mode 100755 index 000000000..9879df4c3 --- /dev/null +++ b/apps/pdfding/latest/scripts/upgrade.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -euo pipefail +exit 0 diff --git a/apps/pdfding/logo.png b/apps/pdfding/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a37f7a2e46267ef8e3a0f6027b5022f9197c0a5c GIT binary patch literal 2724 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