Zum Inhalt springen
supastack
Dokumentation durchstöbern

For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /de/docs/web/deploy-google-cloud.md (or send Accept: text/markdown).

Auf Google Cloud bereitstellen

Bauen Sie das Docker-Image des Kits auf Cloud Build, betreiben Sie es auf Cloud Run mit verwalteten Secrets und legen Sie es auf Ihre Domain.

Schritt-für-Schritt für Einsteiger

Voraussetzungen: Die App läuft lokal, eine echte Datenbank ist aus dem Internet erreichbar (Datenbank einrichten) und die Anbieter-Konten für Ihre Funktionen existieren. Sie brauchen ein Google-Konto; die Billing-Einrichtung fragt eine Karte ab, auch wenn leichte Nutzung im Free Tier bleibt.

Kurze Begriffe: Ein Container-Image ist eine paketierte Kopie Ihrer App, die jeder Host laufen lassen kann. Artifact Registry ist Googles Speicher für Images. Cloud Build baut das Image auf Googles Maschinen — kein lokales Docker nötig. Cloud Run führt das Image als HTTPS-Dienst aus und skaliert ihn. Secret Manager hält Passwörter und Keys. Eine Revision ist eine deployte Version des Dienstes.

Was Sie bauen: ein Google-Cloud-Projekt, ein Artifact-Registry-Repository mit Ihrem Image, einen Cloud-Run-Dienst, der die App über HTTPS ausliefert, Secrets im Secret Manager und ein verwaltetes Postgres. Das Dockerfile im Repo-Root erzeugt bereits einen standalone Next.js-Server auf Port 8080 — genau das, was Cloud Run erwartet.

Ehrlicher Kostenhinweis: Das Free Tier von Cloud Run deckt leichten Traffic, aber Cloud SQL — Googles verwaltetes Postgres — hat keins. Eine Supabase- oder Neon-Free-Tier-Datenbank ist der günstigste Start; diese Anleitung nutzt diesen Weg. Erwägen Sie einen Budget-Alert unter Billing → Budgets & alerts, bevor Sie experimentieren.

Konto anlegen und CLI installieren

1. Öffnen Sie console.cloud.google.com, melden Sie sich mit Ihrem Google-Konto an und akzeptieren Sie die Bedingungen.

2. Verknüpfen Sie die Abrechnung, wenn Sie dazu aufgefordert werden: Billing → Link a billing account → Create billing account. Zur Aktivierung des Kontos ist eine Karte nötig; das Testguthaben deckt die ersten Experimente.

3. Klicken Sie auf das Projekt-Dropdown → New Project, vergeben Sie einen Namen und Create — oder nutzen Sie das Projekt wieder, das Sie für die Google-Anmeldung angelegt haben; ein Projekt reicht.

4. Installieren Sie die Google Cloud CLI von cloud.google.com/sdk: Laden Sie das Installationsprogramm für Ihr Betriebssystem herunter, führen Sie es aus und öffnen Sie dann ein neues Terminal, damit der gcloud-Befehl verfügbar ist.

5. Führen Sie die beiden Befehle unten aus. Der erste öffnet einen Browser, um die CLI zu autorisieren; der zweite wählt Ihr Projekt — nutzen Sie die Projekt-ID aus dem Console-Dashboard, sie ist nicht immer identisch mit dem Namen.

Erwartet: gcloud config list zeigt Ihr Konto und Projekt. Wird gcloud nicht erkannt, öffnen Sie das Terminal neu oder schließen Sie zuerst die Installation ab.

gcloud auth login
gcloud config set project YOUR_PROJECT_ID

Die Produktionsdatenbank erstellen

Einsteigerweg — verwaltetes Postgres außerhalb von Google. Bei supabase.com: New project → Namen, Datenbankpasswort und Region wählen → auf das Provisioning warten → Project Settings → Database. Supabase bietet zwei Verbindungsstrings: den Session-Pooler / die Direct Connection auf Port 5432 und den Transaction-Pooler auf Port 6543 — der 5432-String ist für Migrationen und langlebige Clients, der 6543-String für die serverlose App. Bei neon.tech: New project → den angezeigten Verbindungsstring kopieren. Beides funktioniert; lassen Sie den Passwortteil intakt.

