Quando invecchi sempre di più non riesci a Ât desidera mantenere un server in più per ospitare pochi siti e blog come questo, monitorare se consente di crittografare il certificato rinnovato anche su vecchi siti obsoleti e così viaâÃÂæ almeno questo è vero per io :) E ho deciso di spostarlo su una piattaforma completamente gestita. Per il primo sguardo Google Cloud storage è stata una soluzione abbastanza buona, ma dopo aver creato il bucket e aver lanciato il tutorial completo capisco che l'abilitazione di https non sarà né facile (usando il bilanciamento del carico e così via) né economico (è ÃÂs $ 0,025 per le prime 5 regole all'ora =>$ 18 al mese) Ho appena utilizzato Google Cloud Run per poche API e viene pagato solo per tempo utilizzato/CPU/RAM, ma in caso di sito web poco attivo anche il piano gratuito è sufficiente per ospitare alcuni siti web assolutamente gratuito Dopo aver letto la documentazione sembra molto semplice, non è nemmeno necessario fornire manualmente le credenziali all'interno delle istanze di container Cloud Run (completamente gestite) quando si utilizzano le librerie client GCP! PS: se desideri solo il codice finale per distribuire il tuo contenitore, visita github.com/kanocz/gclwebgcs Per prima cosa dobbiamo ascoltare sulla porta fornita da Variabile di ambiente PORT: http.ListenAndServe + os.Getenv(âÃÂÃÂPORT nil) attraverso GCS env weâÃÂÃÂspecificheremo il nome del bucket di Google Cloud Storage (deve essere nello stesso progetto ctx : = context.Background() client, err := storage.NewClient(ctx) bucket = client.Bucket(os.Getenv(âÃÂÃÂGCS E leggendo l'oggetto da inviare: obj := bucket.Object(r.URL.Path[1 // elimina firstobjAttrs, err := obj.Attrs(ctx) obj = obj.ReadCompressed(true) // non è possibile Non voglio decomprimerlo e comprimerlo di nuovo per il trasferimento // copia le intestazioni w.HeaderSet(âÃÂÃÂContent-TypeâÃÂÃÂ, objAttrs.ContentType) w.HeaderSet(âÃÂÃÂContent-EncodingâÃÂÃÂ, objAttrs.ContentEncoding) w.HeaderSet(âÃÂàContent-LengthâÃÂÃÂ, strconv.Itoa(int(objAttrs.Size w.HeaderSet(âÃÂÃÂContent-DispositionâàÃÂ, objAttrs.ContentDisposition) w.HeaderSet(âÃÂÃÂCache-ControlâÃÂÃÂ, objAttrs.CacheControl) w.HeaderSet(à ¢ÃÂÃÂETagâÃÂÃÂ, objAttrs.Etag) // e invia il lettore di dati, err := obj.NewReader(ctx) io.Copy(w, lettore) In realtà per servire il sito Web richiediamo anche l'indice del server, gestire gli errori non trovati e così via, ma non è nemmeno così complicato Non dimenticare di creare go.mod per aiutare Google Cloud Build :) Di distribuzione al registro contenitore è solo build di gcloud submit --tag gcr.io/project1/gclwebgcs (si prega di sostituire project1 con il nome del tuo progetto) e creare/aggiornare il servizio utilizzando gcloud beta run deploy --image gcr.io/project1/gclwebgcs \ --platform managed --set-env-vars=GCS=GCSbucketName serviceName Non dimenticare di caricare i file su GCSbucketName nello stesso progetto e assegna il nome di dominio al nuovo servizio, il certificato ssl verrà fornito e gestito automaticamente! QuestoâÃÂàè tutto :)