Skip to content

Commit d0b1bdc

Browse files
committed
refactor: Decompose main and use Docker CMD
1 parent 0fa8e60 commit d0b1bdc

File tree

5 files changed

+122
-86
lines changed

5 files changed

+122
-86
lines changed

Dockerfile

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ RUN go mod download
1414
COPY . .
1515

1616
# 构建静态二进制文件
17-
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o vault-backup .
18-
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o backup ./cmd/backup
19-
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o restore ./cmd/restore
17+
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o vaultb ./cmd/backup
18+
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o vaultr ./cmd/restore
2019

2120
# 运行阶段
2221
FROM alpine:latest
@@ -25,16 +24,10 @@ RUN apk add --no-cache \
2524
sqlite
2625

2726
# 复制构建的二进制文件
28-
COPY --from=builder /app/vault-backup /usr/local/bin/vault-backup
29-
COPY --from=builder /app/backup /usr/local/bin/backup
30-
COPY --from=builder /app/restore /usr/local/bin/restore
27+
COPY --from=builder /app/vaultb /usr/local/bin/vaultb
28+
COPY --from=builder /app/vaultr /usr/local/bin/vaultr
3129

32-
# 复制入口脚本
33-
COPY entrypoint.sh /
30+
RUN chmod +x /usr/local/bin/vaultb && \
31+
chmod +x /usr/local/bin/vaultr
3432

35-
RUN chmod +x /entrypoint.sh && \
36-
chmod +x /usr/local/bin/vault-backup && \
37-
chmod +x /usr/local/bin/backup && \
38-
chmod +x /usr/local/bin/restore
39-
40-
ENTRYPOINT ["/entrypoint.sh"]
33+
CMD ["/usr/local/bin/vaultb"]

cmd/backup/main.go

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,51 @@ package main
22

33
import (
44
"fmt"
5+
"log/slog"
56
"os"
7+
"time"
68

7-
"github.com/xg4/vaultwarden-backup/internal/archive"
9+
"github.com/xg4/vaultwarden-backup/internal/app"
10+
"github.com/xg4/vaultwarden-backup/internal/config"
811
)
912

