backup.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package server
  2. import (
  3. "context"
  4. "fmt"
  5. "strconv"
  6. "time"
  7. apiv1 "github.com/usememos/memos/api/v1"
  8. "github.com/usememos/memos/common/log"
  9. "github.com/usememos/memos/store"
  10. "go.uber.org/zap"
  11. )
  12. func autoBackup(ctx context.Context, s *store.Store) {
  13. intervalStr := s.GetSystemSettingValueWithDefault(&ctx, apiv1.SystemSettingAutoBackupIntervalName.String(), "")
  14. if intervalStr == "" {
  15. log.Info("no SystemSettingAutoBackupIntervalName setting, disable auto backup")
  16. return
  17. }
  18. interval, err := strconv.Atoi(intervalStr)
  19. if err != nil || interval <= 0 {
  20. log.Error(fmt.Sprintf("invalid SystemSettingAutoBackupIntervalName value %s, disable auto backup", intervalStr), zap.Error(err))
  21. return
  22. }
  23. log.Info("enable auto backup every " + intervalStr + " seconds")
  24. ticker := time.NewTicker(time.Duration(interval) * time.Second)
  25. defer ticker.Stop()
  26. var t time.Time
  27. for {
  28. select {
  29. case <-ctx.Done():
  30. log.Info("stop auto backup graceful.")
  31. return
  32. case t = <-ticker.C:
  33. }
  34. filename := s.Profile.DSN + t.Format("-20060102-150405.bak")
  35. log.Info(fmt.Sprintf("create backup to %s", filename))
  36. err := s.BackupTo(ctx, filename)
  37. if err != nil {
  38. log.Error("fail to create backup", zap.Error(err))
  39. }
  40. }
  41. }