backup.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. type BackupRunner struct {
  13. Store *store.Store
  14. }
  15. func NewBackupRunner(store *store.Store) *BackupRunner {
  16. return &BackupRunner{
  17. Store: store,
  18. }
  19. }
  20. func (r *BackupRunner) Run(ctx context.Context) {
  21. intervalStr := r.Store.GetSystemSettingValueWithDefault(&ctx, apiv1.SystemSettingAutoBackupIntervalName.String(), "")
  22. if intervalStr == "" {
  23. log.Info("no SystemSettingAutoBackupIntervalName setting, disable auto backup")
  24. return
  25. }
  26. interval, err := strconv.Atoi(intervalStr)
  27. if err != nil || interval <= 0 {
  28. log.Error(fmt.Sprintf("invalid SystemSettingAutoBackupIntervalName value %s, disable auto backup", intervalStr), zap.Error(err))
  29. return
  30. }
  31. log.Info("enable auto backup every " + intervalStr + " seconds")
  32. ticker := time.NewTicker(time.Duration(interval) * time.Second)
  33. defer ticker.Stop()
  34. var t time.Time
  35. for {
  36. select {
  37. case <-ctx.Done():
  38. log.Info("stop auto backup graceful.")
  39. return
  40. case t = <-ticker.C:
  41. }
  42. filename := r.Store.Profile.DSN + t.Format("-20060102-150405.bak")
  43. log.Info(fmt.Sprintf("create backup to %s", filename))
  44. err := r.Store.BackupTo(ctx, filename)
  45. if err != nil {
  46. log.Error("fail to create backup", zap.Error(err))
  47. }
  48. }
  49. }