convertor/scripts/install-python-tools.sh
Your Name 55b0f519ab refactor(docker): 完整重構 Dockerfile v0.1.16
BREAKING CHANGE: Dockerfile 結構重新設計

## 重構內容

### Multi-Stage Build 結構
- Stage 1 [base]: Bun runtime 基礎
- Stage 2 [install]: Node 依賴安裝
- Stage 3 [prerelease]: 應用程式建構
- Stage 4 [system-tools]: APT 系統工具(拆分為 14 個獨立 RUN)
- Stage 5 [fonts]: 字型安裝
- Stage 6 [python-tools]: Python CLI 工具(拆分為 9 個獨立 RUN)
- Stage 7 [models]: 模型下載
- Stage 8 [release]: 最終 Image

### 新增 Scripts
- install-system-tools.sh: 系統工具安裝
- install-fonts.sh: 字型安裝
- install-python-tools.sh: Python 工具安裝
- download-models.sh: 模型下載
- verify-installation.sh: 完整安裝驗證

### 刪除舊檔案
- Dockerfile.backup
- Dockerfile.offline
- Dockerfile.old

### 路徑更新
- MinerU 模型: /opt/convertx/models/mineru/PDF-Extract-Kit-1.0
- BabelDOC 快取: /root/.cache/babeldoc

### Multi-Arch 支援
- linux/amd64: 功能完整
- linux/arm64: 安全降級(MinerU/resvg 跳過)

Closes #docker-refactor
2026-01-25 13:15:31 +08:00

219 lines
7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# ==============================================================================
# ConvertX-CN Python 工具安裝腳本
# ==============================================================================
# 用途:安裝所有 Python CLI 工具
# 執行環境Docker build stage (python-tools)
# ==============================================================================
set -euo pipefail
# 顏色輸出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}🐍 [INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}✅ [SUCCESS]${NC} $1"; }
log_warn() { echo -e "${YELLOW}⚠️ [WARN]${NC} $1"; }
log_error() { echo -e "${RED}❌ [ERROR]${NC} $1"; }
# 架構檢測
ARCH=$(uname -m)
log_info "檢測架構: ${ARCH}"
# ==============================================================================
# Python 基礎環境
# ==============================================================================
install_python_base() {
log_info "安裝 Python 基礎環境..."
apt-get update --fix-missing
apt-get install -y --no-install-recommends \
python3 \
python3-pip \
python3-venv \
python3-numpy \
python3-tinycss2 \
python3-opencv \
python3-img2pdf
rm -rf /var/lib/apt/lists/*
log_success "Python 基礎環境安裝完成: $(python3 --version)"
}
# ==============================================================================
# uv 套件管理器
# ==============================================================================
install_uv() {
log_info "安裝 uv 套件管理器..."
pip3 install --no-cache-dir --break-system-packages uv
log_success "uv 安裝完成: $(uv --version)"
}
# ==============================================================================
# huggingface_hub模型下載
# ==============================================================================
install_huggingface_hub() {
log_info "安裝 huggingface_hub..."
uv pip install --system --break-system-packages --no-cache huggingface_hub
log_success "huggingface_hub 安裝完成"
}
# ==============================================================================
# endesivePDF 簽章)
# ==============================================================================
install_endesive() {
log_info "安裝 endesivePDF 簽章)..."
# endesive 需要編譯依賴
apt-get update --fix-missing
apt-get install -y --no-install-recommends \
build-essential \
swig \
libpcsclite-dev \
python3-dev
uv pip install --system --break-system-packages --no-cache endesive
# 清理編譯依賴
apt-get remove -y build-essential swig python3-dev
apt-get autoremove -y
rm -rf /var/lib/apt/lists/*
log_success "endesive 安裝完成"
}
# ==============================================================================
# markitdown
# ==============================================================================
install_markitdown() {
log_info "安裝 markitdown..."
uv pip install --system --break-system-packages --no-cache "markitdown[all]"
log_success "markitdown 安裝完成"
}
# ==============================================================================
# pdf2zhPDFMathTranslate
# ==============================================================================
install_pdf2zh() {
log_info "安裝 pdf2zh..."
uv pip install --system --break-system-packages --no-cache pdf2zh
if command -v pdf2zh >/dev/null 2>&1; then
log_success "pdf2zh 安裝完成"
else
log_warn "pdf2zh 可能安裝到非標準路徑"
fi
}
# ==============================================================================
# babeldoc
# ==============================================================================
install_babeldoc() {
log_info "安裝 babeldoc..."
uv pip install --system --break-system-packages --no-cache babeldoc || {
log_warn "babeldoc 安裝可能有警告,但繼續"
}
if command -v babeldoc >/dev/null 2>&1; then
log_success "babeldoc 安裝完成"
else
log_warn "babeldoc 可能安裝到非標準路徑"
fi
}
# ==============================================================================
# MinerU
# ==============================================================================
install_mineru() {
log_info "安裝 MinerU..."
if [ "${ARCH}" = "aarch64" ]; then
log_warn "ARM64MinerU 不完全支援,跳過安裝"
return 0
fi
# 使用 system-level 安裝
uv pip install --system --break-system-packages --no-cache -U "mineru[all]"
# 驗證安裝
if command -v mineru >/dev/null 2>&1; then
log_success "MinerU 安裝完成: $(which mineru)"
mineru --version 2>/dev/null || log_info "(版本資訊可能不可用)"
else
log_warn "MinerU 可能安裝到非標準路徑"
fi
}
# ==============================================================================
# tiktokenBabelDOC 依賴)
# ==============================================================================
install_tiktoken() {
log_info "安裝 tiktoken..."
uv pip install --system --break-system-packages --no-cache tiktoken
log_success "tiktoken 安裝完成"
}
# ==============================================================================
# 驗證安裝
# ==============================================================================
verify_installations() {
log_info "驗證 Python 工具安裝..."
local tools=(
"python3:Python"
"pip3:pip"
"uv:uv"
"markitdown:markitdown"
"pdf2zh:pdf2zh"
"babeldoc:babeldoc"
)
# MinerU 僅在 AMD64
if [ "${ARCH}" != "aarch64" ]; then
tools+=("mineru:MinerU")
fi
echo ""
echo "工具驗證結果:"
for tool_pair in "${tools[@]}"; do
local cmd="${tool_pair%%:*}"
local name="${tool_pair#*:}"
if command -v "${cmd}" >/dev/null 2>&1; then
echo "${name}: $(which "${cmd}")"
else
echo " ⚠️ ${name}: 未在 PATH 中找到"
fi
done
log_success "驗證完成"
}
# ==============================================================================
# 主程式
# ==============================================================================
main() {
log_info "=========================================="
log_info "開始安裝 Python 工具 (${ARCH})"
log_info "=========================================="
install_python_base
install_uv
install_huggingface_hub
install_endesive
install_markitdown
install_pdf2zh
install_babeldoc
install_mineru
install_tiktoken
verify_installations
log_success "=========================================="
log_success "所有 Python 工具安裝完成!"
log_success "=========================================="
}
# 執行
main "$@"