feat: 擴展 i18n 支援 65 種語言 + 完整文件系統
🌐 國際化 (i18n) - 從 5 種語言擴展到 65 種語言支援 - 新增:歐洲語系 (de, fr, es, it, pt, ru, nl, pl, tr, uk, cs, sv, da, fi, no, el, hu, ro, bg, hr, sk, sl, lt, lv, et, is, ga, cy, mt, mk, sq, ca, eu, gl, sr) - 新增:中東語系 (ar, he, fa) - 新增:南亞語系 (hi, bn, ta, te, mr, gu, kn, ml, ne, si) - 新增:東南亞語系 (th, vi, id, ms, fil, my, km, lo) - 新增:非洲語系 (af, sw, am, zu) - 完整翻譯所有 UI 文字 📖 文件系統 - 重構 README.md 為入口型首頁 - 新增 docs/getting-started.md - 快速入門指南 - 新增 docs/docker.md - Docker 部署指南 - 新增 docs/environment-variables.md - 環境變數說明 - 新增 docs/url-id-and-storage.md - 儲存結構說明 - 新增 docs/advanced-usage.md - 進階使用指南 - 更新 docs/i18n.md - 65 種語言清單 ✅ 建構驗證 - TypeScript 編譯通過 - Docker 建構通過
This commit is contained in:
parent
53b83b425f
commit
5c68308c36
69 changed files with 7823 additions and 274 deletions
277
docs/advanced-usage.md
Normal file
277
docs/advanced-usage.md
Normal file
|
|
@ -0,0 +1,277 @@
|
|||
# 進階用法
|
||||
|
||||
## 硬體加速
|
||||
|
||||
### NVIDIA GPU (CUDA/NVENC)
|
||||
|
||||
#### 1. 安裝 NVIDIA Container Toolkit
|
||||
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
|
||||
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
|
||||
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
|
||||
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y nvidia-container-toolkit
|
||||
sudo nvidia-ctk runtime configure --runtime=docker
|
||||
sudo systemctl restart docker
|
||||
```
|
||||
|
||||
#### 2. Docker Compose 配置
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx:
|
||||
image: convertx/convertx-cn:latest
|
||||
deploy:
|
||||
resources:
|
||||
reservations:
|
||||
devices:
|
||||
- driver: nvidia
|
||||
count: all
|
||||
capabilities: [gpu]
|
||||
environment:
|
||||
- FFMPEG_ARGS=-hwaccel cuda -hwaccel_output_format cuda
|
||||
- FFMPEG_OUTPUT_ARGS=-c:v h264_nvenc -preset fast
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Intel Quick Sync Video (QSV)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx:
|
||||
image: convertx/convertx-cn:latest
|
||||
devices:
|
||||
- /dev/dri:/dev/dri
|
||||
environment:
|
||||
- FFMPEG_ARGS=-hwaccel qsv
|
||||
- FFMPEG_OUTPUT_ARGS=-c:v h264_qsv -preset faster
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### AMD VAAPI
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx:
|
||||
image: convertx/convertx-cn:latest
|
||||
devices:
|
||||
- /dev/dri:/dev/dri
|
||||
environment:
|
||||
- FFMPEG_ARGS=-hwaccel vaapi -hwaccel_device /dev/dri/renderD128
|
||||
- FFMPEG_OUTPUT_ARGS=-c:v h264_vaapi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 反向代理
|
||||
|
||||
### Nginx
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name convert.example.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name convert.example.com;
|
||||
|
||||
ssl_certificate /etc/nginx/ssl/cert.pem;
|
||||
ssl_certificate_key /etc/nginx/ssl/key.pem;
|
||||
|
||||
client_max_body_size 0; # 無檔案大小限制
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
|
||||
# 長時間連線支援(大檔案轉換)
|
||||
proxy_read_timeout 3600s;
|
||||
proxy_send_timeout 3600s;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Caddy
|
||||
|
||||
```
|
||||
convert.example.com {
|
||||
reverse_proxy localhost:3000 {
|
||||
header_up X-Real-IP {remote_host}
|
||||
header_up X-Forwarded-Proto {scheme}
|
||||
}
|
||||
|
||||
request_body {
|
||||
max_size 0 # 無限制
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Traefik
|
||||
|
||||
參考 [docker.md](docker.md#使用-traefik-反向代理) 中的 Traefik 配置。
|
||||
|
||||
---
|
||||
|
||||
## 子路徑部署
|
||||
|
||||
如果需要在子路徑部署(如 `https://example.com/convertx`):
|
||||
|
||||
### 1. 設定環境變數
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- WEBROOT=/convertx
|
||||
```
|
||||
|
||||
### 2. Nginx 配置
|
||||
|
||||
```nginx
|
||||
location /convertx/ {
|
||||
proxy_pass http://localhost:3000/;
|
||||
# ... 其他 proxy 設定
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Caddy 配置
|
||||
|
||||
```
|
||||
example.com {
|
||||
handle_path /convertx/* {
|
||||
reverse_proxy localhost:3000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 限制同時轉換數
|
||||
|
||||
防止伺服器過載:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- MAX_CONVERT_PROCESS=4 # 最多同時 4 個轉換任務
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 匿名模式
|
||||
|
||||
允許不登入即可使用:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- ALLOW_UNAUTHENTICATED=true
|
||||
- HIDE_HISTORY=true # 建議同時隱藏歷史
|
||||
- AUTO_DELETE_EVERY_N_HOURS=1 # 快速清理
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 高可用部署
|
||||
|
||||
### 多容器部署
|
||||
|
||||
ConvertX-CN 支援多容器部署,但需注意:
|
||||
|
||||
1. **共享儲存**:所有容器需存取相同的 `/app/data` 目錄
|
||||
2. **資料庫鎖定**:SQLite 在高併發下可能有問題
|
||||
3. **JWT Secret**:所有容器需使用相同的 `JWT_SECRET`
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx-1:
|
||||
image: convertx/convertx-cn:latest
|
||||
volumes:
|
||||
- shared-data:/app/data
|
||||
environment:
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
|
||||
convertx-2:
|
||||
image: convertx/convertx-cn:latest
|
||||
volumes:
|
||||
- shared-data:/app/data
|
||||
environment:
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf
|
||||
|
||||
volumes:
|
||||
shared-data:
|
||||
driver: local
|
||||
driver_opts:
|
||||
type: nfs
|
||||
o: addr=nfs-server,rw
|
||||
device: ":/path/to/shared/data"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 效能調優
|
||||
|
||||
### 記憶體限制
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 8G
|
||||
reservations:
|
||||
memory: 2G
|
||||
```
|
||||
|
||||
### CPU 限制
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '4'
|
||||
reservations:
|
||||
cpus: '1'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 日誌管理
|
||||
|
||||
### 查看日誌
|
||||
|
||||
```bash
|
||||
docker logs convertx-cn
|
||||
docker logs -f convertx-cn # 即時追蹤
|
||||
docker logs --tail 100 convertx-cn # 最後 100 行
|
||||
```
|
||||
|
||||
### 日誌輪轉
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx:
|
||||
# ...
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
```
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
# 環境變數設定
|
||||
|
||||
所有環境變數皆為選填,建議至少設定 `JWT_SECRET`。
|
||||
|
||||
## 安全性設定
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
| -------------------- | ------------ | ---------------------------------- |
|
||||
| JWT_SECRET | randomUUID() | 用於簽署 JWT 的密鑰字串(請務必更改) |
|
||||
| ACCOUNT_REGISTRATION | false | 是否允許註冊新帳號 |
|
||||
| HTTP_ALLOWED | false | 是否允許 HTTP 連線(僅本地使用) |
|
||||
| ALLOW_UNAUTHENTICATED| false | 是否允許未登入使用 |
|
||||
|
||||
## 檔案管理
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
| ------------------------- | ------ | ------------------------------------ |
|
||||
| AUTO_DELETE_EVERY_N_HOURS | 24 | 自動刪除超過 N 小時的檔案(0 = 停用) |
|
||||
|
||||
## 進階設定
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
| ------------------ | ------ | -------------------------------------- |
|
||||
| WEBROOT | | 子路徑部署,例如 `/convertx` |
|
||||
| FFMPEG_ARGS | | FFmpeg 輸入參數,例如 `-hwaccel vaapi` |
|
||||
| FFMPEG_OUTPUT_ARGS | | FFmpeg 輸出參數,例如 `-preset veryfast` |
|
||||
| HIDE_HISTORY | false | 隱藏歷史紀錄頁面 |
|
||||
| MAX_CONVERT_PROCESS| 0 | 最大同時轉換數(0 = 無限制) |
|
||||
|
||||
## 本地化設定
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
| -------- | ------ | ----------------------------- |
|
||||
| LANGUAGE | en | 日期格式語言(BCP 47 格式) |
|
||||
| TZ | UTC | 時區設定,例如 `Asia/Taipei` |
|
||||
|
||||
## 範例配置
|
||||
|
||||
### 開發環境
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- HTTP_ALLOWED=true
|
||||
- ACCOUNT_REGISTRATION=true
|
||||
```
|
||||
|
||||
### 生產環境
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- JWT_SECRET=your-very-long-and-random-secret-key
|
||||
- ACCOUNT_REGISTRATION=false
|
||||
- HTTP_ALLOWED=false
|
||||
- TZ=Asia/Taipei
|
||||
- AUTO_DELETE_EVERY_N_HOURS=48
|
||||
```
|
||||
|
||||
### 公開服務(允許匿名使用)
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- ALLOW_UNAUTHENTICATED=true
|
||||
- HIDE_HISTORY=true
|
||||
- AUTO_DELETE_EVERY_N_HOURS=1
|
||||
```
|
||||
216
docs/docker.md
Normal file
216
docs/docker.md
Normal file
|
|
@ -0,0 +1,216 @@
|
|||
# Docker 配置指南
|
||||
|
||||
## Docker Image
|
||||
|
||||
ConvertX-CN 提供預建的 Docker Image,包含所有轉換依賴。
|
||||
|
||||
### 可用 Tag
|
||||
|
||||
| Tag | 說明 |
|
||||
|-----|------|
|
||||
| `convertx/convertx-cn:latest` | 最新穩定版 |
|
||||
| `convertx/convertx-cn:v0.1.3` | 指定版本號 |
|
||||
| `convertx/convertx-cn:v0.1.3-FULL` | 完整版(與 latest 相同) |
|
||||
|
||||
### Image 大小
|
||||
|
||||
由於內建完整依賴(LibreOffice、TexLive、FFmpeg 等),Image 約 **4-6 GB**。
|
||||
|
||||
---
|
||||
|
||||
## Docker Run
|
||||
|
||||
基本啟動命令:
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
--name convertx-cn \
|
||||
-p 3000:3000 \
|
||||
-v ./data:/app/data \
|
||||
-e TZ=Asia/Taipei \
|
||||
-e ACCOUNT_REGISTRATION=true \
|
||||
convertx/convertx-cn:latest
|
||||
```
|
||||
|
||||
### 參數說明
|
||||
|
||||
| 參數 | 說明 |
|
||||
|------|------|
|
||||
| `-d` | 背景執行 |
|
||||
| `--name convertx-cn` | 容器名稱 |
|
||||
| `-p 3000:3000` | 連接埠映射 |
|
||||
| `-v ./data:/app/data` | 資料持久化 |
|
||||
| `-e TZ=Asia/Taipei` | 時區設定 |
|
||||
|
||||
---
|
||||
|
||||
## Docker Compose
|
||||
|
||||
### 基本配置
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx:
|
||||
image: convertx/convertx-cn:latest
|
||||
container_name: convertx-cn
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3000:3000"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
environment:
|
||||
- TZ=Asia/Taipei
|
||||
- JWT_SECRET=your-very-long-random-secret-key
|
||||
- ACCOUNT_REGISTRATION=true
|
||||
```
|
||||
|
||||
### 生產環境配置
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx:
|
||||
image: convertx/convertx-cn:latest
|
||||
container_name: convertx-cn
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3000:3000"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
environment:
|
||||
- TZ=Asia/Taipei
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
- ACCOUNT_REGISTRATION=false
|
||||
- HTTP_ALLOWED=false
|
||||
- AUTO_DELETE_EVERY_N_HOURS=24
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 4G
|
||||
reservations:
|
||||
memory: 2G
|
||||
```
|
||||
|
||||
### 使用 Traefik 反向代理
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx:
|
||||
image: convertx/convertx-cn:latest
|
||||
container_name: convertx-cn
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
environment:
|
||||
- TZ=Asia/Taipei
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
- ACCOUNT_REGISTRATION=false
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.convertx.rule=Host(`convert.example.com`)"
|
||||
- "traefik.http.routers.convertx.entrypoints=websecure"
|
||||
- "traefik.http.routers.convertx.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.services.convertx.loadbalancer.server.port=3000"
|
||||
networks:
|
||||
- traefik
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
external: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 資料持久化
|
||||
|
||||
### Volume 結構
|
||||
|
||||
```
|
||||
./data/
|
||||
├── uploads/ # 上傳的原始檔案
|
||||
├── output/ # 轉換後的檔案
|
||||
└── convertx.db # SQLite 資料庫
|
||||
```
|
||||
|
||||
### 備份
|
||||
|
||||
```bash
|
||||
# 備份資料
|
||||
docker cp convertx-cn:/app/data ./backup-$(date +%Y%m%d)
|
||||
|
||||
# 還原資料
|
||||
docker cp ./backup-20240101/. convertx-cn:/app/data/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 更新
|
||||
|
||||
### Docker Compose
|
||||
|
||||
```bash
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Docker Run
|
||||
|
||||
```bash
|
||||
docker pull convertx/convertx-cn:latest
|
||||
docker stop convertx-cn
|
||||
docker rm convertx-cn
|
||||
docker run -d ... # 使用原本的參數
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 健康檢查
|
||||
|
||||
ConvertX-CN 提供健康檢查端點:
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/healthcheck
|
||||
```
|
||||
|
||||
可在 Docker Compose 中配置:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
convertx:
|
||||
# ...
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/healthcheck"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 記憶體不足
|
||||
|
||||
如果遇到 OOM(記憶體不足),請增加容器記憶體限制:
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 8G
|
||||
```
|
||||
|
||||
### 連接埠衝突
|
||||
|
||||
如果 3000 埠被占用,可更改映射:
|
||||
|
||||
```bash
|
||||
-p 8080:3000 # 使用 8080 埠
|
||||
```
|
||||
|
||||
### 權限問題
|
||||
|
||||
確保 data 目錄有正確權限:
|
||||
|
||||
```bash
|
||||
chmod -R 777 ./data
|
||||
```
|
||||
158
docs/environment-variables.md
Normal file
158
docs/environment-variables.md
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
# 環境變數設定
|
||||
|
||||
所有環境變數皆為選填,建議至少設定 `JWT_SECRET`。
|
||||
|
||||
---
|
||||
|
||||
## 安全性設定
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
|----------|--------|------|
|
||||
| `JWT_SECRET` | `randomUUID()` | 用於簽署 JWT 的密鑰字串。**生產環境請務必設定** |
|
||||
| `ACCOUNT_REGISTRATION` | `false` | 是否允許註冊新帳號 |
|
||||
| `HTTP_ALLOWED` | `false` | 是否允許 HTTP 連線(僅本地使用建議開啟) |
|
||||
| `ALLOW_UNAUTHENTICATED` | `false` | 是否允許未登入使用 |
|
||||
|
||||
### 安全建議
|
||||
|
||||
```yaml
|
||||
# 生產環境
|
||||
environment:
|
||||
- JWT_SECRET=a-very-long-random-string-at-least-32-characters
|
||||
- ACCOUNT_REGISTRATION=false
|
||||
- HTTP_ALLOWED=false
|
||||
- ALLOW_UNAUTHENTICATED=false
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 檔案管理
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
|----------|--------|------|
|
||||
| `AUTO_DELETE_EVERY_N_HOURS` | `24` | 自動刪除超過 N 小時的檔案(0 = 停用) |
|
||||
|
||||
### 範例
|
||||
|
||||
```yaml
|
||||
# 每 48 小時清理一次
|
||||
- AUTO_DELETE_EVERY_N_HOURS=48
|
||||
|
||||
# 停用自動清理
|
||||
- AUTO_DELETE_EVERY_N_HOURS=0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 轉換設定
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
|----------|--------|------|
|
||||
| `MAX_CONVERT_PROCESS` | `0` | 最大同時轉換數(0 = 無限制) |
|
||||
| `FFMPEG_ARGS` | - | FFmpeg 輸入參數,例如 `-hwaccel vaapi` |
|
||||
| `FFMPEG_OUTPUT_ARGS` | - | FFmpeg 輸出參數,例如 `-preset veryfast` |
|
||||
|
||||
### 硬體加速範例
|
||||
|
||||
```yaml
|
||||
# NVIDIA GPU 加速
|
||||
- FFMPEG_ARGS=-hwaccel cuda
|
||||
|
||||
# Intel QSV 加速
|
||||
- FFMPEG_ARGS=-hwaccel qsv
|
||||
|
||||
# AMD VAAPI 加速
|
||||
- FFMPEG_ARGS=-hwaccel vaapi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 介面設定
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
|----------|--------|------|
|
||||
| `WEBROOT` | - | 子路徑部署,例如 `/convertx` |
|
||||
| `HIDE_HISTORY` | `false` | 隱藏歷史紀錄頁面 |
|
||||
|
||||
### 子路徑部署
|
||||
|
||||
如果需要在子路徑部署(如 `https://example.com/convertx`):
|
||||
|
||||
```yaml
|
||||
- WEBROOT=/convertx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 本地化設定
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
|----------|--------|------|
|
||||
| `LANGUAGE` | `en` | 日期格式語言(BCP 47 格式) |
|
||||
| `TZ` | `UTC` | 時區設定 |
|
||||
|
||||
### 常用時區
|
||||
|
||||
```yaml
|
||||
# 台灣
|
||||
- TZ=Asia/Taipei
|
||||
|
||||
# 中國
|
||||
- TZ=Asia/Shanghai
|
||||
|
||||
# 日本
|
||||
- TZ=Asia/Tokyo
|
||||
|
||||
# 美國東部
|
||||
- TZ=America/New_York
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 進階設定
|
||||
|
||||
| 變數名稱 | 預設值 | 說明 |
|
||||
|----------|--------|------|
|
||||
| `UNAUTHENTICATED_USER_SHARING` | `false` | 未登入使用者是否共享檔案空間 |
|
||||
|
||||
---
|
||||
|
||||
## 完整範例
|
||||
|
||||
### 開發環境
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- HTTP_ALLOWED=true
|
||||
- ACCOUNT_REGISTRATION=true
|
||||
- TZ=Asia/Taipei
|
||||
```
|
||||
|
||||
### 生產環境
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- JWT_SECRET=your-very-long-and-random-secret-key-change-me
|
||||
- ACCOUNT_REGISTRATION=false
|
||||
- HTTP_ALLOWED=false
|
||||
- TZ=Asia/Taipei
|
||||
- AUTO_DELETE_EVERY_N_HOURS=24
|
||||
```
|
||||
|
||||
### 公開服務(允許匿名使用)
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- ALLOW_UNAUTHENTICATED=true
|
||||
- HIDE_HISTORY=true
|
||||
- AUTO_DELETE_EVERY_N_HOURS=1
|
||||
```
|
||||
|
||||
### 帶硬體加速
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- JWT_SECRET=your-secret-key
|
||||
- FFMPEG_ARGS=-hwaccel cuda
|
||||
- FFMPEG_OUTPUT_ARGS=-c:v h264_nvenc -preset fast
|
||||
```
|
||||
|
|
@ -2,25 +2,28 @@
|
|||
|
||||
## 系統需求
|
||||
|
||||
- Docker 20.10+
|
||||
- Docker Compose v2+(推薦)
|
||||
- 至少 4GB RAM(建議 8GB)
|
||||
- 10GB 磁碟空間(用於 Docker image)
|
||||
| 需求 | 最低 | 建議 |
|
||||
|------|------|------|
|
||||
| Docker | 20.10+ | 24.0+ |
|
||||
| RAM | 4 GB | 8 GB |
|
||||
| 磁碟空間 | 10 GB | 20 GB |
|
||||
| CPU | 2 核心 | 4 核心 |
|
||||
|
||||
## 安裝方式
|
||||
---
|
||||
|
||||
### 方法一:Docker Run
|
||||
## 最快方式:一行指令
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
--name convertx-cn \
|
||||
-p 3000:3000 \
|
||||
-v ./data:/app/data \
|
||||
-e TZ=Asia/Taipei \
|
||||
convertx/convertx-cn:latest
|
||||
docker run -d -p 3000:3000 -v ./data:/app/data -e ACCOUNT_REGISTRATION=true convertx/convertx-cn:latest
|
||||
```
|
||||
|
||||
### 方法二:Docker Compose(推薦)
|
||||
開啟瀏覽器訪問 `http://localhost:3000`,註冊帳號即可開始使用!
|
||||
|
||||
---
|
||||
|
||||
## 推薦方式:Docker Compose
|
||||
|
||||
### 1. 建立配置檔
|
||||
|
||||
建立 `docker-compose.yml`:
|
||||
|
||||
|
|
@ -37,32 +40,106 @@ services:
|
|||
environment:
|
||||
- TZ=Asia/Taipei
|
||||
- JWT_SECRET=請更換為一個長且隨機的字串
|
||||
- ACCOUNT_REGISTRATION=false
|
||||
- ACCOUNT_REGISTRATION=true
|
||||
- HTTP_ALLOWED=false
|
||||
- AUTO_DELETE_EVERY_N_HOURS=24
|
||||
```
|
||||
|
||||
啟動服務:
|
||||
### 2. 啟動服務
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## 首次設定
|
||||
### 3. 開始使用
|
||||
|
||||
1. 開啟瀏覽器訪問 `http://localhost:3000`
|
||||
2. 建立第一個帳號(此帳號即為管理員)
|
||||
3. 登入後即可開始使用
|
||||
2. 點擊「Register」建立帳號
|
||||
3. 登入後即可開始轉換檔案!
|
||||
|
||||
---
|
||||
|
||||
## 首次設定
|
||||
|
||||
### 建立管理員帳號
|
||||
|
||||
首次訪問時,ConvertX-CN 會顯示設定頁面,讓您建立第一個帳號。此帳號即為管理員。
|
||||
|
||||
### 註冊功能
|
||||
|
||||
- `ACCOUNT_REGISTRATION=true`:允許其他人註冊
|
||||
- `ACCOUNT_REGISTRATION=false`:停用註冊(單人使用)
|
||||
|
||||
---
|
||||
|
||||
## 驗證安裝
|
||||
|
||||
### 檢查容器狀態
|
||||
|
||||
```bash
|
||||
docker ps
|
||||
# 應該看到 convertx-cn 容器正在運行
|
||||
|
||||
docker logs convertx-cn
|
||||
# 應該看到 "🦊 Elysia is running at http://localhost:3000"
|
||||
```
|
||||
|
||||
### 健康檢查
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/healthcheck
|
||||
# 應該返回 "OK"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 更新版本
|
||||
|
||||
```bash
|
||||
# Docker Compose
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
|
||||
# 或 Docker Run
|
||||
docker pull convertx/convertx-cn:latest
|
||||
docker stop convertx-cn
|
||||
docker rm convertx-cn
|
||||
# 然後重新執行 docker run 指令
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 常見問題
|
||||
|
||||
### 無法訪問頁面
|
||||
|
||||
1. 確認容器正在運行:`docker ps`
|
||||
2. 檢查連接埠是否被占用:`netstat -an | grep 3000`
|
||||
3. 查看錯誤日誌:`docker logs convertx-cn`
|
||||
|
||||
### 權限錯誤
|
||||
|
||||
```bash
|
||||
# 確保 data 目錄有正確權限
|
||||
chmod -R 777 ./data
|
||||
```
|
||||
|
||||
### 記憶體不足
|
||||
|
||||
ConvertX-CN 內建完整依賴,建議至少 4GB RAM。可透過 Docker 限制記憶體使用:
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 4G
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 下一步
|
||||
|
||||
- 查看 [環境變數設定](./configuration.md)
|
||||
- 瞭解 [支援的轉換器](./converters.md)
|
||||
- 閱讀 [多語言設定](./i18n.md)
|
||||
- 📖 [Docker 配置](docker.md) - 進階 Docker 設定
|
||||
- ⚙️ [環境變數](environment-variables.md) - 所有可用設定
|
||||
- 🔧 [進階用法](advanced-usage.md) - 硬體加速、反向代理
|
||||
- 🌍 [多語言](i18n.md) - 語言設定與自訂
|
||||
|
|
|
|||
225
docs/i18n.md
225
docs/i18n.md
|
|
@ -1,33 +1,158 @@
|
|||
# 多語言支援(i18n)
|
||||
|
||||
ConvertX-CN 支援多種語言的使用者介面。
|
||||
ConvertX-CN 支援 **65 種語言**,是目前最完整的多語言檔案轉換服務。
|
||||
|
||||
## 支援語言
|
||||
---
|
||||
|
||||
| 語言代碼 | 語言名稱 |
|
||||
| -------- | ---------------- |
|
||||
| zh-TW | 繁體中文(預設) |
|
||||
| zh-CN | 简体中文 |
|
||||
| en | English |
|
||||
| ja | 日本語 |
|
||||
| ko | 한국어 |
|
||||
## 支援語言列表
|
||||
|
||||
### 東亞語言(5 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `zh-TW` | 繁體中文(預設) | 繁體中文 |
|
||||
| `zh-CN` | 簡體中文 | 简体中文 |
|
||||
| `en` | 英文 | English |
|
||||
| `ja` | 日文 | 日本語 |
|
||||
| `ko` | 韓文 | 한국어 |
|
||||
|
||||
### 西歐語言(10 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `de` | 德文 | Deutsch |
|
||||
| `fr` | 法文 | Français |
|
||||
| `es` | 西班牙文 | Español |
|
||||
| `it` | 義大利文 | Italiano |
|
||||
| `pt` | 葡萄牙文 | Português |
|
||||
| `nl` | 荷蘭文 | Nederlands |
|
||||
| `ca` | 加泰隆尼亞文 | Català |
|
||||
| `eu` | 巴斯克文 | Euskara |
|
||||
| `gl` | 加利西亞文 | Galego |
|
||||
| `mt` | 馬爾他文 | Malti |
|
||||
|
||||
### 北歐語言(5 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `sv` | 瑞典文 | Svenska |
|
||||
| `da` | 丹麥文 | Dansk |
|
||||
| `fi` | 芬蘭文 | Suomi |
|
||||
| `no` | 挪威文 | Norsk |
|
||||
| `is` | 冰島文 | Íslenska |
|
||||
|
||||
### 東歐語言(12 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `ru` | 俄文 | Русский |
|
||||
| `pl` | 波蘭文 | Polski |
|
||||
| `uk` | 烏克蘭文 | Українська |
|
||||
| `cs` | 捷克文 | Čeština |
|
||||
| `hu` | 匈牙利文 | Magyar |
|
||||
| `ro` | 羅馬尼亞文 | Română |
|
||||
| `bg` | 保加利亞文 | Български |
|
||||
| `hr` | 克羅埃西亞文 | Hrvatski |
|
||||
| `sk` | 斯洛伐克文 | Slovenčina |
|
||||
| `sl` | 斯洛維尼亞文 | Slovenščina |
|
||||
| `sr` | 塞爾維亞文 | Српски |
|
||||
| `mk` | 馬其頓文 | Македонски |
|
||||
|
||||
### 波羅的海語言(3 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `lt` | 立陶宛文 | Lietuvių |
|
||||
| `lv` | 拉脫維亞文 | Latviešu |
|
||||
| `et` | 愛沙尼亞文 | Eesti |
|
||||
|
||||
### 其他歐洲語言(4 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `el` | 希臘文 | Ελληνικά |
|
||||
| `sq` | 阿爾巴尼亞文 | Shqip |
|
||||
| `ga` | 愛爾蘭文 | Gaeilge |
|
||||
| `cy` | 威爾斯文 | Cymraeg |
|
||||
|
||||
### 中東語言(4 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `ar` | 阿拉伯文 | العربية |
|
||||
| `he` | 希伯來文 | עברית |
|
||||
| `fa` | 波斯文 | فارسی |
|
||||
| `tr` | 土耳其文 | Türkçe |
|
||||
|
||||
### 南亞語言(10 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `hi` | 印地文 | हिन्दी |
|
||||
| `bn` | 孟加拉文 | বাংলা |
|
||||
| `ta` | 泰米爾文 | தமிழ் |
|
||||
| `te` | 泰盧固文 | తెలుగు |
|
||||
| `mr` | 馬拉地文 | मराठी |
|
||||
| `gu` | 古吉拉特文 | ગુજરાતી |
|
||||
| `kn` | 卡納達文 | ಕನ್ನಡ |
|
||||
| `ml` | 馬拉雅拉姆文 | മലയാളം |
|
||||
| `ne` | 尼泊爾文 | नेपाली |
|
||||
| `si` | 僧伽羅文 | සිංහල |
|
||||
|
||||
### 東南亞語言(8 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `th` | 泰文 | ไทย |
|
||||
| `vi` | 越南文 | Tiếng Việt |
|
||||
| `id` | 印尼文 | Bahasa Indonesia |
|
||||
| `ms` | 馬來文 | Bahasa Melayu |
|
||||
| `fil` | 菲律賓文 | Filipino |
|
||||
| `my` | 緬甸文 | မြန်မာ |
|
||||
| `km` | 高棉文 | ខ្មែរ |
|
||||
| `lo` | 寮文 | ລາວ |
|
||||
|
||||
### 非洲語言(4 種)
|
||||
|
||||
| 代碼 | 語言 | 原生名稱 |
|
||||
|------|------|----------|
|
||||
| `af` | 南非語 | Afrikaans |
|
||||
| `sw` | 斯瓦希里文 | Kiswahili |
|
||||
| `am` | 阿姆哈拉文 | አማርኛ |
|
||||
| `zu` | 祖魯文 | isiZulu |
|
||||
|
||||
---
|
||||
|
||||
## 語言切換
|
||||
|
||||
1. 在網站右上角的導航列可看到語言選擇器(圖示)
|
||||
### 方法一:介面切換
|
||||
|
||||
1. 在網站右上角的導航列找到語言圖示(🌐)
|
||||
2. 點擊後選擇偏好語言
|
||||
3. 語言偏好會自動保存到 Cookie 中
|
||||
4. 下次訪問時會記住您的偏好
|
||||
|
||||
### 方法二:URL 參數
|
||||
|
||||
```
|
||||
http://localhost:3000/?lang=ja
|
||||
```
|
||||
|
||||
### 方法三:瀏覽器設定
|
||||
|
||||
ConvertX-CN 會自動偵測瀏覽器的語言設定。
|
||||
|
||||
---
|
||||
|
||||
## 自動偵測
|
||||
|
||||
首次訪問時,系統會根據瀏覽器的語言設定自動選擇最適合的語言。
|
||||
|
||||
優先順序:
|
||||
首次訪問時,系統會根據以下優先順序選擇語言:
|
||||
|
||||
1. Cookie 中儲存的語言偏好
|
||||
2. 瀏覽器的 `Accept-Language` 標頭
|
||||
3. 預設語言(繁體中文)
|
||||
2. URL 參數中的 `lang` 值
|
||||
3. 瀏覽器的 `Accept-Language` 標頭
|
||||
4. 預設語言(繁體中文 `zh-TW`)
|
||||
|
||||
---
|
||||
|
||||
## 新增語言
|
||||
|
||||
|
|
@ -35,55 +160,83 @@ ConvertX-CN 支援多種語言的使用者介面。
|
|||
|
||||
### 1. 建立翻譯檔案
|
||||
|
||||
在 `src/locales/` 目錄新增語言檔案,例如 `fr.json`(法文):
|
||||
在 `src/locales/` 目錄新增語言檔案,例如 `xx.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"common": {
|
||||
"appName": "ConvertX-CN",
|
||||
"poweredBy": "Propulsé par",
|
||||
"poweredBy": "Powered by",
|
||||
"version": "v{version}",
|
||||
"loading": "...",
|
||||
...
|
||||
},
|
||||
"nav": {
|
||||
"history": "Historique",
|
||||
"history": "...",
|
||||
"account": "...",
|
||||
...
|
||||
}
|
||||
},
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 註冊語言
|
||||
### 2. 在 index.ts 中註冊
|
||||
|
||||
在 `src/i18n/index.ts` 中:
|
||||
編輯 `src/i18n/index.ts`:
|
||||
|
||||
```typescript
|
||||
// 導入新語言檔案
|
||||
import fr from "../locales/fr.json";
|
||||
import xx from "../locales/xx.json";
|
||||
|
||||
// 在 SupportedLocale 類型中添加
|
||||
export type SupportedLocale = "en" | "zh-TW" | ... | "xx";
|
||||
|
||||
// 在 supportedLocales 陣列中添加
|
||||
export const supportedLocales: LocaleConfig[] = [
|
||||
// ... 現有語言
|
||||
{ code: "fr", name: "French", nativeName: "Français" },
|
||||
// ...
|
||||
{ code: "xx", name: "Language Name", nativeName: "原生名稱" },
|
||||
];
|
||||
|
||||
// 在 translations 物件中註冊
|
||||
const translations: Record<SupportedLocale, TranslationData> = {
|
||||
// ... 現有翻譯
|
||||
fr: fr as TranslationData,
|
||||
// ...
|
||||
xx: xx as TranslationData,
|
||||
};
|
||||
```
|
||||
|
||||
### 3. 更新類型定義
|
||||
### 3. 測試
|
||||
|
||||
在 `SupportedLocale` 類型中添加新語言代碼:
|
||||
|
||||
```typescript
|
||||
export type SupportedLocale = "zh-TW" | "zh-CN" | "en" | "ja" | "ko" | "fr";
|
||||
```bash
|
||||
bun run dev
|
||||
# 訪問 http://localhost:3000/?lang=xx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 翻譯 Fallback
|
||||
|
||||
如果某個翻譯鍵缺失,系統會:
|
||||
|
||||
1. 嘗試使用英文(`en`)翻譯
|
||||
2. 如果英文也缺失,顯示鍵名(如 `nav.history`)
|
||||
|
||||
---
|
||||
|
||||
## 貢獻翻譯
|
||||
|
||||
歡迎提交 Pull Request 來新增或改進翻譯!請確保:
|
||||
歡迎提交 Pull Request 來新增或改進翻譯!
|
||||
|
||||
- 翻譯完整(包含所有 key)
|
||||
- 語法正確
|
||||
- 遵循現有的翻譯風格
|
||||
### 翻譯指南
|
||||
|
||||
1. **完整翻譯**:確保所有鍵都有翻譯
|
||||
2. **保留佔位符**:`{version}`、`{count}` 等佔位符不要翻譯
|
||||
3. **自然表達**:使用該語言的自然表達方式
|
||||
4. **一致性**:同一個詞在不同地方使用相同翻譯
|
||||
5. **測試**:在實際介面中測試翻譯效果
|
||||
|
||||
### 提交流程
|
||||
|
||||
1. Fork 此專案
|
||||
2. 建立新語言檔案或修改現有翻譯
|
||||
3. 測試確認無誤
|
||||
4. 提交 Pull Request
|
||||
|
|
|
|||
181
docs/url-id-and-storage.md
Normal file
181
docs/url-id-and-storage.md
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
# URL ID 與儲存機制
|
||||
|
||||
## 檔案儲存結構
|
||||
|
||||
ConvertX-CN 使用以下目錄結構儲存檔案:
|
||||
|
||||
```
|
||||
/app/data/
|
||||
├── convertx.db # SQLite 資料庫
|
||||
├── uploads/ # 上傳的原始檔案
|
||||
│ └── {user_id}/
|
||||
│ └── {job_id}/
|
||||
│ ├── file1.docx
|
||||
│ └── file2.pdf
|
||||
└── output/ # 轉換後的檔案
|
||||
└── {user_id}/
|
||||
└── {job_id}/
|
||||
├── file1.pdf
|
||||
└── file2.txt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Job ID 說明
|
||||
|
||||
每次轉換任務都會產生一個唯一的 Job ID,用於:
|
||||
|
||||
- 追蹤轉換進度
|
||||
- 組織檔案儲存
|
||||
- 生成下載連結
|
||||
|
||||
### Job ID 格式
|
||||
|
||||
Job ID 是一個 UUID v4 格式的字串,例如:
|
||||
|
||||
```
|
||||
550e8400-e29b-41d4-a716-446655440000
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## URL 結構
|
||||
|
||||
### 結果頁面
|
||||
|
||||
```
|
||||
/results/{job_id}
|
||||
```
|
||||
|
||||
例如:
|
||||
```
|
||||
http://localhost:3000/results/550e8400-e29b-41d4-a716-446655440000
|
||||
```
|
||||
|
||||
### 下載單一檔案
|
||||
|
||||
```
|
||||
/download/{user_id}/{job_id}/{filename}
|
||||
```
|
||||
|
||||
### 下載所有檔案(Tar)
|
||||
|
||||
```
|
||||
/archive/{job_id}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 資料持久化
|
||||
|
||||
### Docker Volume 映射
|
||||
|
||||
為了確保資料不會在容器重啟後遺失,請務必映射 `/app/data` 目錄:
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
```
|
||||
|
||||
或使用 Named Volume:
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- convertx-data:/app/data
|
||||
|
||||
volumes:
|
||||
convertx-data:
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 自動清理
|
||||
|
||||
ConvertX-CN 會根據 `AUTO_DELETE_EVERY_N_HOURS` 設定自動清理過期檔案。
|
||||
|
||||
### 清理邏輯
|
||||
|
||||
1. 系統每 N 小時執行一次清理
|
||||
2. 刪除建立時間超過 N 小時的 Job
|
||||
3. 同時刪除對應的上傳檔案和輸出檔案
|
||||
4. 資料庫記錄也會被清除
|
||||
|
||||
### 設定範例
|
||||
|
||||
```yaml
|
||||
# 每 24 小時清理一次
|
||||
- AUTO_DELETE_EVERY_N_HOURS=24
|
||||
|
||||
# 每 1 小時清理一次(公開服務建議)
|
||||
- AUTO_DELETE_EVERY_N_HOURS=1
|
||||
|
||||
# 停用自動清理
|
||||
- AUTO_DELETE_EVERY_N_HOURS=0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 資料庫
|
||||
|
||||
ConvertX-CN 使用 SQLite 作為資料庫,儲存於 `/app/data/convertx.db`。
|
||||
|
||||
### 資料表結構
|
||||
|
||||
#### users
|
||||
|
||||
| 欄位 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| id | INTEGER | 使用者 ID |
|
||||
| email | TEXT | 電子郵件 |
|
||||
| password | TEXT | 密碼雜湊 |
|
||||
|
||||
#### jobs
|
||||
|
||||
| 欄位 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| id | TEXT | Job UUID |
|
||||
| user_id | INTEGER | 使用者 ID |
|
||||
| num_files | INTEGER | 檔案數量 |
|
||||
| date_created | TEXT | 建立時間 |
|
||||
|
||||
#### file_names
|
||||
|
||||
| 欄位 | 類型 | 說明 |
|
||||
|------|------|------|
|
||||
| id | INTEGER | 檔案 ID |
|
||||
| job_id | TEXT | Job UUID |
|
||||
| input_file_name | TEXT | 原始檔名 |
|
||||
| output_file_name | TEXT | 輸出檔名 |
|
||||
| status | TEXT | 轉換狀態 |
|
||||
|
||||
---
|
||||
|
||||
## 備份與還原
|
||||
|
||||
### 備份
|
||||
|
||||
```bash
|
||||
# 備份整個 data 目錄
|
||||
tar -czvf convertx-backup-$(date +%Y%m%d).tar.gz ./data
|
||||
|
||||
# 僅備份資料庫
|
||||
cp ./data/convertx.db ./backup-convertx-$(date +%Y%m%d).db
|
||||
```
|
||||
|
||||
### 還原
|
||||
|
||||
```bash
|
||||
# 還原整個 data 目錄
|
||||
tar -xzvf convertx-backup-20240101.tar.gz
|
||||
|
||||
# 還原資料庫
|
||||
cp ./backup-convertx-20240101.db ./data/convertx.db
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 注意事項
|
||||
|
||||
1. **權限問題**:確保 Docker 容器有權限寫入 data 目錄
|
||||
2. **磁碟空間**:大量轉換可能佔用大量磁碟空間,建議設定自動清理
|
||||
3. **資料安全**:敏感文件轉換後建議手動刪除或縮短保留時間
|
||||
Loading…
Add table
Add a link
Reference in a new issue