From d235ba75053ac74b3222e7bed3a6ab59eeeccecf Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 24 Jan 2026 16:01:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=BE=A9=20Dockerfile.lite=20A?= =?UTF-8?q?RM64=20build=20=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 將 Python 安裝分成多個 RUN 步驟 - 修正 apt-get purge 在 lists 清除後失敗的問題 - 添加動態版本號修改步驟到 docker-build-lite.yml - Lite 版 UI 將顯示 X.Y.Z-lite 版本號 --- .github/workflows/docker-build-lite.yml | 59 ++++++++++ .github/workflows/docker-build-remote.yml | 40 +++---- Dockerfile.lite | 19 +++- README.md | 14 +-- docs/部署指南/Docker-Lite.md | 125 +++++++++++----------- docs/部署指南/Docker.md | 12 +-- 6 files changed, 171 insertions(+), 98 deletions(-) diff --git a/.github/workflows/docker-build-lite.yml b/.github/workflows/docker-build-lite.yml index 4f6d0e7..8df7b2b 100644 --- a/.github/workflows/docker-build-lite.yml +++ b/.github/workflows/docker-build-lite.yml @@ -65,6 +65,65 @@ jobs: echo "TAG=${TAG}" >> $GITHUB_OUTPUT echo "📦 版本: ${VERSION}" + # ======================================== + # 動態修改 Lite 版本號(Build-time variant) + # 只在 runner workspace 生效,不 commit 回 repo + # ======================================== + - name: Update version for Lite build + run: | + echo "========================================" + echo "🔧 動態修改 Lite 版本號" + echo "========================================" + + VERSION="${{ steps.version.outputs.VERSION }}" + + # 確保版本號包含 -lite + if [[ "${VERSION}" != *"-lite"* ]]; then + LITE_VERSION="${VERSION}-lite" + else + LITE_VERSION="${VERSION}" + fi + + echo "🔍 Detected base version: ${VERSION}" + echo "✏️ Lite build detected, updating version to: ${LITE_VERSION}" + echo "" + + # 修改 package.json + if [ -f "package.json" ]; then + ORIGINAL_VERSION=$(jq -r '.version' package.json) + echo "📄 package.json 原版本: ${ORIGINAL_VERSION}" + jq --arg v "${LITE_VERSION}" '.version = $v' package.json > package.json.tmp && mv package.json.tmp package.json + echo "✅ package.json 已更新為: ${LITE_VERSION}" + fi + + # 修改 src/version.ts(如存在) + if [ -f "src/version.ts" ]; then + echo "📄 修改 src/version.ts..." + sed -i "s/version.*=.*['\"].*['\"]/version = '${LITE_VERSION}'/" src/version.ts + echo "✅ src/version.ts 已更新" + fi + + # 修改 src/version.js(如存在) + if [ -f "src/version.js" ]; then + echo "📄 修改 src/version.js..." + sed -i "s/version.*=.*['\"].*['\"]/version = '${LITE_VERSION}'/" src/version.js + echo "✅ src/version.js 已更新" + fi + + # 修改 .env(如存在且有 VERSION 變數) + if [ -f ".env" ] && grep -q "^VERSION=" .env; then + echo "📄 修改 .env..." + sed -i "s/^VERSION=.*/VERSION=${LITE_VERSION}/" .env + echo "✅ .env 已更新" + fi + + echo "" + echo "========================================" + echo "✅ Version updated for UI build: ${LITE_VERSION}" + echo "========================================" + echo "" + echo "⚠️ 注意:此修改只影響本次 build,不會 commit 回 repo" + # ======================================== # 清理磁碟空間 # ======================================== diff --git a/.github/workflows/docker-build-remote.yml b/.github/workflows/docker-build-remote.yml index bc81c28..cb6b2ac 100644 --- a/.github/workflows/docker-build-remote.yml +++ b/.github/workflows/docker-build-remote.yml @@ -14,7 +14,7 @@ on: image_tag: description: "📦 版本號(例如:0.1.15、0.1.15-lite、0.1.15.test)" required: true - default: "" + default: "0.1.15.test" type: string build_target: description: "🎯 Build 目標版本(auto = 自動從版本號偵測)" @@ -61,21 +61,21 @@ jobs: echo "========================================" echo "🔧 解析版本設定" echo "========================================" - + INPUT_TAG="${{ github.event.inputs.image_tag }}" BUILD_TARGET_INPUT="${{ github.event.inputs.build_target }}" - + echo "輸入參數:" echo " image_tag: ${INPUT_TAG}" echo " build_target: ${BUILD_TARGET_INPUT}" echo "" - + # 驗證版本號不為空 if [ -z "${INPUT_TAG}" ]; then echo "❌ 錯誤:必須填寫版本號" exit 1 fi - + # ======================================== # 判斷 build target(auto 時根據 tag 自動判斷) # ======================================== @@ -93,14 +93,14 @@ jobs: else FINAL_BUILD_TARGET="${BUILD_TARGET_INPUT}" fi - + # ======================================== # 根據 build target 決定最終 tag # ======================================== # 移除可能的後綴以獲取基礎版本號 BASE_TAG="${INPUT_TAG%-lite}" BASE_TAG="${BASE_TAG%-full}" - + case "${FINAL_BUILD_TARGET}" in "lite") FINAL_TAG="${BASE_TAG}-lite" @@ -121,7 +121,7 @@ jobs: EDITION="一般版(標準版)" ;; esac - + # ======================================== # 判斷是否為正式版本(決定是否更新 latest) # 正式版本格式:純數字+點號(如 0.1.15、0.1.15.1) @@ -134,7 +134,7 @@ jobs: IS_OFFICIAL="false" echo "⚠️ 測試版本:不更新 ${LATEST_TAG}" fi - + echo "" echo "========================================" echo "📋 最終設定:" @@ -146,7 +146,7 @@ jobs: echo " Latest Tag: ${LATEST_TAG}" echo " 正式版本: ${IS_OFFICIAL}" echo "========================================" - + # 輸出到 GITHUB_OUTPUT echo "image_tag=${FINAL_TAG}" >> $GITHUB_OUTPUT echo "base_tag=${BASE_TAG}" >> $GITHUB_OUTPUT @@ -422,19 +422,19 @@ jobs: echo "========================================" echo "🔨 開始 Multi-Arch Docker Build" echo "========================================" - + # 使用 parse_version 步驟的輸出 FINAL_TAG="${{ steps.parse_version.outputs.image_tag }}" DOCKERFILE="${{ steps.parse_version.outputs.dockerfile }}" LATEST_TAG="${{ steps.parse_version.outputs.latest_tag }}" IS_OFFICIAL="${{ steps.parse_version.outputs.is_official }}" EDITION="${{ steps.parse_version.outputs.edition }}" - + echo "🔹 Build 目標: ${EDITION}" echo "🔹 使用 Dockerfile: ${DOCKERFILE}" echo "🔹 版本: v${FINAL_TAG}" echo "🔹 映像名稱: ${{ env.DOCKER_IMAGE_REPO }}:${FINAL_TAG}" - + if [ "${IS_OFFICIAL}" = "true" ]; then echo "✅ 正式版本,將同時標記 ${LATEST_TAG}" ADD_LATEST="true" @@ -528,18 +528,18 @@ jobs: echo "========================================" echo "📤 推送映像到 Docker Hub" echo "========================================" - + # 使用 parse_version 步驟的輸出 FINAL_TAG="${{ steps.parse_version.outputs.image_tag }}" DOCKERFILE="${{ steps.parse_version.outputs.dockerfile }}" LATEST_TAG="${{ steps.parse_version.outputs.latest_tag }}" IS_OFFICIAL="${{ steps.parse_version.outputs.is_official }}" EDITION="${{ steps.parse_version.outputs.edition }}" - + echo "🔹 Push 目標: ${EDITION}" echo "🔹 版本: v${FINAL_TAG}" echo "🔹 映像: ${{ env.DOCKER_IMAGE_REPO }}:${FINAL_TAG}" - + if [ "${IS_OFFICIAL}" = "true" ]; then echo "✅ 正式版本,將同時推送 ${LATEST_TAG}" ADD_LATEST="true" @@ -641,10 +641,10 @@ jobs: echo "========================================" echo "✅ 驗證 Docker Hub 映像" echo "========================================" - + FINAL_TAG="${{ steps.parse_version.outputs.image_tag }}" EDITION="${{ steps.parse_version.outputs.edition }}" - + echo "🔹 版本類型: ${EDITION}" echo "🔹 版本: v${FINAL_TAG}" echo "🔹 映像: ${{ env.DOCKER_IMAGE_REPO }}:${FINAL_TAG}" @@ -737,7 +737,7 @@ jobs: echo "✅ Multi-Arch Docker Build & Push 完成!" echo "========================================" echo "" - + # 使用 parse_version 步驟的輸出 FINAL_TAG="${{ steps.parse_version.outputs.image_tag }}" BASE_TAG="${{ steps.parse_version.outputs.base_tag }}" @@ -745,7 +745,7 @@ jobs: LATEST_TAG="${{ steps.parse_version.outputs.latest_tag }}" IS_OFFICIAL="${{ steps.parse_version.outputs.is_official }}" EDITION="${{ steps.parse_version.outputs.edition }}" - + echo "🏷️ 版本: v${FINAL_TAG}" echo "📦 版本類型: ${EDITION}" echo "" diff --git a/Dockerfile.lite b/Dockerfile.lite index feca456..4c0fe36 100644 --- a/Dockerfile.lite +++ b/Dockerfile.lite @@ -234,7 +234,7 @@ RUN echo "" && \ # ============================================================================== # ============================================================================== -# 🔐 PDF Packager 預設簽章憑證 + Python(合併以減少 layer) +# 🔐 PDF Packager 預設簽章憑證 + Python # ============================================================================== ENV PATH="/root/.local/bin:${PATH}" ENV PIP_NO_CACHE_DIR=1 @@ -244,9 +244,10 @@ ENV PDF_SIGN_REASON="ConvertX-CN Lite PDF Packager" ENV PDF_SIGN_LOCATION="Taiwan" ENV PDF_SIGN_CONTACT="convertx-cn@localhost" +# 階段 7:安裝 Python 和編譯依賴 RUN echo "" && \ echo "========================================" && \ - echo "🔐 安裝 Python + 產生簽章憑證" && \ + echo "🔐 階段 7/8:安裝 Python + 編譯工具" && \ echo "========================================" && \ apt-get update --fix-missing && apt-get install -y --no-install-recommends \ python3 \ @@ -255,6 +256,13 @@ RUN echo "" && \ gcc \ libffi-dev \ && rm -rf /var/lib/apt/lists/* && \ + echo "✅ 階段 7/8 完成:Python + 編譯工具已安裝" + +# 階段 8:安裝 endesive 並產生簽章憑證 +RUN echo "" && \ + echo "========================================" && \ + echo "🔐 階段 8/8:安裝 endesive + 產生憑證" && \ + echo "========================================" && \ pip3 install --no-cache-dir --break-system-packages endesive && \ mkdir -p /app/certs && \ openssl req -x509 -newkey rsa:2048 \ @@ -267,8 +275,13 @@ RUN echo "" && \ -passout pass: && \ rm -f /tmp/key.pem /tmp/cert.pem && \ chmod 644 /app/certs/default.p12 && \ + echo "✅ 階段 8/8 完成:endesive + 簽章憑證已安裝" + +# 清理編譯工具以減小體積 +RUN apt-get update && \ apt-get purge -y --auto-remove gcc python3-dev libffi-dev && \ - echo "✅ Python + PDF 簽章已安裝" + rm -rf /var/lib/apt/lists/* && \ + echo "✅ 編譯工具已清理" # ============================================================================== # 最終清理 + Locale 設定 + 自訂字型(合併以減少 layer) diff --git a/README.md b/README.md index 63566ad..d977430 100644 --- a/README.md +++ b/README.md @@ -153,13 +153,13 @@ docker compose up -d ConvertX-CN 提供兩個版本,滿足不同需求: -| 特性 | Full 版 | Lite 版 | -|------|---------|---------| -| **Image 大小** | 約 8-12 GB | 約 1.5-2.5 GB | -| **部署速度** | 較慢 | 快速 | -| **適用對象** | 進階使用者 | 一般使用者 | -| **OCR/AI/翻譯** | ✅ | ❌ | -| **基本轉檔** | ✅ | ✅ | +| 特性 | Full 版 | Lite 版 | +| --------------- | ---------- | ------------- | +| **Image 大小** | 約 8-12 GB | 約 1.5-2.5 GB | +| **部署速度** | 較慢 | 快速 | +| **適用對象** | 進階使用者 | 一般使用者 | +| **OCR/AI/翻譯** | ✅ | ❌ | +| **基本轉檔** | ✅ | ✅ | ### Lite 版快速啟動 diff --git a/docs/部署指南/Docker-Lite.md b/docs/部署指南/Docker-Lite.md index 7bc4c91..6ac56a7 100644 --- a/docs/部署指南/Docker-Lite.md +++ b/docs/部署指南/Docker-Lite.md @@ -6,37 +6,38 @@ ConvertX-CN Lite 是專為一般使用者設計的輕量版本,提供快速部 ## 📦 什麼是 Lite 版? -| 特性 | Full 版 | Lite 版 | -|------|---------|---------| -| **Image 大小** | 約 8-12 GB | 約 1.2-1.5 GB | -| **部署時間** | 較長(需下載大型模型) | 快速 | -| **記憶體需求** | 較高(AI 模型) | 較低 | -| **適用場景** | 進階使用者、需要 AI/OCR/翻譯 | 一般使用者、基本轉檔需求 | +| 特性 | Full 版 | Lite 版 | +| -------------- | ---------------------------- | ------------------------ | +| **Image 大小** | 約 8-12 GB | 約 1.2-1.5 GB | +| **部署時間** | 較長(需下載大型模型) | 快速 | +| **記憶體需求** | 較高(AI 模型) | 較低 | +| **適用場景** | 進階使用者、需要 AI/OCR/翻譯 | 一般使用者、基本轉檔需求 | --- ## ✅ Lite 版包含的功能 ### 核心功能 + - ✅ **多語言 UI**:完整 i18n 介面(65 種語言) - ✅ **檔案上傳/轉檔/下載**:完整流程支援 - ✅ **轉檔進度與錯誤提示** ### 轉換引擎 -| 引擎 | 功能說明 | 支援格式 | -|------|----------|----------| -| **LibreOffice** | 文件轉檔 | DOC, DOCX, XLS, XLSX, PPT, PPTX, ODT, PDF... | -| **GraphicsMagick** | 圖片轉檔 | PNG, JPG, GIF, WEBP, BMP, TIFF... | -| **FFmpeg** | 影音轉檔(精簡版) | MP4, MP3, WAV, AVI, MKV, MOV... | -| **Pandoc** | 文件格式轉換 | Markdown, HTML, DOCX, LaTeX, EPUB... | +| 引擎 | 功能說明 | 支援格式 | +| ------------------ | ------------------ | -------------------------------------------- | +| **LibreOffice** | 文件轉檔 | DOC, DOCX, XLS, XLSX, PPT, PPTX, ODT, PDF... | +| **GraphicsMagick** | 圖片轉檔 | PNG, JPG, GIF, WEBP, BMP, TIFF... | +| **FFmpeg** | 影音轉檔(精簡版) | MP4, MP3, WAV, AVI, MKV, MOV... | +| **Pandoc** | 文件格式轉換 | Markdown, HTML, DOCX, LaTeX, EPUB... | ### PDF 功能 -| 功能 | 說明 | -|------|------| -| **PDF/A 轉換** | 使用 Ghostscript 轉換為 PDF/A-1b、PDF/A-2b | -| **PDF 防修改** | 使用 qpdf 設定權限保護 | +| 功能 | 說明 | +| ---------------- | ----------------------------------------------- | +| **PDF/A 轉換** | 使用 Ghostscript 轉換為 PDF/A-1b、PDF/A-2b | +| **PDF 防修改** | 使用 qpdf 設定權限保護 | | **PDF 數位簽章** | 使用 PFX/PKCS#12 憑證簽章(單一簽章,不含 LTV) | --- @@ -45,19 +46,19 @@ ConvertX-CN Lite 是專為一般使用者設計的輕量版本,提供快速部 以下功能僅在 Full 版中提供: -| 功能類別 | 功能說明 | -|----------|----------| -| **向量圖轉換** | Inkscape(SVG, PDF, PNG, EPS) | -| **高效能圖片** | VIPS(大型圖片處理) | -| **OCR** | Tesseract OCR 文字辨識 | -| **PDF 翻譯** | PDFMathTranslate、BabelDOC | -| **PDF 轉 Markdown** | MinerU 智能擷取 | -| **AI 模型** | YOLO、VLM 等深度學習模型 | -| **電子書** | Calibre(ePub、MOBI 轉換) | -| **CAD/3D** | assimp、OpenCascade | -| **PDF/A 驗證** | veraPDF | -| **長期驗證** | LTV、OCSP、CRL、TSA | -| **完整 TexLive** | 進階 LaTeX 排版 | +| 功能類別 | 功能說明 | +| ------------------- | ------------------------------ | +| **向量圖轉換** | Inkscape(SVG, PDF, PNG, EPS) | +| **高效能圖片** | VIPS(大型圖片處理) | +| **OCR** | Tesseract OCR 文字辨識 | +| **PDF 翻譯** | PDFMathTranslate、BabelDOC | +| **PDF 轉 Markdown** | MinerU 智能擷取 | +| **AI 模型** | YOLO、VLM 等深度學習模型 | +| **電子書** | Calibre(ePub、MOBI 轉換) | +| **CAD/3D** | assimp、OpenCascade | +| **PDF/A 驗證** | veraPDF | +| **長期驗證** | LTV、OCSP、CRL、TSA | +| **完整 TexLive** | 進階 LaTeX 排版 | --- @@ -101,12 +102,12 @@ docker compose up -d ## 🏷️ Image Tag 說明 -| Tag | 說明 | -|-----|------| -| `convertx/convertx-cn:latest` | Full 版最新穩定版 | +| Tag | 說明 | +| ---------------------------------- | ----------------- | +| `convertx/convertx-cn:latest` | Full 版最新穩定版 | | `convertx/convertx-cn:latest-lite` | Lite 版最新穩定版 | -| `convertx/convertx-cn:0.1.15` | Full 版指定版本 | -| `convertx/convertx-cn:0.1.15-lite` | Lite 版指定版本 | +| `convertx/convertx-cn:0.1.15` | Full 版指定版本 | +| `convertx/convertx-cn:0.1.15-lite` | Lite 版指定版本 | --- @@ -158,7 +159,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ ```yaml services: convertx: - image: convertx/convertx-cn:latest # Full 版 + image: convertx/convertx-cn:latest # Full 版 ``` ### ⚠️ 重要提醒 @@ -171,33 +172,33 @@ services: ## 📊 Lite vs Full 功能對照表 -| 功能類別 | 功能 | Lite | Full | -|----------|------|:----:|:----:| -| **UI** | 多語言介面(65 語言) | ✅ | ✅ | -| **UI** | 深色/淺色主題 | ✅ | ✅ | -| **轉檔** | 文件轉檔(LibreOffice) | ✅ | ✅ | -| **轉檔** | 圖片轉檔(GraphicsMagick) | ✅ | ✅ | -| **轉檔** | 圖片轉檔(ImageMagick) | ❌ | ✅ | -| **轉檔** | 影音轉檔(FFmpeg) | ✅ | ✅ | -| **轉檔** | 文件格式(Pandoc) | ✅ | ✅ | -| **轉檔** | 向量圖(Inkscape) | ❌ | ✅ | -| **轉檔** | 高效能圖片(VIPS) | ❌ | ✅ | -| **轉檔** | 電子書(Calibre) | ❌ | ✅ | -| **轉檔** | CAD/3D(assimp) | ❌ | ✅ | -| **PDF** | PDF/A 轉換 | ✅ | ✅ | -| **PDF** | PDF 防修改 | ✅ | ✅ | -| **PDF** | PDF 數位簽章 | ✅ | ✅ | -| **PDF** | PDF/A 驗證(veraPDF) | ❌ | ✅ | -| **PDF** | 長期驗證(LTV) | ❌ | ✅ | -| **OCR** | 文字辨識(Tesseract) | ❌ | ✅ | -| **OCR** | ocrmypdf | ❌ | ✅ | -| **AI** | PDF 翻譯(PDFMathTranslate) | ❌ | ✅ | -| **AI** | PDF 翻譯(BabelDOC) | ❌ | ✅ | -| **AI** | PDF 轉 Markdown(MinerU) | ❌ | ✅ | -| **字型** | 基本 CJK 字型 | ✅ | ✅ | -| **字型** | 完整 Noto 字型集 | ❌ | ✅ | -| **LaTeX** | 基本 LaTeX | ❌ | ✅ | -| **LaTeX** | 完整 TexLive CJK | ❌ | ✅ | +| 功能類別 | 功能 | Lite | Full | +| --------- | ---------------------------- | :--: | :--: | +| **UI** | 多語言介面(65 語言) | ✅ | ✅ | +| **UI** | 深色/淺色主題 | ✅ | ✅ | +| **轉檔** | 文件轉檔(LibreOffice) | ✅ | ✅ | +| **轉檔** | 圖片轉檔(GraphicsMagick) | ✅ | ✅ | +| **轉檔** | 圖片轉檔(ImageMagick) | ❌ | ✅ | +| **轉檔** | 影音轉檔(FFmpeg) | ✅ | ✅ | +| **轉檔** | 文件格式(Pandoc) | ✅ | ✅ | +| **轉檔** | 向量圖(Inkscape) | ❌ | ✅ | +| **轉檔** | 高效能圖片(VIPS) | ❌ | ✅ | +| **轉檔** | 電子書(Calibre) | ❌ | ✅ | +| **轉檔** | CAD/3D(assimp) | ❌ | ✅ | +| **PDF** | PDF/A 轉換 | ✅ | ✅ | +| **PDF** | PDF 防修改 | ✅ | ✅ | +| **PDF** | PDF 數位簽章 | ✅ | ✅ | +| **PDF** | PDF/A 驗證(veraPDF) | ❌ | ✅ | +| **PDF** | 長期驗證(LTV) | ❌ | ✅ | +| **OCR** | 文字辨識(Tesseract) | ❌ | ✅ | +| **OCR** | ocrmypdf | ❌ | ✅ | +| **AI** | PDF 翻譯(PDFMathTranslate) | ❌ | ✅ | +| **AI** | PDF 翻譯(BabelDOC) | ❌ | ✅ | +| **AI** | PDF 轉 Markdown(MinerU) | ❌ | ✅ | +| **字型** | 基本 CJK 字型 | ✅ | ✅ | +| **字型** | 完整 Noto 字型集 | ❌ | ✅ | +| **LaTeX** | 基本 LaTeX | ❌ | ✅ | +| **LaTeX** | 完整 TexLive CJK | ❌ | ✅ | --- diff --git a/docs/部署指南/Docker.md b/docs/部署指南/Docker.md index 189500b..9c3561b 100644 --- a/docs/部署指南/Docker.md +++ b/docs/部署指南/Docker.md @@ -10,12 +10,12 @@ ### 官方預建版(推薦) -| Tag | 說明 | -| ---------------------------------- | -------------------- | -| `convertx/convertx-cn:latest` | Full 版最新穩定版 | -| `convertx/convertx-cn:latest-lite` | Lite 版最新穩定版 | -| `convertx/convertx-cn:v0.1.x` | Full 版指定版本號 | -| `convertx/convertx-cn:v0.1.x-lite` | Lite 版指定版本號 | +| Tag | 說明 | +| ---------------------------------- | ----------------- | +| `convertx/convertx-cn:latest` | Full 版最新穩定版 | +| `convertx/convertx-cn:latest-lite` | Lite 版最新穩定版 | +| `convertx/convertx-cn:v0.1.x` | Full 版指定版本號 | +| `convertx/convertx-cn:v0.1.x-lite` | Lite 版指定版本號 | ### Full 版(預設)