Setzen Sie den Direct-/Session-String in DATABASE_URL in der .env im Root — das Migrationstool liest die Root-Datei und braucht eine Session-Verbindung — und in apps/web/.env.local für den lokalen Dev-Server. Führen Sie dann den Migrate-Befehl einmal aus dem Repository-Root aus, um die Tabellen des Kits in der neuen Datenbank zu erstellen. Das DATABASE_URL-Secret, das die deployte App nutzt, darf stattdessen der gepoolte 6543-String sein.

Die Google-native Alternative ist Cloud SQL, ein verwaltetes Postgres im selben Projekt. Es hat kein Free Tier, und Private-IP-Verbindungen brauchen einen VPC-Connector — behandeln Sie es als späteres Upgrade, nicht als Startpunkt.

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

Dienste aktivieren und das Image pushen

Führen Sie die Befehle unten aus dem Repository-Root aus. Sie aktivieren die vier Google-Dienste für dieses Deployment, erstellen ein Docker-Repository in Artifact Registry und reichen das Repository bei Cloud Build ein — das das Dockerfile im Root remote baut, sodass Docker Desktop nicht nötig ist.

Ersetzen Sie YOUR_PROJECT_ID und wählen Sie eine Region — unten us-central1 — und nutzen Sie sie für Repository und Dienst gleichermaßen. Erwartet: Das Build-Log streamt einige Minuten und endet mit DONE / STATUS: SUCCESS. Das Image erscheint danach in der Konsole unter Artifact Registry → supastack → web.

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

Secrets im Secret Manager ablegen

Secrets gehören nie in --set-env-vars oder ins Image — beides liegt im Klartext und ist für jeden sichtbar, der die Dienstkonfiguration lesen kann. Secret Manager hält sie verschlüsselt und injiziert sie zur Laufzeit.

1. Öffnen Sie in der Konsole Security → Secret Manager → Create Secret.

2. Erstellen Sie DATABASE_URL mit dem vollständigen Postgres-Verbindungsstring — der gepoolte serverlose String reicht für die App — AUTH_SECRET mit mindestens 32 Zufallszeichen (openssl rand -hex 32 erzeugt eines) und CREDENTIAL_ENCRYPTION_KEY mit einem Base64-kodierten 32-Byte-Key (openssl rand -base64 32); er verschlüsselt die Anbieter-Keys, die Workspaces in der App speichern.

3. Erstellen Sie ein Secret pro aktiviertem Anbieter — etwa STRIPE_SECRET_KEY plus STRIPE_WEBHOOK_SECRET, RESEND_API_KEY, GOOGLE_CLIENT_SECRET, GITHUB_CLIENT_SECRET. Nicht-geheime Einstellungen wie EMAIL_PROVIDER=resend bleiben einfache Umgebungsvariablen, keine Secrets.

Wenn ein Dienst zum ersten Mal ein Secret referenziert, braucht sein Laufzeit-Service-Account die Lesefreigabe — beim Anhängen von Secrets über den Dienst-Editor der Konsole bietet Google die Freigabe automatisch an; auf der CLI nennt der Deploy-Fehler die zu vergebende Secret-Manager-Rolle.

# 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

Den Cloud-Run-Dienst deployen

Konsolenweg: Cloud Run → Create service → Deploy one revision from an existing container image → das gepushte …/supastack/web:latest-Image auswählen → dieselbe Region wählen → unter Authentication Allow unauthenticated invocations wählen (es ist eine öffentliche App) → Create.

Das CLI-Äquivalent unten ergänzt die Umgebungsverkabelung im selben Schritt. Klartext-Konfiguration kommt in --set-env-vars; Secrets werden über ihren Secret-Manager-Namen in --set-secrets referenziert. Fügen Sie Ihre Anbieter-Flags (EMAIL_PROVIDER, BILLING_PROVIDER, AI_PROVIDER, JOB_PROVIDER) als einfache Env-Vars neben APP_URL hinzu.

