> ## 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

# Die übrigen Anbieter-Keys einsammeln

Kurze Walkthroughs für die restlichen Dienste: KI-Anbieter, Trigger.dev, S3-Storage, Sentry oder PostHog, Turnstile und Ihre Domain.

## Wie Sie diese Seite nutzen

Jeder Abschnitt unten ist ein komplettes Setup-Walkthrough: Konto erstellen, Key finden, Env-Namen setzen, prüfen. Nehmen Sie nur die Abschnitte für Dienste, die Ihr Produkt ausliefert — eine Seite ohne KI-Funktionen braucht den ersten nie, und das Kit läuft weiter, selbst wenn Sie jeden Abschnitt hier überspringen.

Dieselben Secret-Regeln wie überall: API-Keys und Webhook-Secrets bleiben serverseitig, nur Werte mit `NEXT_PUBLIC_`/`EXPO_PUBLIC_`-Prefix dürfen den Client erreichen, Produktions-Secrets liegen im Secret Store des Hosts, und der Dev-Server liest Env erst nach einem Neustart.

[Zurück zur Konten-Checkliste](https://supastack.dev/de/docs/web/external-accounts.md)


## KI-Anbieter-Keys

Das `AI_PROVIDER` des Kits akzeptiert `openai`, `anthropic`, `openai-compatible` und `openrouter` — plus `fake`, den lokalen Standard-Ersatz. Wählen Sie einen; der Anbieter-Key ist das einzige nötige Konto, denn Modell-IDs und Preise kommen aus dem Datenbank-Katalog des Kits, nicht aus Env-Variablen.

OpenAI: [platform.openai.com](https://platform.openai.com) → API keys → Create new secret key → `sk-…` kopieren → `OPENAI_API_KEY`. Anthropic: [console.anthropic.com](https://console.anthropic.com) → API Keys → Create Key → `sk-ant-…` → `ANTHROPIC_API_KEY`. Beide rechnen pro Token ab — ein paar Dollar Guthaben decken die Entwicklung.

OpenRouter leitet jedes Katalog-Modell über einen Key: [openrouter.ai](https://openrouter.ai) → Keys → Create Key → `sk-or-…` → `AI_PROVIDER=openrouter` plus `OPENROUTER_API_KEY`; die optionalen `OPENROUTER_APP_NAME`/`OPENROUTER_SITE_URL` senden Attribution-Header. `openai-compatible` deckt jeden OpenAI-förmigen Endpoint ab: `OPENAI_COMPATIBLE_API_KEY` plus `OPENAI_COMPATIBLE_BASE_URL`.

Prüfen: neu starten, eine KI-Aufgabe laufen lassen und eine echte Modellantwort statt des deterministischen Fakes erwarten. Ein Startfehler, der den Key nennt, heißt: Das Anbieter-Flag ist ohne seinen Key an. Eine echte Antwort braucht außerdem `JOB_PROVIDER=trigger` aus dem Trigger.dev-Abschnitt unten plus ein aktiviertes Modell im Katalog des Kits — [KI einrichten](https://supastack.dev/de/docs/web/setup-ai.md) behandelt dieses Setup.

```
# apps/web/.env.local — pick ONE provider
AI_PROVIDER=openai
OPENAI_API_KEY=sk-…

# or AI_PROVIDER=anthropic
# ANTHROPIC_API_KEY=sk-ant-…

# or AI_PROVIDER=openrouter
# OPENROUTER_API_KEY=sk-or-…

# or AI_PROVIDER=openai-compatible
# OPENAI_COMPATIBLE_API_KEY=…
# OPENAI_COMPATIBLE_BASE_URL=https://your-endpoint/v1
```


## Trigger.dev

Überspringen, es sei denn, das Produkt braucht echte Hintergrundjob-Läufe — `JOB_PROVIDER=local` reiht Jobs im Speicher ein, ohne sie auszuführen, was für die Entwicklung richtig ist.

1. Öffnen Sie [app.trigger.dev](https://app.trigger.dev) → Sign up → Projekt erstellen.

2. Kopieren Sie zwei Werte: den Project Ref `proj_…` aus den Projekt-Settings oder der Dashboard-URL → `TRIGGER_PROJECT_REF`, und den Secret Key von der API-Keys-Seite des Projekts (`tr_dev_…` für die Dev-Umgebung, `tr_prod_…` für Produktion) → `TRIGGER_SECRET_KEY`. Beide bleiben serverseitig.

3. Die Tasks des Kits liegen bereits in `apps/web/trigger`, und `apps/web/trigger.config.ts` liest `TRIGGER_PROJECT_REF`. Führen Sie aus `apps/web` `npx trigger.dev@latest dev` aus — es registriert die Tasks bei Ihrem Projekt und führt sie lokal gegen den Dev-Key aus.

Prüfen: Der Dev-Befehl protokolliert die registrierten Tasks; reihen Sie einen in der App ein und sehen Sie ihm in der Runs-Liste des Dashboards beim Ausführen zu. Deployete Umgebungen führen `corepack pnpm --filter @supastack/web trigger:deploy` aus, um den Task-Satz zu veröffentlichen.

```
# apps/web/.env.local
JOB_PROVIDER=trigger
TRIGGER_PROJECT_REF=proj_…
TRIGGER_SECRET_KEY=tr_dev_…   # tr_prod_… in production

# run the worker alongside the app, from apps/web:
cd apps/web
npx trigger.dev@latest dev
```


## S3-kompatibler Storage (Cloudflare R2)

Überspringen, es sei denn, das Produkt speichert Dateien — `STORAGE_PROVIDER=memory` hält Uploads für die Entwicklung im Prozess.

Jeder S3-kompatible Bucket funktioniert; Cloudflare R2 ist die Free-Tier-freundliche Wahl. 1. Öffnen Sie [dash.cloudflare.com](https://dash.cloudflare.com) → R2 Object Storage → Create bucket, benennen Sie ihn und behalten Sie den Standard-Location-Hint.

2. Öffnen Sie auf der R2-Übersicht Manage R2 API Tokens → Create API token → Berechtigung Object Read & Write, auf diesen Bucket beschränkt → Create. Kopieren Sie die Access Key ID, den Secret Access Key und den gezeigten S3-Endpoint — `https://<account-id>.r2.cloudflarestorage.com`.

3. Setzen Sie die Env-Namen unten. `STORAGE_REGION=auto` ist die R2-Konvention — das Kit nutzt standardmäßig `us-east-1`, was R2 ebenfalls akzeptiert. `STORAGE_FORCE_PATH_STYLE` ist für Custom Endpoints bereits standardmäßig an, was R2 will. Öffentliche Dateien auszuliefern braucht zusätzlich `STORAGE_PUBLIC_BASE_URL` oder CDN-Verkabelung; private Dateien brauchen nichts weiter.

Prüfen: neu starten und durch die App hochladen — das Objekt erscheint im R2-Bucket-Browser. Ein Signatur- oder 403-Fehler heißt, dem Token fehlt Object Read/Write auf diesem Bucket; erstellen Sie einen frischen, korrekt begrenzten Token.

```
# apps/web/.env.local
STORAGE_PROVIDER=s3
STORAGE_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com
STORAGE_REGION=auto
STORAGE_BUCKET=your-bucket
STORAGE_ACCESS_KEY_ID=…          # server-only
STORAGE_SECRET_ACCESS_KEY=…      # server-only
# STORAGE_PUBLIC_BASE_URL=       # optional public-URL base
```


## Sentry oder PostHog (optional)

Komplett optional: Jeder Observability-Wert ist standardmäßig leer und das Kit läuft ohne alle — fügen Sie dies hinzu, wenn Sie Fehlerberichte und Analytics in Produktion wollen.

Sentry für Fehler: [sentry.io](https://sentry.io) → Projekt erstellen → die Next.js-Plattform wählen → der Setup-Bildschirm zeigt den DSN `https://…@….ingest.sentry.io/…` → `SENTRY_DSN`. Exceptions erreichen Sentry dann mit Correlation-IDs getaggt; das Free Tier reicht zum Start.

PostHog für Produkt-Analytics stattdessen: [posthog.com](https://posthog.com) → Projekt erstellen → den Projekt-API-Key `phc_…` kopieren → `NEXT_PUBLIC_POSTHOG_KEY` plus `NEXT_PUBLIC_POSTHOG_HOST` (`https://us.i.posthog.com` oder Ihr EU-Host). Diese beiden sind by design öffentliche Browser-Werte; `SENTRY_DSN` bleibt serverseitig. `ALERT_WEBHOOK_URL` postet optional Fehler-Alarme an einen Slack-kompatiblen Endpoint.

Prüfen: neu starten, eine Test-Exception auslösen (oder Sentries Beispiel-Event nachspielen) und bestätigen, dass sie in der Issues-Liste des Projekts landet.

```
# apps/web/.env.local — all optional
SENTRY_DSN=https://…@….ingest.sentry.io/…

NEXT_PUBLIC_POSTHOG_KEY=phc_…
NEXT_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com

# ALERT_WEBHOOK_URL=https://hooks.slack.com/services/…
```


## Cloudflare Turnstile

Bot-Schutz für die öffentlichen Formulare und Credential-Endpoints — standardmäßig `CAPTCHA_PROVIDER=off`, also fügen Sie ihn hinzu, bevor Sie die Registrierung für Fremde öffnen. Kostenlos.

1. Öffnen Sie [dash.cloudflare.com](https://dash.cloudflare.com) → Turnstile → Add widget → benennen Sie es und listen Sie die Hostnamen: `localhost` für die Entwicklung plus Ihre echte Domain → Create.

2. Kopieren Sie beide Werte: den Site Key — by design öffentlich, er rendert im Widget → `NEXT_PUBLIC_TURNSTILE_SITE_KEY` — und den Secret Key, den der Server zur Prüfung nutzt → `TURNSTILE_SECRET_KEY`.

3. `CAPTCHA_PROVIDER=turnstile` schaltet es ein; der Start scheitert und nennt den fehlenden Key. Der Captcha-Guide listet exakt, welche Oberflächen das Widget schützt.

Prüfen: öffnen Sie `/auth` oder das Kontaktformular — das Widget rendert; Einsendungen ohne gelöste Challenge werden abgelehnt. Lädt das Widget nie, steht der besuchte Hostname nicht auf der Widget-Liste.

[Sehen Sie, welche Formulare Turnstile schützt](https://supastack.dev/de/docs/web/captcha.md)

```
# apps/web/.env.local
CAPTCHA_PROVIDER=turnstile
NEXT_PUBLIC_TURNSTILE_SITE_KEY=0x…   # public by design
TURNSTILE_SECRET_KEY=0x…             # server-only
```


## Eine eigene Domain

Ein Kauf bei einem beliebigen Registrar — Cloudflare Registrar, Porkbun, Namecheap funktionieren alle. Nichts davon landet in der Env; die Domain taucht in der Services ID, den Resend-DNS, den Turnstile-Hostnamen und den OAuth-Return-URLs auf, die Sie unterwegs konfiguriert haben.

Zwei Wege, sie auf die App zu zeigen: Für Cloud Run nutzen Sie das Domain Mapping im Deploy-Guide — ein paar Konsolen-Klicks plus die DNS-Records, die Google listet. Oder ziehen Sie DNS zu Cloudflare-Nameservern um (der Registrar tauscht zwei Records) — optional, aber auch der aufgeräumte Weg, R2-Public-Buckets und Turnstile-Hostnamen an einem Ort zu verwalten.

[Die Domain auf Cloud Run mappen](https://supastack.dev/de/docs/web/deploy-google-cloud.md)

[Als Nächstes die Datenbank einrichten](https://supastack.dev/de/docs/web/setup-database.md)


Wenn du die Einrichtung fortsetzen möchtest, lies [Datenbank einrichten](https://supastack.dev/de/docs/web/setup-database.md).


## Weiter

[Datenbank einrichten](https://supastack.dev/de/docs/web/setup-database.md)
