Коли ти старієш і старішаєш, ти не стаєш Не хочу підтримувати ще один сервер, щоб розміщувати кілька сайтів і блогів, подібних до цього, перевірте, чи дозволяє шифрувати сертифікат, оновлений навіть на старих застарілих сайтах тощо. Принаймні це справедливо для я :) І я вирішив перенести це на якусь повнокеровану платформу. На перший погляд, хмарне сховище Google було достатньо хорошим рішенням, але після створення сегмента та перегляду повного посібника я зрозумів, що ввімкнути https буде непросто (використання балансувальника навантаження тощо) і недешево (це ¢ à0,025 доларів США за перші 5 правил на годину =>18 доларів США на місяць) Щойно використовував Google Cloud Run для кількох API, і він оплачується лише за використаний час/процесор/оперативну пам’ять, але у випадку не дуже активного веб-сайту навіть безкоштовного рівня достатньо для розміщення деяких веб-сайтів. безкоштовно Після прочитання документації це виглядає дуже просто, вам навіть не потрібно надавати облікові дані вручну в примірниках контейнера Cloud Run (повністю керованого) під час використання клієнтських бібліотек GCP! P.S.: якщо ви просто хочете отримати остаточний код для розгортання власного контейнера, відвідайте github.com/kanocz/gclwebgcs Спочатку нам потрібно прослухати наданий порт PORT env змінна: http.ListenAndServe + os.Getenv(âÃÂÃÂPORT нуль) через GCS env ми вкажемо назву відра Google Cloud Storage (має бути в тому самому проекті) ctx : = context.Background() client, err := storage.NewClient(ctx) bucket = client.Bucket(os.Getenv(âÃÂÃÂGCS І читання об'єкта для надсилання: obj := bucket.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(âÃÂÃÂCache-ControlâÃÂÃÂ, objAttrs.CacheControl) w.HeaderSet(à ¢ÃÂÃÂETagâÃÂÃÂ, objAttrs.Etag) // і надсилання зчитувача даних, помилка := obj.NewReader(ctx) io.Copy(w, читач) Справді, для обслуговування веб-сайту нам також потрібен індекс сервера, обробка помилок «не знайдено» тощо, але це також не так складно Не забувайте творити go.mod, щоб допомогти Google Cloud Build :) Це просто розгортання в реєстрі контейнерів gcloud builds submit --tag gcr.io/project1/gclwebgcs (будь ласка, замініть project1 з назвою вашого проекту) і створити/оновити службу за допомогою gcloud beta run deploy --image gcr.io/project1/gclwebgcs \ --platform managed --set-env-vars=GCS=GCSbucketName serviceName Не забувайте завантажувати файли в GCSbucketName у тому самому проекті та призначте доменне ім’я новій службі, сертифікат ssl буде надано та керовано автоматично! Ось і все :)