Когда ты становишься все старше и старше, ты не делаешь этого  не хотите поддерживать еще один сервер для размещения нескольких сайтов и блогов, подобных этому, следить за тем, позволяет ли шифровать сертификат, обновленный даже на старых устаревших сайтах и ​​т. д., по крайней мере, это верно для меня :) И я решил перенести его на какую-нибудь полностью управляемую платформу. На первый взгляд хранилище Google Cloud было достаточно хорошим решением, но после создания корзины и прохождения полного руководства я понимаю, что включение https будет ни простым (с использованием балансировщика нагрузки и т. д.), ни дешевым (это âà0,025 доллара США за первые 5 правил в час =>18 долларов США в месяц) Только что использовал Google Cloud Run для нескольких API, и он платил только за использованное время / ЦП / ОЗУ, но в случае не очень активного веб-сайта даже бесплатного уровня достаточно для абсолютного размещения некоторых веб-сайтов. бесплатно После прочтения документации все выглядит очень просто, вам даже не нужно вводить учетные данные вручную внутри экземпляров контейнера Cloud Run (полностью управляемого) при использовании клиентских библиотек GCP! P.S.: если вы просто хотите получить окончательный код для развертывания собственного контейнера, посетите github.com/kanocz/gclwebgcs Сначала нам нужно прослушать порт, предоставленный Переменная окружения PORT: http.ListenAndServe + os.Getenv (ПОРТ ноль) Через GCS env мы укажем имя корзины Google Cloud Storage (должно быть в том же проекте ctx : = context.Background() client, err := storage.NewClient(ctx) Bucket = client.Bucket(os.Getenv(âÃÂÃÂGCS И чтение объекта для отправки: obj := ведро.Object(r.URL.Path[1 // удалить firstobjAttrs, err := obj.Attrs(ctx) obj = obj.ReadCompressed(true) // мы не не нужно распаковывать и снова сжимать его для передачи // копирование заголовков 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(A¢ÃÂÃÂCache-ControlâÃÂÃÂ, objAttrs.CacheControl) w.HeaderSet(à ¢ÃÂÃÂETagâÃÂÃÂ, objAttrs.Etag) // и отправить считыватель данных, err := obj.NewReader(ctx) io.Copy(w, читатель) Действительно для обслуживания сайта нам тоже нужен индекс сервера, обработка не найденных ошибок и тд, но это тоже не так уж и сложно Не забудьте создать go.mod, чтобы помочь Google Cloud Build :) Чем развертывание в реестре контейнеров, это просто Отправить сборку gcloud --tag gcr.io/project1/gclwebgcs (пожалуйста, замените project1 с названием вашего проекта) и создать/обновить службу, используя gcloud beta run deploy --image gcr.io/project1/gclwebgcs \ --platform manage --set-env-vars=GCS=GCSbucketName имя_службы Не забудьте загрузить файлы на GCSbucketName в том же проекте и назначьте доменное имя новой службе, сертификат ssl будет предоставлен и будет управляться автоматически! Вот и все :)