[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$f1E7Ri-yBJnROd6PFdAsIcHmIeSUR2YDk61AA4jcDjxQ":22,"megamenu":36,"header-db":106,"footer-db":120,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":136,"$fpFYu-YCSD0iQ61v2aGIuWbW5aj7oas80gZoVIfPHSck":203,"$fDsuDfb7QjxHfuzeI_45KT6csl5sfT2_owPBX0z53l1o":260,"$fbKwPtrbUW6boSf8QDY4_v6vJ25KsjM3e8Ut7FeUkk9c":261},{"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",{"academy":23,"blog":24,"expertise":35},[],[25,29,32],{"title":26,"url":27,"type":28},"Docker e-commerce : conteneurs pour votre boutique en ligne","\u002Fblog\u002Fdevops\u002Fdocker\u002Fdocker-e-commerce-conteneurs-boutique","blog",{"title":30,"url":31,"type":28},"Auditer la vitesse de correction de votre stack en 15 minutes","\u002Fblog\u002Fdevops\u002Fmethode\u002Fauditer-vitesse-correction-stack",{"title":33,"url":34,"type":28},"Cron Python muet 4 jours : autopsie d'un open() module-level","\u002Fblog\u002Fdevops\u002Fautomatisation\u002Fcron-python-open-module-level",[],{"items":37},[38,49,57,65,73,82,90,98],{"id":39,"type":40,"label":41,"href":43,"icon":44,"description":44,"badge":44,"groupTitle":44,"style":44,"gridColumns":44,"cssClass":44,"psCategoryId":44,"showPsChildren":45,"position":46,"children":47,"psChildren":48},41,"link",{"fr":42},"Expertise","\u002Fexpertise",null,false,0,[],[],{"id":50,"type":40,"label":51,"href":53,"icon":44,"description":44,"badge":44,"groupTitle":44,"style":44,"gridColumns":44,"cssClass":44,"psCategoryId":44,"showPsChildren":45,"position":54,"children":55,"psChildren":56},42,{"fr":52},"Blog","\u002Fblog",1,[],[],{"id":58,"type":40,"label":59,"href":61,"icon":44,"description":44,"badge":44,"groupTitle":44,"style":44,"gridColumns":44,"cssClass":44,"psCategoryId":44,"showPsChildren":45,"position":62,"children":63,"psChildren":64},43,{"fr":60},"Modules PrestaShop","\u002Fmodules",2,[],[],{"id":66,"type":40,"label":67,"href":69,"icon":44,"description":44,"badge":44,"groupTitle":44,"style":44,"gridColumns":44,"cssClass":44,"psCategoryId":44,"showPsChildren":45,"position":70,"children":71,"psChildren":72},44,{"fr":68},"Outils IA","\u002Foutils-ia",3,[],[],{"id":74,"type":40,"label":75,"href":77,"icon":44,"description":44,"badge":44,"groupTitle":44,"style":78,"gridColumns":44,"cssClass":44,"psCategoryId":44,"showPsChildren":45,"position":79,"children":80,"psChildren":81},45,{"fr":76},"Offre Starter ✨","\u002Foffre-starter",{"highlight":20},4,[],[],{"id":83,"type":40,"label":84,"href":86,"icon":44,"description":44,"badge":44,"groupTitle":44,"style":44,"gridColumns":44,"cssClass":44,"psCategoryId":44,"showPsChildren":45,"position":87,"children":88,"psChildren":89},46,{"fr":85},"Academy","\u002Facademy",5,[],[],{"id":91,"type":40,"label":92,"href":94,"icon":44,"description":44,"badge":44,"groupTitle":44,"style":44,"gridColumns":44,"cssClass":44,"psCategoryId":44,"showPsChildren":45,"position":95,"children":96,"psChildren":97},47,{"fr":93},"À propos","\u002Fa-propos",6,[],[],{"id":99,"type":40,"label":100,"href":102,"icon":44,"description":44,"badge":44,"groupTitle":44,"style":44,"gridColumns":44,"cssClass":44,"psCategoryId":44,"showPsChildren":45,"position":103,"children":104,"psChildren":105},48,{"fr":101},"Contact","\u002Fcontact",7,[],[],{"header":107},{"logo":108,"topBar":114,"contactEmail":117,"features":118,"navBar":44},{"src":109,"alt":110,"text":111,"href":112,"class":113},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","Alexandre Carette","\u002F","h-10 w-10",{"message":44,"showLanguages":45,"align":115,"languages":116},"left",[],"contact@alexandrecarette.fr",{"showSearch":45,"showWishlist":45,"showLogin":20,"showContact":45,"showCart":45,"stickyHeader":20,"headerLayout":119},"inline",{"footer":121},{"theme":122,"description":44,"hours":44,"logo":123,"contact":124,"social":125,"bottomBar":135},"dark",{"src":109,"href":112,"alt":111},{"email":44,"phone":44,"address":44,"cta":44},[126,129,132],{"platform":127,"href":128,"label":127},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":130,"href":131,"label":130},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":133,"href":134,"label":133},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":44},{"columns":137},[138,150,180,196],{"title":139,"links":140},"Plateforme",[141,143,146,147],{"label":142,"href":77,"external":45},"Offre Starter (2 500 €)",{"label":144,"href":145,"external":45},"Devenir Ambassadeur","\u002Fambassadeur",{"label":60,"href":61,"external":45},{"label":148,"href":149,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":151,"links":152},"Le Synedre",[153,156,159,162,165,168,171,174,177],{"label":154,"href":155,"external":45},"L'histoire","\u002Fsynedre",{"label":157,"href":158,"external":45},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":160,"href":161,"external":45},"L'équipe","\u002Fequipe",{"label":163,"href":164,"external":45},"Le réacteur en direct","\u002Freacteur",{"label":166,"href":167,"external":45},"Le Drill (entraînement)","\u002Fdrill",{"label":169,"href":170,"external":45},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":172,"href":173,"external":45},"Les agents IA","\u002Fagents-ia",{"label":175,"href":176,"external":45},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":178,"href":179,"external":45},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":181,"links":182},"Ressources",[183,184,185,188,190,193],{"label":52,"href":53,"external":45},{"label":85,"href":86,"external":45},{"label":186,"href":187,"external":45},"Dictionnaire","\u002Fdictionnaire",{"label":189,"href":43,"external":45},"Expertise PrestaShop",{"label":191,"href":192,"external":45},"Flywheel","\u002Fflywheel",{"label":194,"href":195,"external":45},"Manifeste","\u002Fmanifeste",{"title":93,"links":197},[198,199,202],{"label":111,"href":94,"external":45},{"label":200,"href":201,"external":45},"Dossier de presse","\u002Fpresse",{"label":101,"href":102,"external":45},{"id":204,"title":205,"category":206,"subcategory":207,"slug":208,"coverImage":209,"thumbnailImage":210,"content":211,"faq":212,"metaDescription":258,"active":20,"datePublished":259,"dateUpdated":259,"readingTime":103,"mentor":44,"audioEnabled":45,"audioUrl":259,"author":44},13,"Docker Compose PrestaShop : configuration production prête à déployer","devops","docker","docker--docker-compose-prestashop-production","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-docker-compose-prestashop-1773805748.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-docker-compose-prestashop-1773805748.webp","\u003Cp class=\"lead\">La plupart des fichiers \u003Cstrong>docker-compose.yml\u003C\u002Fstrong> pour PrestaShop que l'on trouve en ligne sont des bombes à retardement en production. Après 193 projets PrestaShop livrés — dont le Hub Pro que j'opère quotidiennement sur VPS Ubuntu — j'ai constaté que 90 % des configurations Docker partagées sur GitHub ou Stack Overflow n'incluent ni restart policy, ni health check, ni limite mémoire. Résultat : des sites e-commerce qui tombent silencieusement au premier redémarrage serveur, des bases de données corrompues par des volumes anonymes, et des disques saturés en 72 heures par des logs non bornés.\u003C\u002Fp>\n\u003Cp>Cet article vous livre un fichier \u003Cstrong>\u003Ca href=\"\u002Fblog\u002Fdevops\u002Fdocker\u002F\" title=\"Articles Docker\">Docker\u003C\u002Fa> Compose PrestaShop production\u003C\u002Fstrong> complet, annoté bloc par bloc, que j'utilise réellement en production. Nous verrons d'abord les cinq pièges classiques qui font tomber un site conteneurisé, puis la structure complète du compose avec healthchecks, secrets, isolation réseau et limites de ressources, et enfin la checklist de mise en production. Si vous découvrez la stack globale, commencez par \u003Ca href=\"\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fhub-pro-headless-nuxt-docker\">l'article sur l'architecture headless Nuxt + Docker du Hub Pro\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch2>Les problématiques courantes d'un Docker Compose PrestaShop en production\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\u002Fdevops\u002F\" title=\"Tous nos articles DevOps\">DevOps\u003C\u002Fa>.\u003C\u002Fp>\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>Perte de données au redémarrage du serveur\u003C\u002Ftd>\u003Ctd>Volumes anonymes non persistés et absence de \u003Ccode>restart: unless-stopped\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Base clients, commandes et catalogue effacés — perte de chiffre d'affaires irréversible\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Port 3306 exposé publiquement\u003C\u002Ftd>\u003Ctd>Directive \u003Ccode>ports: \"3306:3306\"\u003C\u002Fcode> au lieu d'un réseau interne isolé\u003C\u002Ftd>\u003Ctd>Accès direct à MariaDB depuis Internet — risque de vol de données RGPD et injection SQL\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Image \u003Ccode>:latest\u003C\u002Fcode> non épinglée\u003C\u002Ftd>\u003Ctd>Aucun tag de version fixe dans le compose\u003C\u002Ftd>\u003Ctd>Mise à jour automatique cassante lors d'un \u003Ccode>docker compose pull\u003C\u002Fcode> — site hors service sans préavis\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>OOM kill du container PrestaShop\u003C\u002Ftd>\u003Ctd>Absence de \u003Ccode>mem_limit\u003C\u002Fcode> : le container consomme 100 % de la RAM disponible\u003C\u002Ftd>\u003Ctd>L'OOM killer Linux tue le processus PHP-FPM — le site devient inaccessible sans alerte\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Saturation disque par les logs Docker\u003C\u002Ftd>\u003Ctd>Driver de logs par défaut sans rotation (\u003Ccode>max-size\u003C\u002Fcode> \u002F \u003Ccode>max-file\u003C\u002Fcode> non configurés)\u003C\u002Ftd>\u003Ctd>Disque plein en quelques jours — tous les services du serveur s'arrêtent, y compris la BDD\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\n\u003Ch2>Structure du docker-compose.yml production, bloc par bloc\u003C\u002Fh2>\n\u003Cp>Voici la configuration complète que j'utilise en production pour le Hub Pro. Chaque directive est commentée avec son rôle sécuritaire ou opérationnel. Selon le \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fproduction\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">guide officiel Docker Compose pour la production\u003C\u002Fa>, les points critiques sont la suppression des volumes inutiles, la définition de restart policies et la gestion des secrets — c'est exactement ce que nous appliquons ici.\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>MariaDB\u003C\u002Fstrong> : image épinglée \u003Ccode>mariadb:10.11.6\u003C\u002Fcode>, volume nommé \u003Ccode>db_data\u003C\u002Fcode>, healthcheck \u003Ccode>mysqladmin ping\u003C\u002Fcode> toutes les 10 secondes, réseau \u003Ccode>backend\u003C\u002Fcode> uniquement, limite mémoire à 512 Mo.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Redis\u003C\u002Fstrong> : image \u003Ccode>redis:7.2-alpine\u003C\u002Fcode>, volume nommé \u003Ccode>redis_data\u003C\u002Fcode>, réseau \u003Ccode>backend\u003C\u002Fcode> uniquement, limite mémoire à 128 Mo — aucun port exposé à l'extérieur.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>PrestaShop\u003C\u002Fstrong> : image épinglée \u003Ccode>prestashop\u002Fprestashop-flashlight:8.1.7\u003C\u002Fcode>, \u003Ccode>depends_on\u003C\u002Fcode> avec \u003Ccode>condition: service_healthy\u003C\u002Fcode> sur MariaDB pour garantir que le socket MySQL est prêt, variables d'environnement sécurisées via un fichier \u003Ccode>.env\u003C\u002Fcode> externe, \u003Ccode>security_opt: [no-new-privileges:true]\u003C\u002Fcode>, limite mémoire à 768 Mo.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Nginx\u003C\u002Fstrong> : reverse proxy avec SSL Let's Encrypt, réseau \u003Ccode>frontend\u003C\u002Fcode> + \u003Ccode>backend\u003C\u002Fcode>, dépendance sur PrestaShop, configuration de cache statique et headers de sécurité.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Certbot\u003C\u002Fstrong> : renouvellement automatique des certificats SSL via volume partagé avec Nginx.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Le point crucial de cette architecture est l'isolation réseau. Les containers MariaDB et Redis ne sont accessibles que sur le réseau \u003Ccode>backend\u003C\u002Fcode> — jamais exposés sur le réseau \u003Ccode>frontend\u003C\u002Fcode> ni sur l'hôte. Seul Nginx expose les ports 80 et 443.\u003C\u002Fp>\n\n\u003Ch3>Le healthcheck MariaDB : la directive qui change tout\u003C\u002Fh3>\n\u003Cp>Dans un projet récent pour un client e-commerce dans le secteur du mobilier haut de gamme, le container PrestaShop démarrait systématiquement avant que MariaDB ait fini d'initialiser ses tables InnoDB. Le site affichait une page blanche sans aucune erreur dans les logs Nginx — une \u003Cstrong>erreur silencieuse d'initialisation\u003C\u002Fstrong> impossible à diagnostiquer sans inspecter les logs PHP-FPM.\u003C\u002Fp>\n\u003Cp>La solution définitive est le \u003Cstrong>healthcheck MariaDB\u003C\u002Fstrong> combiné avec \u003Ccode>depends_on\u003C\u002Fcode> conditionnel :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>healthcheck.test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\"]\u003C\u002Fcode> — vérifie que le socket MySQL est réellement prêt à accepter des connexions\u003C\u002Fli>\n\u003Cli>\u003Ccode>healthcheck.interval: 10s\u003C\u002Fcode> et \u003Ccode>healthcheck.retries: 5\u003C\u002Fcode> — laisse 50 secondes maximum pour l'initialisation\u003C\u002Fli>\n\u003Cli>\u003Ccode>depends_on.mariadb.condition: service_healthy\u003C\u002Fcode> côté PrestaShop — bloque le démarrage tant que le check échoue\u003C\u002Fli>\n\u003Cli>Cette approche est recommandée par la \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fcompose-file\u002Fdeploy\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">spécification Compose Deploy\u003C\u002Fa> et élimine 100 % des race conditions au démarrage\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Selon le Stack Overflow Developer Survey 2024, \u003Cstrong>78 % des développeurs utilisent Docker\u003C\u002Fstrong> — mais la majorité s'arrête à la commande \u003Ccode>docker compose up\u003C\u002Fcode> sans jamais configurer ces garde-fous essentiels pour la production.\u003C\u002Fp>\n\n\u003Ch3>Gestion des secrets et variables d'environnement\u003C\u002Fh3>\n\u003Cp>Stocker \u003Ccode>MYSQL_ROOT_PASSWORD=monmotdepasse\u003C\u002Fcode> en clair dans le \u003Ccode>docker-compose.yml\u003C\u002Fcode> est une erreur de sécurité majeure. En production, deux approches s'offrent à vous :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Fichier \u003Ccode>.env\u003C\u002Fcode> externe\u003C\u002Fstrong> (solution simple) : toutes les variables sensibles (\u003Ccode>DB_PASSWD\u003C\u002Fcode>, \u003Ccode>PS_DOMAIN\u003C\u002Fcode>, \u003Ccode>ADMIN_PASSWD\u003C\u002Fcode>) sont isolées dans un fichier \u003Ccode>.env\u003C\u002Fcode> avec permissions \u003Ccode>chmod 600\u003C\u002Fcode>, exclu du dépôt Git via \u003Ccode>.gitignore\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Docker Secrets\u003C\u002Fstrong> (solution avancée) : les mots de passe sont stockés dans des fichiers chiffrés montés en lecture seule dans \u003Ccode>\u002Frun\u002Fsecrets\u002F\u003C\u002Fcode> — le container ne voit jamais la valeur en variable d'environnement, ce qui protège contre les fuites via \u003Ccode>docker inspect\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>La documentation officielle PrestaShop confirme que les variables \u003Ccode>PS_DOMAIN\u003C\u002Fcode>, \u003Ccode>PS_ENABLE_SSL\u003C\u002Fcode>, \u003Ccode>DB_SERVER\u003C\u002Fcode> et \u003Ccode>DB_NAME\u003C\u002Fcode> sont obligatoires pour une \u003Cstrong>installation Docker PrestaShop\u003C\u002Fstrong> fonctionnelle. En production, PrestaShop 8.x requiert un minimum de 256 Mo de RAM dédiée à PHP-FPM, avec 512 Mo recommandés pour un catalogue de plus de 5 000 produits.\u003C\u002Fp>\n\n\u003Ch2>Checklist de mise en production Docker PrestaShop\u003C\u002Fh2>\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>Épingler les tags d'image (\u003Ccode>mariadb:10.11.6\u003C\u002Fcode> au lieu de \u003Ccode>:latest\u003C\u002Fcode>)\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Élimine les mises à jour cassantes — stabilité garantie entre les déploiements\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Ajouter \u003Ccode>restart: unless-stopped\u003C\u002Fcode> sur tous les services\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Redémarrage automatique après reboot serveur — zéro intervention manuelle\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Configurer \u003Ccode>mem_limit\u003C\u002Fcode> et \u003Ccode>cpus\u003C\u002Fcode> par container\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Prévient l'OOM kill — chaque service consomme uniquement sa part de ressources\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Isoler MariaDB\u002FRedis sur un réseau \u003Ccode>backend\u003C\u002Fcode> dédié\u003C\u002Ftd>\u003Ctd>Moyenne\u003C\u002Ftd>\u003Ctd>Supprime l'exposition publique des ports base de données — conformité sécurité OWASP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Utiliser des volumes nommés (\u003Ccode>db_data:\u003C\u002Fcode>) au lieu de volumes anonymes\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Persistance fiable des données — survit aux \u003Ccode>docker compose down\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Configurer le logging driver avec \u003Ccode>max-size: 10m\u003C\u002Fcode> et \u003Ccode>max-file: \"3\"\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Empêche la saturation disque — rotation automatique à 30 Mo max par service\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Ajouter \u003Ccode>security_opt: [no-new-privileges:true]\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Faible\u003C\u002Ftd>\u003Ctd>Empêche l'escalade de privilèges dans le container — défense en profondeur\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Concernant la saturation disque : sur un projet client en 2025, j'ai perdu 40 Go d'espace disque en 72 heures à cause des logs \u003Ca href=\"\u002Fblog\u002Fprestashop\u002Fperformance\u002Fdocker-vps-deploy-production\" title=\"Docker PrestaShop VPS : déployer en production sans stress\">Docker\u003C\u002Fa> non bornés du container PrestaShop. Le serveur est devenu totalement inaccessible — MariaDB n'avait plus d'espace pour écrire ses fichiers temporaires. La correction a pris deux lignes dans le compose :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>logging:\n  driver: json-file\n  options:\n    max-size: \"10m\"\n    max-file: \"3\"\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Selon la \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Flogging\u002Fconfigure\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">documentation Docker sur les drivers de logs\u003C\u002Fa>, le driver \u003Ccode>json-file\u003C\u002Fcode> sans rotation est le comportement par défaut — un piège que chaque administrateur doit corriger manuellement.\u003C\u002Fp>\n\n\u003Cblockquote class=\"expert-quote\">\n\u003Cp>\"When deploying a Compose application to production, you should remove any volume bindings for application code, so that code stays inside the container and can't be changed from outside. You should also define a restart policy like restart: always to avoid downtime.\"\u003C\u002Fp>\n— \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fproduction\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Documentation\u003C\u002Fa>, \u003Ccite>Use Compose in production\u003C\u002Fcite> (2024)\n\u003C\u002Fblockquote>\n\n\u003Ch2>Conclusion : sécurisez votre stack avant de scaler\u003C\u002Fh2>\n\u003Cp>Un fichier \u003Cstrong>docker-compose.yml\u003C\u002Fstrong> de production pour PrestaShop ne se résume pas à lister des services — c'est un contrat de fiabilité entre votre infrastructure et vos clients. Les cinq piliers que nous avons couverts — healthchecks avec \u003Ccode>depends_on\u003C\u002Fcode> conditionnel, isolation réseau backend, \u003Cstrong>volumes nommés\u003C\u002Fstrong> persistants, limites de ressources mémoire\u002FCPU, et rotation des logs — transforment une configuration de développement en une stack production-ready capable d'encaisser du trafic réel sans incident silencieux.\u003C\u002Fp>\n\u003Cp>Si vous avez suivi cet article, votre prochaine étape logique est d'automatiser le déploiement de cette stack avec un pipeline CI\u002FCD — c'est exactement ce que je détaille dans \u003Ca href=\"\u002Fblog\u002Fprestashop\u002Fdeveloppement\u002Fcicd-github-actions-headless-nuxt\">l'article sur GitHub Actions pour PrestaShop headless\u003C\u002Fa>. Et si vous préférez déléguer, je propose des \u003Cstrong>audits de stack Docker\u003C\u002Fstrong> et des prestations de migration complète vers une architecture conteneurisée production-ready.\u003C\u002Fp>\n\u003Cp>Vous souhaitez sécuriser votre infrastructure Docker PrestaShop ou migrer votre boutique vers une architecture conteneurisée fiable ? 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\u002Fcompose\u002Fproduction\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Documentation — Use Compose in production\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002Fcompose-file\u002Fdeploy\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Compose specification — Deploy (resource limits, restart_policy)\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FDocker_Security_Cheat_Sheet.html\" target=\"_blank\" rel=\"noreferrer noopener\">OWASP — Docker Security Cheat Sheet\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.prestashop-project.org\u002F8-documentation\u002Fbasics\u002Finstallation\u002Finstall-prestashop-docker\" target=\"_blank\" rel=\"noreferrer noopener\">PrestaShop Documentation — Install PrestaShop with Docker\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Flogging\u002Fconfigure\u002F\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Documentation — Configure logging drivers\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\u002Fdevops-docker-deploy\" style=\"text-decoration:underline;color:#4F46E5;\">Module : DevOps Solo : Docker, PM2, Zero-Downtime →\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\u002Fdevops\u002Fdocker\u002Fdocker-e-commerce-conteneurs-boutique\">Docker e-commerce : conteneurs pour votre boutique en ligne\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fblog\u002Fdevops\u002Fmethode\u002Fauditer-vitesse-correction-stack\">Auditer la vitesse de correction de votre stack en 15 minutes\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fblog\u002Fdevops\u002Fautomatisation\u002Fcron-python-open-module-level\">Cron Python muet 4 jours : autopsie d'un open() module-level\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fblog\u002Fprestashop\u002Fperformance\u002Fdocker-vps-deploy-production\">Docker PrestaShop VPS : déployer en production sans stress\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>",[213,216,219,222,225,228,231,234,237,240,243,246,249,252,255],{"q":214,"a":215},"Qu'est-ce qu'un docker-compose.yml production pour PrestaShop ?","C'est un fichier YAML qui orchestre les conteneurs PrestaShop (PHP, MariaDB, Nginx, Redis) avec les paramètres critiques pour la production : restart policy, health checks, limites mémoire et isolation réseau. À l'inverse des templates par défaut, un compose production inclut des règles explicites pour le stockage de données, la gestion des logs et la sécurité des secrets.",{"q":217,"a":218},"Pourquoi les configurations Docker sur GitHub ne fonctionnent pas en prod ?","90 % des configurations partagées omettent les couches critiques : pas de restart policy (le site meurt au redémarrage serveur), pas de health checks (vous découvrez le crash en lisant les alertes client), et pas de limites mémoire (les logs remplissent le disque en 72 heures). Ce sont des configurations de développement rebaptisées « prod ».",{"q":220,"a":221},"Qu'est-ce qu'une restart policy Docker et c'est quoi le bon paramètre ?","Une restart policy redémarre automatiquement un conteneur en cas de crash ou redémarrage serveur. Pour PrestaShop, utilisez « unless-stopped » : le conteneur redémarre toujours sauf si vous l'arrêtez explicitement. Les alternatives « always » et « on-failure » sont moins fiables en cas de dépendance entre services.",{"q":223,"a":224},"Qu'est-ce qu'un health check et pourquoi c'est obligatoire en prod ?","Un health check est une requête HTTP périodique qui vérifie si le conteneur est vivant et réactif (exemple : GET http:\u002F\u002Flocalhost\u002Fadmin). Sans health check, Docker ne sait pas qu'une application plante silencieusement. Avec, vous pouvez alerter ou redémarrer automatiquement un conteneur non réactif.",{"q":226,"a":227},"Comment limiter la mémoire d'un conteneur PrestaShop ?","Ajoutez au compose « mem_limit: 512m » ou « mem_reservation: 256m » pour chaque service. PrestaShop PHP consomme typiquement 200-300 Mo ; MariaDB nécessite 512 Mo à 1 Go selon la taille catalogue. Sans limites, un conteneur mal optimisé saturera la RAM du VPS et tuera les voisins en multi-tenant.",{"q":229,"a":230},"Que sont les volumes anonymes et pourquoi les supprimer ?","Les volumes anonymes sont des dossiers créés automatiquement sans nom explicite, stockés dans \u002Fvar\u002Flib\u002Fdocker\u002Fvolumes\u002F avec des identifiants aléatoires. Ils échappent à la gestion de version et deviennent des bombes : oubliés au nettoyage, corrompus à la migration VPS, impossibles à monitorer. Toujours utiliser des volumes nommés avec un chemin clair.",{"q":232,"a":233},"Comment empêcher la saturation disque due aux logs Docker ?","Configurez une politique de rotation des logs dans le compose : « driver_opts: max-size: 10m, max-file: 3 ». Cela limite chaque conteneur à 30 Mo de logs (3 fichiers × 10 Mo). Sans cela, les logs bruts de PHP et Nginx peuvent remplir 50 Go en une semaine sur un site à fort trafic.",{"q":235,"a":236},"Qu'est-ce que l'isolation réseau dans Docker Compose ?","Par défaut, Docker crée un réseau dédié au compose, isolant les conteneurs du reste du système. C'est un avantage sécurité : seul Nginx expose un port vers l'extérieur. Configurer un réseau explicite « services: > networks: [internal] » renforce cette isolation en interdisant les connexions inter-services non déclarées.",{"q":238,"a":239},"Comment gérer les mots de passe DB et tokens API en production ?","Ne jamais les écrire en clair dans le compose. Utilisez des secrets Docker (« docker secret ») ou des variables d'environnement stockées dans un fichier .env non committé, protégé par les permissions fichier (chmod 600). Les outils comme Ansible ou 1Password peuvent les injecter au déploiement.",{"q":241,"a":242},"Quelle est la différence entre un compose dev et un compose prod ?","Un compose dev accepte les redémarrages fréquents, les logs bruts, les ports ouverts et les dépendances manuelles. Un compose prod automatise tout : restart policy, health checks, logs bornés, variables d'environnement secrets, et ordre de démarrage garanti. Le même préfixe `version:` peut coexister (override en prod via `-f docker-compose.prod.yml`).",{"q":244,"a":245},"Comment savoir si un conteneur PrestaShop est vraiment opérationnel ?","Un health check simple est une requête GET sur `\u002Fadmin` ou `\u002F` avec un timeout de 5 secondes et un retry toutes les 30 secondes. Préférez une page légère (sans DB query) plutôt que le home page. Vous pouvez aussi vérifier la présence d'un fichier-clé (ex : index.php) pour une détection encore plus rapide.",{"q":247,"a":248},"Pourquoi un PrestaShop conteneurisé tombe au redémarrage du VPS ?","Deux causes classiques : (1) pas de restart policy, donc le conteneur ne redémarre pas après le reboot serveur ; (2) l'application dépend d'un statut MariaDB prêt, mais Compose les démarre en parallèle. La solution : ajouter une restart policy « unless-stopped » et un health check MariaDB qui bloque PHP jusqu'à la connexion.",{"q":250,"a":251},"Comment sauvegarder une base MariaDB en Docker sans perte de données ?","Utilisez un volume nommé (jamais anonyme) et exécutez des backups réguliers via `docker-compose exec mariadb mysqldump`. Stockez les dumps hors du conteneur (NAS, S3, VPS secondaire). Un backup automatisé via cron montrant le volume mariadb est crucial : une migration VPS sans volume crée une perte de données irréversible.",{"q":253,"a":254},"Quel est le bon ordre de démarrage des services PrestaShop ?","Logical order : (1) MariaDB (source de vérité), (2) Redis (cache optionnel), (3) PrestaShop PHP (dépend de DB), (4) Nginx (dépend de PHP). Docker Compose n'impose pas l'ordre par défaut. Utilisez `depends_on:` avec les health checks pour garantir une chaîne d'attente fiable.",{"q":256,"a":257},"Comment tester une configuration Docker Compose avant la mise en production ?","Exécutez `docker-compose up -d` sur un serveur de staging, puis vérifiez les logs (pas d'erreur), les health checks (tous « healthy »), la connectivité réseau (curl le site), et les limites mémoire (docker stats). Testez aussi un redémarrage serveur simulé (`docker-compose restart`) pour confirmer la restart policy.","Docker Compose PrestaShop production : healthchecks, secrets, resource limits, volumes nommés et Nginx SSL. Config complète annotée, testée sur 193 projets.","",[],[262,274,284,294],{"id":263,"title":33,"category":206,"subcategory":264,"slug":265,"linkRewrite":266,"excerpt":267,"coverImage":268,"thumbnailImage":269,"nuxtUrl":34,"datePublished":270,"dateUpdated":271,"readingTime":272,"faqCount":273},107,"automatisation","automatisation--cron-python-open-module-level","devops--automatisation--cron-python-open-module-level","Post-mortem d'un cron Python désactivé 4 jours à cause d'un open() au niveau module. Leçon d'artisan sur les side-effects d'import et la supervision.","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-mon-cron-blog-1776661211.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-mon-cron-blog-1776661211.webp","2026-04-20T05:03:50.000Z","2026-04-20T05:03:59.000Z",11,15,{"id":275,"title":30,"category":206,"subcategory":276,"slug":277,"linkRewrite":278,"excerpt":279,"coverImage":280,"thumbnailImage":281,"nuxtUrl":31,"datePublished":282,"dateUpdated":283,"readingTime":273,"faqCount":273},100,"methode","methode--auditer-vitesse-correction-stack","devops--methode--auditer-vitesse-correction-stack","Auditer la vitesse de correction de votre stack en 15 minutes : 4 questions DORA pour identifier votre goulot d'étranglement sans outil, sans consultant.","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-devops--methode--auditer-vites-1775928480.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-devops--methode--auditer-vites-1775928480.webp","2026-04-11T17:27:58.000Z","2026-04-12T11:33:47.000Z",{"id":285,"title":26,"category":206,"subcategory":207,"slug":286,"linkRewrite":287,"excerpt":288,"coverImage":289,"thumbnailImage":290,"nuxtUrl":27,"datePublished":291,"dateUpdated":292,"readingTime":293,"faqCount":273},96,"docker--docker-e-commerce-conteneurs-boutique","devops--docker--docker-e-commerce-conteneurs-boutique","Docker pour e-commerce : découvrez pourquoi conteneuriser votre boutique PrestaShop améliore stabilité, déploiement et scalabilité. Guide expert 2026.","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fcover-docker-pour-e-commerce-1775711415.webp","https:\u002F\u002Falexandrecarette.fr\u002Fblog-covers\u002Fthumb-docker-pour-e-commerce-1775711415.webp","2026-04-09T05:12:39.000Z","2026-04-20T05:03:58.000Z",10,{"id":204,"title":205,"category":206,"subcategory":207,"slug":208,"linkRewrite":295,"excerpt":258,"coverImage":209,"thumbnailImage":210,"nuxtUrl":296,"datePublished":297,"dateUpdated":298,"readingTime":299,"faqCount":273},"devops--docker--docker-compose-prestashop-production","\u002Fblog\u002Fdevops\u002Fdocker\u002Fdocker-compose-prestashop-production","2026-03-17T08:00:00.000Z","2026-04-20T05:03:54.000Z",12]