feat: v0.1.9 - Setup 頁面 i18n + 語言選擇器 UI 修復 + 文件重構

 Features:
- 全頁拖曳上傳:檔案可拖曳到頁面任何位置
- Setup 頁面新增語言選擇器

🐛 Bug Fixes:
- 語言 icon 尺寸修復(h-5→h-6)
- Dropdown 背景完全不透明
- 新增 scrollbar 樣式

🌍 i18n:
- 所有 confirm/alert 訊息國際化
- Setup 頁面 i18n 完整化

📚 Documentation:
- README 精簡為開箱即用版本
- 新增 docs/deployment/, docs/config/, docs/versions/
This commit is contained in:
Your Name 2026-01-20 15:55:49 +08:00
parent a45a049fe2
commit d563682753
14 changed files with 1305 additions and 594 deletions

237
docs/config/environment.md Normal file
View file

@ -0,0 +1,237 @@
# 環境變數完整說明
本文件列出 ConvertX-CN 所有可用的環境變數設定。
---
## 快速參考
| 優先級 | 變數 | 說明 | 預設值 |
| ------ | -------------- | ------------ | ------------------ |
| 必填 | `JWT_SECRET` | 登入驗證金鑰 | 隨機(每次重啟變) |
| 建議 | `TZ` | 時區 | `UTC` |
| 建議 | `HTTP_ALLOWED` | 允許 HTTP | `false` |
| 可選 | `TRUST_PROXY` | 信任反向代理 | `false` |
| 可選 | 其他 | 依需求設定 | - |
---
## 必填設定
### JWT_SECRET
用於簽署登入驗證的密鑰。
| 項目 | 值 |
| ------ | ---------------------- |
| 預設值 | 每次重啟隨機產生 |
| 建議值 | 至少 32 字元的隨機字串 |
不設定的話,每次容器重啟後所有使用者都需要重新登入。
產生方式:
```bash
openssl rand -hex 32
```
---
## 網路與安全
### HTTP_ALLOWED
允許非 HTTPS 連線。
| 項目 | 值 |
| ------ | ------- |
| 預設值 | `false` |
| 情境 | 設定值 |
| --------------------- | ------- |
| 本地測試 (localhost) | `true` |
| 有 HTTPS | `false` |
| 無 HTTPS 但需遠端存取 | `true` |
設為 `false` 但用 HTTP 存取會導致「登入後又被導回登入頁」。
### TRUST_PROXY
信任反向代理的 headers`X-Forwarded-Proto` 等)。
| 項目 | 值 |
| ------ | ------- |
| 預設值 | `false` |
| 情境 | 設定值 |
| ---------------------------- | ------- |
| 直接存取容器 | `false` |
| 透過 Nginx / Traefik / Caddy | `true` |
詳見 [安全性設定](security.md)。
### ACCOUNT_REGISTRATION
是否允許註冊新帳號。
| 項目 | 值 |
| ------ | ------ |
| 預設值 | `true` |
首次註冊不受此限制。建議建立管理員帳號後改為 `false`
### ALLOW_UNAUTHENTICATED
是否允許未登入使用轉換功能。
| 項目 | 值 |
| ------ | ------- |
| 預設值 | `false` |
設為 `true` 有安全風險:任何人都可使用伺服器資源。
---
## 一般設定
### TZ
時區設定,影響日期顯示。
| 項目 | 值 |
| ------ | ----- |
| 預設值 | `UTC` |
常用值:
| 地區 | 值 |
| ---- | ---------------- |
| 台灣 | `Asia/Taipei` |
| 中國 | `Asia/Shanghai` |
| 香港 | `Asia/Hong_Kong` |
| 日本 | `Asia/Tokyo` |
### AUTO_DELETE_EVERY_N_HOURS
自動刪除超過 N 小時的檔案。
| 項目 | 值 |
| ------ | ---- |
| 預設值 | `24` |
| 停用 | `0` |
---
## 介面設定
### WEBROOT
子路徑部署前綴。
| 項目 | 值 |
| ------ | --- |
| 預設值 | 空 |
若透過 `https://example.com/convertx/` 存取:
```yaml
- WEBROOT=/convertx
```
### HIDE_HISTORY
隱藏歷史紀錄頁面。
| 項目 | 值 |
| ------ | ------- |
| 預設值 | `false` |
### LANGUAGE
日期格式語言BCP 47 格式)。
| 項目 | 值 |
| ------ | ---- |
| 預設值 | `en` |
---
## 轉換設定
### MAX_CONVERT_PROCESS
最大同時轉換任務數。
| 項目 | 值 |
| ------ | ------------- |
| 預設值 | `0`(無限制) |
### FFMPEG_ARGS
FFmpeg 輸入參數(硬體加速等)。
| 項目 | 值 |
| ------ | --- |
| 預設值 | 空 |
```yaml
# NVIDIA GPU
- FFMPEG_ARGS=-hwaccel cuda
# Intel QSV
- FFMPEG_ARGS=-hwaccel qsv
```
### FFMPEG_OUTPUT_ARGS
FFmpeg 輸出參數。
| 項目 | 值 |
| ------ | --- |
| 預設值 | 空 |
```yaml
- FFMPEG_OUTPUT_ARGS=-preset veryfast
```
---
## 情境範例
### 開發環境
```yaml
environment:
- TZ=Asia/Taipei
- HTTP_ALLOWED=true
- ACCOUNT_REGISTRATION=true
```
### 生產環境
```yaml
environment:
- TZ=Asia/Taipei
- JWT_SECRET=your-production-secret-at-least-32-chars
- HTTP_ALLOWED=false
- TRUST_PROXY=true
- ACCOUNT_REGISTRATION=false
- AUTO_DELETE_EVERY_N_HOURS=24
```
### 公開服務
```yaml
environment:
- ALLOW_UNAUTHENTICATED=true
- HIDE_HISTORY=true
- AUTO_DELETE_EVERY_N_HOURS=1
```
---
## 相關文件
- [安全性設定](security.md)
- [進階部署](../deployment.md)
- [Docker Compose 詳解](../deployment/docker-compose.md)

