Wenn man älter und älter wird, legt man ab Sie möchten nicht einen Server mehr unterhalten, um einige Sites und Blogs wie diesen zu hosten, überwachen, ob das Zertifikat sogar auf alten, veralteten Sites erneuert werden kann und so weiter. Zumindest ist dies der Fall me :) Und ich beschloss, es auf eine vollständig verwaltete Plattform zu verschieben. Auf den ersten Blick war Google Cloud-Speicher eine ausreichend gute Lösung, aber nachdem ich einen Bucket erstellt und ein vollständiges Tutorial erstellt habe, verstehe ich, dass das Aktivieren von https weder einfach (mit Load Balancer usw.) noch billig (itâÃÂ) sein wird ÃÂs 0,025 $ pro ersten 5 Regeln pro Stunde =>18 $ pro Monat) Ich habe Google Cloud Run gerade für einige APIs verwendet und es wird nur für die verwendete Zeit/CPU/RAM bezahlt, aber im Falle einer nicht sehr aktiven Website reicht sogar das kostenlose Kontingent aus, um einige Websites absolut zu hosten kostenlos Nach dem Lesen der Dokumentation sieht es ganz einfach aus, Sie müssen die Anmeldeinformationen nicht einmal manuell in Cloud Run (vollständig verwalteten) Containerinstanzen eingeben, wenn Sie die GCP-Clientbibliotheken verwenden! P.S.: Wenn Sie nur Ihren endgültigen Code zum Bereitstellen Ihres eigenen Containers benötigen, besuchen Sie bitte github.com/kanocz/gclwebgcs Zuerst müssen wir den von bereitgestellten Port abhören PORT-Umgebungsvariable: http.ListenAndServe + os.Getenv(âÃÂÃÂPORT nil) Über GCS env wir geben den Namen des Google Cloud Storage-Buckets an (muss sich im selben Projekt befinden ctx : = context.Background() Client, err := storage.NewClient(ctx) Bucket = client.Bucket(os.Getenv(âÃÂÃGCS Und zu sendendes Leseobjekt: obj := Bucket.Object(r.URL.Path[1 // strip firstobjAttrs, err := obj.Attrs(ctx) obj = obj.ReadCompressed(true) // wir tun es nicht Ich möchte es nicht dekomprimieren und für die Übertragung erneut komprimieren // Header kopieren 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) // und Datenleser senden, err := obj.NewReader(ctx) io.Copy(w, Leser) Wirklich für das Bereitstellen der Website benötigen wir auch einen Serverindex, behandeln nicht gefundene Fehler und so weiter, aber es ist auch nicht so kompliziert Vergessen Sie nicht, zu erstellen go.mod, um Google Cloud beim Aufbau zu helfen :) Als Bereitstellung in der Containerregistrierung ist es einfach gcloud-Builds übermitteln --tag gcr.io/project1/gclwebgcs (bitte ersetzen project1 mit Ihrem Projektnamen) und Dienst erstellen/aktualisieren mit gcloud beta run deploy --image gcr.io/project1/gclwebgcs \ --platform managed --set-env-vars=GCS=GCSbucketName serviceName Vergessen Sie nicht, Dateien hochzuladen GCSbucketName im selben Projekt und weisen Sie dem neuen Dienst den Domänennamen zu, das SSL-Zertifikat wird automatisch bereitgestellt und verwaltet! Das ist alles :)