feat: add cron

This commit is contained in:
2025-11-06 09:52:24 +01:00
parent acc7fb6424
commit ea72298a0f
6 changed files with 53 additions and 6 deletions

View File

@@ -1,11 +1,16 @@
package main
import (
api "ddbb/pkg/api"
"ddbb/pkg/api"
"ddbb/pkg/cron"
"log"
)
func main() {
// Set up the cron job
cron.ScheduleBackupFromEnv()
// Run the api endpoint
r := api.SetupRouter()
err := r.Run(":12345")
if err != nil {

1
go.mod
View File

@@ -5,6 +5,7 @@ go 1.25.2
require (
github.com/docker/docker v28.5.1+incompatible
github.com/gin-gonic/gin v1.11.0
github.com/robfig/cron/v3 v3.0.1
)
require (

2
go.sum
View File

@@ -95,6 +95,8 @@ github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

View File

@@ -17,6 +17,13 @@ var (
statusMutex sync.Mutex
)
func BackupAllDatabases() {
allBackups, _ := docker.GetBackupConfigsFromContainers()
for _, job := range allBackups {
backup.BackupJob(job)
}
}
// Dump any database giving an Id
func triggerDump(c *gin.Context) {
// Extract backup job name from the form POST data

28
pkg/cron/cron.go Normal file
View File

@@ -0,0 +1,28 @@
package cron
import (
"ddbb/pkg/api"
"github.com/robfig/cron/v3"
"log"
"os"
)
func ScheduleBackupFromEnv() {
expr := os.Getenv("BACKUP_CRON")
if expr == "" {
log.Fatal("Environment variable BACKUP_CRON not set")
}
c := cron.New()
_, err := c.AddFunc(expr, func() {
log.Println("Starting scheduled backup")
api.BackupAllDatabases()
})
if err != nil {
log.Fatalf("Invalid cron expression in BACKUP_CRON: %v", err)
}
c.Start()
// defer c.Stop() on application shutdown if needed
}

View File

@@ -9,7 +9,7 @@ import (
"strings"
)
var dumFileRoot = "/backups/"
var dumpFileRoot = "/backups/"
func RestoreJob(cfg backup.Config) {
switch strings.ToLower(cfg.Kind) {
@@ -26,10 +26,14 @@ func RestoreJob(cfg backup.Config) {
func restoreMySQL(cfg backup.Config) error {
cmd := exec.Command(
"mysql", "-h", cfg.Host, "-u", cfg.User, fmt.Sprintf("-p%s", cfg.Password),
"mariadb",
"--ssl-verify-server-cert=FALSE",
"-h", cfg.Host,
"-u", cfg.User,
fmt.Sprintf("-p%s", cfg.Password),
cfg.Database,
)
dumpFileName := dumFileRoot + cfg.Host + ".sql"
dumpFileName := dumpFileRoot + cfg.Host + ".sql"
dumpFile, err := os.Open(dumpFileName)
if err != nil {
return err
@@ -52,7 +56,7 @@ func restorePostgres(cfg backup.Config) error {
"psql", "-h", cfg.Host, "-U", cfg.User, "-d", cfg.Database,
"-f", "-", // read input from stdin
)
dumpFileName := dumFileRoot + cfg.Host + ".sql"
dumpFileName := dumpFileRoot + cfg.Host + ".sql"
dumpFile, err := os.Open(dumpFileName)
if err != nil {
return err
@@ -72,7 +76,7 @@ func restorePostgres(cfg backup.Config) error {
}
func restoreMongo(cfg backup.Config) error {
dumpFileName := dumFileRoot + cfg.Host + ".gz"
dumpFileName := dumpFileRoot + cfg.Host + ".gz"
cmd := exec.Command(
"mongorestore", "--archive", "--gzip", "--drop", "--archive="+dumpFileName,
"--uri",