[{"data":1,"prerenderedAt":433},["ShallowReactive",2],{"\u002Fnext\u002Fadministrer\u002Fexploitation\u002Finstalled-apps-site-config":3,"section:\u002Fnext\u002Fadministrer\u002Fexploitation\u002Finstalled-apps-site-config":432},{"id":4,"title":5,"body":6,"description":420,"extension":421,"meta":422,"navigation":319,"path":428,"seo":429,"stem":430,"__hash__":431},"docs\u002F2.next\u002F5.administrer\u002F03.exploitation\u002Finstalled-apps-site-config.md","Synchronisation des applications installées dans site_config.json",{"type":7,"value":8,"toc":409},"minimark",[9,18,29,34,40,55,59,74,90,93,101,230,234,251,272,275,279,291,295,298,341,344,366,376,380,405],[10,11,13,14],"h1",{"id":12},"synchronisation-des-applications-installées-dans-site_configjson","Synchronisation des applications installées dans ",[15,16,17],"code",{},"site_config.json",[19,20,21,22,25,26,28],"p",{},"Dans la version en développement de Dodock, chaque installation ou désinstallation d'une application met automatiquement à jour la liste ",[15,23,24],{},"installed_apps"," dans le fichier ",[15,27,17],{}," du site concerné.",[30,31,33],"h2",{"id":32},"pourquoi-cette-fonctionnalité","Pourquoi cette fonctionnalité ?",[19,35,36,37,39],{},"Sans cette copie, lire la liste des applications d'un site demande une connexion à la base de données ou un processus Dodock complet. Avec elle, il suffit de lire le fichier ",[15,38,17],{},". C'est utile pour les scripts de déploiement, les sondes de supervision et les outils multi-sites.",[41,42,45],"callout",{"color":43,"icon":44},"blue","i-mdi-information-outline",[19,46,47,48,50,51,54],{},"En v5, la liste n'est pas recopiée dans ",[15,49,17],{},". Utilisez ",[15,52,53],{},"bench --site \u003Csite> list-apps",".",[30,56,58],{"id":57},"comportement","Comportement",[19,60,61,62,65,66,69,70,73],{},"Lorsque vous installez ou désinstallez une application via ",[15,63,64],{},"bench",", les fonctions internes ",[15,67,68],{},"add_to_installed_apps"," et ",[15,71,72],{},"remove_from_installed_apps"," mettent à jour :",[75,76,77,81],"ol",{},[78,79,80],"li",{},"la liste des applications installées en base de données ;",[78,82,83,84,86,87,54],{},"la clé ",[15,85,24],{}," dans ",[15,88,89],{},"sites\u002F\u003Cnom_du_site>\u002Fsite_config.json",[19,91,92],{},"Si l'écriture du fichier échoue, l'installation continue sans message. La base de données reste la référence.",[94,95,97,98,100],"h3",{"id":96},"exemple-de-site_configjson-après-synchronisation","Exemple de ",[15,99,17],{}," après synchronisation",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"db_name\": \"mon_site\",\n  \"db_password\": \"...\",\n  \"installed_apps\": [\n    \"frappe\",\n    \"erpnext\",\n    \"hrms\"\n  ]\n}\n","json","",[15,109,110,119,147,168,182,195,207,218,224],{"__ignoreMap":107},[111,112,115],"span",{"class":113,"line":114},"line",1,[111,116,118],{"class":117},"sMK4o","{\n",[111,120,122,125,129,132,135,138,142,144],{"class":113,"line":121},2,[111,123,124],{"class":117},"  \"",[111,126,128],{"class":127},"spNyl","db_name",[111,130,131],{"class":117},"\"",[111,133,134],{"class":117},":",[111,136,137],{"class":117}," \"",[111,139,141],{"class":140},"sfazB","mon_site",[111,143,131],{"class":117},[111,145,146],{"class":117},",\n",[111,148,150,152,155,157,159,161,164,166],{"class":113,"line":149},3,[111,151,124],{"class":117},[111,153,154],{"class":127},"db_password",[111,156,131],{"class":117},[111,158,134],{"class":117},[111,160,137],{"class":117},[111,162,163],{"class":140},"...",[111,165,131],{"class":117},[111,167,146],{"class":117},[111,169,171,173,175,177,179],{"class":113,"line":170},4,[111,172,124],{"class":117},[111,174,24],{"class":127},[111,176,131],{"class":117},[111,178,134],{"class":117},[111,180,181],{"class":117}," [\n",[111,183,185,188,191,193],{"class":113,"line":184},5,[111,186,187],{"class":117},"    \"",[111,189,190],{"class":140},"frappe",[111,192,131],{"class":117},[111,194,146],{"class":117},[111,196,198,200,203,205],{"class":113,"line":197},6,[111,199,187],{"class":117},[111,201,202],{"class":140},"erpnext",[111,204,131],{"class":117},[111,206,146],{"class":117},[111,208,210,212,215],{"class":113,"line":209},7,[111,211,187],{"class":117},[111,213,214],{"class":140},"hrms",[111,216,217],{"class":117},"\"\n",[111,219,221],{"class":113,"line":220},8,[111,222,223],{"class":117},"  ]\n",[111,225,227],{"class":113,"line":226},9,[111,228,229],{"class":117},"}\n",[30,231,233],{"id":232},"migration-des-sites-existants","Migration des sites existants",[19,235,236,237,240,241,244,245,247,248,250],{},"Un patch de migration (",[15,238,239],{},"sync_installed_apps_to_site_config",") est inclus. Lors de la prochaine exécution de ",[15,242,243],{},"bench migrate",", la clé ",[15,246,24],{}," est automatiquement ajoutée au ",[15,249,17],{}," de chaque site existant, en reflétant l'état actuel de la base de données.",[102,252,256],{"className":253,"code":254,"language":255,"meta":107,"style":107},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bench --site mon-site.localhost migrate\n","bash",[15,257,258],{"__ignoreMap":107},[111,259,260,263,266,269],{"class":113,"line":114},[111,261,64],{"class":262},"sBMFI",[111,264,265],{"class":140}," --site",[111,267,268],{"class":140}," mon-site.localhost",[111,270,271],{"class":140}," migrate\n",[19,273,274],{},"Aucune action manuelle n'est requise.",[30,276,278],{"id":277},"flux-de-synchronisation","Flux de synchronisation",[280,281,282,283],"mermaid",{},"\nsequenceDiagram\n    participant Admin as Administrateur\n    participant Bench as bench CLI\n    participant Installer as installer.py\n    participant DB as Base de données\n    participant Config as site_config.json\n",[102,284,289],{"className":285,"code":287,"language":288},[286],"language-text","Admin->>Bench: bench --site \u003Csite> install-app \u003Capp>\nBench->>Installer: add_to_installed_apps(app)\nInstaller->>DB: mise à jour de la liste\nInstaller->>Config: sync installed_apps list\nConfig-->>Admin: clé installed_apps mise à jour\n\nAdmin->>Bench: bench --site \u003Csite> uninstall-app \u003Capp>\nBench->>Installer: remove_from_installed_apps(app)\nInstaller->>DB: mise à jour de la liste\nInstaller->>Config: sync installed_apps list\nConfig-->>Admin: clé installed_apps mise à jour\n","text",[15,290,287],{"__ignoreMap":107},[30,292,294],{"id":293},"utilisation-depuis-un-script-externe","Utilisation depuis un script externe",[19,296,297],{},"Une fois la synchronisation active, vous pouvez lire la liste des applications sans démarrer Dodock :",[102,299,303],{"className":300,"code":301,"language":302,"meta":107,"style":107},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import json\nfrom pathlib import Path\n\nsite_config_path = Path(\"sites\u002Fmon-site.localhost\u002Fsite_config.json\")\nconfig = json.loads(site_config_path.read_text())\napps = config.get(\"installed_apps\", [])\nprint(apps)  # ['frappe', 'erpnext', 'hrms']\n","python",[15,304,305,310,315,321,326,331,336],{"__ignoreMap":107},[111,306,307],{"class":113,"line":114},[111,308,309],{},"import json\n",[111,311,312],{"class":113,"line":121},[111,313,314],{},"from pathlib import Path\n",[111,316,317],{"class":113,"line":149},[111,318,320],{"emptyLinePlaceholder":319},true,"\n",[111,322,323],{"class":113,"line":170},[111,324,325],{},"site_config_path = Path(\"sites\u002Fmon-site.localhost\u002Fsite_config.json\")\n",[111,327,328],{"class":113,"line":184},[111,329,330],{},"config = json.loads(site_config_path.read_text())\n",[111,332,333],{"class":113,"line":197},[111,334,335],{},"apps = config.get(\"installed_apps\", [])\n",[111,337,338],{"class":113,"line":209},[111,339,340],{},"print(apps)  # ['frappe', 'erpnext', 'hrms']\n",[19,342,343],{},"Ou en shell :",[102,345,347],{"className":253,"code":346,"language":255,"meta":107,"style":107},"jq '.installed_apps' sites\u002Fmon-site.localhost\u002Fsite_config.json\n",[15,348,349],{"__ignoreMap":107},[111,350,351,354,357,360,363],{"class":113,"line":114},[111,352,353],{"class":262},"jq",[111,355,356],{"class":117}," '",[111,358,359],{"class":140},".installed_apps",[111,361,362],{"class":117},"'",[111,364,365],{"class":140}," sites\u002Fmon-site.localhost\u002Fsite_config.json\n",[41,367,368],{"color":43,"icon":44},[19,369,370,371,86,373,375],{},"La clé ",[15,372,24],{},[15,374,17],{}," est gérée automatiquement par Dodock. Ne la modifiez pas à la main : la prochaine installation ou désinstallation d'application écrase la modification.",[30,377,379],{"id":378},"cas-dusage-typiques","Cas d'usage typiques",[381,382,383,390,396],"ul",{},[78,384,385,389],{},[386,387,388],"strong",{},"Scripts de déploiement"," : vérifier rapidement qu'une application est bien installée avant de lancer une migration.",[78,391,392,395],{},[386,393,394],{},"Supervision"," : sonder l'état des applications sans connexion base de données.",[78,397,398,401,402,404],{},[386,399,400],{},"Outils multi-sites"," : parcourir plusieurs ",[15,403,17],{}," pour inventorier les applications déployées sur un serveur.",[406,407,408],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":107,"searchDepth":114,"depth":121,"links":410},[411,412,416,417,418,419],{"id":32,"depth":121,"text":33},{"id":57,"depth":121,"text":58,"children":413},[414],{"id":96,"depth":149,"text":415},"Exemple de site_config.json après synchronisation",{"id":232,"depth":121,"text":233},{"id":277,"depth":121,"text":278},{"id":293,"depth":121,"text":294},{"id":378,"depth":121,"text":379},"La liste des applications installées sur un site est recopiée dans site_config.json, pour que les outils externes la lisent sans connexion à la base de données.","md",{"reviewed":319,"last_verified":423,"sources":424},"2026-11-03",[425,426,427],"frappe:frappe\u002Finstaller.py","frappe:frappe\u002Fpatches.txt","frappe:frappe\u002Fpatches\u002Fv16_0\u002Fsync_installed_apps_to_site_config.py","\u002Fnext\u002Fadministrer\u002Fexploitation\u002Finstalled-apps-site-config",{"title":5,"description":420},"2.next\u002F5.administrer\u002F03.exploitation\u002Finstalled-apps-site-config","evGF4JROivgDBcexfDNlhPqS9-BHJy_GDtlzVb7UtwU",{},1793871717113]