@@ -5,9 +5,11 @@ import (
55 "fmt"
66 "log/slog"
77 "net/http"
8+ "time"
89
910 "github.com/riverqueue/river"
1011
12+ "github.com/73ai/openbotkit/channel"
1113 "github.com/73ai/openbotkit/config"
1214 "github.com/73ai/openbotkit/oauth/google"
1315 "github.com/73ai/openbotkit/provider"
@@ -34,16 +36,33 @@ func (w *BackupWorker) Work(ctx context.Context, job *river.Job[BackupArgs]) err
3436 return nil
3537 }
3638
39+ schedule , err := time .ParseDuration (w .Cfg .Backup .Schedule )
40+ if err == nil && schedule > 0 {
41+ manifest , mErr := backupsvc .LoadManifest (config .BackupLastManifestPath ())
42+ if mErr == nil && manifest .ID != "" && time .Since (manifest .Timestamp ) < schedule {
43+ slog .Info ("backup: last backup is recent, skipping" ,
44+ "age" , time .Since (manifest .Timestamp ).Round (time .Minute ),
45+ "schedule" , schedule )
46+ return nil
47+ }
48+ }
49+
3750 slog .Info ("starting backup job" )
3851
3952 backend , err := backupsvc .ResolveBackend (ctx , backendOpts (w .Cfg ))
4053 if err != nil {
54+ if job .Attempt >= job .MaxAttempts {
55+ w .notifyFailure (ctx , err )
56+ }
4157 return fmt .Errorf ("resolve backend: %w" , err )
4258 }
4359
4460 svc := backupsvc .New (backend , config .Dir ())
4561 result , err := svc .Run (ctx )
4662 if err != nil {
63+ if job .Attempt >= job .MaxAttempts {
64+ w .notifyFailure (ctx , err )
65+ }
4766 return fmt .Errorf ("backup: %w" , err )
4867 }
4968
@@ -56,6 +75,25 @@ func (w *BackupWorker) Work(ctx context.Context, job *river.Job[BackupArgs]) err
5675 return nil
5776}
5877
78+ func (w * BackupWorker ) notifyFailure (ctx context.Context , backupErr error ) {
79+ if w .Cfg .Channels == nil {
80+ return
81+ }
82+ tg := w .Cfg .Channels .Telegram
83+ if tg == nil || tg .BotToken == "" {
84+ return
85+ }
86+ pusher , err := channel .NewTelegramPusher (tg .BotToken , tg .OwnerID )
87+ if err != nil {
88+ slog .Error ("backup: create telegram pusher" , "error" , err )
89+ return
90+ }
91+ msg := fmt .Sprintf ("Backup failed: %s" , backupErr )
92+ if err := pusher .Push (ctx , msg ); err != nil {
93+ slog .Error ("backup: send failure alert" , "error" , err )
94+ }
95+ }
96+
5997func backendOpts (cfg * config.Config ) backupsvc.ResolveBackendOpts {
6098 opts := backupsvc.ResolveBackendOpts {
6199 ResolveCred : provider .ResolveAPIKey ,
0 commit comments