Files
eiblog/cmd/backup/handler/timer/db/mgodb.go
2025-07-17 10:52:43 +08:00

73 lines
1.5 KiB
Go

package db
import (
"context"
"fmt"
"net/url"
"os/exec"
"time"
"github.com/eiblog/eiblog/cmd/backup/config"
"github.com/eiblog/eiblog/pkg/connector/db"
)
// MongoStorage 备份恢复器
type MongoStorage struct{}
// Backup 备份
func (r MongoStorage) Backup(name string) (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*20)
defer cancel()
// dump
u, err := url.Parse(config.Conf.Database.Source)
if err != nil {
return "", err
}
arg := fmt.Sprintf("mongodump -h %s -d eiblog -o /tmp", u.Host)
cmd := exec.CommandContext(ctx, "sh", "-c", arg)
err = cmd.Run()
if err != nil {
return "", err
}
// tar
arg = fmt.Sprintf("tar czf /tmp/%s -C /tmp eiblog", name)
cmd = exec.CommandContext(ctx, "sh", "-c", arg)
err = cmd.Run()
if err != nil {
return "", err
}
return "/tmp/" + name, nil
}
// Restore 恢复
func (r MongoStorage) Restore(path string) error {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*20)
defer cancel()
// drop database
mdb, err := db.NewMDB(config.Conf.Database)
if err != nil {
return err
}
err = mdb.Drop(ctx)
if err != nil {
return err
}
// unarchive
arg := fmt.Sprintf("tar xzf %s -C /tmp", path)
cmd := exec.CommandContext(ctx, "sh", "-c", arg)
err = cmd.Run()
if err != nil {
return err
}
// restore
u, err := url.Parse(config.Conf.Database.Source)
if err != nil {
return err
}
arg = fmt.Sprintf("mongorestore -h %s -d eiblog /tmp/eiblog", u.Host)
cmd = exec.CommandContext(ctx, "sh", "-c", arg)
return cmd.Run()
}