[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"megamenu":22,"$fP0FV7zZkQhZStJelKMQF2vnI2nbZQB210etjzdyGslw":92,"$fgUi7S4FaSi5Tp8Ra6ftqK6CzMGCJ3hQIy6dSvV5jd_o":160,"header-db":174,"footer-db":187,"$fhE6c23mDpCzBsKeKoTc-FBSzKnSZXziw1iLZy2QRkiM":204,"$fFTgW65smu7VN4pSgOBpumvyLa5R4H--Pd83SgmUXVTQ":262,"$ftCgiCQ1Qyz6eieo83he29D_FsSw74NeCmklcXAHGAsA":263},{"theme":4},{"colors":5,"typography":13,"ui":17,"defaultColorMode":21},{"primary":6,"secondary":7,"background":8,"foreground":9,"muted":10,"headerBg":11,"footerBg":12,"topBarBg":9,"topBarText":11},"#4F46E5","#0D9488","#F9FAFB","#111827","#6B7280","#ffffff","#020617",{"fontFamily":14,"fontUrl":15,"baseFontSize":16},"Inter, system-ui, sans-serif","https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,700;0,800;0,900;1,400;1,700&display=swap","16px",{"borderRadius":18,"contentWidth":19,"shadow":20},"lg","7xl",true,"light",{"items":23},[24,35,43,51,59,68,76,84],{"id":25,"type":26,"label":27,"href":29,"icon":30,"description":30,"badge":30,"groupTitle":30,"style":30,"gridColumns":30,"cssClass":30,"psCategoryId":30,"showPsChildren":31,"position":32,"children":33,"psChildren":34},41,"link",{"fr":28},"Expertise","\u002Fexpertise",null,false,0,[],[],{"id":36,"type":26,"label":37,"href":39,"icon":30,"description":30,"badge":30,"groupTitle":30,"style":30,"gridColumns":30,"cssClass":30,"psCategoryId":30,"showPsChildren":31,"position":40,"children":41,"psChildren":42},42,{"fr":38},"Blog","\u002Fblog",1,[],[],{"id":44,"type":26,"label":45,"href":47,"icon":30,"description":30,"badge":30,"groupTitle":30,"style":30,"gridColumns":30,"cssClass":30,"psCategoryId":30,"showPsChildren":31,"position":48,"children":49,"psChildren":50},43,{"fr":46},"Modules PrestaShop","\u002Fmodules",2,[],[],{"id":52,"type":26,"label":53,"href":55,"icon":30,"description":30,"badge":30,"groupTitle":30,"style":30,"gridColumns":30,"cssClass":30,"psCategoryId":30,"showPsChildren":31,"position":56,"children":57,"psChildren":58},44,{"fr":54},"Outils IA","\u002Foutils-ia",3,[],[],{"id":60,"type":26,"label":61,"href":63,"icon":30,"description":30,"badge":30,"groupTitle":30,"style":64,"gridColumns":30,"cssClass":30,"psCategoryId":30,"showPsChildren":31,"position":65,"children":66,"psChildren":67},45,{"fr":62},"Offre Starter ✨","\u002Foffre-starter",{"highlight":20},4,[],[],{"id":69,"type":26,"label":70,"href":72,"icon":30,"description":30,"badge":30,"groupTitle":30,"style":30,"gridColumns":30,"cssClass":30,"psCategoryId":30,"showPsChildren":31,"position":73,"children":74,"psChildren":75},46,{"fr":71},"Academy","\u002Facademy",5,[],[],{"id":77,"type":26,"label":78,"href":80,"icon":30,"description":30,"badge":30,"groupTitle":30,"style":30,"gridColumns":30,"cssClass":30,"psCategoryId":30,"showPsChildren":31,"position":81,"children":82,"psChildren":83},47,{"fr":79},"À propos","\u002Fa-propos",6,[],[],{"id":85,"type":26,"label":86,"href":88,"icon":30,"description":30,"badge":30,"groupTitle":30,"style":30,"gridColumns":30,"cssClass":30,"psCategoryId":30,"showPsChildren":31,"position":89,"children":90,"psChildren":91},48,{"fr":87},"Contact","\u002Fcontact",7,[],[],{"columns":93},[94,106,136,152],{"title":95,"links":96},"Plateforme",[97,99,102,103],{"label":98,"href":63,"external":31},"Offre Starter (2 500 €)",{"label":100,"href":101,"external":31},"Devenir Ambassadeur","\u002Fambassadeur",{"label":46,"href":47,"external":31},{"label":104,"href":105,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":107,"links":108},"Le Synedre",[109,112,115,118,121,124,127,130,133],{"label":110,"href":111,"external":31},"L'histoire","\u002Fsynedre",{"label":113,"href":114,"external":31},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":116,"href":117,"external":31},"L'équipe","\u002Fequipe",{"label":119,"href":120,"external":31},"Le réacteur en direct","\u002Freacteur",{"label":122,"href":123,"external":31},"Le Drill (entraînement)","\u002Fdrill",{"label":125,"href":126,"external":31},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":128,"href":129,"external":31},"Les agents IA","\u002Fagents-ia",{"label":131,"href":132,"external":31},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":134,"href":135,"external":31},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":137,"links":138},"Ressources",[139,140,141,144,146,149],{"label":38,"href":39,"external":31},{"label":71,"href":72,"external":31},{"label":142,"href":143,"external":31},"Dictionnaire","\u002Fdictionnaire",{"label":145,"href":29,"external":31},"Expertise PrestaShop",{"label":147,"href":148,"external":31},"Flywheel","\u002Fflywheel",{"label":150,"href":151,"external":31},"Manifeste","\u002Fmanifeste",{"title":79,"links":153},[154,156,159],{"label":155,"href":80,"external":31},"Alexandre Carette",{"label":157,"href":158,"external":31},"Dossier de presse","\u002Fpresse",{"label":87,"href":88,"external":31},{"academy":161,"blog":162,"expertise":173},[],[163,167,170],{"title":164,"url":165,"type":166},"Coulisses : propulser un Hub Pro avec PrestaShop Headless et Nuxt","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fhub-pro-headless-nuxt-docker","blog",{"title":168,"url":169,"type":166},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back",{"title":171,"url":172,"type":166},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",[],{"header":175},{"logo":176,"topBar":181,"contactEmail":184,"features":185,"navBar":30},{"src":177,"alt":178,"text":155,"href":179,"class":180},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":30,"messageMobile":30,"showLanguages":31,"align":182,"languages":183},"left",[],"contact@alexandrecarette.fr",{"showSearch":31,"showWishlist":31,"showLogin":20,"showContact":31,"showCart":31,"showBlogLink":31,"showContactLink":31,"showGiftcardLink":31,"showStoresLink":31,"stickyHeader":20,"headerLayout":186},"inline",{"footer":188},{"theme":189,"description":30,"hours":30,"logo":190,"contact":191,"social":192,"bottomBar":202,"newsletter":203},"dark",{"src":177,"href":179,"alt":155},{"email":30,"phone":30,"address":30,"cta":30},[193,196,199],{"platform":194,"href":195,"label":194},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":197,"href":198,"label":197},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":200,"href":201,"label":200},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":30},{"show":31,"title":30,"description":30,"placeholder":30,"ctaLabel":30,"consentText":30},{"id":205,"title":206,"category":207,"subcategory":208,"slug":209,"coverImage":210,"thumbnailImage":211,"content":212,"faq":213,"metaDescription":259,"active":20,"datePublished":260,"dateUpdated":260,"readingTime":261,"mentor":30,"audioEnabled":31,"audioUrl":260,"author":30},17,"Docker PrestaShop Headless : architecture multi-conteneurs en prod","prestashop","architecture","architecture--docker-headless-multi-conteneurs","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-docker-prestashop-headless-1773990002.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-docker-prestashop-headless-1773990002.webp","\u003Cp class=\"lead\">Monter un \u003Cstrong>Docker PrestaShop headless\u003C\u002Fstrong> qui fonctionne sur votre machine locale, c'est l'affaire d'une heure. Le faire tenir en production sans crash à froid, sans fuite de secrets et sans race condition au redémarrage, c'est une autre histoire. Après 193 projets PrestaShop livrés, j'ai constaté que la majorité des architectures Docker que j'audite tombent dans les mêmes pièges — des pièges qui ne se révèlent qu'en conditions réelles, jamais dans un tutoriel Hello World.\u003C\u002Fp>\n\u003Cp>Si vous cherchez d'abord à comprendre \u003Cem>pourquoi\u003C\u002Fem> découpler PrestaShop d'un frontend Nuxt et \u003Cem>ce que\u003C\u002Fem> cette stack apporte en termes de performance et de flexibilité, je vous recommande de lire d'abord \u003Ca href=\"\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fhub-pro-headless-nuxt-docker\">les coulisses de mon Hub Pro headless\u003C\u002Fa>. L'article que vous lisez maintenant plonge dans le \u003Cem>comment\u003C\u002Fem> technique DevOps : la conception du \u003Ccode>docker-compose.yml\u003C\u002Fcode>, le câblage réseau, la persistance des données et les healthchecks qui font la différence entre un POC fragile et un setup de production fiable. Voici le plan : diagnostic des erreurs classiques, \u003Ca href=\"\u002Fblog\u002Fprestashop\u002Farchitecture\u002F\" title=\"Articles architecture\">architecture\u003C\u002Fa> détaillée des 5 services, isolation réseau et volumes, puis les solutions concrètes pour fiabiliser l'ensemble.\u003C\u002Fp>\n\n\u003Ch2>Les problématiques courantes d'une architecture Docker PrestaShop naïve\u003C\u002Fh2>\n\u003Cp class=\"article-nav-context\" style=\"font-size:0.9em;color:#64748b;margin:0.5em 0 1.5em;\">Cet article fait partie de notre dossier \u003Ca href=\"\u002Fblog\u002Fprestashop\u002F\" title=\"Tous nos articles PrestaShop Headless\">PrestaShop Headless\u003C\u002Fa>.\u003C\u002Fp>\n\n\n\u003Ctable class=\"article-table\">\n\u003Cthead>\n\u003Ctr>\u003Cth>Problématique\u003C\u002Fth>\u003Cth>Cause principale\u003C\u002Fth>\u003Cth>Impact métier\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Crash au démarrage à froid (erreur 500 générique)\u003C\u002Ftd>\u003Ctd>PrestaShop tente de se connecter à MariaDB avant que la base ne soit initialisée — aucun \u003Ccode>healthcheck\u003C\u002Fcode> ni \u003Ccode>depends_on\u003C\u002Fcode> conditionnel\u003C\u002Ftd>\u003Ctd>Downtime à chaque redémarrage VPS ou déploiement, perte de commandes en cours\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Base de données ou Redis accessibles depuis l'extérieur\u003C\u002Ftd>\u003Ctd>Services exposés sur \u003Ccode>0.0.0.0\u003C\u002Fcode> par défaut, ports publiés sans restriction\u003C\u002Ftd>\u003Ctd>Surface d'attaque élargie, risque d'exfiltration de données clients (RGPD)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Volumes mal montés : perte de modules custom au rebuild\u003C\u002Ftd>\u003Ctd>Confusion entre bind mounts et volumes anonymes, chemins erronés dans le \u003Ccode>docker-compose.yml\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Régression fonctionnelle en production, heures de debug pour retrouver les fichiers\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Secrets commités dans le dépôt Git\u003C\u002Ftd>\u003Ctd>Fichier \u003Ccode>.env\u003C\u002Fcode> non exclu du versioning, mots de passe en clair dans le YAML ou dans les layers de l'image\u003C\u002Ftd>\u003Ctd>Compromission des accès BDD et back-office — 38 % des vecteurs d'attaque cloud sont liés à des secrets mal gérés selon le \u003Ca href=\"https:\u002F\u002Fsysdig.com\u002Fcontent\u002Fc\u002Fpf-2024-cloud-native-security-report\" target=\"_blank\" rel=\"noreferrer noopener\">Sysdig 2024 Cloud-Native Security Report\u003C\u002Fa>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Assets Nuxt servis par Node au lieu de Nginx\u003C\u002Ftd>\u003Ctd>Absence de reverse proxy dédié aux fichiers statiques\u003C\u002Ftd>\u003Ctd>TTFB dégradé, consommation mémoire Node inutile, scores Core Web Vitals en chute\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Ch2>Anatomie du docker-compose.yml : les 5 services clés\u003C\u002Fh2>\n\n\u003Cp>Selon le \u003Ca href=\"https:\u002F\u002Fsurvey.stackoverflow.co\u002F2024\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Stack Overflow Developer Survey 2024\u003C\u002Fa>, 87 % des développeurs utilisent Docker en environnement de développement. Pourtant, la transition vers une \u003Cstrong>architecture multi-conteneurs\u003C\u002Fstrong> de production exige une rigueur que le mode dev ne demande pas. Voici la structure que j'utilise sur mon propre Hub Pro et que je déploie chez mes clients.\u003C\u002Fp>\n\n\u003Cp>Les cinq services et leur rôle précis dans la chaîne :\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>MariaDB\u003C\u002Fstrong> — le moteur de persistance. Volume nommé \u003Ccode>mariadb_data\u003C\u002Fcode> pour garantir la survie des données entre les rebuilds. Aucun port publié vers l'hôte : il n'écoute que sur le réseau interne Docker.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Redis\u003C\u002Fstrong> — cache objet et cache de sessions PrestaShop. Même logique d'isolation réseau. Il accélère les requêtes API consommées par le frontend Nuxt et réduit la charge sur MariaDB.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>PrestaShop (PHP-FPM)\u003C\u002Fstrong> — le back-office et l'API webservices. Il expose son socket PHP-FPM à Nginx via un réseau partagé, mais n'est jamais directement accessible depuis l'extérieur. Les modules custom sont montés en bind mount depuis le répertoire hôte.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Nuxt (Node SSR)\u003C\u002Fstrong> — le frontend headless. Il consomme l'API PrestaShop pour le rendu côté serveur (SSR), ce qui permet de réduire le TTFB de 40 à 60 % par rapport à un thème PrestaShop classique, d'après mes mesures terrain sur le Hub Pro — un chiffre cohérent avec les \u003Ca href=\"https:\u002F\u002Fweb.dev\u002Fvitals\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">benchmarks Core Web Vitals de web.dev\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Nginx\u003C\u002Fstrong> — le seul point d'entrée exposé (ports 80\u002F443). Il sert de reverse proxy vers PHP-FPM et Node, et distribue directement les assets statiques générés par Nuxt (\u003Ccode>.output\u002Fpublic\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Fol>\n\n\u003Ch2>Networking Docker : isoler pour sécuriser\u003C\u002Fh2>\n\n\u003Cp>C'est le point que je vois le plus souvent bâclé. Par défaut, Docker Compose crée un réseau bridge unique où tous les services se voient. En production, c'est une faille : si le conteneur Nginx est compromis, l'attaquant a un accès direct à MariaDB. La \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fnetwork\u002Fdrivers\u002Fbridge\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">documentation officielle Docker sur les réseaux bridge\u003C\u002Fa> recommande explicitement de segmenter les services.\u003C\u002Fp>\n\n\u003Cp>La bonne pratique est de définir deux réseaux dans votre \u003Ccode>docker-compose.yml\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>frontend_net\u003C\u002Fstrong> — réseau partagé entre Nginx, PrestaShop (PHP-FPM) et Nuxt. C'est le seul réseau connecté à l'hôte via les ports publiés de Nginx.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>backend_net\u003C\u002Fstrong> — réseau interne (\u003Ccode>internal: true\u003C\u002Fcode>) réservé à MariaDB, Redis et PrestaShop. MariaDB et Redis n'ont aucune route vers l'extérieur. PrestaShop est le seul service présent sur les deux réseaux, car il doit à la fois répondre à Nginx et interroger la base.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Concrètement, cela donne dans la section \u003Ccode>networks\u003C\u002Fcode> du Compose :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>networks:\n  frontend_net:\n    driver: bridge\n  backend_net:\n    driver: bridge\n    internal: true\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Avec cette topologie, même un scan de ports agressif depuis l'extérieur ne verra jamais MariaDB (3306) ni Redis (6379). C'est une mesure simple qui élimine une surface d'attaque majeure, conforme aux \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fsecurity\u002Fsecurity\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker security best practices\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch3>Volumes et persistance : ce qu'il faut monter, et comment\u003C\u002Fh3>\n\n\u003Cp>Trois stratégies de montage coexistent dans cette architecture :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Volume nommé pour MariaDB\u003C\u002Fstrong> (\u003Ccode>mariadb_data:\u002Fvar\u002Flib\u002Fmysql\u003C\u002Fcode>) — géré par Docker, sauvegardable via \u003Ccode>docker volume inspect\u003C\u002Fcode>, insensible aux \u003Ccode>docker-compose down\u003C\u002Fcode> sans le flag \u003Ccode>-v\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Bind mount pour les modules PrestaShop custom\u003C\u002Fstrong> (\u003Ccode>.\u002Fmodules\u002Fcustom:\u002Fvar\u002Fwww\u002Fhtml\u002Fmodules\u002Fcustom\u003C\u002Fcode>) — le code source reste sur l'hôte, versionné dans Git. Au rebuild, les modules sont immédiatement disponibles sans copie manuelle.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Assets statiques Nuxt servis par Nginx\u003C\u002Fstrong> — le dossier \u003Ccode>.output\u002Fpublic\u003C\u002Fcode> de Nuxt est monté en lecture seule dans Nginx. Les fichiers JS, CSS et images sont servis directement sans passer par Node, ce qui libère le processus SSR pour le rendu dynamique.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch3>Healthchecks et ordre de démarrage : la leçon apprise à la dure\u003C\u002Fh3>\n\n\u003Cp>Sur mon propre Hub Pro, j'ai perdu 3 heures à déboguer un crash au démarrage. PrestaShop tentait de se connecter à MariaDB avant que la base ne soit initialisée. Le symptôme était trompeur : une erreur 500 générique dans les logs PHP, sans mention explicite de la base de données. Le conteneur MariaDB affichait pourtant un statut \u003Cem>running\u003C\u002Fem> — mais \u003Cem>running\u003C\u002Fem> ne signifie pas \u003Cem>ready\u003C\u002Fem>.\u003C\u002Fp>\n\n\u003Cp>La solution définitive repose sur deux mécanismes combinés, documentés dans la \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Freference\u002Fcompose-file\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">référence officielle des services docker-compose\u003C\u002Fa> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>services:\n  mariadb:\n    image: mariadb:11\n    healthcheck:\n      test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"127.0.0.1\", \"--silent\"]\n      interval: 5s\n      timeout: 3s\n      retries: 10\n      start_period: 30s\n    volumes:\n      - mariadb_data:\u002Fvar\u002Flib\u002Fmysql\n    networks:\n      - backend_net\n    env_file: .env\n\n  prestashop:\n    depends_on:\n      mariadb:\n        condition: service_healthy\n      redis:\n        condition: service_healthy\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Le \u003Ccode>start_period\u003C\u002Fcode> de 30 secondes laisse le temps à MariaDB d'initialiser les tablespaces InnoDB au premier lancement. Le \u003Ccode>depends_on\u003C\u002Fcode> avec \u003Ccode>condition: service_healthy\u003C\u002Fcode> garantit que PrestaShop ne démarre qu'une fois la base réellement prête à accepter des connexions. Depuis cette mise en place, zéro crash à froid en production, y compris après les redémarrages automatiques du VPS.\u003C\u002Fp>\n\n\u003Cp>Dans un projet récent pour un client e-commerce dans le secteur du mobilier (catalogue de 12 000 références), la même race condition provoquait des erreurs intermittentes en staging. L'ajout du healthcheck a non seulement résolu le problème, mais a aussi réduit le temps de déploiement perçu par l'équipe : plus besoin de relancer manuellement les conteneurs après un \u003Ccode>docker-compose up\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Ch2>Les solutions pour fiabiliser votre architecture Docker PrestaShop headless\u003C\u002Fh2>\n\n\u003Ctable class=\"article-table\">\n\u003Cthead>\n\u003Ctr>\u003Cth>Solution\u003C\u002Fth>\u003Cth>Complexité\u003C\u002Fth>\u003Cth>Gain estimé\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Healthchecks MariaDB\u002FRedis + \u003Ccode>depends_on: condition\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Élimination des crashs au démarrage à froid — fiabilité 100 % au reboot\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Double réseau Docker (frontend_net \u002F backend_net interne)\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Suppression de la surface d'attaque réseau sur les services de données\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Volumes nommés pour MariaDB + bind mounts pour le code custom\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Zéro perte de données au rebuild, workflow Git préservé pour les modules\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Fichier \u003Ccode>.env\u003C\u002Fcode> exclu du versioning + \u003Ccode>env_file\u003C\u002Fcode> dans le Compose\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Secrets hors du dépôt Git — conformité sécurité et RGPD\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Nginx comme unique point d'entrée + assets Nuxt en lecture seule\u003C\u002Ftd>\u003Ctd>Moyenne\u003C\u002Ftd>\u003Ctd>Réduction du TTFB de 40-60 %, décharge du processus Node SSR\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Restart policy \u003Ccode>unless-stopped\u003C\u002Fcode> sur tous les services\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Reprise automatique après crash OOM ou reboot serveur\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Cblockquote class=\"expert-quote\">\n\u003Cp>\"By default, \u003Ca href=\"\u002Fblog\u002Fprestashop\u002Fperformance\u002Fdocker-vps-deploy-production\" title=\"Docker PrestaShop VPS : déployer en production sans stress\">Docker\u003C\u002Fa> starts a container with a restricted set of capabilities. […] Manage secrets in a way that makes it difficult to accidentally expose them. Use Docker secrets or environment variables loaded from files.\"\u003C\u002Fp>\n— \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fsecurity\u002Fsecurity\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Documentation\u003C\u002Fa>, \u003Ccite>Docker security\u003C\u002Fcite> (2025)\n\u003C\u002Fblockquote>\n\n\u003Ch2>Conclusion : de l'architecture Docker au pipeline de déploiement\u003C\u002Fh2>\n\n\u003Cp>Structurer une \u003Cstrong>architecture Docker PrestaShop headless\u003C\u002Fstrong> pour la production ne se résume pas à empiler des services dans un fichier YAML. Les décisions qui comptent sont celles qu'on ne voit pas dans un tutoriel : l'isolation réseau qui bloque une attaque latérale, le healthcheck qui évite 3 heures de debug à froid, le volume nommé qui sauve vos données quand un \u003Ccode>docker-compose down -v\u003C\u002Fcode> accidentel survient. Chaque choix documenté dans cet article est issu de situations réelles rencontrées en production.\u003C\u002Fp>\n\u003Cp>Cette architecture Docker est le socle technique. L'étape suivante est de l'automatiser : construire un \u003Ca href=\"\u002Fblog\u002Fprestashop\u002Fdeveloppement\u002Fcicd-github-actions-headless-nuxt\">pipeline CI\u002FCD avec GitHub Actions\u003C\u002Fa> qui build, teste et déploie cette stack à chaque push. C'est la suite logique de ce parcours technique.\u003C\u002Fp>\n\u003Cp>Vous souhaitez structurer ou auditer votre architecture Docker PrestaShop headless pour la production ? Discutons de votre projet : \u003Ca href=\"mailto:contact@alexandrecarette.fr\">contact@alexandrecarette.fr\u003C\u002Fa>\u003C\u002Fp>\n\n\u003Cdiv class=\"article-sources\">\n\u003Ch3>Sources et références\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Freference\u002Fcompose-file\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Compose — Services reference (docs.docker.com)\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fnetwork\u002Fdrivers\u002Fbridge\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker — Bridge network driver (docs.docker.com)\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fsecurity\u002Fsecurity\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker security best practices (docs.docker.com)\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.prestashop-project.org\u002Fwelcome\" target=\"_blank\" rel=\"noreferrer noopener\">PrestaShop — Documentation officielle (docs.prestashop-project.org)\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fweb.dev\u002Fvitals\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Core Web Vitals — web.dev (Google)\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fsysdig.com\u002Fcontent\u002Fc\u002Fpf-2024-cloud-native-security-report\" target=\"_blank\" rel=\"noreferrer noopener\">Sysdig 2024 Cloud-Native Security and Usage Report\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fsurvey.stackoverflow.co\u002F2024\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Stack Overflow Developer Survey 2024\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\u003Cdiv style=\"background:#f8fafc;border-left:4px solid #4F46E5;padding:16px 20px;margin:24px 0;\">\u003Cp style=\"margin:0;font-size:14px;\">\u003Cstrong>Approfondir dans l'Academy\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp style=\"margin:4px 0 0;font-size:13px;\">\u003Ca href=\"\u002Facademy\u002Farchitecture-headless\" style=\"text-decoration:underline;color:#4F46E5;\">Module : Architecture Headless de A à Z →\u003C\u002Fa>\u003C\u002Fp>\u003C\u002Fdiv>\n\n\u003Cdiv class=\"articles-lies\" style=\"margin:2em 0;padding:1.5em;border:1px solid #e2e8f0;border-radius:12px;background:#f8fafc;\">\n\u003Ch3 style=\"margin:0 0 0.8em 0;font-size:1em;color:#334155;\">Articles dans le même univers\u003C\u002Fh3>\n\u003Cul style=\"margin:0;padding-left:1.2em;list-style:disc;\">\n\u003Cli>\u003Ca href=\"\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fhub-pro-headless-nuxt-docker\">Coulisses : propulser un Hub Pro avec PrestaShop Headless et Nuxt\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back\">PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete\">PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fblog\u002Fprestashop\u002Fdeveloppement\u002Fheadless-vs-shopify-comparatif\">PrestaShop Headless ou Shopify : pourquoi bâtir son propre Hub\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>",[214,217,220,223,226,229,232,235,238,241,244,247,250,253,256],{"q":215,"a":216},"Pourquoi découpler PrestaShop d'un frontend Nuxt ?","Le découplage permet à votre frontend de se déployer indépendamment, sans redémarrer PrestaShop, et offre une flexibilité maximale pour tester, itérer et scaler chaque couche isolément. Vous gagnez aussi en performance front (SSR, assets légers) et en résilience : une fuite front ne casse plus votre ecommerce.",{"q":218,"a":219},"C'est quoi une architecture headless dans Docker ?","Une architecture headless isole l'API backend (PrestaShop) du frontend (Nuxt) dans des conteneurs séparés, communiquant via HTTP\u002FREST. Chaque conteneur gère sa responsabilité unique : PrestaShop sert les données, Nuxt rend l'interface utilisateur.",{"q":221,"a":222},"Faut-il vraiment un docker-compose pour la prod ?","Pour la production, le docker-compose assure la reproductibilité entre dev et prod, isole les secrets via variables d'env, et gère les dépendances (mariadb, redis, nginx) en une commande. Sans lui, vous orchestrez à la main et multipliez les points de défaillance.",{"q":224,"a":225},"Comment éviter les race conditions au redémarrage Docker ?","Utilisez des healthchecks explicites (liveness + readiness) pour ne router le trafic que vers les conteneurs prêts. Configurez des délais de startup appropriés et utilisez depends_on avec condition : service_healthy pour forcer l'ordre de démarrage réel.",{"q":227,"a":228},"Où stocker les secrets dans Docker ?","Utilisez les fichiers .env en local et secrets Docker en production (jamais hardcoder). Dans Kubernetes, versez les secrets via GitOps chiffré. N'exposez jamais les clés API, tokens ou mots de passe dans les images ou le code.",{"q":230,"a":231},"PrestaShop et Nuxt peuvent-ils être sur la même machine ?","Oui, sur une même machine via docker-compose : PrestaShop sur le port 8080, Nuxt sur 3000, Nginx front sur 80\u002F443 qui les proxyfiait. En production, cette simplicité est un avantage majeur, mais assurez-vous que les ressources (RAM, CPU) suffisent pour les deux.",{"q":233,"a":234},"Comment persister les données PrestaShop en Docker ?","Utilisez des volumes nommés Docker pour MariaDB (ps_data) et PrestaShop (modules, uploads). Définissez-les dans docker-compose.yml avec driver local et montrez-les sur les répertoires cibles du conteneur. Testez la restauration : un volume sans backup n'est qu'une fausse sécurité.",{"q":236,"a":237},"Faut-il Redis en Docker pour PrestaShop ?","Redis n'est pas obligatoire mais recommandé en production pour mettre en cache les paramètres globaux et sessions, évitant des requêtes récurrentes à la BD. Avec Docker, ajouter un conteneur redis:7 est trivial et améliore la latence frontend de 20-30 % typiquement.",{"q":239,"a":240},"Comment tester que mon Docker fonctionne avant le déploiement ?","Lancez docker-compose up localement, attendez les healthchecks verts, puis testez les routes critiques : GET \u002Fapi\u002Fproducts (PrestaShop), GET \u002F (Nuxt render). Vérifiez les logs (docker logs nom_conteneur) pour les erreurs silencieuses et testez le restart : docker-compose down && up.",{"q":242,"a":243},"Quel est le rôle exact de Nginx dans cette architecture ?","Nginx agit comme reverse proxy unique sur les ports 80\u002F443, distribuant les requêtes vers PrestaShop (backend) ou Nuxt (frontend) selon la route. Il gère aussi HTTPS, la compression, les caches statiques et le failover si un conteneur tombe.",{"q":245,"a":246},"PrestaShop peut-il écouter sur un port interne en Docker ?","Oui, et c'est recommandé : PrestaShop écoute sur 8080 (interne au réseau Docker), jamais exposé publiquement. Seul Nginx écoute sur 80\u002F443 vers l'extérieur. Cela renforce la sécurité en cachant PrestaShop des scanners de ports.",{"q":248,"a":249},"Combien de ressources CPU\u002FRAM pour un Docker PrestaShop+Nuxt ?","Minimum 2 vCPU et 2 GB RAM pour dev. En production avec trafic, comptez 4 vCPU et 4-8 GB pour un site e-commerce de PME (\u003C 1000 produits). Ajouter 50 % si vous avez des automates Python lourds ou du machine learning côté API.",{"q":251,"a":252},"Comment monitorer un Docker PrestaShop en production ?","Loguez les conteneurs vers un agrégateur central (ELK, Grafana, Datadog), configurez des alertes sur les redémarrages, les erreurs 5xx et la consommation des ressources. Les healthchecks Docker doivent être visibles dans votre dashboard pour détecter les dégradations silencieuses.",{"q":254,"a":255},"Est-ce que docker restart est sûr en production ?","Non, jamais. docker restart tue le conteneur brutal, causant la perte des connexions en cours. Utilisez au contraire docker-compose down && up pour un redémarrage propre, ou pm2-runtime si vous gérez via PM2 pour un graceful reload.",{"q":257,"a":258},"Peut-on scaler un Docker PrestaShop sur plusieurs serveurs ?","Oui, mais il faut orchestrer via Kubernetes ou Docker Swarm, partager la BD MariaDB et les uploads via NFS\u002FS3, et configurer le load balancing (HAProxy, AWS ALB). C'est une étape après maîtriser le mono-serveur : commencez simple, scaler après.","Docker PrestaShop headless : structurez une architecture multi-conteneurs robuste avec MariaDB, Redis, Nuxt et Nginx. Retour d'expérience terrain et YAML prêt p","",8,[],[264,277,290,303],{"id":265,"title":266,"category":207,"subcategory":208,"slug":267,"linkRewrite":268,"excerpt":269,"coverImage":270,"thumbnailImage":271,"nuxtUrl":272,"datePublished":273,"dateUpdated":274,"readingTime":275,"faqCount":276},106,"Master Data Management grossiste food PrestaShop : table souveraine","architecture--mdm-grossiste-food-prestashop","prestashop--architecture--mdm-grossiste-food-prestashop","Comment une table MDM unique remplace 4 features PrestaShop natives pour gérer DLC, lots, calibres et allergènes. Retour Palimex 1082 produits.","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-master-data-management-1776574808.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-master-data-management-1776574808.webp","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fmdm-grossiste-food-prestashop","2026-04-19T05:03:33.000Z","2026-04-20T05:03:59.000Z",11,15,{"id":278,"title":279,"category":207,"subcategory":280,"slug":281,"linkRewrite":282,"excerpt":283,"coverImage":284,"thumbnailImage":285,"nuxtUrl":286,"datePublished":287,"dateUpdated":288,"readingTime":289,"faqCount":276},89,"Core Web Vitals PrestaShop : passer de 30 à 95 sur PageSpeed","performance","performance--core-web-vitals-prestashop-pagespeed-95","prestashop--performance--core-web-vitals-prestashop-pagespeed-95","Core Web Vitals PrestaShop : méthode complète pour passer de 30 à 95 sur PageSpeed. LCP, INP, CLS, cache, images, JS — guide expert 2026.","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-core-web-vitals-1775555697.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-core-web-vitals-1775555697.webp","\u002Fblog\u002Fprestashop\u002Fperformance\u002Fcore-web-vitals-prestashop-pagespeed-95","2026-04-07T09:56:51.000Z","2026-04-12T11:33:47.000Z",10,{"id":291,"title":292,"category":207,"subcategory":293,"slug":294,"linkRewrite":295,"excerpt":296,"coverImage":297,"thumbnailImage":298,"nuxtUrl":299,"datePublished":300,"dateUpdated":301,"readingTime":302,"faqCount":276},85,"API WebService PrestaShop : guide complet pour l'intégrer en 2026","developpement","developpement--api-webservice-prestashop-guide-complet","prestashop--developpement--api-webservice-prestashop-guide-complet","API WebService PrestaShop : activez, sécurisez et interrogez l'API REST native. Guide complet avec exemples curl, PHP, Python et erreurs courantes.","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-api-webservice-prestashop-1775284236.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-api-webservice-prestashop-1775284236.webp","\u002Fblog\u002Fprestashop\u002Fdeveloppement\u002Fapi-webservice-prestashop-guide-complet","2026-04-04T06:32:35.000Z","2026-04-08T07:50:50.000Z",12,{"id":304,"title":305,"category":207,"subcategory":208,"slug":306,"linkRewrite":307,"excerpt":308,"coverImage":309,"thumbnailImage":310,"nuxtUrl":311,"datePublished":312,"dateUpdated":313,"readingTime":314,"faqCount":276},84,"PrestaShop WebServices + Nuxt 3 — intégration headless complète","architecture--webservices-nuxt-integration-headless","prestashop--architecture--webservices-nuxt-integration-headless","PrestaShop WebServices et Nuxt 3 : guide technique pas-à-pas pour une intégration headless performante. Clé API, composables, SSR, cache Redis et SEO.","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-prestashop-webservices-nuxt-1775283999.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-prestashop-webservices-nuxt-1775283999.webp","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fwebservices-nuxt-integration-headless","2026-04-04T06:28:50.000Z","2026-04-09T05:02:18.000Z",13]