1013
func main() {
11-
if len(os.Args) != 4 {
12-
fmt.Fprintf(os.Stderr, "Usage: %s <input_directory> <output_encrypted_file> <password>\n", os.Args[0])
14+
// 初始化日志记录器
15+
opts := &slog.HandlerOptions{
16+
Level: slog.LevelInfo,
17+
}
18+
19+
handler := slog.NewTextHandler(os.Stdout, opts)
20+
21+
slog.SetDefault(slog.New(handler))
22+
23+
// 加载配置
24+
cfg, err := config.Load()
25+
if err != nil {
26+
slog.Error(fmt.Sprintf("配置加载失败: %v", err))
1327
os.Exit(1)
1428
}
1529

16-
inputDir := os.Args[1]
17-
outEncryptedFile := os.Args[2]
18-
password := os.Args[3]
30+
// 打印关键配置
31+
slog.Info("-------------------- 环境变量 --------------------")
32+
slog.Info(fmt.Sprintf("备份目录 (BACKUP_DIR): %s", cfg.BackupDir))
33+
slog.Info(fmt.Sprintf("数据目录 (DATA_DIR): %s", cfg.DataDir))
34+
slog.Info(fmt.Sprintf("备份保留 (RETENTION_DAYS): %dd", cfg.RetentionDays))
35+
slog.Info(fmt.Sprintf("备份间隔 (BACKUP_INTERVAL): %v", cfg.BackupInterval))
36+
slog.Info("--------------------------------------------------")
1937

20-
if err := archive.EncryptedBackup(inputDir, password, outEncryptedFile); err != nil {
21-
fmt.Fprintf(os.Stderr, "创建加密归档失败: %v\n", err)
38+
// 创建并运行备份应用
39+
backupApp := app.New(cfg)
40+
if err := backupApp.Run(); err != nil {
2241
os.Exit(1)
2342
}
2443

25-
fmt.Println(" Done.")
26-
fmt.Println("Backup complete.")
44+
ticker := time.NewTicker(cfg.BackupInterval)
45+
defer ticker.Stop()
46+
47+
for range ticker.C {
48+
if err := backupApp.Run(); err != nil {
49+
os.Exit(1)
50+
}
51+
}
2752
}

cmd/restore/main.go

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,100 @@
11
package main
22

33
import (
4+
"flag"
45
"fmt"
56
"os"
7+
"path/filepath"
68

79
"github.com/xg4/vaultwarden-backup/internal/archive"
810
)
911

12+
var (
13+
inputFile = flag.String("input", "", "输入的加密备份文件路径 (必需)")
14+
outputDir = flag.String("output", "", "输出目录路径 (必需)")
15+
password = flag.String("password", "", "解密密码 (必需)")
16+
verbose = flag.Bool("verbose", false, "启用详细输出")
17+
help = flag.Bool("help", false, "显示帮助信息")
18+
)
19+
20+
func init() {
21+
// 添加简写选项
22+
flag.StringVar(inputFile, "i", "", "输入的加密备份文件路径 (必需)")
23+
flag.StringVar(outputDir, "o", "", "输出目录路径 (必需)")
24+
flag.StringVar(password, "p", "", "解密密码 (必需)")
25+
flag.BoolVar(verbose, "v", false, "启用详细输出")
26+
flag.BoolVar(help, "h", false, "显示帮助信息")
27+
}
28+
29+
func usage() {
30+
fmt.Fprintf(os.Stderr, "Vaultwarden 备份解密工具\n\n")
31+
fmt.Fprintf(os.Stderr, "用法: %s [选项]\n\n", filepath.Base(os.Args[0]))
32+
fmt.Fprintf(os.Stderr, "选项:\n")
33+
flag.PrintDefaults()
34+
fmt.Fprintf(os.Stderr, "\n示例:\n")
35+
fmt.Fprintf(os.Stderr, " %s -i backup.enc -o ./restored -p mypassword\n", filepath.Base(os.Args[0]))
36+
fmt.Fprintf(os.Stderr, " %s -input backup.enc -output ./restored -password mypassword -verbose\n", filepath.Base(os.Args[0]))
37+
fmt.Fprintf(os.Stderr, " %s -i backup.enc -o ./restored -p mypassword -v\n", filepath.Base(os.Args[0]))
38+
}
39+
40+
func validateArgs() error {
41+
if *inputFile == "" {
42+
return fmt.Errorf("必须指定输入文件 (-input)")
43+
}
44+
45+
if *outputDir == "" {
46+
return fmt.Errorf("必须指定输出目录 (-output)")
47+
}
48+
49+
if *password == "" {
50+
return fmt.Errorf("必须指定解密密码 (-password)")
51+
}
52+
53+
// 检查输入文件是否存在
54+
if _, err := os.Stat(*inputFile); os.IsNotExist(err) {
55+
return fmt.Errorf("输入文件不存在: %s", *inputFile)
56+
}
57+
58+
return nil
59+
}
60+
1061
func main() {
11-
if len(os.Args) != 4 {
12-
fmt.Fprintf(os.Stderr, "Usage: %s <input_encrypted_file> <output_directory> <password>\n", os.Args[0])
62+
// 自定义 usage 函数
63+
flag.Usage = usage
64+
65+
// 解析命令行参数
66+
flag.Parse()
67+
68+
// 如果指定了 help 标志,显示帮助并退出
69+
if *help {
70+
usage()
71+
os.Exit(0)
72+
}
73+
74+
// 验证参数
75+
if err := validateArgs(); err != nil {
76+
fmt.Fprintf(os.Stderr, "错误: %v\n\n", err)
77+
usage()
1378
os.Exit(1)
1479
}
1580

16-
inputEncryptedFile := os.Args[1]
17-
outputDir := os.Args[2]
18-
password := os.Args[3]
81+
// 详细输出模式
82+
if *verbose {
83+
fmt.Printf("输入文件: %s\n", *inputFile)
84+
fmt.Printf("输出目录: %s\n", *outputDir)
85+
fmt.Printf("开始解密...\n")
86+
}
1987

20-
if err := archive.DecryptBackup(inputEncryptedFile, password, outputDir); err != nil {
88+
// 执行解密
89+
if err := archive.DecryptBackup(*inputFile, *password, *outputDir); err != nil {
2190
fmt.Fprintf(os.Stderr, "解密归档失败: %v\n", err)
2291
os.Exit(1)
2392
}
2493

25-
fmt.Println(" Done.")
94+
fmt.Println("Done.")
2695
fmt.Println("Restore complete.")
96+
97+
if *verbose {
98+
fmt.Printf("文件已成功解密到: %s\n", *outputDir)
99+
}
27100
}

entrypoint.sh

Lines changed: 0 additions & 3 deletions
This file was deleted.

main.go

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)