208
docs/config/security.md Normal file
View file

@ -0,0 +1,208 @@
# 安全性設定
本文件說明 ConvertX-CN 的安全性相關設定與最佳實踐。
---
## Cookie 與登入安全
### HTTP_ALLOWED
控制是否允許非 HTTPS 連線。
```yaml
- HTTP_ALLOWED=true # 允許 HTTP不安全僅測試用
- HTTP_ALLOWED=false # 僅允許 HTTPS預設
```
#### 運作原理
`HTTP_ALLOWED=false`Cookie 會設定 `Secure` 屬性,只在 HTTPS 連線下傳送。
若實際用 HTTP 存取:
- 瀏覽器不會傳送 Cookie
- 每次請求都像未登入
- 造成「登入後又被踢回登入頁」
#### 設定建議
| 情境 | 設定值 |
| ------------------ | ------- |
| `localhost` 測試 | `true` |
| 區網 IP 測試 | `true` |
| 有 HTTPS 憑證 | `false` |
| 透過反向代理 HTTPS | `false` |
---
### TRUST_PROXY
是否信任反向代理傳來的 headers。
```yaml
- TRUST_PROXY=true # 信任 X-Forwarded-* headers
- TRUST_PROXY=false # 不信任(預設)
```
#### 運作原理
當請求經過反向代理時:
- 原始連線:使用者 → Nginx (HTTPS) → ConvertX (HTTP)
- 沒有 TRUST_PROXYConvertX 看到的是 HTTP 連線
- 有 TRUST_PROXYConvertX 讀取 `X-Forwarded-Proto: https`,知道原始是 HTTPS
#### 設定建議
| 情境 | 設定值 |
| ---------------------------- | ------- |
| 直接存取容器(無 Proxy | `false` |
| 透過 Nginx / Traefik / Caddy | `true` |
| 透過 Cloudflare Tunnel | `true` |
#### 安全注意
只在確實有反向代理時才設為 `true`。若直接暴露容器且設為 `true`,攻擊者可偽造 headers。
---
## 帳號安全
### ACCOUNT_REGISTRATION
```yaml
- ACCOUNT_REGISTRATION=true # 開放註冊
- ACCOUNT_REGISTRATION=false # 關閉註冊
```
#### 建議流程
1. 首次部署設為 `true`
2. 註冊管理員帳號
3. 改為 `false`
4. 重啟容器
首次註冊的帳號不受此限制。
### JWT_SECRET
```yaml
- JWT_SECRET=your-secret-key-at-least-32-chars
```
#### 重要性
- 用於簽署登入 Token
- 不設定:每次重啟產生新密鑰,所有人被登出
- 設定固定值:登入狀態跨重啟保留
#### 產生方式
```bash
# Linux / macOS
openssl rand -hex 32
# 輸出範例
# a1b2c3d4e5f6789...64 字元)
```
---
## 公開服務安全
### ALLOW_UNAUTHENTICATED
```yaml
- ALLOW_UNAUTHENTICATED=true # 允許未登入使用
- ALLOW_UNAUTHENTICATED=false # 必須登入(預設)
```
#### 風險
設為 `true` 時:
- 任何人可使用轉換功能
- 消耗伺服器 CPU / 記憶體 / 磁碟
- 可能被惡意利用
#### 緩解措施
若需要公開服務,建議:
```yaml
environment:
- ALLOW_UNAUTHENTICATED=true
- AUTO_DELETE_EVERY_N_HOURS=1 # 頻繁清理
- HIDE_HISTORY=true # 隱藏歷史
- MAX_CONVERT_PROCESS=2 # 限制同時轉換數
```
---
## 網路安全
### 防火牆
只開放必要的埠:
```bash
# 僅允許特定 IP 存取
ufw allow from 192.168.1.0/24 to any port 3000
```
### 只允許本地存取
若透過反向代理,可限制容器只監聽 localhost
```yaml
ports:
- "127.0.0.1:3000:3000"
```
這樣只有本機的反向代理可以存取,外部無法直接連線。
---
## 設定範例
### 最小安全配置(本地測試)
```yaml
environment:
- HTTP_ALLOWED=true
```
### 標準安全配置(生產環境)
```yaml
environment:
- JWT_SECRET=your-production-secret
- HTTP_ALLOWED=false
- TRUST_PROXY=true
- ACCOUNT_REGISTRATION=false
```
### 高安全配置(敏感環境)
```yaml
services:
convertx:
ports:
- "127.0.0.1:3000:3000" # 只允許本地
environment:
- JWT_SECRET=your-very-long-random-secret
- HTTP_ALLOWED=false
- TRUST_PROXY=true
- ACCOUNT_REGISTRATION=false
- ALLOW_UNAUTHENTICATED=false
- AUTO_DELETE_EVERY_N_HOURS=1
```
---
## 相關文件
- [環境變數完整說明](environment.md)
- [反向代理設定](../deployment.md)
- [Docker Compose 詳解](../deployment/docker-compose.md)