332 lines
13 KiB
YAML
332 lines
13 KiB
YAML
# ==============================================================================
|
||
# ConvertX-CN Docker Compose 教學版範例
|
||
#
|
||
# 📚 這份範例的設計理念:
|
||
# - 刻意保留完整註解,讓第一次用 Docker 的人也能成功部署
|
||
# - 每個設定都有說明其用途與風險
|
||
# - 如果你是 Docker 老手,可以自行精簡
|
||
#
|
||
# 🎉 這是完整版 image,已內建所有轉換依賴:
|
||
# - LibreOffice (headless) - 文件轉換
|
||
# - TexLive Full - LaTeX 完整版(含 CJK、阿拉伯、希伯來語支援)
|
||
# - Tesseract OCR + 中日韓英德法語言包
|
||
# - CJK 字型(Noto CJK、標楷體、微軟核心字型)
|
||
# - Pandoc、FFmpeg、ImageMagick、Calibre 等所有轉換器
|
||
#
|
||
# ✅ 使用者不需要自己寫 Dockerfile
|
||
# ✅ 直接 docker compose up -d 即可使用
|
||
#
|
||
# ⚠️ 部署前必做:
|
||
# 1. 先建立 data 資料夾(見 README.md 步驟 2)
|
||
# 2. 修改 JWT_SECRET 為你自己的隨機字串
|
||
#
|
||
# ==============================================================================
|
||
# 🆕 API Server(選用功能)
|
||
# ==============================================================================
|
||
#
|
||
# ConvertX 現在提供獨立的 REST / GraphQL API Server!
|
||
#
|
||
# ⚠️ 預設不啟動 API Server
|
||
# 一般使用者只需要 Web UI,不需要啟動 API
|
||
#
|
||
# 🚀 如何啟用 API Server?
|
||
# 使用 profile 功能:
|
||
#
|
||
# # 只啟動 Web UI(預設行為)
|
||
# docker compose up -d
|
||
#
|
||
# # 同時啟動 Web UI + API Server
|
||
# docker compose --profile api up -d
|
||
#
|
||
# 📖 API 文件請參考:api-server/README.md
|
||
#
|
||
# ==============================================================================
|
||
|
||
services:
|
||
convertx:
|
||
# =========================================================================
|
||
# 映像檔設定
|
||
# =========================================================================
|
||
# convertx-cn 是完整版,已內建所有轉換工具
|
||
# ⚠️ 首次下載約 4-6 GB,請耐心等待
|
||
image: convertx/convertx-cn:latest
|
||
|
||
# 容器名稱,方便識別與管理
|
||
container_name: convertx-cn
|
||
|
||
# 重啟策略:
|
||
# - unless-stopped:除非手動停止,否則自動重啟(推薦)
|
||
# - always:永遠自動重啟
|
||
# - no:不自動重啟
|
||
restart: unless-stopped
|
||
|
||
# =========================================================================
|
||
# 連接埠設定
|
||
# =========================================================================
|
||
# 格式:「主機埠號:容器埠號」
|
||
#
|
||
# 範例:
|
||
# - "3000:3000" → http://localhost:3000
|
||
# - "8080:3000" → http://localhost:8080
|
||
# - "80:3000" → http://localhost(需要 root 權限)
|
||
#
|
||
# 💡 若 3000 埠被佔用,改第一個數字即可
|
||
ports:
|
||
- "3000:3000"
|
||
|
||
# =========================================================================
|
||
# 資料儲存設定(⚠️ 非常重要)
|
||
# =========================================================================
|
||
# 格式:「主機路徑:容器路徑」
|
||
#
|
||
# ./data 是你主機上的實體資料夾(相對於 docker-compose.yml 的位置)
|
||
# /app/data 是容器內的路徑
|
||
#
|
||
# 這裡存放:
|
||
# 📁 上傳的檔案
|
||
# 📁 轉換後的結果
|
||
# 📁 使用者帳號資料(SQLite 資料庫)
|
||
#
|
||
# 🚨 重要提醒:
|
||
# 1. 請務必先建立 data 資料夾再啟動容器!
|
||
# 若資料夾不存在,Docker 可能會建立「匿名 volume」,
|
||
# 這會導致容器刪除後資料全部遺失,且難以找回。
|
||
#
|
||
# 2. 如果你想用 Docker named volume 取代本地資料夾:
|
||
# - convertx_data:/app/data
|
||
# 但資料會存在 Docker 內部,較難直接存取與備份。
|
||
#
|
||
# 3. 建議定期備份 data 資料夾!
|
||
volumes:
|
||
- ./data:/app/data
|
||
|
||
# =========================================================================
|
||
# 環境變數設定
|
||
# =========================================================================
|
||
environment:
|
||
# -----------------------------------------------------------------------
|
||
# 時區設定
|
||
# -----------------------------------------------------------------------
|
||
# 影響檔案時間戳記與日期顯示格式
|
||
# 常用值:Asia/Taipei, Asia/Shanghai, America/New_York, Europe/London
|
||
- TZ=Asia/Taipei
|
||
|
||
# -----------------------------------------------------------------------
|
||
# JWT 密鑰(🔐 強烈建議設定)
|
||
# -----------------------------------------------------------------------
|
||
# 用於使用者登入驗證的加密金鑰
|
||
#
|
||
# ⚠️ 若不設定會怎樣?
|
||
# 系統會使用 randomUUID() 產生臨時金鑰,
|
||
# 但每次容器重啟後金鑰會改變,導致:
|
||
# → 所有使用者的登入狀態失效
|
||
# → 所有人都需要重新登入
|
||
#
|
||
# ✅ 正確做法:
|
||
# 設定一個長且隨機的字串(建議 32 字元以上)
|
||
# 可以用 openssl rand -hex 32 產生
|
||
#
|
||
# 🚨 請務必將下面的值改成你自己的!
|
||
- JWT_SECRET=請改成你自己的長隨機字串-至少32個字元-不要用這個預設值
|
||
|
||
# -----------------------------------------------------------------------
|
||
# 帳號註冊設定
|
||
# -----------------------------------------------------------------------
|
||
# true = 允許任何人註冊新帳號
|
||
# false = 關閉註冊功能
|
||
#
|
||
# 💡 注意:首次註冊的帳號不受此限制
|
||
# 即使設為 false,仍可註冊第一個帳號(管理員)
|
||
#
|
||
# 📌 建議:
|
||
# - 首次部署時設為 true,註冊好帳號後改為 false
|
||
# - 或者直接設為 false,只用第一個註冊的帳號
|
||
- ACCOUNT_REGISTRATION=true
|
||
|
||
# -----------------------------------------------------------------------
|
||
# HTTP 存取設定(🔒 安全性相關)
|
||
# -----------------------------------------------------------------------
|
||
# true = 允許非 HTTPS 連線
|
||
# false = 必須 HTTPS 連線(Cookie 設定 Secure 屬性)
|
||
#
|
||
# ⚠️ 這個設定影響登入功能是否正常運作!
|
||
#
|
||
# 📌 設定指南:
|
||
# 🏠 本地測試(http://localhost) → true
|
||
# 🌐 遠端部署且有 HTTPS → false
|
||
# 🌐 遠端部署但沒有 HTTPS(不建議) → true(但不安全)
|
||
#
|
||
# 🚨 常見問題:
|
||
# 若設為 false 但實際用 HTTP 存取,
|
||
# 會導致「登入後又被導回登入頁」的問題
|
||
- HTTP_ALLOWED=true
|
||
|
||
# -----------------------------------------------------------------------
|
||
# Reverse Proxy 信任設定
|
||
# -----------------------------------------------------------------------
|
||
# 若你透過 Nginx / Traefik / Cloudflare / Caddy 等存取,設為 true
|
||
#
|
||
# 作用:讓應用程式信任 X-Forwarded-Proto 等 header,
|
||
# 正確判斷連線是否為 HTTPS
|
||
#
|
||
# 📌 設定指南:
|
||
# 直接存取容器(無 proxy) → false
|
||
# 透過 reverse proxy 存取 → true
|
||
- TRUST_PROXY=false
|
||
|
||
# -----------------------------------------------------------------------
|
||
# 未登入存取設定
|
||
# -----------------------------------------------------------------------
|
||
# true = 允許未登入的訪客使用轉換功能
|
||
# false = 必須登入才能使用
|
||
#
|
||
# ⚠️ 設為 true 的風險:
|
||
# - 任何人都可以使用你的服務器資源
|
||
# - 可能被濫用(大量轉換、儲存空間耗盡)
|
||
#
|
||
# 📌 建議:除非你明確要提供公開服務,否則設為 false
|
||
- ALLOW_UNAUTHENTICATED=false
|
||
|
||
# -----------------------------------------------------------------------
|
||
# 自動清理設定
|
||
# -----------------------------------------------------------------------
|
||
# 自動刪除超過 N 小時的轉換檔案
|
||
# 設為 0 = 停用自動刪除
|
||
#
|
||
# 💡 建議設定適當的值,避免磁碟空間被轉換檔案塞滿
|
||
- AUTO_DELETE_EVERY_N_HOURS=24
|
||
|
||
# -----------------------------------------------------------------------
|
||
# 進階設定(可選,需要時取消註解)
|
||
# -----------------------------------------------------------------------
|
||
# 子路徑部署(例如 https://example.com/convertx/)
|
||
# - WEBROOT=/convertx
|
||
|
||
# 隱藏歷史紀錄頁面
|
||
# - HIDE_HISTORY=true
|
||
|
||
# 日期格式語言(影響時間顯示格式)
|
||
# - LANGUAGE=zh-TW
|
||
|
||
# FFmpeg 硬體加速參數
|
||
# - FFMPEG_ARGS=-hwaccel vaapi
|
||
|
||
# 最大同時轉換數(0 = 無限制)
|
||
# - MAX_CONVERT_PROCESS=4
|
||
|
||
# ===========================================================================
|
||
# ConvertX API Server(選用服務)
|
||
# ===========================================================================
|
||
#
|
||
# 🆕 REST + GraphQL API 伺服器
|
||
#
|
||
# ⚠️ 這是選用服務,預設不啟動!
|
||
# 使用 --profile api 才會啟動
|
||
#
|
||
# 🚀 啟動方式:
|
||
# docker compose --profile api up -d
|
||
#
|
||
# 📖 API 端點:
|
||
# - REST API: http://localhost:3001/api/v1/
|
||
# - GraphQL: http://localhost:3001/graphql
|
||
# - 健康檢查: http://localhost:3001/health
|
||
#
|
||
# 🔐 認證方式:
|
||
# 所有 API(除健康檢查)都需要 JWT Bearer Token
|
||
# Token 需由外部認證服務產生
|
||
#
|
||
# ===========================================================================
|
||
convertx-api:
|
||
# 使用 profile 使其成為選用服務
|
||
profiles:
|
||
- api
|
||
|
||
# 使用本地 Dockerfile 建置
|
||
build:
|
||
context: ./api-server
|
||
dockerfile: Dockerfile
|
||
|
||
# 或使用預建的 image(取消下面的註解)
|
||
# image: convertx/convertx-api:latest
|
||
|
||
container_name: convertx-api
|
||
|
||
restart: unless-stopped
|
||
|
||
# =========================================================================
|
||
# 連接埠設定
|
||
# =========================================================================
|
||
# API Server 預設使用 3001 埠,避免與 Web UI (3000) 衝突
|
||
ports:
|
||
- "3001:3001"
|
||
|
||
# =========================================================================
|
||
# 資料儲存設定
|
||
# =========================================================================
|
||
# 與 Web UI 共用相同的 data 目錄
|
||
# API Server 會在 data/uploads 和 data/output 下建立子目錄
|
||
volumes:
|
||
- ./data:/app/data
|
||
|
||
# =========================================================================
|
||
# 環境變數設定
|
||
# =========================================================================
|
||
# 可使用 env_file 載入 .env.api 檔案
|
||
env_file:
|
||
- path: .env.api
|
||
required: false
|
||
|
||
environment:
|
||
# 時區設定
|
||
- TZ=Asia/Taipei
|
||
|
||
# -----------------------------------------------------------------------
|
||
# API Server 專用設定
|
||
# -----------------------------------------------------------------------
|
||
# API 監聽地址與埠
|
||
- API_HOST=0.0.0.0
|
||
- API_PORT=3001
|
||
|
||
# -----------------------------------------------------------------------
|
||
# JWT 密鑰(🔐 必須設定)
|
||
# -----------------------------------------------------------------------
|
||
# ⚠️ 這是 API Server 驗證 Token 用的密鑰
|
||
# 必須與產生 Token 的認證服務使用相同的密鑰
|
||
#
|
||
# 🚨 請務必修改為你自己的密鑰!
|
||
- JWT_SECRET=${API_JWT_SECRET:-請設定你的API專用JWT密鑰}
|
||
|
||
# -----------------------------------------------------------------------
|
||
# 檔案儲存路徑
|
||
# -----------------------------------------------------------------------
|
||
- UPLOAD_DIR=/app/data/api-uploads
|
||
- OUTPUT_DIR=/app/data/api-output
|
||
|
||
# -----------------------------------------------------------------------
|
||
# 其他設定
|
||
# -----------------------------------------------------------------------
|
||
# 最大檔案大小(預設 100MB)
|
||
- MAX_FILE_SIZE=104857600
|
||
|
||
# 日誌級別
|
||
- RUST_LOG=convertx_api=info,tower_http=info
|
||
|
||
# =========================================================================
|
||
# 健康檢查
|
||
# =========================================================================
|
||
healthcheck:
|
||
test: ["CMD", "curl", "-f", "http://localhost:3001/health"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 3
|
||
start_period: 10s
|
||
|
||
# =========================================================================
|
||
# 資源限制(可選)
|
||
# =========================================================================
|
||
# deploy:
|
||
# resources:
|
||
# limits:
|
||
# memory: 2G
|
||
# reservations:
|
||
# memory: 512M
|