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_ONLYmodu). Asıl hata ancak--imageyö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_TAGsecret'ı 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/amd64olmadan 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).