> ## Documentation Index
> Fetch the complete documentation index at: https://supastack.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For the full documentation corpus in one file, fetch: https://supastack.dev/llms-full.txt

# Google Cloud'a dağıtın

Kitin Docker imajını Cloud Build'de derleyin, yönetilen sırlarla Cloud Run'da çalıştırın ve alan adınıza koyun.

## Başlangıç seviyesinde izlenecek yol

Ön koşullar: uygulama yerelde çalışıyor, internetten erişebileceğiniz gerçek bir veritabanı (Veritabanını kurun) ve yayınladığınız özellikler için sağlayıcı hesapları. Bir Google hesabı gerekiyor; hafif kullanım ücretsiz katmanda kalsa da faturalandırma kurulumu bir kart ister.

Kısa terimler: konteyner imajı, herhangi bir ana bilgisayarın çalıştırabileceği paketlenmiş bir uygulama kopyasıdır. Artifact Registry, Google'ın imaj deposudur. Cloud Build imajı Google'ın makinelerinde derler — yerel Docker gerekmez. Cloud Run imajı bir HTTPS servisi olarak çalıştırır ve ölçekler. Secret Manager şifreleri ve anahtarları tutar. Revizyon, servisin dağıtılmış bir sürümüdür.

İnşa ettiğiniz şey: bir Google Cloud projesi, imajınızı tutan bir Artifact Registry deposu, uygulamayı HTTPS üzerinden sunan bir Cloud Run servisi, Secret Manager'da sırlar ve yönetilen bir Postgres. Kitin kök `Dockerfile`'ı zaten 8080 numaralı bağlantı noktasında dinleyen bağımsız bir Next.js sunucusu üretir — tam olarak Cloud Run'ın beklediği.

Dürüst maliyet notu: Cloud Run'ın ücretsiz katmanı hafif trafiği karşılar, ancak Cloud SQL — Google'ın yönetilen Postgres'i — ücretsiz katmana sahip değildir. Supabase veya Neon ücretsiz katman veritabanı başlamanın en ucuz yoludur; bu kılavuz o yolu kullanır. Denemeden önce Billing → Budgets & alerts altına bir bütçe uyarısı eklemeyi düşünün.

