[{"data":1,"prerenderedAt":194},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-marimo-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-marimo-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":36,"sections":37,"ctaTitle":131,"ctaBody":132,"ctaButton":133,"ctaUrl":134,"relatedPosts":135},552,"self-host-marimo-vps",{"fr":10,"en":12,"ar":13,"es":14},"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,0,false,"2026-11-01T00:00:00+00:00","2026-11-01T14:14:31+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-marimo-vps-poster.svg",{"categorySlug":34,"appSlug":35},"developpement","marimo","Un notebook Jupyter qui a tourné toute une après-midi finit souvent par mentir : une cellule modifiée, une autre jamais relancée, et le graphique à l'écran ne correspond plus au code. marimo règle ce problème à la racine. Ce notebook Python open source (licence Apache-2.0) enregistre chaque notebook dans un simple fichier .py et recalcule automatiquement les cellules qui dépendent de celle que vous modifiez. Ce guide l'installe avec Docker Compose sur un VPS, protège l'éditeur par un mot de passe, le publie en HTTPS derrière nginx, puis montre comment transformer un notebook en petite application.",[38,42,52,84,87,103,107,110,113,116,119,122,125,128],{"type":39,"title":40,"body":41},"h2","Pourquoi un notebook réactif sur votre propre serveur","Dans Jupyter, l'ordre d'exécution dépend de vos clics : une variable redéfinie plus bas, une cellule oubliée, et les résultats affichés ne correspondent plus au code. Le fichier .ipynb, du JSON chargé de sorties, se relit mal en revue de code et produit des conflits Git à chaque exécution.\n\nmarimo analyse les dépendances entre cellules. Quand une cellule change, toutes celles qui en dépendent sont recalculées, et seulement elles. Le notebook est un fichier Python ordinaire : `git diff` le lit, `python notebook.py` l'exécute.\n\nL'héberger sur votre VPS, c'est garder les données sur un serveur que vous contrôlez, donner à toute l'équipe le même environnement depuis un navigateur et choisir la mémoire et le processeur dont vos calculs ont besoin.",{"type":43,"title":44,"items":45},"ul","Ce que marimo apporte",[46,47,48,49,50,51],"**Exécution réactive** — une cellule modifiée recalcule celles qui en dépendent, sans état caché.","**Fichiers .py** — des notebooks lisibles, versionnables dans Git et exécutables comme scripts.","**Éléments d'interface** — curseurs, menus, tableaux et graphiques reliés aux variables Python.","**Notebook vers application** — `marimo run` sert un notebook en lecture seule, code masqué.","**Migration depuis Jupyter** — `marimo convert` transforme un fichier .ipynb.","**Image « data » officielle** — pandas, polars, numpy et altair préinstallés.",{"type":53,"title":54,"headers":55,"rows":58},"comparison","marimo, Jupyter et code-server",[5,35,56,57],"JupyterLab","code-server",[59,64,69,74,79],[60,61,62,63],"Format du notebook","Fichier .py","Fichier .ipynb (JSON)","Fichiers du projet",[65,66,67,68],"Ordre d'exécution","Réactif, par dépendances","Manuel, au clic","Selon le script lancé",[70,71,72,73],"Relecture dans Git","Diff Python lisible","Diff JSON avec les sorties","Diff du code",[75,76,77,78],"Publier en application","Oui, `marimo run`","Extensions tierces","Non",[80,81,82,83],"Usage idéal","Analyse et outils internes en Python","Écosystème de noyaux varié","Développement logiciel complet",{"type":39,"title":85,"body":86},"Prérequis","Un VPS Ubuntu 24.04 avec 2 Go de RAM et 20 Go de disque (prévoyez davantage de mémoire si vous chargez de gros jeux de données), Docker et le plugin Compose installés, et un accès root en SSH. Un sous-domaine (par exemple notebooks.example.com) pointant vers le VPS est utile pour l'accès HTTPS, mais pas indispensable : un tunnel SSH suffit pour travailler seul.",{"type":88,"title":89,"steps":90},"steps","Installer marimo avec Docker Compose",[91,94,97,100],{"title":92,"body":93},"Préparer le répertoire et le mot de passe","Créez le répertoire de l'application et un fichier `.env` qui porte le mot de passe de l'éditeur.\n```bash\nmkdir -p \u002Fopt\u002Fmarimo && cd \u002Fopt\u002Fmarimo\necho \"ADMIN_PASSWORD=$(openssl rand -base64 24 | tr -d '\u002F+=')\" > .env\nchmod 600 .env\n```",{"title":95,"body":96},"Écrire le fichier compose","Créez `compose.yaml`. L'image officielle « data » contient déjà les bibliothèques d'analyse. Le port n'est publié que sur la boucle locale, et le mot de passe est transmis par un fichier plutôt que par la ligne de commande.\n```yaml\nservices:\n  marimo:\n    image: ghcr.io\u002Fmarimo-team\u002Fmarimo:0.25.2-data\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:2718:8080\"\n    environment:\n      ADMIN_PASSWORD: ${ADMIN_PASSWORD:?ADMIN_PASSWORD requis}\n    command:\n      - sh\n      - -c\n      - umask 077 && printf %s \"$$ADMIN_PASSWORD\" > \u002Ftmp\u002Fmarimo-password && exec marimo edit --headless --skip-update-check --host 0.0.0.0 -p 8080 --token-password-file \u002Ftmp\u002Fmarimo-password \u002Fapp\n    volumes:\n      - marimo-data:\u002Fapp\nvolumes:\n  marimo-data: {}\n```",{"title":98,"body":99},"Démarrer et vérifier","Lancez la pile, puis interrogez la sonde de santé : elle doit répondre 200.\n```bash\ndocker compose up -d\ndocker compose ps\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' http:\u002F\u002F127.0.0.1:2718\u002Fhealth\n```",{"title":101,"body":102},"Publier l'éditeur en HTTPS","marimo dialogue avec le navigateur par WebSocket : le vhost nginx doit transmettre les en-têtes `Upgrade` et `Connection`, sinon l'éditeur s'affiche mais les cellules ne s'exécutent jamais.\n```nginx\nserver {\n    server_name notebooks.example.com;\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:2718;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n        proxy_read_timeout 3600s;\n    }\n}\n```\n\n```bash\ncertbot --nginx -d notebooks.example.com\n```",{"type":104,"title":105,"body":106},"tip","Pas de domaine ? Passez par un tunnel SSH","L'éditeur exécute du code Python avec les droits du conteneur : ne l'exposez jamais sans mot de passe. Pour travailler seul, inutile de le publier — un tunnel SSH ouvre l'éditeur sur http:\u002F\u002Flocalhost:2718 depuis votre poste.\n```bash\nssh -L 2718:127.0.0.1:2718 root@\u003Cvps-ip>\n```",{"type":39,"title":108,"body":109},"Sécuriser l'éditeur","Un éditeur marimo ouvert donne à quiconque y entre la possibilité d'exécuter du Python sur votre serveur : c'est sa raison d'être, et c'est ce qui impose quelques règles simples.\n\n**Un mot de passe long et unique.** Celui du fichier `.env` est tiré au hasard ; ne le remplacez pas par un mot de passe que vous utilisez ailleurs, et changez-le si vous le communiquez à un collaborateur qui quitte le projet (modifiez `.env`, puis `docker compose up -d`).\n\n**Un port qui reste local.** Le compose publie le port sur `127.0.0.1` uniquement : depuis Internet, seul nginx en HTTPS y donne accès. Ne remplacez jamais cette adresse par `0.0.0.0`.\n\n**Pas de secrets en clair dans les notebooks.** Un notebook est un fichier Python versionné : une clé d'API écrite dans une cellule finit dans l'historique Git. Lisez-la plutôt dans une variable d'environnement ajoutée au compose, ou dans un fichier hors du dépôt.\n\n**Des journaux à surveiller.** Au démarrage, marimo affiche son adresse d'accès dans `docker compose logs`, mot de passe compris : ce journal reste sur votre VPS, mais ne le collez pas tel quel dans un ticket ou une discussion.",{"type":39,"title":111,"body":112},"Votre premier notebook réactif","Connectez-vous avec le mot de passe du fichier `.env`. L'éditeur ouvre le dossier `\u002Fapp`, qui contient déjà les tutoriels officiels. Créez un notebook, puis deux cellules : la première définit un curseur, la seconde filtre un fichier CSV avec sa valeur. Déplacez le curseur : la seconde cellule se recalcule seule.\n\n```python\nimport marimo as mo\nimport polars as pl\n\nseuil = mo.ui.slider(0, 1000, value=100, label=\"Montant minimum\")\nseuil\n```\n\n```python\nventes = pl.read_csv(\"data\u002Fventes.csv\")\nventes.filter(pl.col(\"montant\") >= seuil.value)\n```",{"type":39,"title":114,"body":115},"Lire vos données : CSV, Parquet et API","L'image « data » couvre l'essentiel d'une analyse sans rien installer. pandas lit les fichiers CSV, Excel et JSON ; polars lit CSV et Parquet très rapidement et sait traiter des fichiers plus gros que la mémoire en mode paresseux ; altair trace des graphiques interactifs qui s'affichent directement sous la cellule.\n\nDéposez vos fichiers dans le dossier `\u002Fapp\u002Fdata` du volume, par `scp` vers le VPS puis `docker compose cp`, ou téléversez-les depuis le panneau de fichiers de l'éditeur. Pour une API, la bibliothèque standard de Python suffit à télécharger un JSON, que pandas ou polars transforment ensuite en tableau.\n\nChaque résultat de cellule est un objet vivant : un DataFrame s'affiche en tableau triable et filtrable, et la sélection faite dans un tableau ou un graphique peut alimenter la cellule suivante. C'est ce mécanisme qui transforme une exploration en outil réutilisable.",{"type":39,"title":117,"body":118},"Transformer un notebook en application","Un notebook muni d'éléments d'interface est déjà une application. La commande `marimo run` le sert en lecture seule : les visiteurs manipulent les curseurs et les menus, sans voir ni modifier le code. Publiez ce second port derrière son propre vhost, protégé comme l'éditeur.\n\n```bash\ndocker compose exec marimo marimo run \u002Fapp\u002Frapport.py --host 0.0.0.0 -p 8081\n```\n\nVos notebooks Jupyter existants se convertissent en une commande ; relisez ensuite les cellules qui redéfinissaient une même variable, que marimo refuse par conception.\n\n```bash\ndocker compose exec marimo marimo convert \u002Fapp\u002Fancien.ipynb -o \u002Fapp\u002Fnouveau.py\n```",{"type":39,"title":120,"body":121},"Travailler à plusieurs sur les mêmes notebooks","Un serveur marimo est un éditeur partagé : toutes les personnes qui ont le mot de passe voient les mêmes fichiers. Pour une petite équipe, la règle la plus simple est un notebook par personne et par sujet, et un dépôt Git dans `\u002Fapp` pour garder l'historique.\n\nParce que chaque notebook est un fichier .py, les outils habituels du développeur s'appliquent : `git diff` montre exactement quelle cellule a changé, une demande de fusion se relit comme du code, et un linter ou un formateur Python s'exécute dessus sans adaptation. Un notebook peut même être importé comme module ou lancé en script dans une tâche planifiée, pour produire chaque nuit le même rapport.",{"type":39,"title":123,"body":124},"Dimensionner le VPS","marimo lui-même est léger ; ce sont vos données qui fixent la taille du serveur. Comptez 2 Go de RAM pour explorer des fichiers de quelques centaines de mégaoctets avec pandas, et montez à 4 ou 8 Go si vous chargez des jeux de données plus volumineux ou si plusieurs personnes travaillent en même temps. Le processeur compte surtout pour les calculs lourds : polars exploite tous les cœurs disponibles. Prévoyez enfin assez de disque pour l'image (environ 400 Mo) et pour vos fichiers de données, qui grossissent plus vite que les notebooks.",{"type":39,"title":126,"body":127},"Sauvegarde et mise à jour","Les notebooks vivent dans le volume `marimo-data`. Le plus sûr est de versionner `\u002Fapp` dans un dépôt Git ; à défaut, archivez le volume régulièrement.\n\n```bash\ndocker run --rm -v marimo_marimo-data:\u002Fdata -v \"$PWD\":\u002Fbackup alpine \\\n  tar czf \u002Fbackup\u002Fmarimo-$(date +%F).tar.gz -C \u002Fdata .\n```\n\nPour mettre à jour, changez l'étiquette de l'image dans `compose.yaml` en lisant d'abord les notes de version du projet, puis lancez `docker compose pull && docker compose up -d`. Les notebooks, simples fichiers .py, ne sont pas touchés.",{"type":39,"title":129,"body":130},"Installation en un clic depuis le Marketplace ServOrbit","Sur un VPS ServOrbit, marimo s'installe depuis le Marketplace de votre espace client : le script déploie le conteneur officiel, génère le mot de passe de l'éditeur et crée le volume des notebooks. Le mot de passe s'affiche dans votre espace client. Attachez un sous-domaine de l'un de vos domaines, ou le sous-domaine gratuit du VPS, pour ouvrir l'éditeur en HTTPS ; sans domaine, le tunnel SSH décrit plus haut fonctionne tel quel, avec le port affiché dans votre espace client.","Vos notebooks Python, sur votre VPS","Un VPS ServOrbit Ubuntu 24.04 avec 2 Go de RAM suffit pour marimo. Installation en un clic depuis le Marketplace, mot de passe généré pour vous, HTTPS sur votre domaine ou sur le sous-domaine gratuit du VPS.","Découvrir marimo","\u002Fmarketplace\u002Fdeveloppement\u002Fmarimo",[136,157,176],{"id":137,"slug":138,"slugs":139,"title":143,"excerpt":144,"readTime":145,"views":23,"isPinned":19,"publishedAt":146,"updatedAt":147,"category":148,"categories":153,"featuredImage":30,"bgImage":31,"posterImage":155,"relatedSolution":156},301,"installer-code-server-vps",{"fr":138,"en":140,"ar":141,"es":142},"install-code-server-vps","تثبيت-code-server-vps","instalar-code-server-vps","Code Server : VS Code dans votre navigateur sur VPS","Code Server (MIT, 79 k étoiles) : déployez VS Code dans le navigateur sur votre VPS, espace persistant, sans configurer aucun IDE local.",3,"2026-08-24T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":149,"name":150,"slug":34,"color":151,"icon":152},4,"Développement","bg-warning\u002F10 text-warning","dev",[154],{"id":149,"name":150,"slug":34,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Finstaller-code-server-vps-poster.svg",{"categorySlug":34,"appSlug":57},{"id":158,"slug":159,"slugs":160,"title":164,"excerpt":165,"readTime":166,"views":149,"isPinned":19,"publishedAt":167,"updatedAt":168,"category":169,"categories":170,"featuredImage":30,"bgImage":31,"posterImage":172,"relatedSolution":173},168,"self-host-metabase-vps",{"fr":159,"en":161,"ar":162,"es":163},"how-to-self-host-metabase-on-a-vps-open-source-bi-dashboards","استضافة-metabase-على-vps-لوحات-ذكاء-أعمال-مفتوحة-المصدر","alojar-metabase-en-un-vps","Héberger Metabase sur un VPS : tableaux de bord BI open source","Déployez Metabase sur votre VPS : connectez n'importe quelle base SQL et construisez tableaux de bord et graphiques dans le navigateur, avec un Postgres compagnon.",9,"2026-07-06T00:00:00+00:00","2026-10-20T23:18:08+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[171],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-metabase-vps-poster.svg",{"categorySlug":174,"appSlug":175},"bases-de-donnees","metabase",{"id":177,"slug":178,"slugs":179,"title":183,"excerpt":184,"readTime":185,"views":149,"isPinned":19,"publishedAt":186,"updatedAt":187,"category":188,"categories":189,"featuredImage":30,"bgImage":31,"posterImage":191,"relatedSolution":192},45,"deployer-fastapi-vps",{"fr":178,"en":180,"ar":181,"es":182},"deploy-a-fastapi-application-on-a-vps","نشر-تطبيق-fastapi-على-vps","desplegar-una-aplicacion-fastapi-en-un-vps","Déployer FastAPI sur un VPS : guide complet production","Déployez FastAPI sur un VPS avec Docker multi-stage, Gunicorn, PostgreSQL, CI\u002FCD GitHub Actions et monitoring. Guide Python production 2025.",10,"2026-05-06T00:00:00+00:00","2026-10-07T23:07:24+00:00",{"id":149,"name":150,"slug":34,"color":151,"icon":152},[190],{"id":149,"name":150,"slug":34,"color":151,"icon":152},"\u002Fblog\u002Fcovers\u002Fdeployer-fastapi-vps-poster.svg",{"categorySlug":34,"appSlug":193},"fastapi",1793542924698]