[{"data":1,"prerenderedAt":185},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-mlflow-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-mlflow-vps-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":119,"ctaBody":120,"ctaButton":121,"ctaUrl":122,"relatedPosts":123},567,"self-host-mlflow-vps",{"fr":10,"en":12,"ar":13,"es":14},"self-host-mlflow-vps-experiment-tracking","استضافة-mlflow-على-vps-تتبع-تجارب-تعلم-الآلة","autoalojar-mlflow-vps-seguimiento-experimentos","MLflow sur VPS : suivi d'expériences ML et registre de modèles","Installez MLflow sur un VPS : suivi des expériences de machine learning, registre de modèles et traçage LLM, protégés par mot de passe et servis en HTTPS.",6,0,false,"2026-11-05T00:00:00+00:00","2026-11-06T16:13:06+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},1,"Intelligence Artificielle","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-mlflow-vps-poster.svg",{"categorySlug":27,"appSlug":34},"mlflow","Un projet de machine learning produit vite des dizaines d'essais : un taux d'apprentissage changé ici, un jeu de données nettoyé là, et une métrique notée dans un coin de notebook. Trois semaines plus tard, personne ne sait plus quel modèle était le plus précis, ni avec quel code. MLflow est la plateforme open source (licence Apache-2.0) qui range tout cela sur un serveur central : paramètres, métriques et fichiers de chaque exécution, modèles versionnés, et traces des applications LLM. Ce guide l'installe sur un VPS avec Docker Compose, le protège par mot de passe, y branche votre code Python, puis règle les comptes, la sauvegarde et les mises à jour.",[37,41,51,78,81,97,101,104,107,110,113,116],{"type":38,"title":39,"body":40},"h2","Pourquoi un serveur MLflow","Lancé en local, MLflow écrit ses résultats dans un dossier `mlruns` sur votre poste : personne d'autre ne les voit, et ils disparaissent avec la machine. Un serveur de suivi change la donne. Chaque notebook, chaque script d'entraînement et chaque membre de l'équipe envoie ses exécutions au même endroit, et l'interface les compare côte à côte.\n\nLe même serveur porte le registre de modèles — la liste des modèles validés, versionnés, avec un alias pour celui qui est en production — et, pour l'IA générative, les traces de vos appels aux modèles de langage.",{"type":42,"title":43,"items":44},"ul","Ce que MLflow apporte",[45,46,47,48,49,50],"**Suivi d'expériences** — paramètres, métriques et artefacts de chaque exécution, filtrés et comparés dans l'interface.","**Registre de modèles** — versions, alias et historique, pour savoir exactement ce qui tourne en production.","**Traçage LLM** — entrées, sorties, latence et étapes de chaque requête de vos applications d'IA générative.","**Artefacts servis par le serveur** — fichiers, graphiques et modèles envoyés en HTTPS, sans stockage S3 à configurer.","**Journalisation automatique** — `autolog()` pour scikit-learn, PyTorch, Transformers, XGBoost, OpenAI ou LangChain.","**Comptes et permissions** — un compte par personne, des droits donnés expérience par expérience.",{"type":52,"title":53,"headers":54,"rows":57},"comparison","MLflow face au suivi à la main",[5,55,56],"Serveur MLflow","Notebooks et tableur",[58,62,66,70,74],[59,60,61],"Historique des essais","Chaque exécution enregistrée automatiquement","Ce qu'on a pensé à noter",[63,64,65],"Comparer deux modèles","Un écran, métriques côte à côte","Recopier des chiffres",[67,68,69],"Fichiers produits","Rangés avec l'exécution qui les a créés","Dispersés sur les postes",[71,72,73],"Modèle en production","Une version et un alias dans le registre","Un fichier nommé « final_v3 »",[75,76,77],"Travail en équipe","Un serveur partagé, des comptes","Des envois de fichiers",{"type":38,"title":79,"body":80},"Prérequis","Un VPS Ubuntu 24.04 avec **2 Go de RAM** suffit pour démarrer ; prévoyez 4 Go et davantage de disque si vous stockez beaucoup de modèles, car ce sont les artefacts qui occupent la place. Il vous faut Docker avec le plugin Compose, et un **nom de domaine** pointant vers le VPS, avec nginx et un certificat HTTPS : vos scripts et votre équipe s'y connecteront.",{"type":82,"title":83,"steps":84},"steps","Installer MLflow avec Docker Compose",[85,88,91,94],{"title":86,"body":87},"Préparer le répertoire et les secrets","Créez le répertoire de l'application et un fichier `.env` qui porte le mot de passe du compte `admin`, la clé de session et votre domaine.\n```bash\nmkdir -p \u002Fopt\u002Fmlflow && cd \u002Fopt\u002Fmlflow\ncat > .env \u003C\u003CEOF\nADMIN_PASSWORD=$(openssl rand -hex 16)\nSECRET_KEY=$(openssl rand -hex 24)\nDOMAIN=mlflow.example.ma\nEOF\nchmod 600 .env\n```",{"title":89,"body":90},"Écrire le docker-compose.yml","L'image `-full` est la variante officielle qui embarque le module d'authentification. Au démarrage, la commande écrit le fichier `basic_auth.ini` qui déclare le compte `admin` ; `--allowed-hosts` n'accepte que votre domaine et la boucle locale. Le port n'est publié que sur la boucle locale : seul nginx y accède. `MLFLOW_SERVER_ENABLE_JOB_EXECUTION=false` coupe l'exécuteur de tâches de fond, gourmand en mémoire et inutile au suivi.\n```yaml\nservices:\n  mlflow:\n    image: ghcr.io\u002Fmlflow\u002Fmlflow:v3.18.0-full\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:5000:5000\"\n    environment:\n      ADMIN_PASSWORD: ${ADMIN_PASSWORD}\n      DOMAIN: ${DOMAIN}\n      MLFLOW_FLASK_SERVER_SECRET_KEY: ${SECRET_KEY}\n      MLFLOW_AUTH_CONFIG_PATH: \u002Fmlflow\u002Fbasic_auth.ini\n      MLFLOW_SERVER_ENABLE_JOB_EXECUTION: \"false\"\n    entrypoint: [\"\u002Fbin\u002Fsh\", \"-c\"]\n    command:\n      - >-\n        mkdir -p \u002Fmlflow\u002Fartifacts &&\n        printf '[mlflow]\\ndefault_permission = NO_PERMISSIONS\\ndatabase_uri = sqlite:\u002F\u002F\u002F\u002Fmlflow\u002Fbasic_auth.db\\nadmin_username = admin\\nadmin_password = %s\\nauthorization_function = mlflow.server.auth:authenticate_request_basic_auth\\n' \"$$ADMIN_PASSWORD\" > \u002Fmlflow\u002Fbasic_auth.ini &&\n        exec mlflow server --app-name basic-auth --host 0.0.0.0 --port 5000 --workers 2\n        --backend-store-uri sqlite:\u002F\u002F\u002F\u002Fmlflow\u002Fmlflow.db --artifacts-destination \u002Fmlflow\u002Fartifacts\n        --allowed-hosts \"$$DOMAIN,localhost:*,127.0.0.1:*\"\n    volumes:\n      - mlflow-data:\u002Fmlflow\n\nvolumes:\n  mlflow-data: {}\n```",{"title":92,"body":93},"Démarrer et vérifier","Le démarrage prend une quinzaine de secondes. `\u002Fhealth` répond sans authentification ; l'API, elle, renvoie 401 sans identifiants.\n```bash\ndocker compose up -d\ncurl -fsS http:\u002F\u002F127.0.0.1:5000\u002Fhealth\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' http:\u002F\u002F127.0.0.1:5000\u002Fapi\u002F2.0\u002Fmlflow\u002Fexperiments\u002Fsearch\n```",{"title":95,"body":96},"Publier en HTTPS avec nginx","Dans le vhost de votre domaine (certificat obtenu par certbot), proxifiez vers le port local en transmettant l'en-tête `Host`. Relevez `client_max_body_size` : un modèle envoyé comme artefact dépasse vite la limite par défaut.\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:5000;\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    client_max_body_size 512m;\n}\n```",{"type":98,"title":99,"body":100},"tip","Sans --app-name basic-auth, le serveur est ouvert","Par défaut, `mlflow server` n'a aucune authentification : quiconque atteint l'adresse peut lire vos expériences, télécharger vos modèles et tout supprimer. Gardez `--app-name basic-auth`, ne publiez jamais le port 5000 sur l'IP publique, et laissez `--allowed-hosts` à votre seul domaine : c'est la protection de MLflow contre le DNS rebinding.",{"type":38,"title":102,"body":103},"Envoyer vos expériences depuis Python","Installez le client (`pip install mlflow`) sur le poste ou le serveur d'entraînement, puis pointez-le vers votre serveur. Les identifiants se passent par variables d'environnement :\n```python\nimport os\nimport mlflow\n\nos.environ[\"MLFLOW_TRACKING_USERNAME\"] = \"admin\"\nos.environ[\"MLFLOW_TRACKING_PASSWORD\"] = \"VOTRE_MOT_DE_PASSE\"\nmlflow.set_tracking_uri(\"https:\u002F\u002Fmlflow.example.ma\")\nmlflow.set_experiment(\"churn-model\")\n\nwith mlflow.start_run():\n    mlflow.log_param(\"learning_rate\", 0.01)\n    mlflow.log_metric(\"accuracy\", 0.93)\n    mlflow.log_artifact(\"confusion_matrix.png\")\n```\nL'exécution apparaît aussitôt dans l'interface, avec ses paramètres, ses métriques et le fichier envoyé. `mlflow.sklearn.autolog()` ou `mlflow.pytorch.autolog()` enregistrent tout cela sans une ligne de plus.",{"type":38,"title":105,"body":106},"Tracer une application LLM","Pour un assistant ou un agent, le traçage enregistre chaque requête avec ses appels au modèle, ses étapes et leur durée. Activez la journalisation automatique de votre bibliothèque, ou décorez vos propres fonctions :\n```python\nimport mlflow\n\nmlflow.set_experiment(\"support-assistant\")\nmlflow.openai.autolog()   # chaque appel au client OpenAI devient une trace\n\n@mlflow.trace\ndef answer(question: str) -> str:\n    ...\n```\nLes traces s'affichent dans l'onglet de l'expérience : vous voyez quel appel a été lent, quel contexte a été envoyé et ce que le modèle a répondu.",{"type":38,"title":108,"body":109},"Le registre de modèles","Quand un essai est validé, enregistrez son modèle dans le registre : il reçoit un numéro de version, et vous pouvez lui donner un alias comme `production`.\n```python\nmlflow.register_model(f\"runs:\u002F{run_id}\u002Fmodel\", \"churn-model\")\n```\nVotre service d'inférence charge alors `models:\u002Fchurn-model@production` : changer de modèle revient à déplacer l'alias, sans toucher au code.",{"type":38,"title":111,"body":112},"Comptes et permissions","Le compte `admin` crée les autres comptes par l'API :\n```bash\ncurl -u admin:VOTRE_MOT_DE_PASSE -X POST https:\u002F\u002Fmlflow.example.ma\u002Fapi\u002F2.0\u002Fmlflow\u002Fusers\u002Fcreate \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\"username\": \"sara\", \"password\": \"UN_MOT_DE_PASSE_LONG\"}'\n```\nUn nouveau compte ne voit **aucune** expérience tant qu'on ne lui en a pas partagé : les droits (lecture, édition, gestion) se donnent expérience par expérience et modèle par modèle. Changez le mot de passe `admin` par l'API `users\u002Fupdate-password` (en fournissant l'ancien dans `current_password`) ; le nouveau est conservé aux redémarrages.",{"type":38,"title":114,"body":115},"Sauvegarde et mise à jour","Tout l'état de MLflow tient dans le volume `mlflow-data` : la base des expériences, celle des comptes et le dossier des artefacts. Sauvegardez-le conteneur arrêté, puis copiez l'archive hors du VPS :\n```bash\ncd \u002Fopt\u002Fmlflow\ndocker compose stop\ndocker run --rm -v mlflow_mlflow-data:\u002Fdata -v \"$PWD\":\u002Fbackup alpine \\\n  tar czf \u002Fbackup\u002Fmlflow-$(date +%F).tar.gz -C \u002Fdata .\ndocker compose start\n```\nPour mettre à jour, lisez d'abord les notes de version — une mise à jour peut migrer le schéma de la base —, changez le tag de l'image dans `docker-compose.yml`, puis :\n```bash\ncd \u002Fopt\u002Fmlflow\ndocker compose pull && docker compose up -d\ndocker compose logs --tail 20\n```",{"type":38,"title":117,"body":118},"Installation en 1 clic avec ServOrbit","Les Applications en 1 clic de ServOrbit installent MLflow sur votre VPS sans ligne de commande : il déploie le conteneur officiel, génère le mot de passe du compte `admin` et la clé de session, active l'authentification sur l'interface et l'API, limite les noms d'hôte acceptés à votre adresse et publie le serveur en HTTPS sur un sous-domaine de votre domaine ou sur le sous-domaine gratuit du VPS (mlflow.{dns_slug}.servorbit-dns.com). Le mot de passe s'affiche dans votre espace client ; il ne reste qu'à brancher vos notebooks.","Vos expériences ML sur votre propre serveur","Un VPS ServOrbit Ubuntu 24.04 avec 2 Go de RAM suffit pour démarrer MLflow. Installation en 1 clic depuis votre espace client, HTTPS sur votre domaine ou sur le sous-domaine gratuit du VPS, mot de passe généré pour vous.","Installer MLflow","\u002Fapplications\u002Fia\u002Fmlflow",[124,143,167],{"id":125,"slug":126,"slugs":127,"title":131,"excerpt":132,"readTime":133,"views":134,"isPinned":19,"publishedAt":135,"updatedAt":136,"category":137,"categories":138,"featuredImage":30,"bgImage":31,"posterImage":140,"relatedSolution":141},177,"self-host-langfuse-vps",{"fr":126,"en":128,"ar":129,"es":130},"self-host-langfuse-on-a-vps-llm-observability-no-saas-bill","استضافة-langfuse-على-vps-مراقبة-llm-بلا-فاتورة-saas","alojar-langfuse-en-un-vps","Héberger Langfuse sur un VPS : observabilité LLM sans SaaS","Auto-hébergez Langfuse sur un VPS : traçage, évaluation de prompts et suivi des coûts LLM. Guide complet : installation, nginx, TLS, SDK Python\u002FJS, dépannage.",11,2,"2026-07-12T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[139],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-langfuse-vps-poster.svg",{"categorySlug":27,"appSlug":142},"langfuse",{"id":144,"slug":145,"slugs":146,"title":150,"excerpt":151,"readTime":152,"views":18,"isPinned":19,"publishedAt":153,"updatedAt":154,"category":155,"categories":161,"featuredImage":30,"bgImage":31,"posterImage":163,"relatedSolution":164},552,"self-host-marimo-vps",{"fr":145,"en":147,"ar":148,"es":149},"self-host-marimo-vps-python-notebooks","استضافة-marimo-على-vps-دفاتر-python","autoalojar-marimo-vps-notebooks-python","marimo sur VPS : des notebooks Python réactifs en self-hosted","Installez marimo sur un VPS : notebooks Python réactifs enregistrés en fichiers .py, éditeur web protégé par mot de passe, pandas et polars inclus.",8,"2026-11-01T00:00:00+00:00","2026-11-04T16:30:29+00:00",{"id":156,"name":157,"slug":158,"color":159,"icon":160},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[162],{"id":156,"name":157,"slug":158,"color":159,"icon":160},"\u002Fblog\u002Fcovers\u002Fself-host-marimo-vps-poster.svg",{"categorySlug":165,"appSlug":166},"developpement","marimo",{"id":133,"slug":168,"slugs":169,"title":173,"excerpt":174,"readTime":175,"views":176,"isPinned":19,"publishedAt":177,"updatedAt":178,"category":179,"categories":180,"featuredImage":30,"bgImage":31,"posterImage":182,"relatedSolution":183},"heberger-ollama-vps",{"fr":168,"en":170,"ar":171,"es":172},"how-to-host-ollama-on-a-vps","كيفية-استضافة-ollama-على-خادم-vps","como-alojar-ollama-en-un-vps","Héberger Ollama sur un VPS : guide opérationnel avancé","Configuration avancée d'Ollama sur VPS : gestion des modèles, reverse proxy nginx, sécurité API, quantisation Q4_K_M\u002FQ8, CVE-2026-45672 Open WebUI et couplage sécurisé.",9,3,"2026-06-09T00:00:00+00:00","2026-11-04T16:30:24+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[181],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-ollama-vps-poster.svg",{"categorySlug":27,"appSlug":184},"ollama",1793982140040]