Terminez d'abord "Mise en place de pipelines CI/CD pour le déploiement continu" pour débloquer cette leçon.Aller à la leçon précédente

Introduction

Lorsque vous déployez une application web générée par l'IA, le code ne représente que la moitié du défi. L'autre moitié concerne tout ce avec quoi le code communique — clés API pour l'inférence, chaînes de connexion aux bases de données, identifiants de services tiers et feature flags. Une mauvaise gestion de ces éléments en production est la cause la plus fréquente de pannes réelles et d'incidents de sécurité réels.

Cette leçon couvre le flux de travail pratique pour garder les secrets en sécurité à travers trois environnements : développement local, pré-production et production. Vous apprendrez un modèle mental unique qui fonctionne que vous déployiez sur Vercel, Railway, Render, Fly.io ou un VPS brut.

Les trois environnements

Chaque application que vous construisez vit dans au moins trois endroits, et chaque endroit a des règles différentes pour les secrets.

Le développement local se déroule sur votre ordinateur portable. Vous avez besoin d'une itération rapide, donc les secrets vivent dans un fichier `.env` qui est ignoré par Git. Vous les chargez avec une bibliothèque comme `dotenv`. Ce fichier n'est jamais commit et ne quitte jamais votre machine.

La pré-production est une copie de la production avec des données fictives. Elle existe pour détecter les bogues avant que les utilisateurs ne les voient. Les secrets sont injectés par le service d'hébergement (Railway Variables, Vercel Environment Variables, etc.) et sont limités à cet environnement uniquement.

La production est ce que les vrais utilisateurs utilisent. Les secrets proviennent du même service d'hébergement mais vivent dans un namespace plus strict, souvent avec des contrôles d'accès séparés. Une clé de pré-production qui fuit est ennuyeuse ; une clé de production qui fuit est un désastre financier.

schéma des 3 environnements dev/staging/prod avec des sources de secrets différentes

Chargement des variables d'environnement dans le code

Le modèle ci-dessous fonctionne pour presque tous les backends Node.js ou Python. L'idée clé : lire une seule fois au démarrage, échouer bruyamment si un secret requis est manquant.

javascript
import dotenv from 'dotenv';
dotenv.config();
const required = ['DATABASE_URL', 'OPENAI_API_KEY', 'JWT_SECRET'];
for (const key of required) {
if (!process.env[key]) {
throw new Error(`Missing required env var: ${key}`);
}
}
export const config = {
databaseUrl: process.env.DATABASE_URL,
openaiKey: process.env.OPENAI_API_KEY,
jwtSecret: process.env.JWT_SECRET,
nodeEnv: process.env.NODE_ENV || 'development',
port: Number(process.env.PORT) || 3000,
};

Notez la vérification au démarrage. Il vaut bien mieux planter au boot que d'envoyer silencieusement `undefined` à votre client de base de données à 3h du matin. L'appel à `dotenv` ne lit un fichier que s'il existe, ce qui signifie que le même code fonctionne sans modification en production où l'hôte injecte les variables directement.

Pour Python, l'équivalent utilise `pydantic-settings` :

python
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
database_url: str
openai_api_key: str
jwt_secret: str
node_env: str = "development"
port: int = 3000
settings = Settings()

Pydantic lèvera une erreur de validation claire si un champ requis est manquant, obtenant le même comportement fail-fast.

Modèles de connexion à la base de données

Pour une base de données Postgres sur un service managé comme Neon, Supabase ou Railway, la chaîne de connexion est votre secret. Traitez-la comme un mot de passe.

javascript
import pg from 'pg';
import { config } from './config.js';
export const pool = new pg.Pool({
connectionString: config.databaseUrl,
max: 10,
idleTimeoutMillis: 30000,
ssl: config.nodeEnv === 'production' ? { rejectUnauthorized: true } : false,
});