APP_ENV=production ist Pflicht — ohne ihn bootet die App im local-Modus: Die Validierung der Produktionskonfiguration wird übersprungen, sichere Cookie-Präfixe bleiben aus, und die Dev-only-Seite /mail-preview bleibt öffentlich erreichbar (sie leakt den lokalen E-Mail-Postausgang bei EMAIL_PROVIDER=local). Produktion verlangt dann vier weitere Werte beim Boot: EXPO_PUBLIC_API_URL ist die öffentliche https-URL, über die die Mobile-App die API erreicht — setzen Sie sie auf die Dienst-URL (für ein reines Web-Deployment identisch mit APP_URL); EXPO_PUBLIC_APP_SCHEME ist das Deep-Link-Scheme der Mobile-App — ein beliebiger gültiger Wert wie supastack reicht, wenn Sie keine Mobile-App ausliefern; MOBILE_ALLOWED_ORIGINS ist die kommagetrennte Liste exakter https-Origins, denen der Server vertraut — Ihre App-URL ist der richtige Anfang, Wildcards werden abgelehnt; CREDENTIAL_ENCRYPTION_KEY verschlüsselt gespeicherte Anbieter-Zugangsdaten und bleibt im Secret Manager.

Cloud Run vergibt beim ersten Deploy eine https://….run.app-URL, und APP_URL der App muss ihrer echten öffentlichen URL entsprechen, damit Auth-Callbacks und Links funktionieren. Deployen Sie also einmal mit dem Platzhalter, kopieren Sie die *.run.app-URL von der Dienstseite und aktualisieren Sie dann den Dienst (Konsole: Edit & deploy new revision, oder den Befehl erneut ausführen) mit APP_URL — und den passenden EXPO_PUBLIC_API_URL-/MOBILE_ALLOWED_ORIGINS-Werten — darauf. Der Container-Port bleibt 8080 — der Cloud-Run-Default passt schon zum PORT des Dockerfile.

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"

Eigene Domain verbinden (optional)

Überspringen Sie das beim Testen — die *.run.app-URL liefert schon HTTPS. Wenn Sie bereit sind: Cloud Run → Ihr Dienst → Custom Domains / Domain Mappings → Add mapping → Dienst wählen und Ihre Domain eintragen.

Verifizieren Sie die Domain-Inhaberschaft, falls Sie dazu aufgefordert werden (Google führt Sie durch), und erstellen Sie dann die DNS-Einträge, die der Mapping-Bildschirm bei Ihrem Registrar auflistet. Das verwaltete HTTPS-Zertifikat wird automatisch ausgestellt, sobald die Einträge propagieren — meist Minuten, bis zu einem Tag.

Sobald die Domain Traffic ausliefert, aktualisieren Sie APP_URL auf https://yourdomain.com und registrieren Sie die passenden OAuth-Redirect-URIs (https://yourdomain.com/api/auth/callback/…) — die Sign-in-Guides zeigen, wo.

Das Deployment prüfen

Öffnen Sie https://YOUR_SERVICE_URL/api/health — erwartet wird ok. Testen Sie dann die App Ende zu Ende: URL öffnen, registrieren, einen E-Mail-Code anfordern, bestätigen, dass er im Posteingang ankommt (dazu braucht es EMAIL_PROVIDER=resend, RESEND_API_KEY und einen verifizierten Absender — der lokale Adapter erreicht echte Posteingänge nie), anmelden und eine aktivierte Funktion nutzen.

Cloud Run → Ihr Dienst → Logs zeigt Request- und Fehlerausgaben. Der Revisions-Tab bietet Rollback per Klick auf die vorherige Revision, wenn ein Deploy schiefgeht.

Mobile- und Desktop-Clients müssen auf dieses HTTPS-Backend zeigen: EXPO_PUBLIC_API_URL in apps/mobile/.env.local für Expo, SUPASTACK_APP_URL für die Desktop-Shell.

Häufige Fragen

14 Fragen

Was ist supastack?

supastack ist eine modulare Basis zum Bauen von KI-gestützten SaaS-Produkten. Sie bündelt die gemeinsame Infrastruktur, damit du dich auf die Funktionen konzentrieren kannst, die dein Produkt ausmachen.

