feat: add cron
This commit is contained in:
@@ -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
1
go.mod
@@ -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
2
go.sum
@@ -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=
|
||||
|
||||
@@ -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
28
pkg/cron/cron.go
Normal 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
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user