Deux choses comptent ici. Premièrement, le pool de connexions empêche votre application d'ouvrir une nouvelle connexion TCP à chaque requête. Deuxièmement, SSL est requis en production. De nombreuses bases de données managées rejettent les connexions non chiffrées, mais être explicite vous protège si la valeur par défaut change.

Pour les plateformes serverless (Vercel Functions, Cloudflare Workers), utilisez un pooler de connexions qui vit en dehors de la fonction — Neon en a un intégré, Supabase dispose du mode transaction `pgbouncer`. L'objet pool ci-dessus vit dans la mémoire du processus, ce qui sur du serverless signifie un nouveau pool à chaque cold start, ce qui est lent et peut épuiser les connexions à la base de données lors de pics de trafic.

Gestion des clés API pour les services d'IA

Les API d'IA (OpenAI, Anthropic, Google, etc.) facturent au token. Une clé qui fuit peut vider une carte de crédit en quelques heures. Trois règles vous protègent.

Premièrement, définissez une limite de dépenses stricte dans le tableau de bord du fournisseur. Chaque fournisseur majeur propose cela. Deuxièmement, créez des clés séparées par environnement — `myapp-dev`, `myapp-staging`, `myapp-prod` — pour pouvoir en révoquer une sans toucher aux autres. Troisièmement, ne loguez jamais la clé et ne l'incluez jamais dans des messages d'erreur envoyés à un service de logging.

javascript
const openaiHeaders = {
'Authorization': `Bearer ${config.openaiKey}`,
'Content-Type': 'application/json',
};
async function callOpenAI(messages) {
const res = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: openaiHeaders,
body: JSON.stringify({ model: 'gpt-4o-mini', messages }),
});
if (!res.ok) {
const text = await res.text();
throw new Error(`OpenAI error ${res.status}: ${text}`);
}
return res.json();
}

Le gestionnaire d'erreurs capture le corps de la réponse pour le débogage, ce qui est acceptable car il ne contient pas la clé — seulement l'erreur du fournisseur en amont. Si vous avez besoin de logger les en-têtes de requête pour le débogage, masquez d'abord le champ `Authorization`.

Erreurs courantes et comment les éviter

L'erreur la plus fréquente est de commit un fichier `.env`. Même une seule fois. L'historique Git est éternel, et des bots scannent GitHub à la recherche de clés exposées en quelques minutes après un push. Ajoutez `.env` à `.gitignore` dès le premier jour, et utilisez des outils comme `git-secrets` ou `gitleaks` en CI pour bloquer les commits accidentels.

La deuxième erreur est d'utiliser la même base de données pour le développement et la production. Cela semble pratique jusqu'à ce qu'un `DROP TABLE` dans un script local efface la production. Utilisez toujours des bases de données séparées, et idéalement des projets de fournisseur séparés, pour chaque environnement.

La troisième erreur est de faire tourner les clés sans plan. Lorsque vous faites tourner un mot de passe de base de données, chaque instance en cours d'exécution de votre application échouera à se reconnecter jusqu'à ce qu'elle redémarre. Sur les plateformes qui le supportent, utilisez des chaînes de connexion qui incluent le mot de passe et concevez votre application pour réessayer au démarrage. Sur des plateformes comme Vercel, un redéploiement après la rotation du secret gère cela automatiquement.

Résumé

Traitez chaque secret comme s'il allait fuir demain — parce que finalement il fuira. Utilisez des fichiers `.env` localement avec `dotenv` ou `pydantic-settings`, laissez votre plateforme d'hébergement injecter les variables en pré-production et en production, validez les secrets requis au démarrage, poollez les connexions à la base de données avec `ssl: true` en production, et donnez à chaque clé API d'IA une limite de dépenses plus une clé unique par environnement. Cette configuration prend un après-midi à mettre en place et vous évite la catégorie la plus courante d'incidents en production.

Entraînement

Point de contrôle de la leçon

Révisez la leçon et recevez des conseils sur votre travail.

0/1
Répondu · 0/1