Ana içeriğe geç

Backend — Production Deployment (Cloud Run)

Backend Go uygulamasının yackr-prod Google Cloud projesine Cloud Run üzerinden deploy edilmesi.


Genel Bilgi

Bilgi Değer
Google Cloud Projesi yackr-prod
Proje Numarası 875277302539
Organizasyon ID 323359026086 (yackr.co Google Workspace)
Bölge europe-west1
Cloud Run Servis Adı yackr-backend
Servis URL https://yackr-backend-snuey74raq-ew.a.run.app
gRPC Port 50051
Hesap murat@yackr.co

Kullanılan Yöntem

Local Docker build → Artifact Registry push → gcloud run deploy --image.

Önemli: gcloud run deploy --source . (Cloud Build) kullanılmaz. 3 kez denendi, her seferinde "Build failed" hatası döndü, terminal üzerinden log görülemedi (CLOUD_LOGGING_ONLY modu). Asıl hata ancak --image yöntemiyle tespit edilebildi.


Ön Koşullar (Bir Kez Yapıldı)

1. gcloud CLI Kurulumu (macOS)

brew install --cask google-cloud-sdk
gcloud --version  # 572.0.0

2. Giriş ve Proje Ayarı

gcloud auth login  # tarayıcıda murat@yackr.co ile giriş
gcloud config set project yackr-prod

3. Gerekli API'lerin Aktif Edilmesi

gcloud services enable \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  orgpolicy.googleapis.com
# secretmanager.googleapis.com zaten aktifti

4. Docker — Artifact Registry Girişi

gcloud auth configure-docker europe-west1-docker.pkg.dev

5. IAM İzinleri (Bir Kez Verildi)

Proje düzeyinde:

gcloud projects add-iam-policy-binding yackr-prod \
  --member="serviceAccount:875277302539@cloudbuild.gserviceaccount.com" \
  --role="roles/storage.objectAdmin"

gcloud projects add-iam-policy-binding yackr-prod \
  --member="serviceAccount:875277302539-compute@developer.gserviceaccount.com" \
  --role="roles/storage.objectAdmin"

gcloud projects add-iam-policy-binding yackr-prod \
  --member="serviceAccount:875277302539-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

gcloud projects add-iam-policy-binding yackr-prod \
  --member="serviceAccount:875277302539-compute@developer.gserviceaccount.com" \
  --role="roles/logging.logWriter"

Organizasyon düzeyinde (public erişim sorununu çözmek için gerekti):

gcloud organizations add-iam-policy-binding 323359026086 \
  --member="user:murat@yackr.co" \
  --role="roles/orgpolicy.policyAdmin"

6. Secret Manager

yackr-prod projesinde tanımlı secret'lar:

Secret Adı Açıklama
COCKROACH_DATABASE_URL CockroachDB bağlantı string'i
JWT_SECRET JWT access token imzalama anahtarı
R2_ACCESS_KEY_ID Cloudflare R2 erişim anahtarı
R2_SECRET_ACCESS_KEY Cloudflare R2 gizli anahtar
R2_ENDPOINT Cloudflare R2 endpoint URL
R2_BUCKET_NAME Cloudflare R2 bucket adı
R2_PUBLIC_URL Cloudflare R2 public URL
POSTMARK_API_KEY Postmark e-posta API anahtarı
POSTMARK_FROM_EMAIL Gönderici e-posta adresi

CF_AUD_TAG secret'ı da tanımlı ancak panel servisi içindir (cmd/panel-server) — ana backend'de kullanılmaz ve deploy komutuna eklenmez.


Deploy Komutu (Her Güncellemede)

backend/ dizininden çalıştır:

# 1. amd64 için build et — Apple Silicon Mac'te zorunlu
docker build --platform linux/amd64 -t yackr-backend:prod .

# 2. Tag'le ve push'la
docker tag yackr-backend:prod europe-west1-docker.pkg.dev/yackr-prod/cloud-run-source-deploy/yackr-backend:prod
docker push europe-west1-docker.pkg.dev/yackr-prod/cloud-run-source-deploy/yackr-backend:prod

# 3. Deploy et
gcloud run deploy yackr-backend \
  --image europe-west1-docker.pkg.dev/yackr-prod/cloud-run-source-deploy/yackr-backend:prod \
  --region europe-west1 \
  --port 50051 \
  --no-invoker-iam-check \
  --set-env-vars="APP_ENV=prod" \
  --update-secrets="COCKROACH_DATABASE_URL=COCKROACH_DATABASE_URL:latest,JWT_SECRET=JWT_SECRET:latest,R2_ACCESS_KEY_ID=R2_ACCESS_KEY_ID:latest,R2_SECRET_ACCESS_KEY=R2_SECRET_ACCESS_KEY:latest,R2_ENDPOINT=R2_ENDPOINT:latest,R2_BUCKET_NAME=R2_BUCKET_NAME:latest,R2_PUBLIC_URL=R2_PUBLIC_URL:latest,POSTMARK_API_KEY=POSTMARK_API_KEY:latest,POSTMARK_FROM_EMAIL=POSTMARK_FROM_EMAIL:latest"

Apple Silicon zorunluluğu: --platform linux/amd64 olmadan build edilen image arm64 üretir. Cloud Run amd64 ister. Hata: Container manifest must support amd64/linux.


Public Erişim Ayarı (Tamamlandı)

Sorun (Çözüldü)

yackr.co Google Workspace organizasyonu, iam.allowedPolicyMemberDomains policy'siyle allUsers IAM atamasını engelliyor. allUsers özel bir principal olduğu için bu constraint doğrudan override edilemiyor — allowAll: true veya Cloud Console üzerinden allUsers ataması her ikisi de başarısız oluyor.

Çözüm

Google resmi dokümantasyonuna göre domain restricted sharing varken önerilen yöntem --no-invoker-iam-check flag'idir. Bu, allUsers IAM binding gerektirmeden servisi public açar.

gcloud run services update yackr-backend \
  --region=europe-west1 \
  --no-invoker-iam-check

Gelecekte yeniden deploy edildiğinde --allow-unauthenticated yerine bu flag kullanılmalı veya yukarıdaki komut tekrar çalıştırılmalıdır.


Deploy Sonrası Doğrulama

Deploy bittikten sonra servisin ayakta olduğunu doğrulamak için — True dönmesi beklenir:

gcloud run services describe yackr-backend --region=europe-west1 --format="value(status.conditions[0].status,status.url)"

Log İzleme

Tarayıcıdan: Google Cloud Console → Cloud Run → yackr-backend → Logs sekmesi

Terminalden canlı akış:

gcloud alpha logging tail "resource.type=cloud_run_revision AND resource.labels.service_name=yackr-backend" --project=yackr-prod

Çıkmak için Ctrl+C.


Rollback (Önceki Versiyona Dönme)

Mevcut revision'ları listele:

gcloud run revisions list --service=yackr-backend --region=europe-west1 --project=yackr-prod

İstenen revision'a geç:

gcloud run services update-traffic yackr-backend \
  --region=europe-west1 \
  --to-revisions=REVISION_ADI=100

REVISION_ADI → yukarıdaki listeden kopyala (örn. yackr-backend-00003-abc).