Unterstützt es Web und Mobil?

Ja. supastack enthält Next.js- und Expo-Apps als Ausgangspunkt für Web- und Mobile-Erlebnisse.

Welche Authentifizierung ist enthalten?

Better Auth deckt E-Mail/Passwort, OTP und Social Login ab. Persönliche Workspaces werden mit dem Konto provisioniert, damit Datensätze vom ersten Tag an begrenzt sind.

Wie wird KI unterstützt?

supastack enthält konfigurierbare Multi-Anbieter-KI, Nutzungsverfolgung, Budgets und verschlüsselte Bring-your-own-key-Unterstützung.

Wie werden Abonnements gehandhabt?

Für Produkte, die auf dem Kit aufbauen, bilden Stripe-Abrechnung, Abonnements und Berechtigungen die Basis für bezahlten Zugang. Anbieter-Geheimnisse bleiben serverseitig.

Wo liegt mein produktspezifischer Code?

Produktspezifische Funktionen bleiben in einem separaten Codebase, während das Produkt die Basismodule von supastack konfiguriert und integriert.

Wie funktioniert die Preisgestaltung von supastack?

Das Kit ist ein Einmalkauf mit lebenslangen Updates: Ein Framework für 249 $ (befristeter Einführungspreis — 100 $ Rabatt auf den regulären Preis von 349 $) oder Alle Frameworks (Next.js, iOS, Android) für 499 $ (befristeter Einführungspreis — 100 $ Rabatt auf den regulären Preis von 599 $), plus 75 $ pro zusätzlichem Entwickler-Sitz. Kein Kit-Abo. Checkout auf dieser Website liefert deinen Lizenzschlüssel per E-Mail, mit Repo-Zugang per GitHub-Einladung.

Wie begrenzen Workspaces meine Daten?

Nutzerdatensätze sind über workspaceId begrenzt. Identität, Berechtigungen, KI-Nutzung, Abrechnungsereignisse und Audit-Einträge bleiben innerhalb der persönlichen Workspace-Grenze.

Wie funktionieren Hintergrundjobs?

Trigger.dev ist die explizite Job-Laufzeit. Der JobRunner-Vertrag verspricht nur enqueue, status und cancel — Workflow-Semantik bleibt Trigger.dev-spezifisch und explizit.

Wie unterscheidet sich E-Mail von Outreach?

Transaktions-E-Mail deckt Produktabläufe wie Task-Abschluss-Hinweise ab. Cold Outreach und Kampagnen gehören zum Produkt selbst, außerhalb des E-Mail-Moduls dieses Kits.

Wie funktionieren mobile Käufe?

Mobile bietet native Käufe und Wiederherstellung über RevenueCat; dein Server prüft den Zugriff. Konfiguriere die Store-Konten und schließe Gerätetests vor der Veröffentlichung ab. Web-Abrechnung bleibt separat.

Wo liegen die KI-Anbieter-Schlüssel?

BYOK-Zugangsdaten sind verschlüsselt und bleiben serverseitig. Schlüssel werden in Logs bereinigt; Nutzung und Budgets bleiben auf Workspace-Ebene sichtbar.

Welche Zahlungsmethoden akzeptiert der Checkout?

Der von Stripe gehostete Checkout akzeptiert Karten und kann — sobald die Wallets im Stripe-Konto aktiviert sind — auch Alipay und WeChat Pay anbieten, praktisch für Käufer in China. Wallet-Autorisierungen werden asynchron bestätigt, sodass sich die Lizenzseite aktualisiert, sobald die Zahlung eingegangen ist.

Kann ich eine Rückerstattung erhalten?

Sobald du Zugriff auf das Repository hast, gehört supastack für immer dir und kann daher nicht zurückerstattet werden. Aber keine Sorge: Du erhältst den vollständigen Quellcode mit lebenslangen Updates, um unbegrenzt viele Produkte für dich oder deine Kunden zu erstellen und zu veröffentlichen. Du darfst den Code lediglich nicht weiterverkaufen oder das Repository als Starter-Kit oder Vorlage weitergeben.

DE
Design