Sur cette page
Répondez de tête, puis ouvrez. Préparer son poste de développement
1Votre programme a besoin d'une clé d'API. Où la mettre ?
Dans une variable d'environnement, ou un fichier .env exclu de git ; jamais dans le code, ni dans une page web ou une application.
2Une clé est partie par erreur dans un dépôt. Que faire d'abord ?
La supprimer dans la console de l'éditeur, puis en créer une autre : l'effacer du fichier ne suffit pas, elle reste dans l'historique de git.
- Un hébergeur fait tourner l'application ; la clé d'API se range dans ses variables d'environnement, jamais dans le dépôt envoyé.
- Une application en ligne a une adresse publique : sans contrôle, n'importe qui peut l'appeler et dépenser votre crédit.
- Clever Cloud, Scaleway, OVHcloud et Scalingo sont des sociétés françaises, avec des régions à Paris ou en France.
- Héberger à Paris ne suffit pas : l'appel au modèle, les secrets et les journaux peuvent partir ailleurs, chacun selon ses réglages.
- Aucun des services de déploiement décrits ici n'est qualifié SecNumCloud au 15 septembre 2026, d'après le catalogue de l'ANSSI.
Prérequis
- Le poste de la page du poste de développement : uv, git, et la clé de Mistral dans un fichier .env exclu de git.
- Un compte chez l'hébergeur, créé par vous ; Clever Cloud donne des crédits à l'inscription, sans carte.
- Un code d'accès pour protéger l'application, une longue chaîne tirée au hasard, ajouté au fichier .env sous le nom
CODE_ACCES:
Terminalpython3 -c "import secrets; print(secrets.token_urlsafe(32))"
Le déploiement suit la documentation de Clever Cloud lue le 7 octobre 2026 ; il n'a pas encore été fait par Meridal, qui n'ouvre pas de compte sans l'accord du dirigeant. Les sorties ne sont donc pas montrées.
Étapes
Écrire l'application
Une application web minimale : une route/sante, que l'hébergeur interroge pour savoir si elle tourne, et une route/question, qui transmet la question à Mistral si l'appel porte le bon code d'accès dans l'en-têtex-code-acces.Terminaluv init assistant-web cd assistant-web uv add fastapi uvicorn mistralai
app.pyimport os import secrets from typing import Annotated from fastapi import FastAPI, Header, HTTPException from mistralai.client import Mistral from pydantic import BaseModel app = FastAPI() client = Mistral(api_key=os.environ["MISTRAL_API_KEY"]) class Question(BaseModel): texte: str @app.get("/sante") def sante(): return {"etat": "ok"} @app.post("/question") def question(q: Question, x_code_acces: Annotated[str, Header()]): # l'adresse est publique : sans le bon code d'accès, rien ne part chez Mistral if not secrets.compare_digest(x_code_acces, os.environ["CODE_ACCES"]): raise HTTPException(status_code=401) r = client.chat.complete(model="mistral-large-latest", messages=[{"role": "user", "content": q.texte}]) return {"reponse": r.choices[0].message.content}Installer Clever Tools et se connecter
Créer l'application, à Paris
Terminalclever create --type python --region par assistant-web
Ranger la clé, le code d'accès et la commande de démarrage
Les variables de l'hébergeur remplacent le fichier .env, qui ne part pas avec le code.La commande de démarrage s'exécute sans substitution de variables : le port s'écrit en chiffres, 8080, celui que Clever Cloud ouvre par défaut.Macclever env import < .env clever env set CC_PYTHON_UV_RUN_COMMAND "uv run uvicorn --host 0.0.0.0 --port 8080 app:app" clever env set CC_HEALTH_CHECK_PATH /sante
Windows, PowerShellGet-Content .env | clever env import clever env set CC_PYTHON_UV_RUN_COMMAND "uv run uvicorn --host 0.0.0.0 --port 8080 app:app" clever env set CC_HEALTH_CHECK_PATH /sante
Ce qu'on voit :clever envliste les variables :MISTRAL_API_KEY,CODE_ACCES, et les deux de Clever Cloud.Déployer
Terminalgit add . git commit -m "Première version" clever deploy
Ce qu'on voit :clever deployenvoie le code par git et affiche la construction :uv sync, puis le démarrage. La santé est vérifiée sur/santeavant que l'application reçoive du trafic.À vérifier :git statusne doit pas montrer.env: le fichier reste exclu de git, comme dans la préparation du poste.Appeler l'application
Remplacez ADRESSE par celle que montreTerminalclever open curl https://ADRESSE/sante curl -X POST https://ADRESSE/question -H "Content-Type: application/json" -H "x-code-acces: VOTRE_CODE" -d '{"texte": "Bonjour"}'clever openouclever applications.Ce qu'on voit :{"etat":"ok"}pour la santé ; une réponse de Mistral avec le bon code d'accès ; une erreur 401 sans lui.Lire les journaux
Terminalclever logs clever logs --since 2h
Contrôle du résultat
Problèmes fréquents
« Your application is listening on localhost instead of publicly »
CauseLe serveur écoute sur 127.0.0.1 au lieu de l'interface publique.
À faireDémarrez uvicorn avec --host 0.0.0.0, comme dans la commande de l'étape 4.
L'application part en déploiement « ancien », avec uWSGI
CauseIl manque uv.lock à la racine, ou la variable CC_PYTHON_UV_RUN_COMMAND.
À faireCommitez uv.lock, vérifiez la variable, puis clever deploy.
Une variable changée n'est pas prise en compte
CauseLes variables se lisent au démarrage.
À faireRedéployez, ou clever restart.
Le déploiement échoue au contrôle de santé
Cause/sante ne répond pas par un code 2xx.
À faireAppelez /sante en local avec uv run uvicorn app:app, et lisez clever logs.
Les appels au modèle partent hors d'Europe
CauseL'hébergeur est à Paris, mais l'appel à Mistral passe par son point d'accès mondial, qui ne s'engage pas sur le lieu du calcul.
À fairePointez la bibliothèque sur api.eu.mistral.ai, facturé 1,1 fois le tarif. L'API de Claude n'offre que « global » ou « us » ; celle d'OpenAI a une région Europe, sur accord commercial.
Retour en arrière
Variantes par outil
Sept hébergeurs pour la même application, relevés le 7 octobre 2026 ; la qualification SecNumCloud d'après le catalogue de l'ANSSI du 15 septembre 2026.
Un avantageÀ savoir
scw container deploy construit et déploie depuis les sources, en une commande, à Paris par défaut, sur le port 8080.
Un conteneur est public par défaut ; privé, il s'appelle avec un en-tête X-Auth-Token. Les secrets s'ajoutent dans l'onglet Deployment du conteneur, section Secrets ; ils ne sont pas ceux du gestionnaire de secrets de Scaleway. Les journaux sont dans Cockpit, gardés 7 jours gratuitement.
AI Deploy lance une image Docker avec ovhai app run, à Gravelines ; une application exige une authentification, sauf lancée avec --unsecure-http. Les variables se passent au lancement avec --env ; les journaux se lisent avec ovhai app logs.
az webapp up --location francecentral crée et déploie en une étape, à Paris. Les secrets vont dans les paramètres de l'application, chiffrés au repos ; Microsoft conseille d'y mettre des références à Key Vault. Le flux de journaux est dans le portail, sous Monitoring.
gcloud run deploy --source . construit et déploie ; la région se choisit au lancement, Paris étant europe-west9. Les secrets viennent de Secret Manager.
Par défaut, un secret est répliqué dans plusieurs régions du monde, et les journaux sont rangés en zone mondiale : pour rester en Europe, il faut une réplication choisie et des journaux régionalisés, réglés à la création.
Vérification
1AppliquerVotre application tourne chez un hébergeur. Où mettre la clé de l'API ?
Dans les variables d'environnement de l'hébergeur, ou son gestionnaire de secrets ; jamais dans le dépôt envoyé.
2ComprendreL'hébergeur est à Paris. Les données restent-elles en Europe ?
Pas forcément : l'appel au modèle part chez son éditeur, et certains hébergeurs gardent secrets et journaux hors de la région par défaut. Chaque maillon se vérifie.
3AppliquerPourquoi protéger l'adresse de l'application ?
Parce qu'elle est publique : sans contrôle, n'importe qui peut l'appeler et dépenser votre crédit chez l'éditeur du modèle.
Lectures suivantes
Déploiement en région européenne
Premiers pas en développement · étape 8 sur 8
Limites et sources
Le déploiement suit la documentation de Clever Cloud du 7 octobre 2026 et n'a pas encore été fait par Meridal. Les prix sont ceux affichés par les éditeurs ce jour, hors taxe quand ils le disent.
La qualification SecNumCloud se lit dans le catalogue de l'ANSSI, mis à jour au moins une fois par mois : une offre hébergée sur une infrastructure qualifiée n'est pas qualifiée elle-même.
Cette page ne remplace pas l'analyse d'un transfert de données hors de l'Union : voir l'hébergement en Europe et la CNIL.
- La synthèse des hébergeurs :
apprendre/donnees/hebergeurs.json, chaque case avec sa source. - Clever Cloud : Deploy Python with uv ; Clever Tools, Applications.
- Le relevé complet :
apprendre/recherches/2026-10-07-deploiement-europe.json(139 sources). - L'image d'ouverture : Un métier à tisser Jacquard, ses cartes perforées au-dessus du métier, G. Bruno, Le Tour de la France par deux enfants, édition de 1904 ; domaine public, Wikimedia Commons, d'après l'exemplaire de l'Université de Toronto.
Écrit par Meridal, avec l'aide de l'IA ; chaque fait vérifié à sa source et relu avant publication. Texte et schémas sous licence CC BY 4.0 : reprenez-les en citant Meridal. Le code sous licence MIT.
Outiller un métier de bout en bout
à partir de 8 250 €, sur devis