mirror of
https://github.com/netbirdio/netbird.git
synced 2025-08-14 01:08:46 +02:00
[client] Feature/upload bundle (#3734)
Add an upload bundle option with the flag --upload-bundle; by default, the upload will use a NetBird address, which can be replaced using the flag --upload-bundle-url. The upload server is available under the /upload-server path. The release change will push a docker image to netbirdio/upload image repository. The server supports using s3 with pre-signed URL for direct upload and local file for storing bundles.
This commit is contained in:
69
upload-server/server/s3.go
Normal file
69
upload-server/server/s3.go
Normal file
@ -0,0 +1,69 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/aws/aws-sdk-go-v2/aws"
|
||||
"github.com/aws/aws-sdk-go-v2/config"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
log "github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/netbirdio/netbird/upload-server/types"
|
||||
)
|
||||
|
||||
type sThree struct {
|
||||
ctx context.Context
|
||||
bucket string
|
||||
presignClient *s3.PresignClient
|
||||
}
|
||||
|
||||
func configureS3Handlers(mux *http.ServeMux) error {
|
||||
bucket := os.Getenv(bucketVar)
|
||||
region, ok := os.LookupEnv("AWS_REGION")
|
||||
if !ok {
|
||||
return fmt.Errorf("AWS_REGION environment variable is required")
|
||||
}
|
||||
ctx := context.Background()
|
||||
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region))
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to load SDK config: %w", err)
|
||||
}
|
||||
|
||||
client := s3.NewFromConfig(cfg)
|
||||
|
||||
handler := &sThree{
|
||||
ctx: ctx,
|
||||
bucket: bucket,
|
||||
presignClient: s3.NewPresignClient(client),
|
||||
}
|
||||
mux.HandleFunc(types.GetURLPath, handler.handlerGetUploadURL)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sThree) handlerGetUploadURL(w http.ResponseWriter, r *http.Request) {
|
||||
if !isValidRequest(w, r) {
|
||||
return
|
||||
}
|
||||
|
||||
objectKey := getObjectKey(w, r)
|
||||
if objectKey == "" {
|
||||
return
|
||||
}
|
||||
|
||||
req, err := s.presignClient.PresignPutObject(s.ctx, &s3.PutObjectInput{
|
||||
Bucket: aws.String(s.bucket),
|
||||
Key: aws.String(objectKey),
|
||||
}, s3.WithPresignExpires(15*time.Minute))
|
||||
|
||||
if err != nil {
|
||||
http.Error(w, "failed to presign URL", http.StatusInternalServerError)
|
||||
log.Errorf("Presign error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
respondGetRequest(w, req.URL, objectKey)
|
||||
}
|
Reference in New Issue
Block a user