diff --git a/README.md b/README.md
index a9732d3..b35dfcf 100644
--- a/README.md
+++ b/README.md
@@ -2,506 +2,197 @@
English | äžæ
-
ð¡ïž BackupX
+ BackupX
- Self-hosted Server Backup Management Platform with Web UI
-
-
- Features â¢
- Quick Start â¢
- Configuration â¢
- Architecture â¢
- Cluster â¢
- Development â¢
- API
+ èªæç®¡æå¡åšå€ä»œç®¡çå¹³å°
+ äžäžªäºè¿å¶ïŒäžæ¡åœä»€ïŒç®¡å¥œäœ æææå¡åšçå€ä»œã
-
+
-
-
---
-BackupX æ¯äžäžªé¢å **Linux / macOS æå¡åš**çèªæç®¡å€ä»œç®¡çå¹³å°ãéè¿äŒäžçº§ Web æ§å¶å°ïŒèœ»æŸé
眮ç®åœå€ä»œãæ°æ®åºå€ä»œïŒå¹¶å°å€ä»œæä»¶å®å
šååšå°é¿éäº OSSãè
Ÿè®¯äº COSãäžçäº KodoãGoogle DriveãS3 å
Œå®¹ååšãWebDAVãFTP/FTPS ææ¬å°ç£çã
+
-æ¯æ **å€èç¹é矀管ç**ïŒå¯ç»äžç®¡æ§ååžåšäžåæå¡åšäžçå€ä»œä»»å¡ã
+## åèœäº®ç¹
-> **éçšäººçŸ€**ïŒæ¥æ Linux æå¡åšç䞪人åŒåè
/ å°å¢é / äŒäžè¿ç»Ž
-
-## Screenshots
-
-### ç»åœé¡µé¢
-
-
-### 仪衚ç
-
-
-### å€ä»œä»»å¡
-
-
-### å€ä»œè®°åœ
-
-
-### ååšç®æ
-
-
-### èç¹ç®¡ç
-
-
-### éç¥é
眮
-
-
-### ç³»ç»è®Ÿçœ®
-
-
-## Features
-
-### ðŠ å€ç§å€ä»œç±»å
-- **æä»¶/ç®åœ** â æ¯æå€æºè·¯åŸå€ä»œïŒèªå®ä¹æé€è§åïŒåŠ `node_modules`ã`*.log`ïŒ
-- **MySQL** â éè¿ `mysqldump` åçå·¥å
·
-- **SQLite** â å®å
šæä»¶æ·èŽ
-- **PostgreSQL** â éè¿ `pg_dump` åçå·¥å
·
-- **SAP HANA** â éè¿ `hdbsql+backint` ïŒæ¯æå€ç§æ·æ°æ®åºïŒ
-
-### âïž å€äºååšå端
-| åå | ç±»å | 诎æ |
-|------|------|------|
-| ðšð³ **é¿éäº OSS** | `aliyun_oss` | èªåšç»è£
EndpointïŒæ¯æå
çœäŒ èŸ |
-| ðšð³ **è
Ÿè®¯äº COS** | `tencent_cos` | èªåšç»è£
Endpoint |
-| ðšð³ **äžçäº Kodo** | `qiniu_kodo` | 6 倧åºå粟确æ å° |
-| ð **S3 Compatible** | `s3` | AWS S3 / MinIO / Cloudflare R2 ç |
-| ð **Google Drive** | `google_drive` | å®æŽ OAuth 2.0 æææµçš |
-| ð **WebDAV** | `webdav` | åæäº / Nextcloud ç |
-| ð **FTP / FTPS** | `ftp` | æ å FTP åè®®ïŒæ¯æ Explicit TLS å å¯ |
-| ðŸ **æ¬å°ç£ç** | `local_disk` | å€ä»œå°æå¡åšæ¬å°ç®åœ |
-
-> åœå
äºååä»
éå¡«å **Region** å **AccessKey**ïŒç³»ç»èªåšå®æ Endpoint ç»è£
ïŒåºå±å€çš S3 åŒæé¶é¢å€äŸèµã
-
-### ð¥ïž é矀管ç (Master-Agent)
-- **èç¹ç®¡ç** â æ³šåè¿çšæå¡åšèç¹ïŒToken 讀è¯
-- **æ¬æºèç¹** â èªåšå建ïŒåæºçšæ·é¶æç¥å级
-- **ç®åœæµè§** â å¯è§åæä»¶æ éæ©å€ä»œæºè·¯åŸïŒå嫿åšèŸå
¥
-- **Agent å¿è·³** â èç¹åšçº¿ç¶æå®æ¶çæ§
-- **任塿 çŸ** â ææ çŸ/èç¹å类管çå€ä»œä»»å¡
-
-### â° èªåšåäžè°åºŠ
-- Cron 衚蟟åŒå®æ¶è°åºŠ
-- å¯è§å Cron çŒèŸåš
-- èªåšä¿ççç¥ïŒæå€©æ° / æä»œæ°è¿ææž
çïŒ
-- æå€§å¹¶åå€ä»œæ°éå¶
-
-### ð å®å
š
-- JWT è®€è¯ + bcrypt å¯ç ååš
-- AES-256-GCM å å¯ååšææé
çœ®ïŒæ°æ®åºå¯ç ãOAuth TokenïŒ
-- å¯éå€ä»œæä»¶å å¯
-- ç»åœéæµé²æŽåç Žè§£
-- èç¹ Token 讀è¯ïŒäžæ¬¡æ§æŸç€ºïŒå®å
šäŒ èŸïŒ
-- CLI å¯ç é眮ïŒDocker çšæ·éè¿ `docker exec` æ§è¡ïŒæ éé®ä»¶æŸåïŒ
-
-### ð çæ§äžéç¥
-- 仪衚çç»è®¡ïŒæåçãååšçšéãå€ä»œè¶å¿åŸè¡šïŒ
-- é®ä»¶ / Webhook / Telegram éç¥
-- 宿¶å€ä»œæ§è¡æ¥å¿ (SSE)
-- **审计æ¥å¿** â å
šæäœéŸå¯æº¯æºïŒè®°åœç»åœãä»»å¡å建/ä¿®æ¹/å é€ãå€ä»œæ§è¡/æ¢å€çå
³é®äºä»¶
-
-### ð å
¶ä»
-- äžè±æåœé
å (i18n)
-- é¶å€éšäŸèµïŒå
åµ SQLiteïŒåäºè¿å¶éšçœ²ïŒ
-- Docker / Docker Compose äžé®éšçœ²
-- systemd æå¡æ¯æ
-
-## Quick Start
-
-### Docker éšçœ² (æšè)
-
-```bash
-# å
é项ç®
-git clone https://github.com/Awuqing/BackupX.git
-cd BackupX
-
-# äžé®å¯åš
-docker compose up -d
-```
-
-åŠéå€ä»œå®¿äž»æºäžçç®åœïŒåš `docker-compose.yml` äžæèœœå¯¹åºè·¯åŸïŒ
-
-```yaml
-volumes:
- - backupx-data:/app/data
- - /path/to/backup/source:/mnt/source:ro
-```
-
-### 仿ºç æå»º
-
-```bash
-# å
é项ç®
-git clone https://github.com/Awuqing/BackupX.git
-cd BackupX
-
-# äžé®æå»ºåå端
-make build
-
-# å¯åšå端æå¡ïŒé»è®€çå¬ :8340ïŒ
-cd server && ./bin/backupx
-```
-
-### åœå
çšæ·æå»º
-
-åŠæå çœç»åå äžèœœäŸèµçŒæ
¢ïŒå¯äœ¿çšåœå
éåå éïŒ
-
-```bash
-# æ¹åŒäžïŒDocker æå»ºïŒæšèïŒäžè¡æå®ïŒ
-make docker-cn
-
-# æ¹åŒäºïŒæåšè®Ÿçœ®éååè£žæºæå»º
-export GOPROXY=https://goproxy.cn,direct # Go æš¡å代ç
-npm config set registry https://registry.npmmirror.com # npm æ·å®æº
-make build
-```
-
-### è®¿é® Web UI
-
-æåŒæµè§åšè®¿é® `http://your-server:8340`ïŒéŠæ¬¡äœ¿çšäŒåŒå¯Œæšå建管çå莊æ·ã
-
-## Configuration
-
-é
眮æä»¶è·¯åŸé»è®€äžº `./config.yaml`ïŒä¹å¯éè¿ç¯å¢åé `BACKUPX_` åçŒèŠçã
-
-```yaml
-# config.yaml
-server:
- host: "0.0.0.0"
- port: 8340
- mode: "release" # debug | release
-
-database:
- path: "./data/backupx.db" # SQLite æ°æ®åºè·¯åŸ
-
-security:
- jwt_secret: "" # ç空åèªåšçæ
- jwt_expire: "24h"
- encryption_key: "" # AES å å¯å¯é¥ïŒç空èªåšçæ
-
-backup:
- temp_dir: "/tmp/backupx" # å€ä»œäžŽæ¶æä»¶ç®åœ
- max_concurrent: 2 # æå€§å¹¶åå€ä»œæ°
-
-log:
- level: "info" # debug | info | warn | error
- file: "./data/backupx.log"
- max_size: 100 # æ¥å¿æä»¶å€§å°äžé (MB)
- max_backups: 3 # ä¿çæ§æ¥å¿æä»¶æ°
- max_age: 30 # æ¥å¿ä¿ç倩æ°
-```
-
-> ð¡ `jwt_secret` å `encryption_key` éŠæ¬¡å¯åšæ¶èªåšçæå¹¶æä¹
åå°æ°æ®åºïŒæ éæåšé
眮ã
-
-## Architecture
-
-```
- âââââââââââââââââââââââ
- â Nginx (åå代ç) â
- â / â åç«¯éææä»¶ â
- â /api â :8340 â
- âââââââââââ¬ââââââââââââ
- â
- âŒ
-ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
-â BackupX Master (Go API Server) â
-â :8340 â
-â â
-â ââââââââ ââââââââââââââ ââââââââââââââââââââââââââ
-â â Auth â âBackup Engineâ â Storage Registry ââ
-â ââââââââ ââââââââ¬ââââââ â âââââââââââââââââââ ââ
-â â â â Aliyun OSS â ââ
-â ââââââââââââ â â â Tencent COS â ââ
-â â Cron ââââââ â â Qiniu Kodo â ââ
-â âScheduler â â â S3 Compatible â ââ
-â ââââââââââââ â â Google Drive â ââ
-â â â WebDAV â ââ
-â â â FTP / FTPS â ââ
-â ââââââââââââ â â Local Disk â ââ
-â â Notify â â âââââââââââââââââââ ââ
-â â Module â ââââââââââââââââââââââââââ
-â ââââââââââââ â
-â â
-â ââââââââââââââââ ââââââââââââââââââââââ â
-â â Node Manager â â SQLite (backupx.db)â â
-â ââââââââ¬ââââââââ ââââââââââââââââââââââ â
-âââââââââââŒâââââââââââââââââââââââââââââââââââââââââââââ
- â Heartbeat / Task Dispatch
- âŒ
-ââââââââââââââââââââ ââââââââââââââââââââ
-â Agent Node A â â Agent Node B â
-â (è¿çšæå¡åš) â â (è¿çšæå¡åš) â
-ââââââââââââââââââââ ââââââââââââââââââââ
-```
-
-### ææ¯æ
-
-| ç»ä»¶ | ææ¯ |
+| èœå | 诎æ |
|------|------|
-| **å端** | Go · Gin · GORM · SQLite · robfig/cron |
-| **å端** | React 18 · TypeScript · ArcoDesign · Vite · Zustand · ECharts |
-| **ååš** | AWS SDK v2 (S3/OSS/COS/Kodo) · Google Drive API v3 · gowebdav · jlaffaye/ftp |
-| **å®å
š** | JWT · bcrypt · AES-256-GCM |
-| **æ¥å¿** | zap + lumberjack (èªåšèœ®èœ¬) |
+| **å€ä»œç±»å** | æä»¶/ç®åœïŒå€æºè·¯åŸïŒãMySQLãPostgreSQLãSQLiteãSAP HANA |
+| **ååšå端** | é¿éäº OSSãè
Ÿè®¯äº COSãäžçäºãS3 å
Œå®¹(AWS/MinIO/R2)ãGoogle DriveãWebDAVãFTP/FTPSãæ¬å°ç£ç |
+| **èªåšè°åºŠ** | Cron 宿¶ + å¯è§åçŒèŸåš + èªåšä¿ççç¥ïŒæå€©æ°/ä»œæ°æž
çïŒ |
+| **å€èç¹** | Master-Agent é矀ïŒç»äžç®¡çå€å°æå¡åšçå€ä»œ |
+| **å®å
š** | JWT + bcrypt + AES-256-GCM å å¯é
眮 + å¯éå€ä»œæä»¶å å¯ + 审计æ¥å¿ |
+| **éç¥** | é®ä»¶ / Webhook / TelegramïŒå€ä»œæåæå€±èŽ¥æ¶èªåšæšé |
+| **éšçœ²** | åäºè¿å¶ + å
åµ SQLiteïŒDocker äžé®å¯åšïŒé¶å€éšäŸèµ |
-## Cluster Mode
+---
-BackupX æ¯æ **Master-Agent** æš¡åŒïŒå¯ç®¡çå€å°æå¡åšçå€ä»œä»»å¡ã
+## å¿«éåŒå§
-### å·¥äœåç
+### 1. å®è£
-1. **Master** 䞺è¿è¡ BackupX Web æ§å¶å°çäž»æ§æå¡åš
-2. **Agent** éšçœ²åšéèŠå€ä»œçè¿çšæå¡åšäž
-3. Agent å¯åšåéè¿ Token å Master 泚å并宿åéå¿è·³
-4. Master å°å€ä»œä»»å¡äžåè³å¯¹åº Agent æ§è¡
-
-### æ·»å èç¹
+**DockerïŒæšèïŒæ éå
éä»åºïŒïŒ**
```bash
-# åš Web æ§å¶å° â èç¹ç®¡ç â æ·»å èç¹
-# ç³»ç»å°çæäžäžªå¯äžç 64 äœåå
è¿å¶ Token
+# å建 docker-compose.yml åäžé®å¯åš
+docker compose up -d
-# åšè¿çšæå¡åšäžé
眮 Agent å¯åšåæ°
-./backupx-agent --master http://master-server:8340 --token
+# æçŽæ¥è¿è¡
+docker run -d --name backupx -p 8340:8340 -v backupx-data:/app/data awuqing/backupx:latest
```
-### ç®åœæ¢é API
+> Docker Hub éåïŒ[`awuqing/backupx`](https://hub.docker.com/r/awuqing/backupx)ïŒæ¯æ linux/amd64 å linux/arm64ã
-Master æäŸ `GET /api/nodes/:id/fs/list?path=/` æ¥å£ïŒå¯è¿çšæµè§èç¹çæä»¶ç³»ç»ç®åœãå端åšå建å€ä»œä»»å¡ç"æºè·¯åŸ"èŸå
¥æ¶å¯äœ¿çšæ åœ¢éæ©åšçŽæ¥æµè§ç®æ æºåšçç®åœç»æã
+
+docker-compose.yml åè
-## Project Structure
+```yaml
+services:
+ backupx:
+ image: awuqing/backupx:latest
+ container_name: backupx
+ restart: unless-stopped
+ ports:
+ - "8340:8340"
+ volumes:
+ - backupx-data:/app/data
+ # æèœœéèŠå€ä»œç宿䞻æºç®åœïŒæéæ·»å ïŒïŒ
+ # - /var/www:/mnt/www:ro
+ # - /etc/nginx:/mnt/nginx-conf:ro
+ environment:
+ - TZ=Asia/Shanghai
-```
-BackupX/
-âââ server/ # Go å端
-â âââ cmd/backupx/ # çšåºå
¥å£
-â âââ internal/
-â â âââ app/ # åºçšç»è£
(DI)
-â â âââ apperror/ # ç»äžé误类å
-â â âââ backup/ # å€ä»œåŒæ (file/mysql/sqlite/pgsql/saphana)
-â â â âââ retention/ # ä¿ççç¥
-â â âââ config/ # é
眮å 蜜 (viper)
-â â âââ database/ # æ°æ®åºåå§å + è¿ç§»
-â â âââ http/ # HTTP å€çåš + è·¯ç± + äžéŽä»¶
-â â âââ httpapi/ # HTTP API èŸ
å©å·¥å
·
-â â âââ logger/ # æ¥å¿åå§å (zap + lumberjack)
-â â âââ model/ # GORM æ°æ®æš¡å
-â â âââ notify/ # éç¥ (email/webhook/telegram)
-â â âââ repository/ # æ°æ®è®¿é®å±
-â â âââ scheduler/ # Cron è°åºŠåš
-â â âââ security/ # JWT + éæµ
-â â âââ service/ # äžå¡é»èŸå±
-â â âââ storage/ # ååšå端 (æä»¶åæ¥å£)
-â â âââ aliyun/ # é¿éäº OSS
-â â âââ tencent/ # è
Ÿè®¯äº COS
-â â âââ qiniu/ # äžçäº Kodo
-â â âââ s3/ # S3 Compatible æ žå¿
-â â âââ s3provider/ # S3 Provider èŸ
å©
-â â âââ googledrive/ # Google Drive
-â â âââ webdav/ # WebDAV æ žå¿
-â â âââ webdavprovider/ # WebDAV Provider èŸ
å©
-â â âââ localdisk/ # æ¬å°ç£ç
-â â âââ ftp/ # FTP / FTPS
-â â âââ codec/ # é
眮çŒè§£ç
-â âââ pkg/ # å·¥å
·å
(compress/crypto/response)
-âââ web/ # React å端
-â âââ src/
-â âââ components/ # éçšç»ä»¶ (CronEditor/FormDrawer/...)
-â âââ hooks/ # èªå®ä¹ Hooks
-â âââ layouts/ # åžå±ç»ä»¶ (AppLayout)
-â âââ pages/ # 页颿š¡å
-â â âââ dashboard/ # 仪衚ç
-â â âââ backup-tasks/ # å€ä»œä»»å¡
-â â âââ backup-records/ # å€ä»œè®°åœ
-â â âââ storage-targets/ # ååšç®æ
-â â âââ nodes/ # èç¹ç®¡ç
-â â âââ notifications/ # éç¥é
眮
-â â âââ audit/ # 审计æ¥å¿
-â â âââ settings/ # ç³»ç»è®Ÿçœ®
-â â âââ login/ # ç»åœé¡µ
-â âââ services/ # API 请æ±å°è£
-â âââ stores/ # Zustand ç¶æç®¡ç
-â âââ styles/ # å
šå±æ ·åŒ
-â âââ types/ # TypeScript ç±»åå®ä¹
-â âââ utils/ # å·¥å
·åœæ°
-â âââ locales/ # i18n è¯èšå
(zh-CN / en-US)
-â âââ router/ # è·¯ç±é
眮
-âââ deploy/ # éšçœ²é
眮
-â âââ nginx.conf # Nginx åèé
眮
-â âââ backupx.service # systemd æå¡åå
-â âââ install.sh # äžé®å®è£
èæ¬
-â âââ docker/ # Docker éšçœ²é
眮
-â âââ nginx.conf # 容åšå
Nginx é
眮
-â âââ entrypoint.sh # 容åšå¯åšèæ¬
-âââ .github/ # GitHub é
眮
-â âââ workflows/ci.yml # CI å·¥äœæµ
-â âââ workflows/release.yml # Release å·¥äœæµ
-â âââ ISSUE_TEMPLATE/ # Issue æš¡æ¿
-âââ Dockerfile # Docker å€é¶æ®µæå»º
-âââ docker-compose.yml # Docker Compose é
眮
-âââ Makefile # æå»ºåœä»€
+volumes:
+ backupx-data:
```
-## Development
+
-### å眮æ¡ä»¶
+**é¢çŒè¯å
ïŒè£žæºéšçœ²ïŒïŒ**
-- **Go** ⥠1.21
-- **Node.js** ⥠18
-- **npm**
-
-### åŒåæš¡åŒ
+ä» [Releases](https://github.com/Awuqing/BackupX/releases) äžèœœå¯¹åºå¹³å°çå猩å
ïŒ
```bash
-# ç»ç«¯ 1ïŒå¯åšå端 (çé蜜éé
å air)
-make dev-server
-
-# ç»ç«¯ 2ïŒå¯åšå端 (Vite HMR)
-make dev-web
+tar xzf backupx-v*-linux-amd64.tar.gz && cd backupx-*
+sudo ./install.sh # èªåšé
眮 systemd + Nginx
```
-### è¿è¡æµè¯
+**仿ºç æå»ºïŒ**
```bash
-# è¿è¡å
šéšæµè¯
-make test
-
-# ä»
å端
-make test-server # go test ./...
-
-# ä»
å端
-make test-web # npm run test
+git clone https://github.com/Awuqing/BackupX.git && cd BackupX
+make build # æå»ºåå端
+make docker-cn # æçšåœå
éåæå»º DockerïŒgoproxy.cn / npmmirror / é¿éäº apkïŒ
```
-### æå»º
+### 2. æåŒæ§å¶å°
-```bash
-# æå»ºåå端
-make build
+æµè§åšè®¿é® `http://your-server:8340`ïŒéŠæ¬¡æåŒäŒåŒå¯Œå建管çå莊æ·ã
-# Docker æå»º
-make docker
+### 3. æ·»å ååšç®æ
-# åœå
Docker æå»ºïŒäœ¿çšåœå
éåå éïŒ
-make docker-cn
+è¿å
¥ **ååšç®æ ** 页é¢ïŒç¹å» **æ·»å **ïŒéæ©ååšç±»åå¹¶å¡«ååè¯ïŒ
-# æž
çæå»ºäº§ç©
-make clean
-```
+| ååšç±»å | éèŠå¡«å |
+|---------|---------|
+| é¿éäº OSS | Region + AccessKey ID/Secret + Bucket |
+| è
Ÿè®¯äº COS | Region + SecretId/SecretKey + BucketïŒæ ŒåŒ `name-appid`ïŒ |
+| äžçäº Kodo | Region + AccessKey/SecretKey + Bucket |
+| S3 å
Œå®¹ | Endpoint + AccessKey + Bucket |
+| Google Drive | Client ID/Secret â ç¹å»ææå®æ OAuth |
+| WebDAV | æå¡åšå°å + çšæ·å/å¯ç |
+| FTP | äž»æº + ç«¯å£ + çšæ·å/å¯ç |
+| æ¬å°ç£ç | ç®æ ç®åœè·¯åŸ |
-### åç
+> åœå
äºåååªéå¡« Region å AccessKeyïŒç³»ç»èªåšç»è£
Endpointã
-æšé Git tag å³å¯èªåšè§Šå GitHub Actions 宿å
šéšååžæµçšïŒ
+æ·»å åç¹å» **æµè¯è¿æ¥** 确讀é
眮æ£ç¡®ã
-```bash
-git tag v1.2.3
-git push --tags
-# GitHub Actions èªåšïŒçŒè¯äºè¿å¶ â ååž Release â æšé Docker Hub éå
-```
+### 4. å建å€ä»œä»»å¡
-ä¹å¯ä»¥åš GitHub Actions 页颿åšè§Šå Release workflowïŒèŸå
¥çæ¬å·å³å¯ã
+è¿å
¥ **å€ä»œä»»å¡** 页é¢ïŒç¹å» **æ°å»º**ïŒäžæ¥å®æïŒ
-## Deployment
+1. **åºç¡ä¿¡æ¯** â ä»»å¡åç§°ãå€ä»œç±»åãCron 衚蟟åŒïŒç空åä»
æåšæ§è¡ïŒ
+2. **æºé
眮** â æä»¶å€ä»œéæ©æºè·¯åŸïŒæ¯æå€äžªïŒãæ°æ®åºå€ä»œå¡«åè¿æ¥ä¿¡æ¯
+3. **ååšäžçç¥** â éæ©ååšç®æ ãå猩çç¥ãä¿ç倩æ°ãæ¯åŠå å¯
-### äžé®å®è£
(æšè)
+ä¿ååå¯ä»¥ç¹å» **ç«å³æ§è¡** æµè¯ïŒåš **å€ä»œè®°åœ** 页é¢å®æ¶æ¥çæ§è¡æ¥å¿ã
-```bash
-# å
æå»º
-make build
+### 5. é
眮éç¥ïŒå¯éïŒ
-# 以 root æ§è¡å®è£
èæ¬
-sudo ./deploy/install.sh
-```
+è¿å
¥ **éç¥é
眮** 页é¢ïŒæ¯æé®ä»¶ãWebhookãTelegram äžç§æ¹åŒïŒå¯åå«é
眮æå/å€±èŽ¥æ¶æ¯åŠæšéã
-å®è£
èæ¬å°èªåšïŒ
-1. å建 `backupx` ç³»ç»çšæ·
-2. å®è£
äºè¿å¶å° `/opt/backupx/bin/`
-3. éšçœ²åç«¯å° `/opt/backupx/web/`
-4. çæé
眮æä»¶ `/etc/backupx/config.yaml`
-5. 泚åå¹¶å¯åš systemd æå¡
-6. é
眮 Nginx åå代çïŒåŠå·²å®è£
ïŒ
+---
+
+## éšçœ²æå
### Docker éšçœ²
```bash
-# äœ¿çš docker compose
-docker compose up -d
-
-# ææåšæå»ºéå
-docker build -t backupx .
-docker run -d --name backupx -p 8340:8340 -v backupx-data:/app/data backupx
+docker compose up -d # 䜿çšäžæ¹ç docker-compose.yml
```
-**å¯ç é眮**ïŒå¿è®°ç®¡çåå¯ç æ¶ïŒïŒ
+å€ä»œå®¿äž»æºç®åœæ¶éèŠæèœœè·¯åŸïŒåš docker-compose.yml ç `volumes` äžæ·»å ïŒïŒ
+
+```yaml
+volumes:
+ - backupx-data:/app/data
+ - /var/www:/mnt/www:ro # æèœœéèŠå€ä»œçç®åœ
+ - /etc/nginx:/mnt/nginx-conf:ro # å¯ä»¥æèœœå€äžª
+```
+
+éè¿ç¯å¢åéè°æŽé
眮ïŒ
+
+```yaml
+environment:
+ - TZ=Asia/Shanghai
+ - BACKUPX_LOG_LEVEL=debug
+ - BACKUPX_BACKUP_MAX_CONCURRENT=4
+```
+
+### 裞æºéšçœ²
```bash
-docker exec -it backupx /app/bin/backupx reset-password --username admin --password newpass123
+# 䜿çšé¢çŒè¯å
+tar xzf backupx-v*-linux-amd64.tar.gz && cd backupx-*
+sudo ./install.sh
+
+# æä»æºç
+make build
+sudo ./deploy/install.sh
```
-éè¿ç¯å¢åéèŠçé
眮ïŒ
+å®è£
èæ¬èªåšå®æïŒå建系ç»çšæ· â å®è£
äºè¿å¶å° `/opt/backupx/` â é
眮 systemd â é
眮 Nginx åå代çã
-```bash
-docker run -d --name backupx \
- -p 8340:8340 \
- -v backupx-data:/app/data \
- -e TZ=Asia/Shanghai \
- -e BACKUPX_LOG_LEVEL=debug \
- -e BACKUPX_BACKUP_MAX_CONCURRENT=4 \
- backupx
-```
-
-### æåšéšçœ²
-
-```bash
-# 1. æå»º
-cd server && go build -o backupx ./cmd/backupx
-cd ../web && npm run build
-
-# 2. éšçœ²æä»¶
-scp server/backupx your-server:/opt/backupx/bin/
-scp -r web/dist/ your-server:/opt/backupx/web/
-scp server/config.example.yaml your-server:/etc/backupx/config.yaml
-
-# 3. å¯åš
-ssh your-server '/opt/backupx/bin/backupx -config /etc/backupx/config.yaml'
-```
-
-### å¯ç é眮
-
-å¿è®°ç®¡çåå¯ç æ¶ïŒå¯éè¿ CLI çŽæ¥é眮ïŒéèŠæå¡åš shell æéïŒïŒ
-
-```bash
-# 裞æºéšçœ²
-./backupx reset-password --username admin --password newpass123
-
-# Docker éšçœ²
-docker exec -it backupx /app/bin/backupx reset-password --username admin --password newpass123
-```
-
-### Nginx é
眮瀺äŸ
+### Nginx åå代çïŒè£žæºéšçœ²æ¶ïŒ
```nginx
server {
listen 80;
server_name backup.example.com;
- # åç«¯éææä»¶
location / {
root /opt/backupx/web;
try_files $uri $uri/ /index.html;
}
- # API åå代ç
location /api/ {
proxy_pass http://127.0.0.1:8340;
proxy_set_header Host $host;
@@ -510,90 +201,122 @@ server {
}
```
-## API Reference
+### é
眮æä»¶
-ææ API å以 `/api` 䞺åçŒïŒäœ¿çš JWT Bearer Token 讀è¯ïŒé€ç¹æ®æ 泚å€ïŒã
+é
眮æä»¶è·¯åŸ `./config.yaml`ïŒä¹å¯éè¿ `BACKUPX_` åçŒç¯å¢åéèŠçïŒ
+
+```yaml
+server:
+ port: 8340
+database:
+ path: "./data/backupx.db"
+security:
+ jwt_secret: "" # ç空èªåšçæå¹¶æä¹
åå°æ°æ®åº
+ encryption_key: "" # ç空èªåšçæ
+backup:
+ temp_dir: "/tmp/backupx"
+ max_concurrent: 2
+log:
+ level: "info" # debug | info | warn | error
+ file: "./data/backupx.log"
+```
+
+### å¯ç é眮
+
+å¿è®°ç®¡çåå¯ç æ¶éè¿ CLI é眮ïŒ
+
+```bash
+# 裞æº
+./backupx reset-password --username admin --password newpass123
+
+# Docker
+docker exec -it backupx /app/bin/backupx reset-password --username admin --password newpass123
+```
+
+---
+
+## å€èç¹é矀
+
+BackupX æ¯æ Master-Agent æš¡åŒç®¡çå€å°æå¡åšïŒ
+
+1. Web æ§å¶å° â **èç¹ç®¡ç** â **æ·»å èç¹**ïŒç³»ç»çæ Token
+2. åšè¿çšæå¡åšéšçœ² Agent å¹¶äœ¿çš Token è¿æ¥ Master
+3. å建å€ä»œä»»å¡æ¶éæ©å¯¹åºèç¹ïŒMaster èªåšäžåä»»å¡
+
+å建æä»¶å€ä»œä»»å¡æ¶ïŒå¯éè¿å¯è§åç®åœæµè§åšè¿çšéæ© Agent èç¹äžçç®åœïŒæ éæåšèŸå
¥è·¯åŸã
+
+---
+
+## åŒåæå
+
+**ç¯å¢èŠæ±ïŒ** Go >= 1.25 · Node.js >= 20 · npm
+
+```bash
+# åŒåæš¡åŒ
+make dev-server # ç»ç«¯ 1ïŒå端ïŒé»è®€ :8340ïŒ
+make dev-web # ç»ç«¯ 2ïŒå端ïŒVite HMRïŒ
+
+# æµè¯
+make test # è¿è¡å
šéšæµè¯
+
+# æå»º
+make build # åå端äžèµ·æå»º
+make docker # Docker æå»º
+make docker-cn # åœå
Docker æå»ºïŒéåå éïŒ
+```
+
+### åç
+
+```bash
+git tag v1.2.3 && git push --tags
+# GitHub Actions èªåšïŒçŒè¯åæ¶æäºè¿å¶ â ååž GitHub Release â æšé Docker Hub éå
+```
+
+ä¹å¯åš GitHub Actions 页颿åšè§Šå Release workflowã
+
+---
+
+## API åè
+
+æææ¥å£ä»¥ `/api` 䞺åçŒïŒäœ¿çš JWT Bearer Token 讀è¯ã
| æš¡å | ç«¯ç¹ | 诎æ |
|------|------|------|
-| **讀è¯** | `POST /api/auth/setup` | éŠæ¬¡åå§å管çå |
-| | `POST /api/auth/login` | ç»åœè·å Token |
-| | `POST /api/auth/logout` | ç»åº |
-| | `GET /api/auth/profile` | åœåçšæ·ä¿¡æ¯ |
-| | `PUT /api/auth/password` | ä¿®æ¹å¯ç |
-| **å€ä»œä»»å¡** | `GET/POST /api/backup/tasks` | ä»»å¡å衚 / å建 |
-| | `GET/PUT/DELETE /api/backup/tasks/:id` | 诊æ
/ æŽæ° / å é€ |
-| | `PUT /api/backup/tasks/:id/toggle` | å¯çš/çŠçš |
-| | `POST /api/backup/tasks/:id/run` | æåšè§Šåæ§è¡ |
-| **å€ä»œè®°åœ** | `GET /api/backup/records` | è®°åœå衚 (æ¯æçé) |
-| | `GET /api/backup/records/:id` | è®°åœè¯Šæ
|
-| | `GET /api/backup/records/:id/logs/stream` | 宿¶æ§è¡æ¥å¿ (SSE) |
-| | `GET /api/backup/records/:id/download` | äžèœœå€ä»œæä»¶ |
-| | `POST /api/backup/records/:id/restore` | æ¢å€å€ä»œ |
-| **ååšç®æ ** | `GET/POST /api/storage-targets` | ååšå衚 / æ·»å |
-| | `GET/PUT/DELETE /api/storage-targets/:id` | 诊æ
/ æŽæ° / å é€ |
-| | `POST /api/storage-targets/test` | æµè¯è¿æ¥ |
-| | `POST /api/storage-targets/:id/test` | æµè¯å·²ä¿åè¿æ¥ |
-| | `GET /api/storage-targets/:id/usage` | æ¥è¯¢çšé |
-| **èç¹ç®¡ç** | `GET/POST /api/nodes` | èç¹å衚 / æ·»å |
-| | `GET/DELETE /api/nodes/:id` | 诊æ
/ å é€ |
-| | `GET /api/nodes/:id/fs/list` | ç®åœæµè§ |
-| | `POST /api/agent/heartbeat` | Agent å¿è·³ â¡ |
-| **éç¥** | `GET/POST /api/notifications` | éç¥å衚 / æ·»å |
-| | `POST /api/notifications/test` | æµè¯éç¥ |
-| | `POST /api/notifications/:id/test` | æµè¯å·²ä¿åéç¥ |
-| **仪衚ç** | `GET /api/dashboard/stats` | æŠè§ç»è®¡ |
-| | `GET /api/dashboard/timeline` | å€ä»œè¶å¿æ¶éŽçº¿ |
-| **审计æ¥å¿** | `GET /api/audit-logs` | 审计æ¥å¿å衚 (æ¯æåç±»çé/å页) |
-| **ç³»ç»** | `GET /api/system/info` | ç³»ç»ä¿¡æ¯ (çæ¬/ç£ç) |
-| | `GET/PUT /api/settings` | ç³»ç»è®Ÿçœ®è¯»å |
+| **讀è¯** | `POST /auth/setup` | åå§å管çå |
+| | `POST /auth/login` | ç»åœ |
+| | `PUT /auth/password` | ä¿®æ¹å¯ç |
+| **å€ä»œä»»å¡** | `GET\|POST /backup/tasks` | å衚 / å建 |
+| | `GET\|PUT\|DELETE /backup/tasks/:id` | 诊æ
/ æŽæ° / å é€ |
+| | `PUT /backup/tasks/:id/toggle` | å¯çš/çŠçš |
+| | `POST /backup/tasks/:id/run` | æåšæ§è¡ |
+| **å€ä»œè®°åœ** | `GET /backup/records` | åè¡šïŒæ¯æçéïŒ |
+| | `GET /backup/records/:id/logs/stream` | 宿¶æ¥å¿ (SSE) |
+| | `GET /backup/records/:id/download` | äžèœœ |
+| | `POST /backup/records/:id/restore` | æ¢å€ |
+| **ååšç®æ ** | `GET\|POST /storage-targets` | å衚 / æ·»å |
+| | `POST /storage-targets/test` | æµè¯è¿æ¥ |
+| **èç¹** | `GET\|POST /nodes` | å衚 / æ·»å |
+| | `GET /nodes/:id/fs/list` | ç®åœæµè§ |
+| **éç¥** | `GET\|POST /notifications` | å衚 / æ·»å |
+| **仪衚ç** | `GET /dashboard/stats` | æŠè§ç»è®¡ |
+| **审计æ¥å¿** | `GET /audit-logs` | æäœå®¡è®¡ |
+| **ç³»ç»** | `GET /system/info` | ç³»ç»ä¿¡æ¯ |
-> â¡ `POST /api/agent/heartbeat` 䞺å
¬åŒç«¯ç¹ïŒäœ¿çš Node Token 讀è¯èé JWTã
+---
-## äºååšé
眮æå
+## ææ¯æ
-### é¿éäº OSS
-
-1. ç»åœ[é¿éäºæ§å¶å°](https://oss.console.aliyun.com/)ïŒå建 Bucket
-2. ååŸ RAM æ§å¶å°å建 AccessKey
-3. åš BackupX æ·»å ååšç®æ æ¶éæ©"é¿éäº OSS"
-4. å¡«å RegionïŒåŠ `cn-hangzhou`ïŒå AccessKeyïŒç³»ç»èªåšç»è£
Endpoint
-
-### è
Ÿè®¯äº COS
-
-1. ç»åœ[è
Ÿè®¯äºæ§å¶å°](https://console.cloud.tencent.com/cos)ïŒå建ååšæ¡¶
-2. ååŸ API å¯é¥ç®¡çå建 SecretId/SecretKey
-3. Bucket åç§°æ ŒåŒäžº `BucketName-APPID`ïŒåŠ `backup-1250000000`ïŒ
-
-### äžçäº Kodo
-
-1. ç»åœ[äžçäºæ§å¶å°](https://portal.qiniu.com/)ïŒå建ååšç©ºéŽ
-2. æ¯æåºåïŒ`z0`(åäž) / `cn-east-2`(åäž-æµæ±2) / `z1`(åå) / `z2`(åå) / `na0`(åçŸ) / `as0`(äžåäº)
-
-### Google Drive
-
-1. ååŸ [Google Cloud Console](https://console.cloud.google.com/) å建项ç®
-2. å¯çš **Google Drive API**
-3. å建 **OAuth 2.0 客æ·ç«¯ ID**ïŒWeb åºçšç±»åïŒ
-4. æ·»å éå®å URIïŒ`http://your-server/api/storage-targets/google-drive/callback`
-5. åš BackupX ååšç®¡ç页é¢å¡«å
¥ Client ID / SecretïŒç¹å»ææ
+| ç»ä»¶ | ææ¯ |
+|------|------|
+| **å端** | Go · Gin · GORM · SQLite · robfig/cron |
+| **å端** | React 18 · TypeScript · ArcoDesign · Vite · Zustand · ECharts |
+| **ååš** | AWS SDK v2 · Google Drive API v3 · gowebdav · jlaffaye/ftp |
+| **å®å
š** | JWT · bcrypt · AES-256-GCM |
## Contributing
æ¬¢è¿æäº€ Issue å Pull RequestïŒ
-1. Fork æ¬é¡¹ç®
-2. å建åèœåæ¯ (`git checkout -b feature/amazing-feature`)
-3. æäº€æŽæ¹ (`git commit -m 'Add amazing feature'`)
-4. æšéå°åæ¯ (`git push origin feature/amazing-feature`)
-5. å建 Pull Request
-
## License
-æ¬é¡¹ç®éçš [Apache License 2.0](LICENSE) åŒæºåè®®ã
-
----
-
-
- Made with â€ïž for self-hosters
-
+[Apache License 2.0](LICENSE)
diff --git a/README_EN.md b/README_EN.md
index c7210ff..ed7c809 100644
--- a/README_EN.md
+++ b/README_EN.md
@@ -2,485 +2,225 @@
English | äžæ
-
ð¡ïž BackupX
+ BackupX
- Self-hosted Server Backup Management Platform with Web UI
-
-
- Features â¢
- Quick Start â¢
- Configuration â¢
- Architecture â¢
- Cluster â¢
- Development â¢
- API
+ Self-hosted Server Backup Management Platform
+ One binary, one command â manage all your server backups.
-
+
-
-
---
-BackupX is a self-hosted backup management platform for **Linux / macOS servers**. Through an enterprise-grade Web console, you can easily configure directory backups, database backups, and securely store backup files to Alibaba Cloud OSS, Tencent Cloud COS, Qiniu Cloud Kodo, Google Drive, S3-compatible storage, WebDAV, FTP/FTPS, or local disk.
+
-Supports **multi-node cluster management** for unified control of backup tasks across different servers.
+## Highlights
-> **For**: Individual developers / small teams / DevOps with Linux servers
+| Capability | Details |
+|-----------|---------|
+| **Backup Types** | Files/Directories (multi-source), MySQL, PostgreSQL, SQLite, SAP HANA |
+| **Storage Backends** | Alibaba Cloud OSS, Tencent COS, Qiniu Kodo, S3-compatible (AWS/MinIO/R2), Google Drive, WebDAV, FTP/FTPS, Local Disk |
+| **Scheduling** | Cron-based scheduling + visual editor + auto-retention policy (by days/count) |
+| **Multi-Node** | Master-Agent cluster for managing backups across multiple servers |
+| **Security** | JWT + bcrypt + AES-256-GCM encrypted config + optional backup encryption + audit logs |
+| **Notifications** | Email / Webhook / Telegram â push on success or failure |
+| **Deployment** | Single binary + embedded SQLite, Docker one-click, zero external dependencies |
-## Screenshots
-
-### Login
-
-
-### Dashboard
-
-
-### Backup Tasks
-
-
-### Backup Records
-
-
-### Storage Targets
-
-
-### Node Management
-
-
-### Notification Settings
-
-
-### System Settings
-
-
-## Features
-
-### ðŠ Multiple Backup Types
-- **Files / Directories** â Multi-source path backup, custom exclude rules (e.g. `node_modules`, `*.log`)
-- **MySQL** â Via native `mysqldump` tool
-- **SQLite** â Safe file copy
-- **PostgreSQL** â Via native `pg_dump` tool
-- **SAP HANA** â Via native `hdbsql` tool (multi-tenant database support)
-
-### âïž Multi-Cloud Storage Backends
-| Provider | Type | Description |
-|----------|------|-------------|
-| ðšð³ **Alibaba Cloud OSS** | `aliyun_oss` | Auto endpoint assembly, internal network support |
-| ðšð³ **Tencent Cloud COS** | `tencent_cos` | Auto endpoint assembly |
-| ðšð³ **Qiniu Cloud Kodo** | `qiniu_kodo` | 6 region precise mapping |
-| ð **S3 Compatible** | `s3` | AWS S3 / MinIO / Cloudflare R2, etc. |
-| ð **Google Drive** | `google_drive` | Full OAuth 2.0 flow |
-| ð **WebDAV** | `webdav` | Nextcloud / Nutstore, etc. |
-| ð **FTP / FTPS** | `ftp` | Standard FTP protocol with Explicit TLS support |
-| ðŸ **Local Disk** | `local_disk` | Backup to local server directory |
-
-> Chinese cloud providers only require **Region** and **AccessKey** â the system auto-assembles the endpoint. Powered by the S3 engine under the hood with zero extra dependencies.
-
-### ð¥ïž Cluster Management (Master-Agent)
-- **Node Management** â Register remote server nodes with Token authentication
-- **Local Node** â Auto-created, zero-friction upgrade for single-machine users
-- **Directory Browser** â Visual file tree selector for backup source paths
-- **Agent Heartbeat** â Real-time node online status monitoring
-- **Task Tags** â Categorize and manage backup tasks by tags/nodes
-
-### â° Automation & Scheduling
-- Cron expression scheduling
-- Visual Cron editor
-- Auto-retention policy (by days / by count)
-- Max concurrent backup limit
-
-### ð Security
-- JWT authentication + bcrypt password hashing
-- AES-256-GCM encrypted sensitive config storage (DB passwords, OAuth tokens)
-- Optional backup file encryption
-- Login rate limiting (brute force protection)
-- Node Token authentication (one-time display, secure transport)
-- CLI password reset (Docker users can run `docker exec` â no email recovery needed)
-
-### ð Monitoring & Notifications
-- Dashboard stats (success rate, storage usage, backup trend charts)
-- Email / Webhook / Telegram notifications
-- Real-time backup execution logs (SSE)
-- **Audit Logs** â Full operation traceability, records login, task CRUD, backup execution/restore and other key events
-
-### ð Other
-- Chinese & English i18n
-- Zero external dependencies (embedded SQLite, single binary deployment)
-- Docker / Docker Compose one-click deployment
-- systemd service support
+---
## Quick Start
-### Docker Deployment (Recommended)
+### 1. Install
+
+**Docker (recommended, no clone needed):**
```bash
-# Clone the project
-git clone https://github.com/Awuqing/BackupX.git
-cd BackupX
-
-# Start with one command
+# Create a docker-compose.yml then start
docker compose up -d
+
+# Or run directly
+docker run -d --name backupx -p 8340:8340 -v backupx-data:/app/data awuqing/backupx:latest
```
-To back up host directories, mount them in `docker-compose.yml`:
+> Docker Hub: [`awuqing/backupx`](https://hub.docker.com/r/awuqing/backupx) â supports linux/amd64 and linux/arm64.
+
+
+docker-compose.yml reference
+
+```yaml
+services:
+ backupx:
+ image: awuqing/backupx:latest
+ container_name: backupx
+ restart: unless-stopped
+ ports:
+ - "8340:8340"
+ volumes:
+ - backupx-data:/app/data
+ # Mount host directories to back up (add as needed):
+ # - /var/www:/mnt/www:ro
+ # - /etc/nginx:/mnt/nginx-conf:ro
+ environment:
+ - TZ=Asia/Shanghai
+
+volumes:
+ backupx-data:
+```
+
+
+
+**Pre-built binaries (bare metal):**
+
+Download from [Releases](https://github.com/Awuqing/BackupX/releases):
+
+```bash
+tar xzf backupx-v*-linux-amd64.tar.gz && cd backupx-*
+sudo ./install.sh # Auto-configures systemd + Nginx
+```
+
+**Build from source:**
+
+```bash
+git clone https://github.com/Awuqing/BackupX.git && cd BackupX
+make build # Build frontend + backend
+make docker-cn # Or Docker build with China mirrors (goproxy.cn / npmmirror / Aliyun apk)
+```
+
+### 2. Open the Console
+
+Visit `http://your-server:8340` in your browser. First-time access guides you through admin account creation.
+
+### 3. Add a Storage Target
+
+Go to **Storage Targets** â **Add**, choose a storage type and enter credentials:
+
+| Storage Type | Required Fields |
+|-------------|----------------|
+| Alibaba Cloud OSS | Region + AccessKey ID/Secret + Bucket |
+| Tencent Cloud COS | Region + SecretId/SecretKey + Bucket (`name-appid`) |
+| Qiniu Cloud Kodo | Region + AccessKey/SecretKey + Bucket |
+| S3 Compatible | Endpoint + AccessKey + Bucket |
+| Google Drive | Client ID/Secret â click Authorize for OAuth |
+| WebDAV | Server URL + Username/Password |
+| FTP | Host + Port + Username/Password |
+| Local Disk | Target directory path |
+
+Click **Test Connection** to verify.
+
+### 4. Create a Backup Task
+
+Go to **Backup Tasks** â **Create**, complete 3 steps:
+
+1. **Basic Info** â Task name, backup type, Cron expression (leave empty for manual-only)
+2. **Source Config** â File backup: select source paths (supports multiple); Database: enter connection info
+3. **Storage & Policy** â Select storage target(s), compression, retention days, encryption toggle
+
+Save, then click **Run Now** to test. View real-time logs in **Backup Records**.
+
+### 5. Set Up Notifications (Optional)
+
+Go to **Notifications** to configure Email, Webhook, or Telegram alerts for backup success/failure.
+
+---
+
+## Deployment Guide
+
+### Docker
+
+```bash
+docker compose up -d # Using the docker-compose.yml above
+```
+
+Mount host directories for file backup (add to `volumes` in docker-compose.yml):
```yaml
volumes:
- backupx-data:/app/data
- - /path/to/backup/source:/mnt/source:ro
+ - /var/www:/mnt/www:ro
+ - /etc/nginx:/mnt/nginx-conf:ro
```
-### Build from Source
-
-```bash
-# Clone the project
-git clone https://github.com/Awuqing/BackupX.git
-cd BackupX
-
-# Build frontend and backend
-make build
-
-# Start the backend service (default port :8340)
-cd server && ./bin/backupx
-```
-
-### China Mirror Build
-
-If downloading dependencies is slow due to network restrictions, use China mirror acceleration:
-
-```bash
-# Option 1: Docker build (recommended, one command)
-make docker-cn
-
-# Option 2: Set mirrors manually, then build
-export GOPROXY=https://goproxy.cn,direct
-npm config set registry https://registry.npmmirror.com
-make build
-```
-
-### Access Web UI
-
-Open `http://your-server:8340` in your browser. First-time use will guide you through creating an admin account.
-
-## Configuration
-
-The config file defaults to `./config.yaml`. Settings can also be overridden via `BACKUPX_` prefixed environment variables.
+Override config via environment variables:
```yaml
-# config.yaml
-server:
- host: "0.0.0.0"
- port: 8340
- mode: "release" # debug | release
-
-database:
- path: "./data/backupx.db" # SQLite database path
-
-security:
- jwt_secret: "" # Leave empty to auto-generate
- jwt_expire: "24h"
- encryption_key: "" # AES encryption key, auto-generated if empty
-
-backup:
- temp_dir: "/tmp/backupx" # Backup temp directory
- max_concurrent: 2 # Max concurrent backups
-
-log:
- level: "info" # debug | info | warn | error
- file: "./data/backupx.log"
- max_size: 100 # Max log file size (MB)
- max_backups: 3 # Number of old log files to retain
- max_age: 30 # Log retention days
+environment:
+ - TZ=Asia/Shanghai
+ - BACKUPX_LOG_LEVEL=debug
+ - BACKUPX_BACKUP_MAX_CONCURRENT=4
```
-> ð¡ `jwt_secret` and `encryption_key` are auto-generated on first startup and persisted to the database.
-
-## Architecture
-
-```
- âââââââââââââââââââââââ
- â Nginx (Reverse â
- â Proxy) â
- â / â Static Files â
- â /api â :8340 â
- âââââââââââ¬ââââââââââââ
- â
- âŒ
-ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
-â BackupX Master (Go API Server) â
-â :8340 â
-â â
-â ââââââââ ââââââââââââââ ââââââââââââââââââââââââââ
-â â Auth â âBackup Engineâ â Storage Registry ââ
-â ââââââââ ââââââââ¬ââââââ â âââââââââââââââââââ ââ
-â â â â Alibaba Cloud â ââ
-â ââââââââââââ â â â Tencent Cloud â ââ
-â â Cron ââââââ â â Qiniu Cloud â ââ
-â âScheduler â â â S3 Compatible â ââ
-â ââââââââââââ â â Google Drive â ââ
-â â â WebDAV â ââ
-â â â FTP / FTPS â ââ
-â ââââââââââââ â â Local Disk â ââ
-â â Notify â â âââââââââââââââââââ ââ
-â â Module â ââââââââââââââââââââââââââ
-â ââââââââââââ â
-â â
-â ââââââââââââââââ ââââââââââââââââââââââ â
-â â Node Manager â â SQLite (backupx.db)â â
-â ââââââââ¬ââââââââ ââââââââââââââââââââââ â
-âââââââââââŒâââââââââââââââââââââââââââââââââââââââââââââ
- â Heartbeat / Task Dispatch
- âŒ
-ââââââââââââââââââââ ââââââââââââââââââââ
-â Agent Node A â â Agent Node B â
-â (Remote Server)â â (Remote Server)â
-ââââââââââââââââââââ ââââââââââââââââââââ
-```
-
-### Tech Stack
-
-| Component | Technology |
-|-----------|-----------|
-| **Backend** | Go · Gin · GORM · SQLite · robfig/cron |
-| **Frontend** | React 18 · TypeScript · ArcoDesign · Vite · Zustand · ECharts |
-| **Storage** | AWS SDK v2 (S3/OSS/COS/Kodo) · Google Drive API v3 · gowebdav · jlaffaye/ftp |
-| **Security** | JWT · bcrypt · AES-256-GCM |
-| **Logging** | zap + lumberjack (auto-rotation) |
-
-## Cluster Mode
-
-BackupX supports **Master-Agent** mode for managing backup tasks across multiple servers.
-
-### How It Works
-
-1. **Master** is the server running the BackupX Web console
-2. **Agent** is deployed on remote servers that need to be backed up
-3. Agents register with the Master using a Token and send periodic heartbeats
-4. Master dispatches backup tasks to the corresponding Agent for execution
-
-### Adding Nodes
+### Bare Metal
```bash
-# In Web Console â Node Management â Add Node
-# The system generates a unique 64-character hex Token
+# From pre-built package
+tar xzf backupx-v*-linux-amd64.tar.gz && cd backupx-*
+sudo ./install.sh
-# Configure the Agent on the remote server
-./backupx-agent --master http://master-server:8340 --token
-```
-
-### Directory Probe API
-
-Master provides `GET /api/nodes/:id/fs/list?path=/` to remotely browse a node's file system. The frontend uses a tree selector to browse the target machine's directory structure when creating backup tasks.
-
-## Project Structure
-
-```
-BackupX/
-âââ server/ # Go backend
-â âââ cmd/backupx/ # Entry point
-â âââ internal/
-â â âââ app/ # App assembly (DI)
-â â âââ apperror/ # Unified error types
-â â âââ backup/ # Backup engine (file/mysql/sqlite/pgsql/saphana)
-â â â âââ retention/ # Retention policy
-â â âââ config/ # Config loading (viper)
-â â âââ database/ # Database init + migrations
-â â âââ http/ # HTTP handlers + routes + middleware
-â â âââ httpapi/ # HTTP API helpers
-â â âââ logger/ # Logger init (zap + lumberjack)
-â â âââ model/ # GORM data models
-â â âââ notify/ # Notifications (email/webhook/telegram)
-â â âââ repository/ # Data access layer
-â â âââ scheduler/ # Cron scheduler
-â â âââ security/ # JWT + rate limiting
-â â âââ service/ # Business logic
-â â âââ storage/ # Storage backends (plugin interface)
-â â âââ aliyun/ # Alibaba Cloud OSS
-â â âââ tencent/ # Tencent Cloud COS
-â â âââ qiniu/ # Qiniu Cloud Kodo
-â â âââ s3/ # S3 Compatible core
-â â âââ s3provider/ # S3 Provider helper
-â â âââ googledrive/ # Google Drive
-â â âââ webdav/ # WebDAV core
-â â âââ webdavprovider/ # WebDAV Provider helper
-â â âââ localdisk/ # Local disk
-â â âââ ftp/ # FTP / FTPS
-â â âââ codec/ # Config codec
-â âââ pkg/ # Utilities (compress/crypto/response)
-âââ web/ # React frontend
-â âââ src/
-â âââ components/ # Shared components (CronEditor/FormDrawer/...)
-â âââ hooks/ # Custom Hooks
-â âââ layouts/ # Layout components (AppLayout)
-â âââ pages/ # Page modules
-â â âââ dashboard/ # Dashboard
-â â âââ backup-tasks/ # Backup tasks
-â â âââ backup-records/ # Backup records
-â â âââ storage-targets/ # Storage targets
-â â âââ nodes/ # Node management
-â â âââ notifications/ # Notification settings
-â â âââ audit/ # Audit logs
-â â âââ settings/ # System settings
-â â âââ login/ # Login page
-â âââ services/ # API request wrappers
-â âââ stores/ # Zustand state management
-â âââ styles/ # Global styles
-â âââ types/ # TypeScript type definitions
-â âââ utils/ # Utility functions
-â âââ locales/ # i18n language packs (zh-CN / en-US)
-â âââ router/ # Route configuration
-âââ deploy/ # Deployment configs
-â âââ nginx.conf # Nginx reference config
-â âââ backupx.service # systemd service unit
-â âââ install.sh # One-click install script
-â âââ docker/ # Docker deployment configs
-â âââ nginx.conf # In-container Nginx config
-â âââ entrypoint.sh # Container entrypoint script
-âââ .github/ # GitHub configuration
-â âââ workflows/ci.yml # CI workflow
-â âââ workflows/release.yml # Release workflow
-â âââ ISSUE_TEMPLATE/ # Issue templates
-âââ Dockerfile # Docker multi-stage build
-âââ docker-compose.yml # Docker Compose config
-âââ Makefile # Build commands
-```
-
-## Development
-
-### Prerequisites
-
-- **Go** ⥠1.21
-- **Node.js** ⥠18
-- **npm**
-
-### Dev Mode
-
-```bash
-# Terminal 1: Start backend (use air for hot-reload)
-make dev-server
-
-# Terminal 2: Start frontend (Vite HMR)
-make dev-web
-```
-
-### Run Tests
-
-```bash
-# Run all tests
-make test
-
-# Backend only
-make test-server # go test ./...
-
-# Frontend only
-make test-web # npm run test
-```
-
-### Build
-
-```bash
-# Build frontend and backend
+# Or from source
make build
-
-# Docker build
-make docker
-
-# Docker build with China mirrors
-make docker-cn
-
-# Clean build artifacts
-make clean
-```
-
-### Release
-
-Push a Git tag to automatically trigger the full release pipeline via GitHub Actions:
-
-```bash
-git tag v1.2.3
-git push --tags
-# GitHub Actions will: compile binaries â publish GitHub Release â push Docker Hub image
-```
-
-You can also manually trigger the Release workflow from the GitHub Actions page.
-
-## Deployment
-
-### One-Click Install (Recommended)
-
-```bash
-# Build first
-make build
-
-# Run install script as root
sudo ./deploy/install.sh
```
-The install script will automatically:
-1. Create a `backupx` system user
-2. Install the binary to `/opt/backupx/bin/`
-3. Deploy the frontend to `/opt/backupx/web/`
-4. Generate config at `/etc/backupx/config.yaml`
-5. Register and start the systemd service
-6. Configure Nginx reverse proxy (if installed)
+The install script creates a system user, installs to `/opt/backupx/`, configures systemd, and sets up Nginx reverse proxy.
-### Docker Deployment
+### Nginx Reverse Proxy (bare metal)
-```bash
-# Using docker compose
-docker compose up -d
+```nginx
+server {
+ listen 80;
+ server_name backup.example.com;
-# Or build and run manually
-docker build -t backupx .
-docker run -d --name backupx -p 8340:8340 -v backupx-data:/app/data backupx
+ location / {
+ root /opt/backupx/web;
+ try_files $uri $uri/ /index.html;
+ }
+
+ location /api/ {
+ proxy_pass http://127.0.0.1:8340;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ }
+}
```
-**Password Reset** (when you forget the admin password):
+### Configuration
-```bash
-docker exec -it backupx /app/bin/backupx reset-password --username admin --password newpass123
-```
+Config file: `./config.yaml` (or override with `BACKUPX_` prefixed env vars):
-Override configuration via environment variables:
-
-```bash
-docker run -d --name backupx \
- -p 8340:8340 \
- -v backupx-data:/app/data \
- -e TZ=Asia/Shanghai \
- -e BACKUPX_LOG_LEVEL=debug \
- -e BACKUPX_BACKUP_MAX_CONCURRENT=4 \
- backupx
-```
-
-### Manual Deployment
-
-```bash
-# 1. Build
-cd server && go build -o backupx ./cmd/backupx
-cd ../web && npm run build
-
-# 2. Deploy files
-scp server/backupx your-server:/opt/backupx/bin/
-scp -r web/dist/ your-server:/opt/backupx/web/
-scp server/config.example.yaml your-server:/etc/backupx/config.yaml
-
-# 3. Start
-ssh your-server '/opt/backupx/bin/backupx -config /etc/backupx/config.yaml'
+```yaml
+server:
+ port: 8340
+database:
+ path: "./data/backupx.db"
+security:
+ jwt_secret: "" # Auto-generated and persisted to DB
+ encryption_key: "" # Auto-generated
+backup:
+ temp_dir: "/tmp/backupx"
+ max_concurrent: 2
+log:
+ level: "info" # debug | info | warn | error
+ file: "./data/backupx.log"
```
### Password Reset
-When you forget the admin password, reset it via CLI (requires server shell access):
-
```bash
# Bare metal
./backupx reset-password --username admin --password newpass123
@@ -489,112 +229,90 @@ When you forget the admin password, reset it via CLI (requires server shell acce
docker exec -it backupx /app/bin/backupx reset-password --username admin --password newpass123
```
-### Nginx Config Example
+---
-```nginx
-server {
- listen 80;
- server_name backup.example.com;
+## Multi-Node Cluster
- # Frontend static files
- location / {
- root /opt/backupx/web;
- try_files $uri $uri/ /index.html;
- }
+BackupX supports Master-Agent mode for managing multiple servers:
- # API reverse proxy
- location /api/ {
- proxy_pass http://127.0.0.1:8340;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- }
-}
+1. Web Console â **Node Management** â **Add Node** â system generates a Token
+2. Deploy Agent on remote server, connect using the Token
+3. Create backup tasks and assign to specific nodes â Master dispatches automatically
+
+The visual directory browser lets you pick directories on remote Agent nodes â no manual path typing.
+
+---
+
+## Development
+
+**Requirements:** Go >= 1.25 · Node.js >= 20 · npm
+
+```bash
+# Dev mode
+make dev-server # Terminal 1: backend (:8340)
+make dev-web # Terminal 2: frontend (Vite HMR)
+
+# Test
+make test # Run all tests
+
+# Build
+make build # Build frontend + backend
+make docker # Docker build
+make docker-cn # Docker build with China mirrors
```
+### Release
+
+```bash
+git tag v1.2.3 && git push --tags
+# GitHub Actions: compile dual-arch binaries â publish GitHub Release â push Docker Hub image
+```
+
+Or manually trigger the Release workflow from GitHub Actions page.
+
+---
+
## API Reference
-All APIs are prefixed with `/api` and use JWT Bearer Token authentication (unless noted otherwise).
+All endpoints prefixed with `/api`, authenticated via JWT Bearer Token.
| Module | Endpoint | Description |
|--------|----------|-------------|
-| **Auth** | `POST /api/auth/setup` | Initialize admin (first time) |
-| | `POST /api/auth/login` | Login to get Token |
-| | `POST /api/auth/logout` | Logout |
-| | `GET /api/auth/profile` | Current user info |
-| | `PUT /api/auth/password` | Change password |
-| **Backup Tasks** | `GET/POST /api/backup/tasks` | List / Create tasks |
-| | `GET/PUT/DELETE /api/backup/tasks/:id` | Detail / Update / Delete |
-| | `PUT /api/backup/tasks/:id/toggle` | Enable / Disable |
-| | `POST /api/backup/tasks/:id/run` | Trigger manual execution |
-| **Backup Records** | `GET /api/backup/records` | List records (with filter) |
-| | `GET /api/backup/records/:id` | Record detail |
-| | `GET /api/backup/records/:id/logs/stream` | Real-time execution logs (SSE) |
-| | `GET /api/backup/records/:id/download` | Download backup file |
-| | `POST /api/backup/records/:id/restore` | Restore backup |
-| **Storage Targets** | `GET/POST /api/storage-targets` | List / Add targets |
-| | `GET/PUT/DELETE /api/storage-targets/:id` | Detail / Update / Delete |
-| | `POST /api/storage-targets/test` | Test connection |
-| | `POST /api/storage-targets/:id/test` | Test saved connection |
-| | `GET /api/storage-targets/:id/usage` | Query usage |
-| **Nodes** | `GET/POST /api/nodes` | List / Add nodes |
-| | `GET/DELETE /api/nodes/:id` | Detail / Delete |
-| | `GET /api/nodes/:id/fs/list` | Directory browser |
-| | `POST /api/agent/heartbeat` | Agent heartbeat â¡ |
-| **Notifications** | `GET/POST /api/notifications` | List / Add |
-| | `POST /api/notifications/test` | Test notification |
-| | `POST /api/notifications/:id/test` | Test saved notification |
-| **Dashboard** | `GET /api/dashboard/stats` | Overview statistics |
-| | `GET /api/dashboard/timeline` | Backup trend timeline |
-| **Audit Logs** | `GET /api/audit-logs` | Audit log list (with category filter/pagination) |
-| **System** | `GET /api/system/info` | System info (version/disk) |
-| | `GET/PUT /api/settings` | System settings |
+| **Auth** | `POST /auth/setup` | Initialize admin |
+| | `POST /auth/login` | Login |
+| | `PUT /auth/password` | Change password |
+| **Backup Tasks** | `GET\|POST /backup/tasks` | List / Create |
+| | `GET\|PUT\|DELETE /backup/tasks/:id` | Detail / Update / Delete |
+| | `PUT /backup/tasks/:id/toggle` | Enable / Disable |
+| | `POST /backup/tasks/:id/run` | Manual run |
+| **Backup Records** | `GET /backup/records` | List (with filter) |
+| | `GET /backup/records/:id/logs/stream` | Real-time logs (SSE) |
+| | `GET /backup/records/:id/download` | Download |
+| | `POST /backup/records/:id/restore` | Restore |
+| **Storage Targets** | `GET\|POST /storage-targets` | List / Add |
+| | `POST /storage-targets/test` | Test connection |
+| **Nodes** | `GET\|POST /nodes` | List / Add |
+| | `GET /nodes/:id/fs/list` | Directory browser |
+| **Notifications** | `GET\|POST /notifications` | List / Add |
+| **Dashboard** | `GET /dashboard/stats` | Overview stats |
+| **Audit Logs** | `GET /audit-logs` | Operation audit |
+| **System** | `GET /system/info` | System info |
-> â¡ `POST /api/agent/heartbeat` is a public endpoint authenticated via Node Token instead of JWT.
+---
-## Cloud Storage Setup Guide
+## Tech Stack
-### Alibaba Cloud OSS
-
-1. Log in to [Alibaba Cloud Console](https://oss.console.aliyun.com/), create a Bucket
-2. Go to RAM Console to create an AccessKey
-3. Select "Alibaba Cloud OSS" when adding a storage target in BackupX
-4. Enter the Region (e.g. `cn-hangzhou`) and AccessKey â the system auto-assembles the endpoint
-
-### Tencent Cloud COS
-
-1. Log in to [Tencent Cloud Console](https://console.cloud.tencent.com/cos), create a bucket
-2. Go to API Key Management to create SecretId/SecretKey
-3. Bucket name format is `BucketName-APPID` (e.g. `backup-1250000000`)
-
-### Qiniu Cloud Kodo
-
-1. Log in to [Qiniu Cloud Console](https://portal.qiniu.com/), create a storage space
-2. Supported regions: `z0` (East China) / `cn-east-2` (East China-Zhejiang 2) / `z1` (North China) / `z2` (South China) / `na0` (North America) / `as0` (Southeast Asia)
-
-### Google Drive
-
-1. Go to [Google Cloud Console](https://console.cloud.google.com/) and create a project
-2. Enable the **Google Drive API**
-3. Create an **OAuth 2.0 Client ID** (Web application type)
-4. Add redirect URI: `http://your-server/api/storage-targets/google-drive/callback`
-5. Enter the Client ID / Secret in BackupX storage management and click Authorize
+| Component | Technology |
+|-----------|-----------|
+| **Backend** | Go · Gin · GORM · SQLite · robfig/cron |
+| **Frontend** | React 18 · TypeScript · ArcoDesign · Vite · Zustand · ECharts |
+| **Storage** | AWS SDK v2 · Google Drive API v3 · gowebdav · jlaffaye/ftp |
+| **Security** | JWT · bcrypt · AES-256-GCM |
## Contributing
Issues and Pull Requests are welcome!
-1. Fork this repository
-2. Create a feature branch (`git checkout -b feature/amazing-feature`)
-3. Commit your changes (`git commit -m 'Add amazing feature'`)
-4. Push to the branch (`git push origin feature/amazing-feature`)
-5. Open a Pull Request
-
## License
-This project is licensed under the [Apache License 2.0](LICENSE).
-
----
-
-
- Made with â€ïž for self-hosters
-
+[Apache License 2.0](LICENSE)
diff --git a/docker-compose.yml b/docker-compose.yml
index 2ccd869..7283480 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,21 +1,29 @@
+# BackupX Docker Compose
+#
+# å¿«éå¯åšïŒdocker compose up -d
+# 访é®å°åïŒhttp://localhost:8340
+#
+# åŠé仿ºç æå»ºéåïŒèéæå线äžéåïŒïŒåæ¶æ³šé build è¡å¹¶æ³šé image è¡ã
+
services:
backupx:
- build: .
- image: backupx:latest
+ image: awuqing/backupx:latest
+ # build: . # 仿ºç æå»ºæ¶åæ¶æ€è¡æ³šé
container_name: backupx
restart: unless-stopped
ports:
- "8340:8340"
volumes:
- backupx-data:/app/data
- # Mount host directories that need to be backed up (example):
- # - /path/to/backup/source:/mnt/source:ro
+ # æèœœéèŠå€ä»œç宿䞻æºç®åœïŒæéæ·»å ïŒ:ro 衚瀺åªè¯»ïŒïŒ
+ # - /var/www:/mnt/www:ro
+ # - /etc/nginx:/mnt/nginx-conf:ro
+ # - /home/user/data:/mnt/data:ro
environment:
- TZ=Asia/Shanghai
- # Override any config via BACKUPX_ prefixed env vars:
- # - BACKUPX_SERVER_PORT=8340
- # - BACKUPX_LOG_LEVEL=info
- # - BACKUPX_BACKUP_MAX_CONCURRENT=2
+ # éè¿ BACKUPX_ åçŒç¯å¢åéèŠçé
眮ïŒ
+ # - BACKUPX_LOG_LEVEL=debug
+ # - BACKUPX_BACKUP_MAX_CONCURRENT=4
volumes:
backupx-data: