Aller au contenu

FaireNiveau 3, Construire18 minutes

Déploiement en région européenne

Mettre une petite application d'IA en service chez un hébergeur européen, avec sa clé d'API gardée hors du code, une adresse protégée et des journaux lisibles ; puis les mêmes gestes chez les autres hébergeurs, et ce que chacun garde hors d'Europe.

Écrit le 7 octobre 2026 · Vérifié le 7 octobre 2026

Vous saurez

  • Déployer une application Python chez un hébergeur français, en une commande
  • Ranger la clé et le code d'accès dans les variables de l'hébergeur
  • Lire les journaux, et savoir combien de temps ils restent
  • Repérer ce qui sort d'Europe : l'appel au modèle, les secrets, les journaux

Dans le parcours

Premiers pas en développement

Étape 7 sur 8

Aussi dans : Développement d'applications d'IA

Sur cette page
  1. Rappel
  2. L'essentiel
  3. Prérequis
  4. Étapes
  5. Contrôle du résultat
  6. Problèmes fréquents
  7. Retour en arrière
  8. Variantes par outil
  9. Vérification
  10. Lectures suivantes
Rappel de la page précédente

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.

L'essentiel
  1. 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é.
  2. Une application en ligne a une adresse publique : sans contrôle, n'importe qui peut l'appeler et dépenser votre crédit.
  3. Clever Cloud, Scaleway, OVHcloud et Scalingo sont des sociétés françaises, avec des régions à Paris ou en France.
  4. Héberger à Paris ne suffit pas : l'appel au modèle, les secrets et les journaux peuvent partir ailleurs, chacun selon ses réglages.
  5. 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.
1

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 :
Terminal
python3 -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.

2

Étapes

  1. É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ête x-code-acces.
    Terminal
    uv init assistant-web
    cd assistant-web
    uv add fastapi uvicorn mistralai
    app.py
    import 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}
    Ce qu'on voit : uv.lock à la racine du projet, à côté de app.py : sa présence déclenche le déploiement natif par uv.
  2. Installer Clever Tools et se connecter

    Mac
    brew install CleverCloud/homebrew-tap/clever-tools
    clever login
    Windows, PowerShell
    winget install CleverTools
    clever login
    Autre voie : npm install -g clever-tools, avec Node.js 24 ou plus récent.
    Ce qu'on voit : clever login ouvre le navigateur ; une fois connecté, Clever Tools garde ses identifiants de connexion dans votre dossier personnel.
  3. Créer l'application, à Paris

    Terminal
    clever create --type python --region par assistant-web
    Ce qu'on voit : l'application liée au dossier ; par, les centres de données de Clever Cloud à Paris, est la région par défaut.
  4. 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.
    Mac
    clever 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, PowerShell
    Get-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
    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.
    Ce qu'on voit : clever env liste les variables : MISTRAL_API_KEY, CODE_ACCES, et les deux de Clever Cloud.
    À vérifier : Clever Cloud n'a pas de gestionnaire de secrets dédié dans les pages lues : les variables d'environnement en tiennent lieu. Anthropic conseille, dans le nuage, un stockage chiffré des secrets plutôt qu'un fichier .env.
  5. Déployer

    Terminal
    git add .
    git commit -m "Première version"
    clever deploy
    Ce qu'on voit : clever deploy envoie le code par git et affiche la construction : uv sync, puis le démarrage. La santé est vérifiée sur /sante avant que l'application reçoive du trafic.
    À vérifier : git status ne doit pas montrer .env : le fichier reste exclu de git, comme dans la préparation du poste.
  6. Appeler l'application

    Terminal
    clever 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"}'
    Remplacez ADRESSE par celle que montre clever open ou clever 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.
  7. Lire les journaux

    Terminal
    clever logs
    clever logs --since 2h
    Ce qu'on voit : les lignes de démarrage d'uvicorn, puis une ligne par appel. Clever Cloud garde les journaux 7 jours par défaut.
    À vérifier : n'écrivez jamais la clé ni le code d'accès dans un journal. La CNIL conseille, pour les journaux de sécurité, une conservation de six mois à un an : à prévoir hors de l'hébergeur si vous en avez besoin.
3

Contrôle du résultat

Le trajet d'une question : le visiteur appelle l'application avec le code d'accès ; l'application tourne à Paris ; l'appel au modèle, les secrets et les journaux peuvent partir ailleurs, chacun selon son réglage.
Ce qu'il faut contrôler au-delà de l'hébergeur : où part l'appel au modèle, où sont gardés les secrets, où sont rangés les journaux. Le détail par hébergeur est dans « Variantes par outil », la correction dans « Problèmes fréquents ».
4

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.

5

Retour en arrière

  • Revenir à une version précédente : clever restart --commit suivi de l'identifiant de la version, lu dans git log.
  • Arrêter tout : clever delete --yes supprime l'application ; changez aussi le code d'accès, et la clé dans la console de Mistral.
6

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

Variantes par outil
Outil et offreSiègeRégion en FrancePour démarrerSecNumCloudÀ savoir
Clever Cloudapplication Python, déployée par gitUn avantage : Nantes, FranceUn avantage : Paris par défaut (zone par)Instance pico : 0,00625 € de l'heure ; crédits offerts à l'inscription, sans carteÀ savoir : Non qualifié ; l'éditeur dit s'y engagerÀ savoir : Pas de gestionnaire de secrets dédié trouvé : les variables d'environnement en tiennent lieu
Scalewayconteneurs sans serveurUn avantage : Paris, FranceUn avantage : Paris (fr-par) par défautGratuit sous 200 000 vCPU-secondes et 400 000 Go-secondes par mois ; puis 0,00001 € la vCPU-seconde, hors taxeÀ savoir : En cours de qualificationÀ savoir : Un conteneur est public par défaut ; ses secrets ne sont pas ceux du gestionnaire de secrets
OVHcloudAI Deploy, à partir d'une image DockerUn avantage : Roubaix, FranceUn avantage : Gravelines (GRA)0,033 € de l'heure hors taxe pour 1 vCPU, facturé à la minuteÀ savoir : Qualifiés : des offres d'infrastructure (IaaS), pas AI DeployÀ savoir : Web PaaS, l'ancienne offre de déploiement simple, est fermé depuis le 31 janvier 2025
Scalingoapplication Python, déployée par gitUn avantage : Strasbourg, FranceUn avantage : Paris, sur Outscale ; une région SecNumCloud sur demandeConteneur S : 7,20 € hors taxe pour 30 joursÀ savoir : La plateforme n'est pas qualifiée ; l'infrastructure Outscale l'est, jusqu'au 30 novembre 2026Garde les journaux un an
Microsoft AzureApp ServiceÀ savoir : Redmond, États-UnisUn avantage : Paris (francecentral)Plan F1 gratuit ; B1 Linux : 0,0158 € de l'heureÀ savoir : Non qualifié ; « Cloud de Confiance Bleu », de Bleu SAS, en cours de qualificationÀ savoir : Devant le Sénat, en juin 2025, Microsoft France n'a pas pu garantir que des données ne seraient jamais transmises aux autorités américaines
Google CloudCloud RunÀ savoir : Mountain View, États-UnisUn avantage : Paris (europe-west9)Gratuit sous 180 000 vCPU-secondes et 2 millions de requêtes par mois ; prix publiés en dollarsÀ savoir : Non qualifié ; « S3NS », offre de Thales, qualifiée jusqu'au 17 décembre 2028À savoir : Par défaut, les secrets sont répliqués dans le monde et les journaux rangés en zone mondiale
AWSECS Express ModeÀ savoir : Seattle, États-Unis ; contrat EMEA au LuxembourgUn avantage : Paris (eu-west-3)Fargate : 0,0486 $ par vCPU-heure, plus le répartiteur de chargeÀ savoir : Non qualifiéÀ savoir : App Runner, le service simple, est fermé aux nouveaux clients depuis le 30 avril 2026

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.

7

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.

8

Lectures suivantes

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.

  1. La synthèse des hébergeurs : apprendre/donnees/hebergeurs.json, chaque case avec sa source.
  2. Clever Cloud : Deploy Python with uv ; Clever Tools, Applications.
  3. Le relevé complet : apprendre/recherches/2026-10-07-deploiement-europe.json (139 sources).
  4. 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.

Service correspondant

Outiller un métier de bout en bout

à partir de 8 250 €, sur devis

Voir le service

Un premier échange de 30 minutes

En visio et sans frais : vous décrivez votre situation, nous vous indiquons ce qui est réalisable, avec quels outils et pour quel ordre de prix. Vous pouvez aussi nous écrire ; chaque message reçoit une réponse écrite.