package main
import (
"fmt"
"log"
"os"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/dgraph-io/badger/v4"
)
func main() {
// Open the Badger database
db, err := badger.Open(badger.DefaultOptions("/mnt/badger")) // Adjust path to your instance storage
if err != nil {
log.Fatalf("Failed to open Badger DB: %v", err)
}
defer db.Close()
// Create a backup file
backupFile := fmt.Sprintf("badger-backup-%s.db", time.Now().Format("20060102-150405"))
f, err := os.Create(backupFile)
if err != nil {
log.Fatalf("Failed to create backup file: %v", err)
}
defer f.Close()
// Perform the backup
_, err = db.Backup(f, 0) // 0 means full backup
if err != nil {
log.Fatalf("Failed to backup Badger DB: %v", err)
}
log.Printf("Backup completed to %s", backupFile)
// Upload to S3
err = uploadToS3(backupFile, "your-s3-bucket-name", backupFile)
if err != nil {
log.Fatalf("Failed to upload to S3: %v", err)
}
log.Printf("Uploaded %s to S3", backupFile)
// Optionally, remove the local backup file to save space
os.Remove(backupFile)
}
// uploadToS3 uploads a file to an S3 bucket
func uploadToS3(filePath, bucket, key string) error {
sess, err := session.NewSession(&aws.Config{
Region: aws.String("us-west-2"), // Adjust to your region
})
if err != nil {
return fmt.Errorf("failed to create AWS session: %v", err)
}
uploader := s3manager.NewUploader(sess)
f, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("failed to open file: %v", err)
}
defer f.Close()
_, err = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: f,
})
if err != nil {
return fmt.Errorf("failed to upload file to S3: %v", err)
}
return nil
}