storage

S3

Az S3-kompatibilis driver, egy külön verziózott modul, minio-go-ra épülve.

A storage/driver/s3 a production driver: egy S3-kompatibilis Driver, minio-go-ra építve. Ez egy külön Go modul, nem a gyökér storage modul alcsomagja: saját go.mod-ja és saját verziója van, mert behúzza a minio-go-t mint valódi függőséget, és ezt a súlyt csak azoknak a projekteknek kell viselniük, amelyek ténylegesen S3-mal beszélnek. A storage minden más része (Disk, Manager, a dekorátorok, storage/memory, storage/local) nem is tud erről a modulról.

Telepítés

go get github.com/gp-system/storage/driver/s3@latest

Ez a gyökér github.com/gp-system/storage-tól függetlenül verziózott: a gyökér modul emelése nem igényli ennek emelését, és fordítva sem. Mindkettő kell a go.mod-ba, mivel a driver a gyökér modul típusait importálja (Driver, FileInfo és társaik).

Konfiguráció

import "github.com/gp-system/storage/driver/s3"

cfg := s3.Config{ /* ... */ }
driver, err := s3.New(cfg)
disk := storage.NewDisk(driver, storage.WithName("s3"))

Az s3.Config-ot S3_ prefixszel komponálod a projekt configjába, ugyanúgy, ahogy bármely gpsystem modul configja komponálódik:

type Config struct {
    // ...
    Storage s3.Config `envPrefix:"S3_"`
}
VáltozóDefaultJelentés
S3_ENDPOINTkötelezőa szolgáltatás címe (s3.amazonaws.com, egy MinIO host, ...)
S3_REGIONus-east-1
S3_BUCKETkötelező
S3_ACCESS_KEY / S3_SECRET_KEYüreshitelesítő adatok az endpointhoz
S3_USE_PATH_STYLEfalsetrue a legtöbb self-hosted S3-hoz (/bucket/key címzés a virtual-host-stílus helyett)
S3_PUBLIC_BASE_URLüresa Disk.URL alapja (egy CDN, vagy a bucket saját publikus endpointja)

A teljes lista a konfiguráció-referenciában.

Nem csak AWS

Mivel a driver minio-go-ra épül, nem az AWS SDK-ra, bármilyen az S3 API-t implementáló szolgáltatással beszél, nem csak magával az AWS-szel: az AWS S3, a MinIO, a RustFS, a Cloudflare R2 és a Backblaze B2 mind működik ugyanaz az s3.Config mögött, jellemzően csak az S3_ENDPOINT és az S3_USE_PATH_STYLE megfelelő beállításával. Egy new project-tel generált projekt már eleve futtat egy self-hosted, S3-kompatibilis rustfs service-t a dev compose.yml-jében, így a helyi fejlesztéshez sosem kellenek valódi AWS-hitelesítő adatok.

// a Client egy escape hatch mindenhez, amit a Driver interfész nem tesz elérhetővé
client := driver.Client() // *minio.Client
bucket := driver.Bucket() // a konfigurált bucket neve

Az s3.New opciókat is elfogad; a WithTransport(http.RoundTripper) lehetővé teszi az alatta lévő HTTP transport cseréjét, hasznos egyedi TLS-konfigurációhoz vagy saját OTel-instrumentált transport injektálásához.

Presigned URL-ek

A TemporaryURL és a TemporaryUploadURL a minio-go natív presigningjével implementált (PresignedGetObject/PresignedPutObject): a visszaadott URL közvetlenül az S3-kompatibilis endpointra mutat, így a kliens úgy tölt le vagy fel, hogy a kérés egyáltalán nem megy át a service-eden. Ez ugyanaz a Driver szerződés, amit minden más driver implementál, így a disk.TemporaryURL(...)-t hívó kód nem tudja és nem is érdekli, hogy S3-mal beszél, nem a helyi driver HMAC-aláírt linkjeivel.

Önálló példa

main.go
package main

import (
    "context"
    "log"
    "strings"
    "time"

    "github.com/gp-system/storage"
    "github.com/gp-system/storage/driver/s3"
)

func main() {
    driver, err := s3.New(s3.Config{
        Endpoint:      "localhost:9000",
        Region:        "us-east-1",
        Bucket:        "uploads",
        AccessKey:     "minioadmin",
        SecretKey:     "minioadmin",
        UsePathStyle:  true,
        PublicBaseURL: "http://localhost:9000/uploads",
    })
    if err != nil {
        log.Fatal(err)
    }
    disk := storage.NewDisk(driver, storage.WithName("s3"))

    ctx := context.Background()
    if err := disk.Put(ctx, "hello.txt", strings.NewReader("hello, s3"), storage.PutOptions{}); err != nil {
        log.Fatal(err)
    }

    signed, err := disk.TemporaryURL(ctx, "hello.txt", storage.TemporaryURLOptions{TTL: 15 * time.Minute})
    if err != nil {
        log.Fatal(err)
    }
    log.Println("presigned link:", signed)
}

Kapcsolódó oldalak

  • Áttekintés: a Driver/Disk/Manager modell, amibe ez a driver illeszkedik.
  • Disk API: a metódusok, amiket a Disk bármilyen driveren, így ezen is elérhetővé tesz.
  • Memória és helyi lemez: a driverek teszthez és egy-node-os telepítéshez.
  • Tesztelés: futtasd a konformancia-suite-ot a saját S3-kompatibilis endpointod ellen.
  • Külső függőségek: a minio-go verzió, amit ez a driver pinel.
Copyright © 2026