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

# Récupérer les clés de fournisseur restantes

Courts parcours pour les services restants : fournisseurs d'IA, Trigger.dev, stockage S3, Sentry ou PostHog, Turnstile et votre domaine.

## Comment utiliser cette page

Chaque section ci-dessous est un parcours de configuration complet : créer le compte, trouver la clé, renseigner les noms d'env, vérifier. Ne prenez que les sections des services que votre produit livre — un site sans fonctions d'IA n'aura jamais besoin de la première, et le kit continue de tourner même si vous sautez toutes les sections d'ici.

Les mêmes règles de secrets que partout : les clés d'API et les secrets de webhook restent côté serveur, seules les valeurs préfixées `NEXT_PUBLIC_`/`EXPO_PUBLIC_` peuvent atteindre le client, les secrets de production vivent dans le coffre de secrets de l'hébergeur, et le serveur de dev ne relit l'env qu'au redémarrage.

[Retour à la liste des comptes](https://supastack.dev/fr/docs/web/external-accounts.md)


## Clés de fournisseurs d'IA

L'`AI_PROVIDER` du kit accepte `openai`, `anthropic`, `openai-compatible` et `openrouter` — plus `fake`, le remplaçant local par défaut. Choisissez-en un ; la clé du fournisseur est le seul compte nécessaire, car les ids de modèles et les prix viennent du catalogue en base de données du kit, pas de variables env.

OpenAI : [platform.openai.com](https://platform.openai.com) → API keys → Create new secret key → copiez `sk-…` → `OPENAI_API_KEY`. Anthropic : [console.anthropic.com](https://console.anthropic.com) → API Keys → Create Key → `sk-ant-…` → `ANTHROPIC_API_KEY`. Les deux facturent au token — quelques dollars de crédit couvrent le développement.

OpenRouter achemine chaque modèle du catalogue via une seule clé : [openrouter.ai](https://openrouter.ai) → Keys → Create Key → `sk-or-…` → `AI_PROVIDER=openrouter` plus `OPENROUTER_API_KEY` ; les optionnels `OPENROUTER_APP_NAME`/`OPENROUTER_SITE_URL` envoient des en-têtes d'attribution. `openai-compatible` couvre tout endpoint de forme OpenAI : `OPENAI_COMPATIBLE_API_KEY` plus `OPENAI_COMPATIBLE_BASE_URL`.

Vérifiez : redémarrez, lancez une tâche d'IA et attendez une vraie réponse de modèle au lieu du fake déterministe. Une erreur de démarrage qui nomme la clé signifie que le flag du fournisseur est actif sans sa clé. Une vraie réponse a aussi besoin de `JOB_PROVIDER=trigger` de la section Trigger.dev ci-dessous plus un modèle activé dans le catalogue du kit — [Configurer l'IA](https://supastack.dev/fr/docs/web/setup-ai.md) couvre ce montage.

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

À sauter sauf si le produit a besoin de vraies exécutions de jobs en arrière-plan — `JOB_PROVIDER=local` met les jobs en file en mémoire sans les exécuter, ce qui convient au développement.

1. Ouvrez [app.trigger.dev](https://app.trigger.dev) → Sign up → créez un projet.

2. Copiez deux valeurs : le project ref `proj_…` depuis les paramètres du projet ou l'URL du tableau de bord → `TRIGGER_PROJECT_REF`, et la secret key de la page API keys du projet (`tr_dev_…` pour l'environnement dev, `tr_prod_…` pour la production) → `TRIGGER_SECRET_KEY`. Les deux restent côté serveur.

3. Les tâches du kit vivent déjà dans `apps/web/trigger` et `apps/web/trigger.config.ts` lit `TRIGGER_PROJECT_REF`. Depuis `apps/web`, lancez `npx trigger.dev@latest dev` — il enregistre les tâches auprès de votre projet et les exécute en local avec la clé dev.

Vérifiez : la commande dev consigne les tâches enregistrées ; mettez-en une en file dans l'app et regardez-la s'exécuter dans la liste Runs du tableau de bord. Les environnements déployés lancent `corepack pnpm --filter @supastack/web trigger:deploy` pour publier l'ensemble des tâches.

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


## Stockage compatible S3 (Cloudflare R2)

À sauter sauf si le produit stocke des fichiers — `STORAGE_PROVIDER=memory` garde les uploads dans le processus pour le développement.

Tout bucket compatible S3 convient ; Cloudflare R2 est le choix le plus favorable au niveau gratuit. 1. Ouvrez [dash.cloudflare.com](https://dash.cloudflare.com) → R2 Object Storage → Create bucket, nommez-le et gardez l'indication d'emplacement par défaut.

2. De retour sur la vue d'ensemble R2, ouvrez Manage R2 API Tokens → Create API token → permission Object Read & Write, limitée à ce bucket → Create. Copiez l'Access Key ID, la Secret Access Key et l'endpoint S3 affiché — `https://<account-id>.r2.cloudflarestorage.com`.

3. Renseignez les noms d'env ci-dessous. `STORAGE_REGION=auto` est la convention de R2 — le kit met `us-east-1` par défaut, que R2 accepte aussi. `STORAGE_FORCE_PATH_STYLE` est déjà activé par défaut pour les endpoints personnalisés, ce que veut R2. Servir des fichiers publics exige en plus `STORAGE_PUBLIC_BASE_URL` ou un câblage CDN ; les fichiers privés n'ont besoin de rien d'autre.

Vérifiez : redémarrez et uploadez via l'app — l'objet apparaît dans le navigateur du bucket R2. Une erreur de signature ou un 403 signifie qu'il manque au token la lecture/écriture d'objets sur ce bucket ; créez un token frais avec la bonne portée.

```
# 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 ou PostHog (optionnel)

Entièrement optionnel : chaque valeur d'observabilité est vide par défaut et le kit tourne très bien sans — ajoutez ceci quand vous voulez des rapports d'erreurs et de l'analytique en production.

Sentry pour les erreurs : [sentry.io](https://sentry.io) → créez un projet → choisissez la plateforme Next.js → l'écran de configuration affiche le DSN `https://…@….ingest.sentry.io/…` → `SENTRY_DSN`. Les exceptions arrivent alors dans Sentry étiquetées avec des ids de corrélation ; le niveau gratuit suffit pour démarrer.

PostHog pour l'analytique produit à la place : [posthog.com](https://posthog.com) → créez un projet → copiez la clé d'API du projet `phc_…` → `NEXT_PUBLIC_POSTHOG_KEY` plus `NEXT_PUBLIC_POSTHOG_HOST` (`https://us.i.posthog.com`, ou votre hôte UE). Ces deux-là sont des valeurs publiques de navigateur par conception ; `SENTRY_DSN` reste côté serveur. `ALERT_WEBHOOK_URL` poste en option des alertes d'échec vers un endpoint compatible Slack.

Vérifiez : redémarrez, levez une exception de test (ou rejouez l'événement d'exemple de Sentry) et confirmez qu'elle atterrit dans la liste Issues du projet.

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

Protection anti-bots pour les formulaires publics et les endpoints d'identifiants — `CAPTCHA_PROVIDER=off` par défaut, donc ajoutez-le avant d'ouvrir l'inscription à des inconnus. Gratuit.

1. Ouvrez [dash.cloudflare.com](https://dash.cloudflare.com) → Turnstile → Add widget → nommez-le et listez les hostnames : `localhost` pour le développement plus votre vrai domaine → Create.

2. Copiez les deux valeurs : la Site Key — publique par conception, elle se rend dans le widget → `NEXT_PUBLIC_TURNSTILE_SITE_KEY` — et la Secret Key, que le serveur utilise pour vérifier → `TURNSTILE_SECRET_KEY`.

3. `CAPTCHA_PROVIDER=turnstile` l'active ; le démarrage échoue en nommant la clé qui manque. Le guide captcha liste exactement les surfaces que le widget protège.

Vérifiez : ouvrez `/auth` ou le formulaire de contact — le widget se rend ; les soumissions sans défi résolu sont rejetées. Si le widget ne se charge jamais, le hostname que vous visitez n'est pas dans la liste du widget.

[Voir quels formulaires Turnstile protège](https://supastack.dev/fr/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
```


## Un domaine à vous

Un achat chez n'importe quel registrar — Cloudflare Registrar, Porkbun, Namecheap conviennent tous. Rien de tout cela ne se copie dans l'env ; le domaine apparaît dans le Services ID, le DNS de Resend, les hostnames de Turnstile et les return URL d'OAuth que vous avez configurées en chemin.

Deux façons de le pointer vers l'app : pour Cloud Run, utilisez le mapping de domaine du guide de déploiement — quelques clics de console plus les enregistrements DNS que Google liste. Ou déplacez le DNS vers les nameservers de Cloudflare (le registrar échange deux enregistrements) — optionnel, mais c'est aussi la façon propre de gérer les buckets publics R2 et les hostnames Turnstile au même endroit.

[Mapper le domaine sur Cloud Run](https://supastack.dev/fr/docs/web/deploy-google-cloud.md)

[Configurer ensuite la base de données](https://supastack.dev/fr/docs/web/setup-database.md)


Pour poursuivre la configuration, consultez [Configurer la base de données](https://supastack.dev/fr/docs/web/setup-database.md).


## Suivant

[Configurer la base de données](https://supastack.dev/fr/docs/web/setup-database.md)
