From c2ac2e474abed0ae7d631e3975896e3f4fc1aa2c Mon Sep 17 00:00:00 2001 From: DevMiner Date: Sat, 18 Feb 2023 20:16:51 +0100 Subject: [PATCH] feat: own scheduler --- .env.dist | 4 +++- main.go | 58 +++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/.env.dist b/.env.dist index c97a4a8..84241a1 100644 --- a/.env.dist +++ b/.env.dist @@ -7,4 +7,6 @@ POSTGRES_HOST=postgres POSTGRES_PORT=5432 POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres -POSTGRES_DB=postgres \ No newline at end of file +POSTGRES_DB=postgres + +EVERY=24h \ No newline at end of file diff --git a/main.go b/main.go index 8d10508..fb5233d 100644 --- a/main.go +++ b/main.go @@ -9,10 +9,13 @@ import ( "log" "os" "strconv" + "time" ) func main() { - _ = godotenv.Load() + if err := godotenv.Load(); err != nil { + log.Printf("WARNING: Error loading .env file: %s\n", err) + } postgresHost := flag.String("postgres-host", lookupEnvOrString("POSTGRES_HOST", "localhost"), "connectionOptions host") postgresPort := flag.Int("postgres-port", lookupEnvOrInt("POSTGRES_PORT", 5432), "connectionOptions port") @@ -25,6 +28,8 @@ func main() { s3AccessKey := flag.String("s3-access-key", lookupEnvOrString("S3_ACCESS_KEY", "minio"), "S3 access key") s3SecretKey := flag.String("s3-secret-key", lookupEnvOrString("S3_SECRET_KEY", "minioadmin"), "S3 secret key") + every := flag.Duration("every", lookupEnvOrDuration("EVERY", 24*time.Hour), "How often to run the backup") + flag.Parse() must("postgres-host", postgresHost) @@ -40,22 +45,32 @@ func main() { log.Fatal(err) } - file := newFileName(*postgresDB) - err = RunDump(&connectionOptions{ - Host: *postgresHost, - Port: *postgresPort, - Database: *postgresDB, - Username: *postgresUser, - Password: *postgresPassword, - }, file) - if err != nil { - log.Fatal(err) - } + for { + file := newFileName(*postgresDB) + err = RunDump(&connectionOptions{ + Host: *postgresHost, + Port: *postgresPort, + Database: *postgresDB, + Username: *postgresUser, + Password: *postgresPassword, + }, file) + if err != nil { + log.Printf("WARNING: Failed to dump database: %s", err) + } - log.Printf("Uploading %s to %s", file, *s3Bucket) + log.Printf("Uploading %s to %s", file, *s3Bucket) - if _, err := s3.FPutObject(context.Background(), *s3Bucket, file, file, minio.PutObjectOptions{}); err != nil { - log.Fatal(err) + if _, err := s3.FPutObject(context.Background(), *s3Bucket, file, file, minio.PutObjectOptions{}); err != nil { + log.Printf("WARNING: Failed to upload %s to %s: %s", file, *s3Bucket, err) + } + + log.Printf("Removing %s", file) + if err := os.Remove(file); err != nil { + log.Printf("WARNING: Failed to remove %s: %s", file, err) + } + + log.Printf("Sleeping for %s", *every) + time.Sleep(*every) } } @@ -80,6 +95,19 @@ func lookupEnvOrInt(key string, defaultVal int) int { return defaultVal } +func lookupEnvOrDuration(key string, defaultVal time.Duration) time.Duration { + if val, ok := os.LookupEnv(key); ok { + parsed, err := time.ParseDuration(val) + if err != nil { + log.Fatal(err) + } + + return parsed + } + + return defaultVal +} + func must(flag string, str *string) { if str == nil || *str == "" { log.Fatalf("Missing required flag: %s", flag)