[Veritabanını kurun](https://supastack.dev/tr/docs/web/setup-database.md)

[Önce OAuth hesaplarını oluşturun](https://supastack.dev/tr/docs/web/external-accounts.md)


## Hesabı oluşturun ve CLI'yi kurun

1. [console.cloud.google.com](https://console.cloud.google.com) adresini açın, Google hesabınızla oturum açın ve koşulları kabul edin.

2. İstendiğinde faturalandırmayı ekleyin: Billing → Link a billing account → Create billing account. Hesabı etkinleştirmek için kart gerekir; deneme kredisi ilk denemeleri karşılar.

3. Proje açılır menüsüne → New Project'e tıklayın, adlandırın ve Create — veya Google ile giriş için oluşturduğunuz projeyi yeniden kullanın; tek proje yeterlidir.

4. Google Cloud CLI'yi [cloud.google.com/sdk](https://cloud.google.com/sdk/docs/install) adresinden kurun: işletim sisteminiz için yükleyiciyi indirin, tamamlayın, ardından `gcloud` komutunun kullanılabilir olması için yeni bir terminal açın.

5. Aşağıdaki iki komutu çalıştırın. İlki CLI'yi yetkilendirmek için bir tarayıcı açar; ikincisi projenizi seçer — konsol panosunda gösterilen ve her zaman adla aynı olmayan proje kimliğini kullanın.

Beklenen: `gcloud config list` hesabınızı ve projenizi gösterir. `gcloud` tanınmıyorsa terminali yeniden açın veya önce yükleyiciyi bitirin.

```
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
```


## Üretim veritabanını oluşturun

Yeni başlayan yolu — Google dışında yönetilen Postgres. [supabase.com](https://supabase.com) adresinde: New project → bir ad, veritabanı şifresi ve bölge seçin → hazırlanmasını bekleyin → Project Settings → Database. Supabase iki bağlantı dizesi sunar: 5432 numaralı bağlantı noktasındaki oturum havuzu / doğrudan bağlantı ve 6543 numaralı bağlantı noktasındaki işlem havuzu — 5432 dizesi geçişler ve uzun ömürlü istemciler içindir, 6543 dizesi sunucusuz uygulama içindir. [neon.tech](https://neon.tech) adresinde: New project → gösterdiği bağlantı dizesini kopyalayın. İkisi de işe yarar; şifre kısmını bozulmadan tutun.

Doğrudan/oturum dizesini kök `.env` içindeki `DATABASE_URL`'ye koyun — geçiş aracı kök dosyayı okur ve oturum bağlantısına ihtiyaç duyar — ve yerel geliştirme sunucusu için `apps/web/.env.local` içine. Ardından kitin tablolarını yeni veritabanında oluşturmak için depo kökünden geçiş komutunu bir kez çalıştırın. Dağıtılan uygulamanın kullandığı `DATABASE_URL` sırrı bunun yerine havuzlanmış 6543 dizesi olabilir.

Google yerel alternatifi, aynı proje içinde yönetilen bir Postgres olan Cloud SQL'dir. Ücretsiz katmanı yoktur ve özel IP bağlantıları bir VPC konektörü gerektirir — onu bir başlangıç noktası değil, sonraki bir yükseltme olarak görün.

```
# DATABASE_URL=<the direct/session Postgres string, port 5432> in .env + apps/web/.env.local, then:
corepack pnpm --filter @supastack/db db:migrate
```


## Servisleri etkinleştirin ve imajı gönderin

Aşağıdaki komutları depo kökünden çalıştırın. Bu dağıtımın kullandığı dört Google servisini etkinleştirir, Artifact Registry'de bir Docker deposu oluşturur ve depoyu Cloud Build'e gönderir — kök `Dockerfile`'ı uzaktan derler, bu yüzden Docker Desktop gerekmez.

`YOUR_PROJECT_ID` yerine kendi değerinizi yazın ve bir bölge seçin — aşağıda `us-central1` — ve onu depo ve servis için yeniden kullanın. Beklenen: derleme günlüğü birkaç dakika akar ve `DONE` / `STATUS: SUCCESS` ile biter. İmaj ardından konsolda Artifact Registry → supastack → web altında görünür.

```
gcloud services enable run.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com secretmanager.googleapis.com

gcloud artifacts repositories create supastack --repository-format=docker --location=us-central1

gcloud builds submit --tag us-central1-docker.pkg.dev/YOUR_PROJECT_ID/supastack/web:latest
```


## Sırları Secret Manager'da saklayın

Sırlar asla `--set-env-vars`'a veya imaja girmemelidir — ikisi de düz metin olarak saklanır ve servis yapılandırmasını okuyabilen herkese görünür. Secret Manager onları şifreli tutar ve çalışma zamanında enjekte eder.

1. Konsolda Security → Secret Manager → Create Secret'i açın.

2. `DATABASE_URL`'yi tam Postgres bağlantı dizesiyle — havuzlanmış sunucusuz dize uygulama için uygundur — `AUTH_SECRET`'ı en az 32 rastgele karakterle (`openssl rand -hex 32` bir tane üretir) ve `CREDENTIAL_ENCRYPTION_KEY`'i Base64 kodlu 32 baytlık bir anahtarla (`openssl rand -base64 32`) oluşturun; çalışma alanlarının uygulamada sakladığı sağlayıcı anahtarlarını şifreler.

3. Etkinleştirdiğiniz her sağlayıcı için bir sır oluşturun — örneğin `STRIPE_SECRET_KEY` artı `STRIPE_WEBHOOK_SECRET`, `RESEND_API_KEY`, `GOOGLE_CLIENT_SECRET`, `GITHUB_CLIENT_SECRET`. `EMAIL_PROVIDER=resend` gibi gizli olmayan ayarlar sır değil, düz ortam değişkenleri olarak kalır.

Bir servis ilk kez bir sırra başvurduğunda, çalışma zamanı servis hesabının onu okuma iznine ihtiyacı vardır — konsolun servis düzenleyicisi aracılığıyla sır eklediğinizde Google bu izni otomatik olarak önerir; CLI'de dağıtım hatası, verilmesi gereken eksik Secret Manager rolünü adlandırır.

```
# Secrets to create in Secret Manager:
DATABASE_URL     # Postgres connection string — the pooled serverless string is fine
AUTH_SECRET      # openssl rand -hex 32
CREDENTIAL_ENCRYPTION_KEY   # openssl rand -base64 32

# plus one per enabled provider, e.g.:
STRIPE_SECRET_KEY
STRIPE_WEBHOOK_SECRET
RESEND_API_KEY
GOOGLE_CLIENT_SECRET
GITHUB_CLIENT_SECRET
```


## Cloud Run servisini dağıtın

Konsol yolu: Cloud Run → Create service → Deploy one revision from an existing container image → gönderilen `…/supastack/web:latest` imajını seçin → aynı bölgeyi seçin → Authentication altında Allow unauthenticated invocations'ı seçin (herkese açık bir uygulamadır) → Create.

Aşağıdaki CLI eşdeğeri ortam bağlantısını aynı adımda ekler. Düz metin yapılandırma `--set-env-vars`'a gider; sırlar `--set-secrets` içinde Secret Manager adlarıyla başvurulur. Sağlayıcı bayraklarınızı (`EMAIL_PROVIDER`, `BILLING_PROVIDER`, `AI_PROVIDER`, `JOB_PROVIDER`) `APP_URL` yanında düz env değişkenleri olarak ekleyin.

`APP_ENV=production` gereklidir — onsuz uygulama `local` modunda açılır: üretim yapılandırma doğrulaması atlanır, güvenli çerez önekleri kapalı kalır ve yalnızca geliştirmeye özel `/mail-preview` sayfası herkese açık erişilebilir kalır (`EMAIL_PROVIDER=local` iken yerel e-posta giden kutusunu sızdırır). Üretim ardından açılışta dört değer daha gerektirir: `EXPO_PUBLIC_API_URL`, mobil uygulamanın API'ye ulaşmak için kullandığı genel https URL'sidir — servis URL'sine ayarlayın (yalnızca web dağıtımında `APP_URL` ile aynı); `EXPO_PUBLIC_APP_SCHEME` mobil derin bağlantı şemasıdır — mobil uygulama yayınlamıyorsanız `supastack` gibi herhangi bir geçerli değer işe yarar; `MOBILE_ALLOWED_ORIGINS`, sunucunun güvendiği tam https kökenlerinin virgülle ayrılmış listesidir — uygulama URL'niz doğru başlangıçtır ve joker karakterler reddedilir; `CREDENTIAL_ENCRYPTION_KEY` saklanan sağlayıcı kimlik bilgilerini şifreler ve Secret Manager'da kalır.

Cloud Run ilk dağıtımda bir `https://….run.app` URL'si atar ve kimlik doğrulama geri çağrılarının ve bağlantıların çalışması için uygulamanın `APP_URL`'si gerçek genel URL'sine eşit olmalıdır. Bu yüzden önce yer tutucuyla bir kez dağıtın, servis sayfasından `*.run.app` URL'sini kopyalayın, ardından servisi (konsol: Edit & deploy new revision veya komutu yeniden çalıştırın) `APP_URL` — ve eşleşen `EXPO_PUBLIC_API_URL` / `MOBILE_ALLOWED_ORIGINS` değerleri — ona ayarlanmış şekilde güncelleyin. Konteyner bağlantı noktası 8080'de kalır — Cloud Run varsayılanı zaten `Dockerfile`'ın `PORT`'uyla eşleşir.

```
gcloud run deploy supastack --image us-central1-docker.pkg.dev/YOUR_PROJECT_ID/supastack/web:latest --region us-central1 --allow-unauthenticated --set-env-vars "APP_ENV=production,APP_URL=https://YOUR_SERVICE_URL,EXPO_PUBLIC_API_URL=https://YOUR_SERVICE_URL,EXPO_PUBLIC_APP_SCHEME=supastack,MOBILE_ALLOWED_ORIGINS=https://YOUR_SERVICE_URL" --set-secrets "DATABASE_URL=DATABASE_URL:latest,AUTH_SECRET=AUTH_SECRET:latest,CREDENTIAL_ENCRYPTION_KEY=CREDENTIAL_ENCRYPTION_KEY:latest"
```


## Kendi alan adınızı bağlayın (isteğe bağlı)

Test ederken bunu atlayın — `*.run.app` URL'si zaten HTTPS sunar. Hazır olduğunuzda: Cloud Run → servisiniz → Custom Domains / Domain Mappings → Add mapping → servisi seçin ve alan adınızı girin.

İstenirse alan adı sahipliğini doğrulayın (Google size yol gösterir), ardından eşleme ekranının listelediği DNS kayıtlarını kayıt şirketinizde oluşturun. Yönetilen HTTPS sertifikası, kayıtlar yayıldıktan sonra otomatik olarak verilir — genellikle dakikalar, en fazla bir gün.

Alan adı trafik sunduktan sonra `APP_URL`'yi `https://yourdomain.com` olarak güncelleyin ve eşleşen OAuth redirect URI'lerini (`https://yourdomain.com/api/auth/callback/…`) kaydedin — giriş kılavuzları nereyi kapsadığını anlatır.


## Dağıtımı doğrulayın

`https://YOUR_SERVICE_URL/api/health` adresini açın — `ok` bekleyin. Ardından uygulamayı uçtan uca deneyin: URL'yi açın, kaydolun, bir e-posta kodu isteyin, gelen kutusuna ulaştığını doğrulayın (bu `EMAIL_PROVIDER=resend`, `RESEND_API_KEY` ve doğrulanmış bir gönderen gerektirir — yerel adaptör asla gerçek gelen kutularına ulaşmaz), oturum açın ve etkinleştirdiğiniz bir özelliği kullanın.

Cloud Run → servisiniz → Logs istek ve hata çıktısını gösterir. Bir dağıtım ters giderse Revisions sekmesi önceki revizyona tek tıkla geri dönüş sunar.

Mobil ve masaüstü istemciler bu HTTPS arka ucunu işaret etmelidir: Expo için `apps/mobile/.env.local` içindeki `EXPO_PUBLIC_API_URL`, masaüstü kabuğu için `SUPASTACK_APP_URL`.

[Mobil hesapları oluşturun](https://supastack.dev/tr/docs/mobile/external-accounts.md)

[Tam dağıtım kontrol listesini çalıştırın](https://supastack.dev/tr/docs/web/deployment.md)


Kuruluma devam etmek için [Dağıtım kontrol listesi](https://supastack.dev/tr/docs/web/deployment.md) kılavuzunu okuyun.


## Sonraki

[Dağıtım kontrol listesi](https://supastack.dev/tr/docs/web/deployment.md)
