Kiedy się starzejesz i się starzejesz, nie... Nie chcę utrzymywać jednego serwera więcej, aby hostować kilka witryn i blogów, takich jak ten, monitoruj, czy pozwala na szyfrowanie odnawianego certyfikatu nawet na starych, nieaktualnych witrynach i tak dalej… przynajmniej dotyczy to ja :) I postanowiłem przenieść go na jakąś w pełni zarządzaną platformę. Na pierwszy rzut oka przechowywanie w Google Cloud było wystarczająco dobrym rozwiązaniem, ale po utworzeniu zasobnika i przejściu do kompletnego samouczka rozumiem, że włączenie https nie będzie ani łatwe (przy użyciu równoważenia obciążenia itp.), ani tanie (jest to 0,025 USD za pierwsze 5 reguł na godzinę =>18 USD miesięcznie) Właśnie korzystałem z Google Cloud Run dla kilku interfejsów API i płaci się tylko za wykorzystany czas / procesor / pamięć RAM, ale w przypadku niezbyt aktywnej witryny nawet Free Tier wystarczy, aby hostować niektóre witryny absolutnie za darmo Po przeczytaniu dokumentacji wygląda to po prostu bardzo prosto, nie musisz nawet ręcznie podawać danych uwierzytelniających w instancjach kontenerów Cloud Run (w pełni zarządzanych) podczas korzystania z bibliotek klienckich GCP! P.S .: jeśli chcesz tylko, aby końcowy kod wdrożył własny kontener, odwiedź stronę github.com/kanocz/gclwebgcs Najpierw musimy nasłuchiwać na porcie dostarczonym przez Zmienna środowiskowa PORT: http.ListenAndServe + os.Getenv(âÃÂÃÂPORT zero) Przez Środowisko GCS określimy nazwę zasobnika Google Cloud Storage (musi należeć do tego samego projektu ctx : = klient context.Background(), błąd := storage.NewClient(ctx) wiadro = klient.Bucket(os.Getenv(âÃÂÃÂGCS I czytanie obiektu do wysłania: obj := Bucket.Object(r.URL.Path[1 // usuń firstobjAttrs, err := obj.Attrs(ctx) obj = obj.ReadCompressed(true) // nie nie chcę go dekompresować i ponownie kompresować w celu przesłania // kopiowania nagłówków 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) // i wyślij czytnik danych, err := obj.NewReader(ctx) io.Copy(w, czytelnik) Naprawdę do obsługi strony internetowej potrzebujemy również indeksu serwera, obsługi nie znalezionych błędów i tak dalej, ale to też nie jest takie skomplikowane Nie zapomnij utworzyć go.mod, aby pomóc Google Cloud Build :) Niż wdrożenie do rejestru kontenerów to po prostu kompilacje gcloud prześlij --tag gcr.io/project1/gclwebgcs (proszę wymienić project1 z nazwą twojego projektu) i utwórz/zaktualizuj usługę za pomocą wdrożenie wersji beta gcloud --image gcr.io/project1/gclwebgcs \ --platform zarządzane --set-env-vars=GCS=GCSbucketName nazwa_usługi Nie zapomnij przesłać plików do GCSbucketName w tym samym projekcie i przypisać nazwę domeny do nowej usługi, certyfikat ssl zostanie dostarczony i zarządzany automatycznie! To wszystko :)