package main import ( "context" "github.com/joho/godotenv" "log" "os" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" ) const ( ENDPOINT = "s3.us-west-004.backblazeb2.com" BUCKETNAME = "ducimon-db-backups" ) func main() { ctx := context.Background() accessKeyID, secretAccessKey := getCredentials() client := createClient(accessKeyID, secretAccessKey) verifyBucket(client, ctx) absolutePath, basename := validateUploadFile() _, err := client.FPutObject(ctx, BUCKETNAME, "test", absolutePath, minio.PutObjectOptions{}) if err != nil { log.Fatalln(err) } log.Printf("upload of %s complete\n", basename) } func validateUploadFile() (string, string) { if len(os.Args) < 2 { log.Fatalln("upload file not specified") } file, err := os.Stat(os.Args[1]) if err != nil { log.Fatalln(err) } if file.IsDir() { log.Fatalln("upload of directories is not supported") } return os.Args[1], file.Name() } func verifyBucket(client *minio.Client, ctx context.Context) { exists, err := client.BucketExists(ctx, BUCKETNAME) if err != nil { log.Fatalln(err) } if !exists { log.Fatalf("bucket %s does not exist\n", BUCKETNAME) } } func createClient(accessKeyID string, secretAccessKey string) *minio.Client { // Initialize minio client object. minioClient, err := minio.New(ENDPOINT, &minio.Options{ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), Secure: true, }) if err != nil { log.Fatalln(err) } return minioClient } func getCredentials() (string, string) { // get credentials from env vars err := godotenv.Load() if err != nil { log.Fatalf("error loading .env file: (%s)", err.Error()) } keyName := os.Getenv("KEY_ID") if keyName == "" { log.Fatal("missing or empty KEY_ID") } applicationKey := os.Getenv("APPLICATION_KEY") if applicationKey == "" { log.Fatal("missing or empty APPLICATION_KEY") } return keyName, applicationKey }