Cuando te haces más y más viejo, no lo haces No quiero mantener un servidor más para alojar algunos sitios y blogs como este, monitorear si permite encriptar el certificado renovado incluso en sitios obsoletos y así sucesivamente... al menos esto es cierto para yo :) Y decidí moverlo a una plataforma completamente administrada. A primera vista, el almacenamiento en la nube de Google fue una solución lo suficientemente buena, pero después de crear un depósito y lanzar el tutorial completo, entiendo que habilitar https no será fácil (usando el balanceador de carga, etc.) ni barato (itâàÃÂs $0.025 por las primeras 5 reglas por hora =>$18 por mes) Acabo de usar Google Cloud Run para algunas API y se paga solo por el tiempo utilizado/CPU/RAM, pero en el caso de un sitio web no muy activo, incluso el nivel gratuito es suficiente para alojar algunos sitios web. gratis Después de leer la documentación, parece muy simple, ¡ni siquiera necesita proporcionar credenciales manualmente dentro de las instancias de contenedores de Cloud Run (totalmente administradas) cuando usa las bibliotecas de clientes de GCP! P.D.: si solo desea su código final para implementar su propio contenedor, visite github.com/kanocz/gclwebgcs Primero necesitamos escuchar en el puerto provisto por Variable de entorno de PUERTO: http.ListenAndServe + os.Getenv(âÃÂÃÂPORT cero) A través de GCS env, especificaremos el nombre del depósito de Google Cloud Storage (debe estar en el mismo proyecto ctx : = context.Background() cliente, err := storage.NewClient(ctx) bucket = client.Bucket(os.Getenv(âÃÂÃÂGCS Y objeto de lectura para enviar: obj := bucket.Object(r.URL.Path[1 // quitar firstobjAttrs, err := obj.Attrs(ctx) obj = obj.ReadCompressed(true) // no lo hacemos No quiero descomprimirlo y comprimirlo de nuevo para transferir // copiar encabezados 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) // y enviar datos al lector, err := obj.NewReader(ctx) io.Copy(w, lector) Realmente para servir el sitio web también requerimos el índice del servidor, manejar los errores no encontrados, etc., pero tampoco es tan complicado. No olvides crear go.mod para ayudar a Google Cloud Build :) Que la implementación en el registro de contenedores, simplemente Envío de compilaciones de gcloud --tag gcr.io/project1/gclwebgcs (por favor cámbialo project1 con el nombre de su proyecto) y crear/actualizar el servicio usando gcloud beta run deployment --image gcr.io/project1/gclwebgcs \ --platform Managed --set-env-vars=GCS=GCSbucketName serviceName No olvides subir archivos a GCSbucketName en el mismo proyecto y asigne el nombre de dominio al nuevo servicio, ¡el certificado SSL se proporcionará y administrará automáticamente! Eso es todo :)