[{"data":1,"prerenderedAt":5688},["ShallowReactive",2],{"article-fr-\u002Fdevops\u002Fset-up-mongodb-replica-with-docker":3,"article-sibling-fr-\u002Fdevops\u002Fset-up-mongodb-replica-with-docker":3100,"surround-fr-\u002Fdevops\u002Fset-up-mongodb-replica-with-docker":5662,"related-fr-\u002Fdevops\u002Fset-up-mongodb-replica-with-docker":5669},{"id":4,"title":5,"body":6,"date":3082,"description":3083,"extension":3084,"img":3085,"meta":3086,"navigation":1287,"path":3087,"seo":3088,"slug":3089,"stem":3090,"tags":3091,"topics":3096,"__hash__":3099},"content\u002Fdevops\u002F2.set-up-mongodb-replica-with-docker.fr.md","Mettre en place un cluster MongoDB Replica Set à 3 nœuds avec Docker Compose",{"type":7,"value":8,"toc":3065},"minimark",[9,14,18,22,31,43,46,51,58,65,72,79,90,93,97,105,113,117,125,161,164,1039,1045,1144,1148,1151,1154,1194,1214,1220,1224,1229,1240,1741,1745,1775,1784,1788,2101,2105,2108,2124,2133,2137,2144,2179,2193,2196,2209,2220,2741,2746,2750,2760,2921,2934,2944,2950,2970,2973,2978,2981,2985,2991,2998,3001,3005,3061],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17],"p",{},"Dans cet article, je te guide à travers la mise en place d'un cluster MongoDB replica set à\n3 nœuds avec Docker Compose. Ce guide suppose que tu es familier avec les concepts Docker de\nbase — Docker Compose, volumes, réseaux, healthchecks — ainsi qu'avec les concepts MongoDB\ncomme les replica sets. Si tu es prêt, on plonge dedans !",[10,19,21],{"id":20},"cest-quoi-un-replica-set-mongodb","C'est quoi un replica set MongoDB ?",[23,24],"post-image",{"alt":25,"className":26,"source":30},"Restauration de backup réussie",[27,28,29],"h-auto","max-w-xl","mx-auto","https:\u002F\u002Fres.cloudinary.com\u002Fdpdwhd6ka\u002Fimage\u002Fupload\u002Ff_auto,q_auto\u002Fv1\u002FBlog\u002Farticles\u002Fhow-to\u002Fnye35wpkfcy8fivg5qlv",[15,32,33,34,38,39,42],{},"Un replica set MongoDB est un groupe d'instances MongoDB qui hébergent le même jeu de données.\nDans un replica set, un nœud est le nœud ",[35,36,37],"strong",{},"primary"," qui reçoit toutes les opérations\nd'écriture. Tous les autres nœuds, appelés ",[35,40,41],{},"secondary",", appliquent les opérations du primary\npour avoir le même jeu de données.",[15,44,45],{},"Les replica sets MongoDB offrent redondance et haute disponibilité, en gardant la base\nopérationnelle même si un ou plusieurs nœuds tombent. Ils répliquent les données sur plusieurs\nnœuds pour garantir intégrité et disponibilité.",[47,48,50],"h3",{"id":49},"pourquoi-utiliser-un-replica-set-mongodb","Pourquoi utiliser un replica set MongoDB ?",[15,52,53,54,57],{},"1- ",[35,55,56],{},"Haute disponibilité"," : si le nœud primary tombe, un secondary peut être élu comme nouveau\nprimary, ce qui garantit que la base reste disponible.",[15,59,60,61,64],{},"2- ",[35,62,63],{},"Redondance des données"," : les données sont répliquées sur plusieurs nœuds, garantissant\nleur intégrité et leur disponibilité.",[15,66,67,68,71],{},"3- ",[35,69,70],{},"Scalabilité en lecture"," : les nœuds secondary peuvent servir les opérations de lecture,\ndistribuant la charge de lecture sur plusieurs nœuds.",[15,73,74,75,78],{},"4- ",[35,76,77],{},"Failover automatique"," : si le nœud primary tombe, un secondary est automatiquement élu\ncomme nouveau primary.",[15,80,81,82,89],{},"Pour aller plus loin sur la réplication MongoDB, consulte la doc officielle sur les\n",[83,84,88],"a",{"href":85,"rel":86},"https:\u002F\u002Fdocs.mongodb.com\u002Fmanual\u002Freplication\u002F",[87],"nofollow","replica sets",".",[10,91,5],{"id":92},"mettre-en-place-un-cluster-mongodb-replica-set-à-3-nœuds-avec-docker-compose",[47,94,96],{"id":95},"prérequis","Prérequis",[15,98,99,100,89],{},"Dans ce guide, on utilise Docker Compose pour mettre en place un cluster MongoDB replica set à\n3 nœuds. Avant de commencer, assure-toi d'avoir Docker et Docker Compose installés sur ta\nmachine. Si ce n'est pas le cas, télécharge-les depuis le\n",[83,101,104],{"href":102,"rel":103},"https:\u002F\u002Fdocs.docker.com\u002Fget-docker\u002F",[87],"site officiel Docker",[15,106,107,108,89],{},"Tu auras peut-être aussi besoin d'une compréhension de base de MongoDB et des commandes\nmongo shell. Si tu débutes avec MongoDB, consulte la doc officielle sur les\n",[83,109,112],{"href":110,"rel":111},"https:\u002F\u002Fdocs.mongodb.com\u002Fmanual\u002Fcrud\u002F",[87],"opérations CRUD MongoDB",[47,114,116],{"id":115},"étape-1-créer-un-fichier-docker-compose","Étape 1 : créer un fichier Docker Compose",[15,118,119,120,124],{},"Commence par créer un fichier ",[121,122,123],"code",{},"docker-compose.yml"," dans un nouveau dossier. Ce fichier\ndéfinira les services pour les conteneurs MongoDB. On va créer :",[126,127,128,143,149],"ul",{},[129,130,131,132,135,136,139,140],"li",{},"trois services : ",[121,133,134],{},"mongo1",", ",[121,137,138],{},"mongo2"," et ",[121,141,142],{},"mongo3",[129,144,145,146],{},"un réseau appelé ",[121,147,148],{},"mongo-cluster",[129,150,151,152,135,155,139,158],{},"trois volumes : ",[121,153,154],{},"mongo1-data",[121,156,157],{},"mongo2-data",[121,159,160],{},"mongo3-data",[15,162,163],{},"C'est parti :",[165,166,171],"pre",{"className":167,"code":168,"filename":123,"language":169,"meta":170,"style":170},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","networks:\n  mongo-cluster:\n    driver: bridge\nvolumes:\n  mongo1_data:\n  mongo1_config:\n  mongo2_data:\n  mongo2_config:\n  mongo3_data:\n  mongo3_config:\nservices:\n  mongo1:\n    container_name: mongo1\n    image: 'mongo:8.2-noble'\n    hostname: mongo1\n    command: [\"--config\", \"\u002Fetc\u002Fmongod.conf\"]\n    volumes:\n      - mongo1_data:\u002Fdata\u002Fdb\n      - mongo1_config:\u002Fdata\u002Fconfigdb\n      - '$PWD\u002Fscripts\u002Fmongo\u002Frs_keyfile:\u002Fetc\u002Fmongodb\u002Fkeyfile:ro'\n      - '$PWD\u002Fscripts\u002Fmongo\u002Fmongod.conf:\u002Fetc\u002Fmongod.conf:ro'\n    networks:\n      - mongo-cluster\n    environment:\n      MONGO_INITDB_ROOT_USERNAME: '${MONGO_ADMIN_USER:-admin}'\n      MONGO_INITDB_ROOT_PASSWORD: '${MONGO_ADMIN_PASSWD:-veryStringPassword}'\n      MONGO_INITDB_DATABASE: '${DB_NAME:-test}'\n    healthcheck:\n      test: [\"CMD\", \"mongosh\", \"--quiet\", \"--eval\", \"try { rs.status().ok } catch(e) { rs.initiate().ok }\"]\n      timeout: 5m\n      interval: 10s\n      retries: 5\n      start_period: 12s\n  mongo2:\n    container_name: mongo2\n    image: 'mongo:8.2-noble'\n    hostname: mongo2\n    volumes:\n      - mongo2_data:\u002Fdata\u002Fdb\n      - mongo2_config:\u002Fdata\u002Fconfigdb\n      - '$PWD\u002Fscripts\u002Fmongo\u002Frs_keyfile:\u002Fetc\u002Fmongodb\u002Fkeyfile:ro'\n      - '$PWD\u002Fscripts\u002Fmongo\u002Fmongod.conf:\u002Fetc\u002Fmongod.conf:ro'\n    networks:\n      - mongo-cluster\n    environment:\n      MONGO_INITDB_ROOT_USERNAME: '${MONGO_ADMIN_USER:-admin}'\n      MONGO_INITDB_ROOT_PASSWORD: '${MONGO_ADMIN_PASSWD:-veryStringPassword}'\n  mongo3:\n    container_name: mongo3\n    image: 'mongo:8.2-noble'\n    hostname: mongo3\n    volumes:\n      - mongo3_data:\u002Fdata\u002Fdb\n      - mongo3_config:\u002Fdata\u002Fconfigdb\n      - '$PWD\u002Fscripts\u002Fmongo\u002Frs_keyfile:\u002Fetc\u002Fmongodb\u002Fkeyfile:ro'\n      - '$PWD\u002Fscripts\u002Fmongo\u002Fmongod.conf:\u002Fetc\u002Fmongod.conf:ro'\n    networks:\n      - mongo-cluster\n    environment:\n      MONGO_INITDB_ROOT_USERNAME: '${MONGO_ADMIN_USER:-admin}'\n      MONGO_INITDB_ROOT_PASSWORD: '${MONGO_ADMIN_PASSWD:-veryStringPassword}'\n  mongo-init:\n    container_name: mongo-init\n    image: docker.io\u002Fmongo:8.2-noble\n    restart: no\n    entrypoint: [\"\u002Fbin\u002Fbash\", \"\u002Finit.sh\"]\n    networks:\n      - mongo-cluster\n    depends_on:\n      - mongo1\n      - mongo2\n      - mongo3\n    volumes:\n      - $PWD\u002Fscripts\u002Fmongo\u002Finit.js:\u002Finit.js\n      - $PWD\u002Fscripts\u002Fmongo\u002Finit.sh:\u002Finit.sh\n    environment:\n      MONGO_ROOT_USERNAME: '${MONGO_ADMIN_USER:-admin}'\n      MONGO_ROOT_PASSWORD: '${MONGO_ADMIN_PASSWD:-veryStringPassword}'\n      DB_USERNAME: '${DB_USERNAME:-myuser}'\n      DB_PASSWORD: '${DB_PASSWORD:-mypassword}'\n","yml","",[121,172,173,186,194,207,215,223,231,239,247,255,263,271,279,290,307,317,350,358,367,375,387,399,407,415,423,438,453,468,476,531,542,553,565,576,584,594,607,616,623,631,639,650,661,668,675,682,695,708,716,726,739,748,755,763,771,782,793,800,807,814,827,840,848,858,868,880,908,915,922,930,937,944,951,958,966,974,981,995,1009,1024],{"__ignoreMap":170},[174,175,178,182],"span",{"class":176,"line":177},"line",1,[174,179,181],{"class":180},"swJcz","networks",[174,183,185],{"class":184},"sMK4o",":\n",[174,187,189,192],{"class":176,"line":188},2,[174,190,191],{"class":180},"  mongo-cluster",[174,193,185],{"class":184},[174,195,197,200,203],{"class":176,"line":196},3,[174,198,199],{"class":180},"    driver",[174,201,202],{"class":184},":",[174,204,206],{"class":205},"sfazB"," bridge\n",[174,208,210,213],{"class":176,"line":209},4,[174,211,212],{"class":180},"volumes",[174,214,185],{"class":184},[174,216,218,221],{"class":176,"line":217},5,[174,219,220],{"class":180},"  mongo1_data",[174,222,185],{"class":184},[174,224,226,229],{"class":176,"line":225},6,[174,227,228],{"class":180},"  mongo1_config",[174,230,185],{"class":184},[174,232,234,237],{"class":176,"line":233},7,[174,235,236],{"class":180},"  mongo2_data",[174,238,185],{"class":184},[174,240,242,245],{"class":176,"line":241},8,[174,243,244],{"class":180},"  mongo2_config",[174,246,185],{"class":184},[174,248,250,253],{"class":176,"line":249},9,[174,251,252],{"class":180},"  mongo3_data",[174,254,185],{"class":184},[174,256,258,261],{"class":176,"line":257},10,[174,259,260],{"class":180},"  mongo3_config",[174,262,185],{"class":184},[174,264,266,269],{"class":176,"line":265},11,[174,267,268],{"class":180},"services",[174,270,185],{"class":184},[174,272,274,277],{"class":176,"line":273},12,[174,275,276],{"class":180},"  mongo1",[174,278,185],{"class":184},[174,280,282,285,287],{"class":176,"line":281},13,[174,283,284],{"class":180},"    container_name",[174,286,202],{"class":184},[174,288,289],{"class":205}," mongo1\n",[174,291,293,296,298,301,304],{"class":176,"line":292},14,[174,294,295],{"class":180},"    image",[174,297,202],{"class":184},[174,299,300],{"class":184}," '",[174,302,303],{"class":205},"mongo:8.2-noble",[174,305,306],{"class":184},"'\n",[174,308,310,313,315],{"class":176,"line":309},15,[174,311,312],{"class":180},"    hostname",[174,314,202],{"class":184},[174,316,289],{"class":205},[174,318,320,323,325,328,331,334,336,339,342,345,347],{"class":176,"line":319},16,[174,321,322],{"class":180},"    command",[174,324,202],{"class":184},[174,326,327],{"class":184}," [",[174,329,330],{"class":184},"\"",[174,332,333],{"class":205},"--config",[174,335,330],{"class":184},[174,337,338],{"class":184},",",[174,340,341],{"class":184}," \"",[174,343,344],{"class":205},"\u002Fetc\u002Fmongod.conf",[174,346,330],{"class":184},[174,348,349],{"class":184},"]\n",[174,351,353,356],{"class":176,"line":352},17,[174,354,355],{"class":180},"    volumes",[174,357,185],{"class":184},[174,359,361,364],{"class":176,"line":360},18,[174,362,363],{"class":184},"      -",[174,365,366],{"class":205}," mongo1_data:\u002Fdata\u002Fdb\n",[174,368,370,372],{"class":176,"line":369},19,[174,371,363],{"class":184},[174,373,374],{"class":205}," mongo1_config:\u002Fdata\u002Fconfigdb\n",[174,376,378,380,382,385],{"class":176,"line":377},20,[174,379,363],{"class":184},[174,381,300],{"class":184},[174,383,384],{"class":205},"$PWD\u002Fscripts\u002Fmongo\u002Frs_keyfile:\u002Fetc\u002Fmongodb\u002Fkeyfile:ro",[174,386,306],{"class":184},[174,388,390,392,394,397],{"class":176,"line":389},21,[174,391,363],{"class":184},[174,393,300],{"class":184},[174,395,396],{"class":205},"$PWD\u002Fscripts\u002Fmongo\u002Fmongod.conf:\u002Fetc\u002Fmongod.conf:ro",[174,398,306],{"class":184},[174,400,402,405],{"class":176,"line":401},22,[174,403,404],{"class":180},"    networks",[174,406,185],{"class":184},[174,408,410,412],{"class":176,"line":409},23,[174,411,363],{"class":184},[174,413,414],{"class":205}," mongo-cluster\n",[174,416,418,421],{"class":176,"line":417},24,[174,419,420],{"class":180},"    environment",[174,422,185],{"class":184},[174,424,426,429,431,433,436],{"class":176,"line":425},25,[174,427,428],{"class":180},"      MONGO_INITDB_ROOT_USERNAME",[174,430,202],{"class":184},[174,432,300],{"class":184},[174,434,435],{"class":205},"${MONGO_ADMIN_USER:-admin}",[174,437,306],{"class":184},[174,439,441,444,446,448,451],{"class":176,"line":440},26,[174,442,443],{"class":180},"      MONGO_INITDB_ROOT_PASSWORD",[174,445,202],{"class":184},[174,447,300],{"class":184},[174,449,450],{"class":205},"${MONGO_ADMIN_PASSWD:-veryStringPassword}",[174,452,306],{"class":184},[174,454,456,459,461,463,466],{"class":176,"line":455},27,[174,457,458],{"class":180},"      MONGO_INITDB_DATABASE",[174,460,202],{"class":184},[174,462,300],{"class":184},[174,464,465],{"class":205},"${DB_NAME:-test}",[174,467,306],{"class":184},[174,469,471,474],{"class":176,"line":470},28,[174,472,473],{"class":180},"    healthcheck",[174,475,185],{"class":184},[174,477,479,482,484,486,488,491,493,495,497,500,502,504,506,509,511,513,515,518,520,522,524,527,529],{"class":176,"line":478},29,[174,480,481],{"class":180},"      test",[174,483,202],{"class":184},[174,485,327],{"class":184},[174,487,330],{"class":184},[174,489,490],{"class":205},"CMD",[174,492,330],{"class":184},[174,494,338],{"class":184},[174,496,341],{"class":184},[174,498,499],{"class":205},"mongosh",[174,501,330],{"class":184},[174,503,338],{"class":184},[174,505,341],{"class":184},[174,507,508],{"class":205},"--quiet",[174,510,330],{"class":184},[174,512,338],{"class":184},[174,514,341],{"class":184},[174,516,517],{"class":205},"--eval",[174,519,330],{"class":184},[174,521,338],{"class":184},[174,523,341],{"class":184},[174,525,526],{"class":205},"try { rs.status().ok } catch(e) { rs.initiate().ok }",[174,528,330],{"class":184},[174,530,349],{"class":184},[174,532,534,537,539],{"class":176,"line":533},30,[174,535,536],{"class":180},"      timeout",[174,538,202],{"class":184},[174,540,541],{"class":205}," 5m\n",[174,543,545,548,550],{"class":176,"line":544},31,[174,546,547],{"class":180},"      interval",[174,549,202],{"class":184},[174,551,552],{"class":205}," 10s\n",[174,554,556,559,561],{"class":176,"line":555},32,[174,557,558],{"class":180},"      retries",[174,560,202],{"class":184},[174,562,564],{"class":563},"sbssI"," 5\n",[174,566,568,571,573],{"class":176,"line":567},33,[174,569,570],{"class":180},"      start_period",[174,572,202],{"class":184},[174,574,575],{"class":205}," 12s\n",[174,577,579,582],{"class":176,"line":578},34,[174,580,581],{"class":180},"  mongo2",[174,583,185],{"class":184},[174,585,587,589,591],{"class":176,"line":586},35,[174,588,284],{"class":180},[174,590,202],{"class":184},[174,592,593],{"class":205}," mongo2\n",[174,595,597,599,601,603,605],{"class":176,"line":596},36,[174,598,295],{"class":180},[174,600,202],{"class":184},[174,602,300],{"class":184},[174,604,303],{"class":205},[174,606,306],{"class":184},[174,608,610,612,614],{"class":176,"line":609},37,[174,611,312],{"class":180},[174,613,202],{"class":184},[174,615,593],{"class":205},[174,617,619,621],{"class":176,"line":618},38,[174,620,355],{"class":180},[174,622,185],{"class":184},[174,624,626,628],{"class":176,"line":625},39,[174,627,363],{"class":184},[174,629,630],{"class":205}," mongo2_data:\u002Fdata\u002Fdb\n",[174,632,634,636],{"class":176,"line":633},40,[174,635,363],{"class":184},[174,637,638],{"class":205}," mongo2_config:\u002Fdata\u002Fconfigdb\n",[174,640,642,644,646,648],{"class":176,"line":641},41,[174,643,363],{"class":184},[174,645,300],{"class":184},[174,647,384],{"class":205},[174,649,306],{"class":184},[174,651,653,655,657,659],{"class":176,"line":652},42,[174,654,363],{"class":184},[174,656,300],{"class":184},[174,658,396],{"class":205},[174,660,306],{"class":184},[174,662,664,666],{"class":176,"line":663},43,[174,665,404],{"class":180},[174,667,185],{"class":184},[174,669,671,673],{"class":176,"line":670},44,[174,672,363],{"class":184},[174,674,414],{"class":205},[174,676,678,680],{"class":176,"line":677},45,[174,679,420],{"class":180},[174,681,185],{"class":184},[174,683,685,687,689,691,693],{"class":176,"line":684},46,[174,686,428],{"class":180},[174,688,202],{"class":184},[174,690,300],{"class":184},[174,692,435],{"class":205},[174,694,306],{"class":184},[174,696,698,700,702,704,706],{"class":176,"line":697},47,[174,699,443],{"class":180},[174,701,202],{"class":184},[174,703,300],{"class":184},[174,705,450],{"class":205},[174,707,306],{"class":184},[174,709,711,714],{"class":176,"line":710},48,[174,712,713],{"class":180},"  mongo3",[174,715,185],{"class":184},[174,717,719,721,723],{"class":176,"line":718},49,[174,720,284],{"class":180},[174,722,202],{"class":184},[174,724,725],{"class":205}," mongo3\n",[174,727,729,731,733,735,737],{"class":176,"line":728},50,[174,730,295],{"class":180},[174,732,202],{"class":184},[174,734,300],{"class":184},[174,736,303],{"class":205},[174,738,306],{"class":184},[174,740,742,744,746],{"class":176,"line":741},51,[174,743,312],{"class":180},[174,745,202],{"class":184},[174,747,725],{"class":205},[174,749,751,753],{"class":176,"line":750},52,[174,752,355],{"class":180},[174,754,185],{"class":184},[174,756,758,760],{"class":176,"line":757},53,[174,759,363],{"class":184},[174,761,762],{"class":205}," mongo3_data:\u002Fdata\u002Fdb\n",[174,764,766,768],{"class":176,"line":765},54,[174,767,363],{"class":184},[174,769,770],{"class":205}," mongo3_config:\u002Fdata\u002Fconfigdb\n",[174,772,774,776,778,780],{"class":176,"line":773},55,[174,775,363],{"class":184},[174,777,300],{"class":184},[174,779,384],{"class":205},[174,781,306],{"class":184},[174,783,785,787,789,791],{"class":176,"line":784},56,[174,786,363],{"class":184},[174,788,300],{"class":184},[174,790,396],{"class":205},[174,792,306],{"class":184},[174,794,796,798],{"class":176,"line":795},57,[174,797,404],{"class":180},[174,799,185],{"class":184},[174,801,803,805],{"class":176,"line":802},58,[174,804,363],{"class":184},[174,806,414],{"class":205},[174,808,810,812],{"class":176,"line":809},59,[174,811,420],{"class":180},[174,813,185],{"class":184},[174,815,817,819,821,823,825],{"class":176,"line":816},60,[174,818,428],{"class":180},[174,820,202],{"class":184},[174,822,300],{"class":184},[174,824,435],{"class":205},[174,826,306],{"class":184},[174,828,830,832,834,836,838],{"class":176,"line":829},61,[174,831,443],{"class":180},[174,833,202],{"class":184},[174,835,300],{"class":184},[174,837,450],{"class":205},[174,839,306],{"class":184},[174,841,843,846],{"class":176,"line":842},62,[174,844,845],{"class":180},"  mongo-init",[174,847,185],{"class":184},[174,849,851,853,855],{"class":176,"line":850},63,[174,852,284],{"class":180},[174,854,202],{"class":184},[174,856,857],{"class":205}," mongo-init\n",[174,859,861,863,865],{"class":176,"line":860},64,[174,862,295],{"class":180},[174,864,202],{"class":184},[174,866,867],{"class":205}," docker.io\u002Fmongo:8.2-noble\n",[174,869,871,874,876],{"class":176,"line":870},65,[174,872,873],{"class":180},"    restart",[174,875,202],{"class":184},[174,877,879],{"class":878},"sfNiH"," no\n",[174,881,883,886,888,890,892,895,897,899,901,904,906],{"class":176,"line":882},66,[174,884,885],{"class":180},"    entrypoint",[174,887,202],{"class":184},[174,889,327],{"class":184},[174,891,330],{"class":184},[174,893,894],{"class":205},"\u002Fbin\u002Fbash",[174,896,330],{"class":184},[174,898,338],{"class":184},[174,900,341],{"class":184},[174,902,903],{"class":205},"\u002Finit.sh",[174,905,330],{"class":184},[174,907,349],{"class":184},[174,909,911,913],{"class":176,"line":910},67,[174,912,404],{"class":180},[174,914,185],{"class":184},[174,916,918,920],{"class":176,"line":917},68,[174,919,363],{"class":184},[174,921,414],{"class":205},[174,923,925,928],{"class":176,"line":924},69,[174,926,927],{"class":180},"    depends_on",[174,929,185],{"class":184},[174,931,933,935],{"class":176,"line":932},70,[174,934,363],{"class":184},[174,936,289],{"class":205},[174,938,940,942],{"class":176,"line":939},71,[174,941,363],{"class":184},[174,943,593],{"class":205},[174,945,947,949],{"class":176,"line":946},72,[174,948,363],{"class":184},[174,950,725],{"class":205},[174,952,954,956],{"class":176,"line":953},73,[174,955,355],{"class":180},[174,957,185],{"class":184},[174,959,961,963],{"class":176,"line":960},74,[174,962,363],{"class":184},[174,964,965],{"class":205}," $PWD\u002Fscripts\u002Fmongo\u002Finit.js:\u002Finit.js\n",[174,967,969,971],{"class":176,"line":968},75,[174,970,363],{"class":184},[174,972,973],{"class":205}," $PWD\u002Fscripts\u002Fmongo\u002Finit.sh:\u002Finit.sh\n",[174,975,977,979],{"class":176,"line":976},76,[174,978,420],{"class":180},[174,980,185],{"class":184},[174,982,984,987,989,991,993],{"class":176,"line":983},77,[174,985,986],{"class":180},"      MONGO_ROOT_USERNAME",[174,988,202],{"class":184},[174,990,300],{"class":184},[174,992,435],{"class":205},[174,994,306],{"class":184},[174,996,998,1001,1003,1005,1007],{"class":176,"line":997},78,[174,999,1000],{"class":180},"      MONGO_ROOT_PASSWORD",[174,1002,202],{"class":184},[174,1004,300],{"class":184},[174,1006,450],{"class":205},[174,1008,306],{"class":184},[174,1010,1012,1015,1017,1019,1022],{"class":176,"line":1011},79,[174,1013,1014],{"class":180},"      DB_USERNAME",[174,1016,202],{"class":184},[174,1018,300],{"class":184},[174,1020,1021],{"class":205},"${DB_USERNAME:-myuser}",[174,1023,306],{"class":184},[174,1025,1027,1030,1032,1034,1037],{"class":176,"line":1026},80,[174,1028,1029],{"class":180},"      DB_PASSWORD",[174,1031,202],{"class":184},[174,1033,300],{"class":184},[174,1035,1036],{"class":205},"${DB_PASSWORD:-mypassword}",[174,1038,306],{"class":184},[15,1040,1041,1042,1044],{},"Décortiquons le fichier ",[121,1043,123],{}," :",[126,1046,1047,1060,1073,1125],{},[129,1048,1049,1050,1052,1053,1055,1056,139,1058,89],{},"On définit un réseau ",[121,1051,148],{}," qui sera utilisé par tous les conteneurs MongoDB. Cela\ngarantit que les conteneurs peuvent communiquer entre eux via les hostnames ",[121,1054,134],{},",\n",[121,1057,138],{},[121,1059,142],{},[129,1061,1062,1063,135,1066,139,1069,1072],{},"On définit trois volumes : ",[121,1064,1065],{},"mongo1_data",[121,1067,1068],{},"mongo2_data",[121,1070,1071],{},"mongo3_data"," pour persister les\ndonnées de chaque conteneur MongoDB.",[129,1074,1075,1076,135,1078,139,1080,1082,1083,1085,1086,1089,1090,1093,1094,1097,1098,135,1100,139,1102,1104,1105,1055,1108,139,1111,1114,1115,1117,1118,1120,1121,139,1123,89],{},"On définit trois services : ",[121,1077,134],{},[121,1079,138],{},[121,1081,142],{},". Chaque service lance un\nconteneur MongoDB avec l'image ",[121,1084,303],{},". On spécifie l'option ",[121,1087,1088],{},"--replSet"," pour\ndéfinir le nom du replica set à ",[121,1091,1092],{},"rs0",". On spécifie également l'option ",[121,1095,1096],{},"--bind_ip"," pour lier\nle conteneur aux hostnames ",[121,1099,134],{},[121,1101,138],{},[121,1103,142],{},". On monte les volumes pour\npersister les données et le keyfile pour l'authentification. On expose les ports ",[121,1106,1107],{},"27017",[121,1109,1110],{},"27018",[121,1112,1113],{},"27019"," pour les conteneurs MongoDB. On définit un healthcheck pour le service\n",[121,1116,134],{}," pour vérifier le statut du replica set et l'initialiser s'il ne l'est pas encore.\nAprès réussite du healthcheck, le replica set est initialisé avec le nœud primary ",[121,1119,134],{},"\net les secondary ",[121,1122,138],{},[121,1124,142],{},[129,1126,1127,1128,1055,1131,135,1134,135,1137,139,1140,1143],{},"On définit les variables d'environnement ",[121,1129,1130],{},"MONGO_INITDB_ROOT_USERNAME",[121,1132,1133],{},"MONGO_INITDB_ROOT_PASSWORD",[121,1135,1136],{},"MONGO_INITDB_DATABASE",[121,1138,1139],{},"DB_USERNAME",[121,1141,1142],{},"DB_PASSWORD"," pour\nchaque service pour configurer l'authentification MongoDB. On utilise l'interpolation pour\ngarantir l'usage des valeurs par défaut si les variables d'environnement ne sont pas\ndéfinies.",[47,1145,1147],{"id":1146},"étape-2-créer-un-keyfile-pour-lauthentification","Étape 2 : créer un keyfile pour l'authentification",[15,1149,1150],{},"MongoDB utilise des keyfiles pour l'authentification interne entre les membres du replica set.\nDans certains scénarios où aucun credentials n'est défini, on n'en a pas besoin. Mais pour les\nbesoins de ce guide, il faut créer un keyfile et le monter dans les conteneurs MongoDB,\npuisqu'on utilise l'authentification.",[15,1152,1153],{},"Pour créer un keyfile, lance la commande suivante :",[165,1155,1159],{"className":1156,"code":1157,"language":1158,"meta":170,"style":170},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","openssl rand -base64 756 > scripts\u002Fmongo\u002Frs_keyfile && chmod 400 scripts\u002Fmongo\u002Frs_keyfile\n","bash",[121,1160,1161],{"__ignoreMap":170},[174,1162,1163,1167,1170,1173,1176,1179,1182,1185,1188,1191],{"class":176,"line":177},[174,1164,1166],{"class":1165},"sBMFI","openssl",[174,1168,1169],{"class":205}," rand",[174,1171,1172],{"class":205}," -base64",[174,1174,1175],{"class":563}," 756",[174,1177,1178],{"class":184}," >",[174,1180,1181],{"class":205}," scripts\u002Fmongo\u002Frs_keyfile",[174,1183,1184],{"class":184}," &&",[174,1186,1187],{"class":1165}," chmod",[174,1189,1190],{"class":563}," 400",[174,1192,1193],{"class":205}," scripts\u002Fmongo\u002Frs_keyfile\n",[15,1195,1196,1197,1200,1201,1204,1205,1208,1209,89],{},"Cette commande génère une clé aléatoire de 756 octets et la sauvegarde dans le fichier\n",[121,1198,1199],{},"scripts\u002Fmongo\u002Frs_keyfile",". On définit ensuite les permissions du fichier à ",[121,1202,1203],{},"400"," pour\ns'assurer que seul le propriétaire ",[121,1206,1207],{},"mongodb:mongodb"," peut lire et écrire le fichier. Tu peux\nen apprendre plus sur les keyfiles dans la\n",[83,1210,1213],{"href":1211,"rel":1212},"https:\u002F\u002Fwww.mongodb.com\u002Fdocs\u002Fmanual\u002Ftutorial\u002Fdeploy-replica-set-with-keyfile-access-control\u002F",[87],"doc MongoDB",[1215,1216,1217],"blockquote",{},[15,1218,1219],{},"Note : le keyfile sert à l'authentification interne entre les membres du replica set. Il est\nimportant de garder le keyfile sécurisé et de ne pas l'exposer à des utilisateurs non\nautorisés.",[47,1221,1223],{"id":1222},"étape-3-scripts-dinitialisation","Étape 3 : scripts d'initialisation",[1225,1226,1228],"h4",{"id":1227},"initialisation-mongodb","Initialisation MongoDB",[15,1230,1231,1232,1235,1236,1239],{},"Comme mentionné plus tôt, on va configurer une base de données initiale, un nom d'utilisateur\net un mot de passe pour le replica set MongoDB. Pour ce faire, on utilise un script\nd'initialisation qui sera exécuté au démarrage du conteneur MongoDB. Crée maintenant un\nfichier ",[121,1233,1234],{},"init.js"," dans le dossier ",[121,1237,1238],{},"scripts\u002Fmongo"," avec le contenu suivant :",[165,1241,1246],{"className":1242,"code":1243,"filename":1244,"language":1245,"meta":170,"style":170},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","db = db.getSiblingDB('admin');\n\ntry {\n  var rsConf = {\n    _id: 'okydookReplSet',\n    members: [\n      { _id: 0, host: 'mongo1:27017', priority: 2 },\n      { _id: 1, host: 'mongo2:27017' },\n      { _id: 2, host: 'mongo3:27017' }\n    ]\n  };\n  \n  \u002F\u002F Check if replica set is already initialized\n  var isInitialized = false;\n  try {\n    var status = rs.status();\n    if (status.ok === 1) {\n      isInitialized = true;\n      print(\"ReplicaSet already initiated\");\n    }\n  } catch(e) {\n    \u002F\u002F rs.status() throws error if not initialized yet\n    print(\"ReplicaSet not yet initiated, proceeding with initiation...\");\n  }\n  \n  if (!isInitialized) {\n    rs.initiate(rsConf);\n    print(\"ReplicaSet initiated successfully\");\n    \n    \u002F\u002F Wait for replica set to be ready\n    sleep(20000);\n  }\n} catch(e) {\n  print(\"Failed to initiate replica set: \" + e.message);\n  throw e;\n}\n","scripts\u002Fmongo\u002Finit.js","js",[121,1247,1248,1283,1289,1298,1312,1328,1338,1378,1404,1430,1435,1440,1445,1451,1465,1472,1495,1521,1533,1551,1556,1573,1578,1596,1601,1605,1622,1641,1658,1663,1668,1682,1686,1698,1727,1736],{"__ignoreMap":170},[174,1249,1250,1254,1257,1260,1262,1266,1269,1272,1275,1277,1280],{"class":176,"line":177},[174,1251,1253],{"class":1252},"sTEyZ","db ",[174,1255,1256],{"class":184},"=",[174,1258,1259],{"class":1252}," db",[174,1261,89],{"class":184},[174,1263,1265],{"class":1264},"s2Zo4","getSiblingDB",[174,1267,1268],{"class":1252},"(",[174,1270,1271],{"class":184},"'",[174,1273,1274],{"class":205},"admin",[174,1276,1271],{"class":184},[174,1278,1279],{"class":1252},")",[174,1281,1282],{"class":184},";\n",[174,1284,1285],{"class":176,"line":188},[174,1286,1288],{"emptyLinePlaceholder":1287},true,"\n",[174,1290,1291,1295],{"class":176,"line":196},[174,1292,1294],{"class":1293},"s7zQu","try",[174,1296,1297],{"class":184}," {\n",[174,1299,1300,1304,1307,1310],{"class":176,"line":209},[174,1301,1303],{"class":1302},"spNyl","  var",[174,1305,1306],{"class":1252}," rsConf",[174,1308,1309],{"class":184}," =",[174,1311,1297],{"class":184},[174,1313,1314,1317,1319,1321,1324,1326],{"class":176,"line":217},[174,1315,1316],{"class":180},"    _id",[174,1318,202],{"class":184},[174,1320,300],{"class":184},[174,1322,1323],{"class":205},"okydookReplSet",[174,1325,1271],{"class":184},[174,1327,1055],{"class":184},[174,1329,1330,1333,1335],{"class":176,"line":225},[174,1331,1332],{"class":180},"    members",[174,1334,202],{"class":184},[174,1336,1337],{"class":180}," [\n",[174,1339,1340,1343,1346,1348,1351,1353,1356,1358,1360,1363,1365,1367,1370,1372,1375],{"class":176,"line":233},[174,1341,1342],{"class":184},"      {",[174,1344,1345],{"class":180}," _id",[174,1347,202],{"class":184},[174,1349,1350],{"class":563}," 0",[174,1352,338],{"class":184},[174,1354,1355],{"class":180}," host",[174,1357,202],{"class":184},[174,1359,300],{"class":184},[174,1361,1362],{"class":205},"mongo1:27017",[174,1364,1271],{"class":184},[174,1366,338],{"class":184},[174,1368,1369],{"class":180}," priority",[174,1371,202],{"class":184},[174,1373,1374],{"class":563}," 2",[174,1376,1377],{"class":184}," },\n",[174,1379,1380,1382,1384,1386,1389,1391,1393,1395,1397,1400,1402],{"class":176,"line":241},[174,1381,1342],{"class":184},[174,1383,1345],{"class":180},[174,1385,202],{"class":184},[174,1387,1388],{"class":563}," 1",[174,1390,338],{"class":184},[174,1392,1355],{"class":180},[174,1394,202],{"class":184},[174,1396,300],{"class":184},[174,1398,1399],{"class":205},"mongo2:27017",[174,1401,1271],{"class":184},[174,1403,1377],{"class":184},[174,1405,1406,1408,1410,1412,1414,1416,1418,1420,1422,1425,1427],{"class":176,"line":249},[174,1407,1342],{"class":184},[174,1409,1345],{"class":180},[174,1411,202],{"class":184},[174,1413,1374],{"class":563},[174,1415,338],{"class":184},[174,1417,1355],{"class":180},[174,1419,202],{"class":184},[174,1421,300],{"class":184},[174,1423,1424],{"class":205},"mongo3:27017",[174,1426,1271],{"class":184},[174,1428,1429],{"class":184}," }\n",[174,1431,1432],{"class":176,"line":257},[174,1433,1434],{"class":180},"    ]\n",[174,1436,1437],{"class":176,"line":265},[174,1438,1439],{"class":184},"  };\n",[174,1441,1442],{"class":176,"line":273},[174,1443,1444],{"class":180},"  \n",[174,1446,1447],{"class":176,"line":281},[174,1448,1450],{"class":1449},"sHwdD","  \u002F\u002F Check if replica set is already initialized\n",[174,1452,1453,1455,1458,1460,1463],{"class":176,"line":292},[174,1454,1303],{"class":1302},[174,1456,1457],{"class":1252}," isInitialized",[174,1459,1309],{"class":184},[174,1461,1462],{"class":878}," false",[174,1464,1282],{"class":184},[174,1466,1467,1470],{"class":176,"line":309},[174,1468,1469],{"class":1293},"  try",[174,1471,1297],{"class":184},[174,1473,1474,1477,1480,1482,1485,1487,1490,1493],{"class":176,"line":319},[174,1475,1476],{"class":1302},"    var",[174,1478,1479],{"class":1252}," status",[174,1481,1309],{"class":184},[174,1483,1484],{"class":1252}," rs",[174,1486,89],{"class":184},[174,1488,1489],{"class":1264},"status",[174,1491,1492],{"class":180},"()",[174,1494,1282],{"class":184},[174,1496,1497,1500,1503,1505,1507,1510,1513,1515,1518],{"class":176,"line":352},[174,1498,1499],{"class":1293},"    if",[174,1501,1502],{"class":180}," (",[174,1504,1489],{"class":1252},[174,1506,89],{"class":184},[174,1508,1509],{"class":1252},"ok",[174,1511,1512],{"class":184}," ===",[174,1514,1388],{"class":563},[174,1516,1517],{"class":180},") ",[174,1519,1520],{"class":184},"{\n",[174,1522,1523,1526,1528,1531],{"class":176,"line":360},[174,1524,1525],{"class":1252},"      isInitialized",[174,1527,1309],{"class":184},[174,1529,1530],{"class":878}," true",[174,1532,1282],{"class":184},[174,1534,1535,1538,1540,1542,1545,1547,1549],{"class":176,"line":369},[174,1536,1537],{"class":1264},"      print",[174,1539,1268],{"class":180},[174,1541,330],{"class":184},[174,1543,1544],{"class":205},"ReplicaSet already initiated",[174,1546,330],{"class":184},[174,1548,1279],{"class":180},[174,1550,1282],{"class":184},[174,1552,1553],{"class":176,"line":377},[174,1554,1555],{"class":184},"    }\n",[174,1557,1558,1561,1564,1566,1569,1571],{"class":176,"line":389},[174,1559,1560],{"class":184},"  }",[174,1562,1563],{"class":1293}," catch",[174,1565,1268],{"class":180},[174,1567,1568],{"class":1252},"e",[174,1570,1517],{"class":180},[174,1572,1520],{"class":184},[174,1574,1575],{"class":176,"line":401},[174,1576,1577],{"class":1449},"    \u002F\u002F rs.status() throws error if not initialized yet\n",[174,1579,1580,1583,1585,1587,1590,1592,1594],{"class":176,"line":409},[174,1581,1582],{"class":1264},"    print",[174,1584,1268],{"class":180},[174,1586,330],{"class":184},[174,1588,1589],{"class":205},"ReplicaSet not yet initiated, proceeding with initiation...",[174,1591,330],{"class":184},[174,1593,1279],{"class":180},[174,1595,1282],{"class":184},[174,1597,1598],{"class":176,"line":417},[174,1599,1600],{"class":184},"  }\n",[174,1602,1603],{"class":176,"line":425},[174,1604,1444],{"class":180},[174,1606,1607,1610,1612,1615,1618,1620],{"class":176,"line":440},[174,1608,1609],{"class":1293},"  if",[174,1611,1502],{"class":180},[174,1613,1614],{"class":184},"!",[174,1616,1617],{"class":1252},"isInitialized",[174,1619,1517],{"class":180},[174,1621,1520],{"class":184},[174,1623,1624,1627,1629,1632,1634,1637,1639],{"class":176,"line":455},[174,1625,1626],{"class":1252},"    rs",[174,1628,89],{"class":184},[174,1630,1631],{"class":1264},"initiate",[174,1633,1268],{"class":180},[174,1635,1636],{"class":1252},"rsConf",[174,1638,1279],{"class":180},[174,1640,1282],{"class":184},[174,1642,1643,1645,1647,1649,1652,1654,1656],{"class":176,"line":470},[174,1644,1582],{"class":1264},[174,1646,1268],{"class":180},[174,1648,330],{"class":184},[174,1650,1651],{"class":205},"ReplicaSet initiated successfully",[174,1653,330],{"class":184},[174,1655,1279],{"class":180},[174,1657,1282],{"class":184},[174,1659,1660],{"class":176,"line":478},[174,1661,1662],{"class":180},"    \n",[174,1664,1665],{"class":176,"line":533},[174,1666,1667],{"class":1449},"    \u002F\u002F Wait for replica set to be ready\n",[174,1669,1670,1673,1675,1678,1680],{"class":176,"line":544},[174,1671,1672],{"class":1264},"    sleep",[174,1674,1268],{"class":180},[174,1676,1677],{"class":563},"20000",[174,1679,1279],{"class":180},[174,1681,1282],{"class":184},[174,1683,1684],{"class":176,"line":555},[174,1685,1600],{"class":184},[174,1687,1688,1691,1693,1696],{"class":176,"line":567},[174,1689,1690],{"class":184},"}",[174,1692,1563],{"class":1293},[174,1694,1695],{"class":1252},"(e) ",[174,1697,1520],{"class":184},[174,1699,1700,1703,1705,1707,1710,1712,1715,1718,1720,1723,1725],{"class":176,"line":578},[174,1701,1702],{"class":1264},"  print",[174,1704,1268],{"class":180},[174,1706,330],{"class":184},[174,1708,1709],{"class":205},"Failed to initiate replica set: ",[174,1711,330],{"class":184},[174,1713,1714],{"class":184}," +",[174,1716,1717],{"class":1252}," e",[174,1719,89],{"class":184},[174,1721,1722],{"class":1252},"message",[174,1724,1279],{"class":180},[174,1726,1282],{"class":184},[174,1728,1729,1732,1734],{"class":176,"line":586},[174,1730,1731],{"class":1293},"  throw",[174,1733,1717],{"class":1252},[174,1735,1282],{"class":184},[174,1737,1738],{"class":176,"line":596},[174,1739,1740],{"class":184},"}\n",[15,1742,1041,1743,1044],{},[121,1744,1234],{},[126,1746,1747,1752,1764],{},[129,1748,1749,1750,89],{},"On se connecte à la base spécifiée par la variable ",[121,1751,1136],{},[129,1753,1754,1755,139,1757,1759,1760,1763],{},"On crée un utilisateur spécifié par les variables ",[121,1756,1139],{},[121,1758,1142],{}," avec le\nrôle ",[121,1761,1762],{},"readWrite"," sur la base.",[129,1765,1766,1767,1770,1771,1774],{},"On définit le write concern à ",[121,1768,1769],{},"majority"," avec un timeout de ",[121,1772,1773],{},"5000"," millisecondes. Cela\ngarantit que l'opération d'écriture est acquittée par la majorité des membres du replica set.",[15,1776,1777,1778,1783],{},"Ce script s'exécute au démarrage du conteneur MongoDB, créant la base et l'utilisateur\ninitiaux pour le replica set. Note que la partie scriptée n'est pas obligatoire et que tu\npourrais utiliser des valeurs en dur. Cependant, selon la\n",[83,1779,1782],{"href":1780,"rel":1781},"https:\u002F\u002F12factor.net\u002Fconfig",[87],"section III du 12-factor app",", il vaut mieux utiliser les\nvariables d'environnement pour stocker les secrets ou tout ce qui peut varier entre les\ndéploiements.",[1225,1785,1787],{"id":1786},"process-de-connexion-au-replicaset","Process de connexion au replicaset",[165,1789,1791],{"className":1156,"code":1790,"language":1158,"meta":170,"style":170},"#!\u002Fbin\u002Fbash\n\necho \"Waiting for MongoDB to be ready...\"\nsleep 15\n\n# Test connection\nuntil mongosh --host mongo1:27017 -u \"${MONGO_ROOT_USERNAME}\" -p \"${MONGO_ROOT_PASSWORD}\" --authenticationDatabase admin --eval \"db.adminCommand('ping')\" > \u002Fdev\u002Fnull 2>&1; do\n    echo \"Waiting for MongoDB connection...\"\n    sleep 5\ndone\n\necho \"MongoDB is ready, initializing replica set...\"\n\nmongosh --host mongo1:27017 \\\n    -u \"${MONGO_ROOT_USERNAME}\" \\\n    -p \"${MONGO_ROOT_PASSWORD}\" \\\n    --authenticationDatabase admin \\\n    --eval \"\n        var MONGO_DB_USER='${MONGO_DB_USER}';\n        var MONGO_DB_PASSWORD='${MONGO_DB_PASSWORD}';\n    \" \\\n    --file \u002Finit.js\n\nif [ $? -eq 0 ]; then\n    echo \"Initialization completed successfully\"\nelse\n    echo \"Initialization failed\"\n    exit 1\nfi\n",[121,1792,1793,1798,1802,1815,1823,1827,1832,1895,1907,1913,1918,1922,1933,1937,1948,1961,1974,1983,1991,2007,2021,2028,2036,2040,2061,2072,2077,2088,2096],{"__ignoreMap":170},[174,1794,1795],{"class":176,"line":177},[174,1796,1797],{"class":1449},"#!\u002Fbin\u002Fbash\n",[174,1799,1800],{"class":176,"line":188},[174,1801,1288],{"emptyLinePlaceholder":1287},[174,1803,1804,1807,1809,1812],{"class":176,"line":196},[174,1805,1806],{"class":1264},"echo",[174,1808,341],{"class":184},[174,1810,1811],{"class":205},"Waiting for MongoDB to be ready...",[174,1813,1814],{"class":184},"\"\n",[174,1816,1817,1820],{"class":176,"line":209},[174,1818,1819],{"class":1165},"sleep",[174,1821,1822],{"class":563}," 15\n",[174,1824,1825],{"class":176,"line":217},[174,1826,1288],{"emptyLinePlaceholder":1287},[174,1828,1829],{"class":176,"line":225},[174,1830,1831],{"class":1449},"# Test connection\n",[174,1833,1834,1837,1840,1843,1846,1849,1852,1855,1858,1861,1863,1866,1868,1871,1874,1877,1879,1882,1884,1886,1889,1892],{"class":176,"line":233},[174,1835,1836],{"class":1293},"until",[174,1838,1839],{"class":1165}," mongosh",[174,1841,1842],{"class":205}," --host",[174,1844,1845],{"class":205}," mongo1:27017",[174,1847,1848],{"class":205}," -u",[174,1850,1851],{"class":184}," \"${",[174,1853,1854],{"class":1252},"MONGO_ROOT_USERNAME",[174,1856,1857],{"class":184},"}\"",[174,1859,1860],{"class":205}," -p",[174,1862,1851],{"class":184},[174,1864,1865],{"class":1252},"MONGO_ROOT_PASSWORD",[174,1867,1857],{"class":184},[174,1869,1870],{"class":205}," --authenticationDatabase",[174,1872,1873],{"class":205}," admin",[174,1875,1876],{"class":205}," --eval",[174,1878,341],{"class":184},[174,1880,1881],{"class":205},"db.adminCommand('ping')",[174,1883,330],{"class":184},[174,1885,1178],{"class":184},[174,1887,1888],{"class":205}," \u002Fdev\u002Fnull",[174,1890,1891],{"class":184}," 2>&1;",[174,1893,1894],{"class":1293}," do\n",[174,1896,1897,1900,1902,1905],{"class":176,"line":241},[174,1898,1899],{"class":1264},"    echo",[174,1901,341],{"class":184},[174,1903,1904],{"class":205},"Waiting for MongoDB connection...",[174,1906,1814],{"class":184},[174,1908,1909,1911],{"class":176,"line":249},[174,1910,1672],{"class":1165},[174,1912,564],{"class":563},[174,1914,1915],{"class":176,"line":257},[174,1916,1917],{"class":1293},"done\n",[174,1919,1920],{"class":176,"line":265},[174,1921,1288],{"emptyLinePlaceholder":1287},[174,1923,1924,1926,1928,1931],{"class":176,"line":273},[174,1925,1806],{"class":1264},[174,1927,341],{"class":184},[174,1929,1930],{"class":205},"MongoDB is ready, initializing replica set...",[174,1932,1814],{"class":184},[174,1934,1935],{"class":176,"line":281},[174,1936,1288],{"emptyLinePlaceholder":1287},[174,1938,1939,1941,1943,1945],{"class":176,"line":292},[174,1940,499],{"class":1165},[174,1942,1842],{"class":205},[174,1944,1845],{"class":205},[174,1946,1947],{"class":1252}," \\\n",[174,1949,1950,1953,1955,1957,1959],{"class":176,"line":309},[174,1951,1952],{"class":205},"    -u",[174,1954,1851],{"class":184},[174,1956,1854],{"class":1252},[174,1958,1857],{"class":184},[174,1960,1947],{"class":1252},[174,1962,1963,1966,1968,1970,1972],{"class":176,"line":319},[174,1964,1965],{"class":205},"    -p",[174,1967,1851],{"class":184},[174,1969,1865],{"class":1252},[174,1971,1857],{"class":184},[174,1973,1947],{"class":1252},[174,1975,1976,1979,1981],{"class":176,"line":352},[174,1977,1978],{"class":205},"    --authenticationDatabase",[174,1980,1873],{"class":205},[174,1982,1947],{"class":1252},[174,1984,1985,1988],{"class":176,"line":360},[174,1986,1987],{"class":205},"    --eval",[174,1989,1990],{"class":184}," \"\n",[174,1992,1993,1996,1999,2002,2004],{"class":176,"line":369},[174,1994,1995],{"class":205},"        var MONGO_DB_USER='",[174,1997,1998],{"class":184},"${",[174,2000,2001],{"class":1252},"MONGO_DB_USER",[174,2003,1690],{"class":184},[174,2005,2006],{"class":205},"';\n",[174,2008,2009,2012,2014,2017,2019],{"class":176,"line":377},[174,2010,2011],{"class":205},"        var MONGO_DB_PASSWORD='",[174,2013,1998],{"class":184},[174,2015,2016],{"class":1252},"MONGO_DB_PASSWORD",[174,2018,1690],{"class":184},[174,2020,2006],{"class":205},[174,2022,2023,2026],{"class":176,"line":389},[174,2024,2025],{"class":184},"    \"",[174,2027,1947],{"class":1252},[174,2029,2030,2033],{"class":176,"line":401},[174,2031,2032],{"class":205},"    --file",[174,2034,2035],{"class":205}," \u002Finit.js\n",[174,2037,2038],{"class":176,"line":409},[174,2039,1288],{"emptyLinePlaceholder":1287},[174,2041,2042,2045,2047,2050,2053,2055,2058],{"class":176,"line":417},[174,2043,2044],{"class":1293},"if",[174,2046,327],{"class":184},[174,2048,2049],{"class":1252}," $? ",[174,2051,2052],{"class":184},"-eq",[174,2054,1350],{"class":563},[174,2056,2057],{"class":184}," ];",[174,2059,2060],{"class":1293}," then\n",[174,2062,2063,2065,2067,2070],{"class":176,"line":425},[174,2064,1899],{"class":1264},[174,2066,341],{"class":184},[174,2068,2069],{"class":205},"Initialization completed successfully",[174,2071,1814],{"class":184},[174,2073,2074],{"class":176,"line":440},[174,2075,2076],{"class":1293},"else\n",[174,2078,2079,2081,2083,2086],{"class":176,"line":455},[174,2080,1899],{"class":1264},[174,2082,341],{"class":184},[174,2084,2085],{"class":205},"Initialization failed",[174,2087,1814],{"class":184},[174,2089,2090,2093],{"class":176,"line":470},[174,2091,2092],{"class":1264},"    exit",[174,2094,2095],{"class":563}," 1\n",[174,2097,2098],{"class":176,"line":478},[174,2099,2100],{"class":1293},"fi\n",[47,2102,2104],{"id":2103},"étape-4-démarrer-le-cluster-mongodb-replica-set","Étape 4 : démarrer le cluster MongoDB Replica Set",[15,2106,2107],{},"Maintenant que tout est en place, on peut démarrer le cluster MongoDB replica set avec Docker\nCompose en exécutant la commande suivante :",[165,2109,2111],{"className":1156,"code":2110,"language":1158,"meta":170,"style":170},"docker-compose up -d\n",[121,2112,2113],{"__ignoreMap":170},[174,2114,2115,2118,2121],{"class":176,"line":177},[174,2116,2117],{"class":1165},"docker-compose",[174,2119,2120],{"class":205}," up",[174,2122,2123],{"class":205}," -d\n",[1215,2125,2126],{},[15,2127,2128,2129,2132],{},"Note : le flag ",[121,2130,2131],{},"-d"," lance les conteneurs en mode détaché, ce qui signifie qu'ils tournent en\narrière-plan.",[47,2134,2136],{"id":2135},"étape-5-vérifier-le-replica-set-mongodb","Étape 5 : vérifier le replica set MongoDB",[15,2138,2139,2140,2143],{},"Pour vérifier que le replica set MongoDB tourne correctement, tu peux utiliser le shell\n",[121,2141,2142],{},"mongo"," pour te connecter au nœud primary et vérifier le statut du replica set. Lance la\ncommande suivante pour te connecter au primary :",[165,2145,2147],{"className":1156,"code":2146,"language":1158,"meta":170,"style":170},"docker exec -it mongo_rs0 mongosh -u admin -p veryStringPassword --authenticationDatabase admin\n",[121,2148,2149],{"__ignoreMap":170},[174,2150,2151,2154,2157,2160,2163,2165,2167,2169,2171,2174,2176],{"class":176,"line":177},[174,2152,2153],{"class":1165},"docker",[174,2155,2156],{"class":205}," exec",[174,2158,2159],{"class":205}," -it",[174,2161,2162],{"class":205}," mongo_rs0",[174,2164,1839],{"class":205},[174,2166,1848],{"class":205},[174,2168,1873],{"class":205},[174,2170,1860],{"class":205},[174,2172,2173],{"class":205}," veryStringPassword",[174,2175,1870],{"class":205},[174,2177,2178],{"class":205}," admin\n",[1215,2180,2181],{},[15,2182,2183,2184,2187,2188,2190,2191,89],{},"Note : remplace ",[121,2185,2186],{},"veryStringPassword"," par le mot de passe que tu as défini pour la variable\n",[121,2189,1133],{},". Si tu n'en as pas défini, utilise ",[121,2192,2186],{},[15,2194,2195],{},"Une fois connecté, lance la commande suivante pour vérifier le statut du replica set :",[165,2197,2199],{"className":1156,"code":2198,"language":1158,"meta":170,"style":170},"rs.status()\n",[121,2200,2201],{"__ignoreMap":170},[174,2202,2203,2206],{"class":176,"line":177},[174,2204,2205],{"class":1264},"rs.status",[174,2207,2208],{"class":184},"()\n",[15,2210,2211,2212,2214,2215,139,2217,2219],{},"Tu devrais voir le statut du replica set avec le nœud primary ",[121,2213,134],{}," et les secondary\n",[121,2216,138],{},[121,2218,142],{},". La sortie devrait ressembler à :",[165,2221,2225],{"className":2222,"code":2223,"language":2224,"meta":170,"style":170},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","members: [\n    {\n      _id: 0,\n      name: 'mongo1:27017',\n      health: 1,\n      state: 1,\n      stateStr: 'PRIMARY',\n      uptime: 478,\n      electionTime: Timestamp({ t: 1721354075, i: 1 }),\n      electionDate: ISODate('2024-07-19T01:54:35.000Z'),\n        ...\n    },\n    {\n      _id: 1,\n      name: 'mongo2:27018',\n      health: 1,\n      state: 2,\n      stateStr: 'SECONDARY',\n      uptime: 471,\n      syncSourceHost: 'mongo1:27017',\n        ...\n    },\n    {\n      _id: 2,\n      name: 'mongo3:27019',\n      health: 1,\n      state: 2,\n      stateStr: 'SECONDARY',\n      uptime: 471,\n      syncSourceHost: 'mongo1:27017',\n        ...\n    }\n  ],\n  ok: 1,\n  '$clusterTime': {\n    clusterTime: Timestamp({ t: 1721354536, i: 1 }),\n    signature: {\n      hash: Binary.createFromBase64('8KKPt\u002FSmHkhGZDH299+yq6j5i04=', 0),\n      keyId: Long('7393159456961331205')\n    }\n  },\n","json",[121,2226,2227,2235,2240,2251,2272,2283,2294,2306,2318,2355,2389,2394,2399,2403,2413,2432,2442,2452,2463,2474,2493,2497,2501,2505,2515,2534,2544,2554,2564,2574,2592,2596,2600,2607,2616,2623,2655,2664,2715,2731,2735],{"__ignoreMap":170},[174,2228,2229,2232],{"class":176,"line":177},[174,2230,2231],{"class":1252},"members: ",[174,2233,2234],{"class":184},"[\n",[174,2236,2237],{"class":176,"line":188},[174,2238,2239],{"class":184},"    {\n",[174,2241,2242,2245,2247,2249],{"class":176,"line":196},[174,2243,2244],{"class":1252},"      _id",[174,2246,202],{"class":184},[174,2248,1350],{"class":563},[174,2250,1055],{"class":184},[174,2252,2253,2256,2258,2261,2264,2266,2268,2270],{"class":176,"line":209},[174,2254,2255],{"class":1252},"      name",[174,2257,202],{"class":184},[174,2259,2260],{"class":1252}," 'mongo",[174,2262,2263],{"class":563},"1",[174,2265,202],{"class":1252},[174,2267,1107],{"class":563},[174,2269,1271],{"class":1252},[174,2271,1055],{"class":184},[174,2273,2274,2277,2279,2281],{"class":176,"line":217},[174,2275,2276],{"class":1252},"      health",[174,2278,202],{"class":184},[174,2280,1388],{"class":563},[174,2282,1055],{"class":184},[174,2284,2285,2288,2290,2292],{"class":176,"line":225},[174,2286,2287],{"class":1252},"      state",[174,2289,202],{"class":184},[174,2291,1388],{"class":563},[174,2293,1055],{"class":184},[174,2295,2296,2299,2301,2304],{"class":176,"line":233},[174,2297,2298],{"class":1252},"      stateStr",[174,2300,202],{"class":184},[174,2302,2303],{"class":1252}," 'PRIMARY'",[174,2305,1055],{"class":184},[174,2307,2308,2311,2313,2316],{"class":176,"line":241},[174,2309,2310],{"class":1252},"      uptime",[174,2312,202],{"class":184},[174,2314,2315],{"class":563}," 478",[174,2317,1055],{"class":184},[174,2319,2320,2323,2325,2328,2331,2334,2336,2339,2341,2344,2346,2348,2351,2353],{"class":176,"line":249},[174,2321,2322],{"class":1252},"      electionTime",[174,2324,202],{"class":184},[174,2326,2327],{"class":1252}," Timestamp(",[174,2329,2330],{"class":184},"{",[174,2332,2333],{"class":1252}," t",[174,2335,202],{"class":184},[174,2337,2338],{"class":563}," 1721354075",[174,2340,338],{"class":184},[174,2342,2343],{"class":1252}," i",[174,2345,202],{"class":184},[174,2347,1388],{"class":563},[174,2349,2350],{"class":184}," }",[174,2352,1279],{"class":1252},[174,2354,1055],{"class":184},[174,2356,2357,2360,2362,2365,2368,2371,2374,2376,2379,2381,2384,2387],{"class":176,"line":257},[174,2358,2359],{"class":1252},"      electionDate",[174,2361,202],{"class":184},[174,2363,2364],{"class":1252}," ISODate('",[174,2366,2367],{"class":563},"2024-07-19",[174,2369,2370],{"class":1252},"T",[174,2372,2373],{"class":563},"01",[174,2375,202],{"class":1252},[174,2377,2378],{"class":563},"54",[174,2380,202],{"class":1252},[174,2382,2383],{"class":563},"35.000",[174,2385,2386],{"class":1252},"Z')",[174,2388,1055],{"class":184},[174,2390,2391],{"class":176,"line":265},[174,2392,2393],{"class":1252},"        ...\n",[174,2395,2396],{"class":176,"line":273},[174,2397,2398],{"class":184},"    },\n",[174,2400,2401],{"class":176,"line":281},[174,2402,2239],{"class":184},[174,2404,2405,2407,2409,2411],{"class":176,"line":292},[174,2406,2244],{"class":1252},[174,2408,202],{"class":184},[174,2410,1388],{"class":563},[174,2412,1055],{"class":184},[174,2414,2415,2417,2419,2421,2424,2426,2428,2430],{"class":176,"line":309},[174,2416,2255],{"class":1252},[174,2418,202],{"class":184},[174,2420,2260],{"class":1252},[174,2422,2423],{"class":563},"2",[174,2425,202],{"class":1252},[174,2427,1110],{"class":563},[174,2429,1271],{"class":1252},[174,2431,1055],{"class":184},[174,2433,2434,2436,2438,2440],{"class":176,"line":319},[174,2435,2276],{"class":1252},[174,2437,202],{"class":184},[174,2439,1388],{"class":563},[174,2441,1055],{"class":184},[174,2443,2444,2446,2448,2450],{"class":176,"line":352},[174,2445,2287],{"class":1252},[174,2447,202],{"class":184},[174,2449,1374],{"class":563},[174,2451,1055],{"class":184},[174,2453,2454,2456,2458,2461],{"class":176,"line":360},[174,2455,2298],{"class":1252},[174,2457,202],{"class":184},[174,2459,2460],{"class":1252}," 'SECONDARY'",[174,2462,1055],{"class":184},[174,2464,2465,2467,2469,2472],{"class":176,"line":369},[174,2466,2310],{"class":1252},[174,2468,202],{"class":184},[174,2470,2471],{"class":563}," 471",[174,2473,1055],{"class":184},[174,2475,2476,2479,2481,2483,2485,2487,2489,2491],{"class":176,"line":377},[174,2477,2478],{"class":1252},"      syncSourceHost",[174,2480,202],{"class":184},[174,2482,2260],{"class":1252},[174,2484,2263],{"class":563},[174,2486,202],{"class":1252},[174,2488,1107],{"class":563},[174,2490,1271],{"class":1252},[174,2492,1055],{"class":184},[174,2494,2495],{"class":176,"line":389},[174,2496,2393],{"class":1252},[174,2498,2499],{"class":176,"line":401},[174,2500,2398],{"class":184},[174,2502,2503],{"class":176,"line":409},[174,2504,2239],{"class":184},[174,2506,2507,2509,2511,2513],{"class":176,"line":417},[174,2508,2244],{"class":1252},[174,2510,202],{"class":184},[174,2512,1374],{"class":563},[174,2514,1055],{"class":184},[174,2516,2517,2519,2521,2523,2526,2528,2530,2532],{"class":176,"line":425},[174,2518,2255],{"class":1252},[174,2520,202],{"class":184},[174,2522,2260],{"class":1252},[174,2524,2525],{"class":563},"3",[174,2527,202],{"class":1252},[174,2529,1113],{"class":563},[174,2531,1271],{"class":1252},[174,2533,1055],{"class":184},[174,2535,2536,2538,2540,2542],{"class":176,"line":440},[174,2537,2276],{"class":1252},[174,2539,202],{"class":184},[174,2541,1388],{"class":563},[174,2543,1055],{"class":184},[174,2545,2546,2548,2550,2552],{"class":176,"line":455},[174,2547,2287],{"class":1252},[174,2549,202],{"class":184},[174,2551,1374],{"class":563},[174,2553,1055],{"class":184},[174,2555,2556,2558,2560,2562],{"class":176,"line":470},[174,2557,2298],{"class":1252},[174,2559,202],{"class":184},[174,2561,2460],{"class":1252},[174,2563,1055],{"class":184},[174,2565,2566,2568,2570,2572],{"class":176,"line":478},[174,2567,2310],{"class":1252},[174,2569,202],{"class":184},[174,2571,2471],{"class":563},[174,2573,1055],{"class":184},[174,2575,2576,2578,2580,2582,2584,2586,2588,2590],{"class":176,"line":533},[174,2577,2478],{"class":1252},[174,2579,202],{"class":184},[174,2581,2260],{"class":1252},[174,2583,2263],{"class":563},[174,2585,202],{"class":1252},[174,2587,1107],{"class":563},[174,2589,1271],{"class":1252},[174,2591,1055],{"class":184},[174,2593,2594],{"class":176,"line":544},[174,2595,2393],{"class":1252},[174,2597,2598],{"class":176,"line":555},[174,2599,1555],{"class":184},[174,2601,2602,2605],{"class":176,"line":567},[174,2603,2604],{"class":184},"  ]",[174,2606,1055],{"class":1252},[174,2608,2609,2612,2614],{"class":176,"line":578},[174,2610,2611],{"class":1252},"  ok: ",[174,2613,2263],{"class":563},[174,2615,1055],{"class":1252},[174,2617,2618,2621],{"class":176,"line":586},[174,2619,2620],{"class":1252},"  '$clusterTime': ",[174,2622,1520],{"class":184},[174,2624,2625,2628,2630,2632,2634,2636,2638,2641,2643,2645,2647,2649,2651,2653],{"class":176,"line":596},[174,2626,2627],{"class":1252},"    clusterTime",[174,2629,202],{"class":184},[174,2631,2327],{"class":1252},[174,2633,2330],{"class":184},[174,2635,2333],{"class":1252},[174,2637,202],{"class":184},[174,2639,2640],{"class":563}," 1721354536",[174,2642,338],{"class":184},[174,2644,2343],{"class":1252},[174,2646,202],{"class":184},[174,2648,1388],{"class":563},[174,2650,2350],{"class":184},[174,2652,1279],{"class":1252},[174,2654,1055],{"class":184},[174,2656,2657,2660,2662],{"class":176,"line":609},[174,2658,2659],{"class":1252},"    signature",[174,2661,202],{"class":184},[174,2663,1297],{"class":184},[174,2665,2666,2669,2671,2674,2677,2680,2683,2686,2689,2692,2695,2698,2701,2704,2707,2710,2712],{"class":176,"line":618},[174,2667,2668],{"class":1252},"      hash",[174,2670,202],{"class":184},[174,2672,2673],{"class":1252}," Binary.createFromBase",[174,2675,2676],{"class":563},"64",[174,2678,2679],{"class":1252},"('",[174,2681,2682],{"class":563},"8",[174,2684,2685],{"class":1252},"KKPt\u002FSmHkhGZDH",[174,2687,2688],{"class":563},"299",[174,2690,2691],{"class":1252},"+yq",[174,2693,2694],{"class":563},"6",[174,2696,2697],{"class":1252},"j",[174,2699,2700],{"class":563},"5",[174,2702,2703],{"class":1252},"i",[174,2705,2706],{"class":563},"04",[174,2708,2709],{"class":1252},"='",[174,2711,338],{"class":184},[174,2713,2714],{"class":1252}," 0),\n",[174,2716,2717,2720,2722,2725,2728],{"class":176,"line":625},[174,2718,2719],{"class":1252},"      keyId",[174,2721,202],{"class":184},[174,2723,2724],{"class":1252}," Long('",[174,2726,2727],{"class":563},"7393159456961331205",[174,2729,2730],{"class":1252},"')\n",[174,2732,2733],{"class":176,"line":633},[174,2734,1555],{"class":184},[174,2736,2737,2739],{"class":176,"line":641},[174,2738,1560],{"class":184},[174,2740,1055],{"class":1252},[1215,2742,2743],{},[15,2744,2745],{},"Note : c'est une sortie tronquée, et elle peut varier selon la version de MongoDB utilisée.",[10,2747,2749],{"id":2748},"bonus-ajouter-mongo-express-pour-une-administration-web","Bonus : ajouter Mongo-Express pour une administration web",[15,2751,2752,2753,2756,2757,2759],{},"Ajoutons un outil d'administration web pour MongoDB en utilisant ",[121,2754,2755],{},"mongo-express",". Pour ajouter\n",[121,2758,2755],{}," au fichier Docker Compose, ajoute la définition de service suivante :",[165,2761,2763],{"className":167,"code":2762,"filename":123,"language":169,"meta":170,"style":170},"mongo-express:\n  container_name: mongo-express\n  image: 'mongo-express:latest'\n  ports:\n    - '8081:8081'\n  networks:\n    - mongo-cluster\n  environment:\n    ME_CONFIG_BASICAUTH: false\n    ME_CONFIG_MONGODB_ENABLE_ADMIN: false\n    ME_CONFIG_MONGODB_ADMINUSERNAME: '${MONGO_ADMIN_USER:-admin}'\n    ME_CONFIG_MONGODB_ADMINPASSWORD: '${MONGO_ADMIN_PASSWD:-veryStrongPassword}'\n    ME_CONFIG_MONGODB_URL: >-\n      mongodb:\u002F\u002F${DB_USERNAME:-myuser}:${DB_PASSWORD:-veryStringPassword}@mongo1:27017,mongo2:27018,mongo3:27019\u002F${DB_NAME}?replicaSet=rs0\n  depends_on:\n    mongo1:\n      condition: service_healthy\n\n",[121,2764,2765,2771,2781,2795,2802,2814,2821,2827,2834,2844,2853,2866,2880,2892,2897,2904,2911],{"__ignoreMap":170},[174,2766,2767,2769],{"class":176,"line":177},[174,2768,2755],{"class":180},[174,2770,185],{"class":184},[174,2772,2773,2776,2778],{"class":176,"line":188},[174,2774,2775],{"class":180},"  container_name",[174,2777,202],{"class":184},[174,2779,2780],{"class":205}," mongo-express\n",[174,2782,2783,2786,2788,2790,2793],{"class":176,"line":196},[174,2784,2785],{"class":180},"  image",[174,2787,202],{"class":184},[174,2789,300],{"class":184},[174,2791,2792],{"class":205},"mongo-express:latest",[174,2794,306],{"class":184},[174,2796,2797,2800],{"class":176,"line":209},[174,2798,2799],{"class":180},"  ports",[174,2801,185],{"class":184},[174,2803,2804,2807,2809,2812],{"class":176,"line":217},[174,2805,2806],{"class":184},"    -",[174,2808,300],{"class":184},[174,2810,2811],{"class":205},"8081:8081",[174,2813,306],{"class":184},[174,2815,2816,2819],{"class":176,"line":225},[174,2817,2818],{"class":180},"  networks",[174,2820,185],{"class":184},[174,2822,2823,2825],{"class":176,"line":233},[174,2824,2806],{"class":184},[174,2826,414],{"class":205},[174,2828,2829,2832],{"class":176,"line":241},[174,2830,2831],{"class":180},"  environment",[174,2833,185],{"class":184},[174,2835,2836,2839,2841],{"class":176,"line":249},[174,2837,2838],{"class":180},"    ME_CONFIG_BASICAUTH",[174,2840,202],{"class":184},[174,2842,2843],{"class":878}," false\n",[174,2845,2846,2849,2851],{"class":176,"line":257},[174,2847,2848],{"class":180},"    ME_CONFIG_MONGODB_ENABLE_ADMIN",[174,2850,202],{"class":184},[174,2852,2843],{"class":878},[174,2854,2855,2858,2860,2862,2864],{"class":176,"line":265},[174,2856,2857],{"class":180},"    ME_CONFIG_MONGODB_ADMINUSERNAME",[174,2859,202],{"class":184},[174,2861,300],{"class":184},[174,2863,435],{"class":205},[174,2865,306],{"class":184},[174,2867,2868,2871,2873,2875,2878],{"class":176,"line":273},[174,2869,2870],{"class":180},"    ME_CONFIG_MONGODB_ADMINPASSWORD",[174,2872,202],{"class":184},[174,2874,300],{"class":184},[174,2876,2877],{"class":205},"${MONGO_ADMIN_PASSWD:-veryStrongPassword}",[174,2879,306],{"class":184},[174,2881,2882,2885,2887,2889],{"class":176,"line":281},[174,2883,2884],{"class":180},"    ME_CONFIG_MONGODB_URL",[174,2886,202],{"class":184},[174,2888,1178],{"class":1293},[174,2890,2891],{"class":1302},"-\n",[174,2893,2894],{"class":176,"line":292},[174,2895,2896],{"class":205},"      mongodb:\u002F\u002F${DB_USERNAME:-myuser}:${DB_PASSWORD:-veryStringPassword}@mongo1:27017,mongo2:27018,mongo3:27019\u002F${DB_NAME}?replicaSet=rs0\n",[174,2898,2899,2902],{"class":176,"line":309},[174,2900,2901],{"class":180},"  depends_on",[174,2903,185],{"class":184},[174,2905,2906,2909],{"class":176,"line":319},[174,2907,2908],{"class":180},"    mongo1",[174,2910,185],{"class":184},[174,2912,2913,2916,2918],{"class":176,"line":352},[174,2914,2915],{"class":180},"      condition",[174,2917,202],{"class":184},[174,2919,2920],{"class":205}," service_healthy\n",[1215,2922,2923],{},[15,2924,2925,2926,2928,2929,2931,2932,89],{},"Note : le service ",[121,2927,2755],{}," dépend du service ",[121,2930,134],{}," healthy. Cela garantit que le\nreplica set est en marche avant de démarrer le service ",[121,2933,2755],{},[15,2935,2936,2937,2939,2940,2943],{},"Tu peux accéder à ",[121,2938,2755],{}," à ",[121,2941,2942],{},"http:\u002F\u002Flocalhost:8081"," dans ton navigateur, et avoir\nquelque chose comme :",[23,2945],{"alt":2946,"className":2947,"source":2949},"Connexion réussie à mongo-express",[27,2948,29],"max-w-full","https:\u002F\u002Fres.cloudinary.com\u002Fdpdwhd6ka\u002Fimage\u002Fupload\u002Ff_auto,q_auto\u002Fv1\u002FBlog\u002Farticles\u002Fhow-to\u002Fmongo-express",[1215,2951,2952],{},[15,2953,2954,2955,2958,2959,135,2961,139,2963,2966,2967,89],{},"Note : pour connecter ton application au replica set MongoDB, tu peux utiliser la chaîne de\nconnexion ",[121,2956,2957],{},"mongodb:\u002F\u002F${DB_USERNAME}:${DB_PASSWORD}@mongo1:27017,mongo2:27018,mongo3:27019\u002F${DB_NAME}?replicaSet=rs0",".\nPense aussi à remplacer ",[121,2960,1139],{},[121,2962,1142],{},[121,2964,2965],{},"DB_NAME"," par les credentials de ton\napplication en définissant les variables d'environnement dans le fichier ",[121,2968,2969],{},".env",[15,2971,2972],{},"Si tout est bien configuré, tu devrais avoir quelque chose comme ceci dans ton Docker\nDesktop :",[23,2974],{"alt":2975,"className":2976,"source":2977},"Replicaset créé avec succès",[27,2948,29],"https:\u002F\u002Fres.cloudinary.com\u002Fdpdwhd6ka\u002Fimage\u002Fupload\u002Ff_auto,q_auto\u002Fv1\u002FBlog\u002Farticles\u002Fhow-to\u002Fdocker-desktop",[15,2979,2980],{},"Et voilà, tu as un cluster MongoDB replica set avec un outil d'administration web !",[10,2982,2984],{"id":2983},"conclusion","Conclusion",[15,2986,2987,2988,2990],{},"Dans cet article, je t'ai guidé à travers la mise en place d'un cluster MongoDB replica set à\n3 nœuds avec Docker Compose. On a couvert les bases des replica sets MongoDB, les prérequis\npour mettre en place un replica set, et les étapes pour créer un fichier Docker Compose qui le\nconfigure. Je t'ai aussi montré comment vérifier le replica set et ajouter un outil\nd'administration web avec ",[121,2989,2755],{},". J'espère que ce guide t'aidera à démarrer avec les\nreplica sets MongoDB et Docker Compose.",[15,2992,2993,2994,2997],{},"Dans un futur article, je parlerai de quelque chose de plus important :\n",[35,2995,2996],{},"comment sauvegarder et restaurer une base MongoDB dans un environnement conteneurisé",".\nTu as peut-être entendu que les conteneurs Docker sont éphémères, donc il est important\nd'avoir une stratégie de backup en place pour éviter la perte de données. Reste à l'écoute !",[15,2999,3000],{},"Si tu as des questions ou des retours, n'hésite pas à me contacter. Bon code !",[10,3002,3004],{"id":3003},"références","Références",[126,3006,3007,3013,3020,3027,3033,3040,3047,3054],{},[129,3008,3009],{},[83,3010,3012],{"href":85,"rel":3011},[87],"Documentation MongoDB Replica Set",[129,3014,3015],{},[83,3016,3019],{"href":3017,"rel":3018},"https:\u002F\u002Fdocs.docker.com\u002F",[87],"Documentation Docker",[129,3021,3022],{},[83,3023,3026],{"href":3024,"rel":3025},"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002F",[87],"Documentation Docker Compose",[129,3028,3029],{},[83,3030,3032],{"href":110,"rel":3031},[87],"Opérations CRUD MongoDB",[129,3034,3035],{},[83,3036,3039],{"href":3037,"rel":3038},"https:\u002F\u002Fdocs.docker.com\u002Fstorage\u002Fvolumes\u002F",[87],"Volumes Docker",[129,3041,3042],{},[83,3043,3046],{"href":3044,"rel":3045},"https:\u002F\u002Fdocs.docker.com\u002Fnetwork\u002F",[87],"Réseaux Docker",[129,3048,3049],{},[83,3050,3053],{"href":3051,"rel":3052},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Freference\u002Fbuilder\u002F#healthcheck",[87],"Healthchecks Docker",[129,3055,3056],{},[83,3057,3060],{"href":3058,"rel":3059},"https:\u002F\u002Fgithub.com\u002Fmongo-express\u002Fmongo-express",[87],"Mongo-Express",[3062,3063,3064],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":170,"searchDepth":188,"depth":188,"links":3066},[3067,3068,3071,3079,3080,3081],{"id":12,"depth":188,"text":13},{"id":20,"depth":188,"text":21,"children":3069},[3070],{"id":49,"depth":196,"text":50},{"id":92,"depth":188,"text":5,"children":3072},[3073,3074,3075,3076,3077,3078],{"id":95,"depth":196,"text":96},{"id":115,"depth":196,"text":116},{"id":1146,"depth":196,"text":1147},{"id":1222,"depth":196,"text":1223},{"id":2103,"depth":196,"text":2104},{"id":2135,"depth":196,"text":2136},{"id":2748,"depth":188,"text":2749},{"id":2983,"depth":188,"text":2984},{"id":3003,"depth":188,"text":3004},"2024-07-17","Comment mettre en place un cluster MongoDB replica set à 3 nœuds avec Docker Compose. Apprends ce qu'est un replica set MongoDB, les prérequis, et les étapes pour créer un fichier Docker Compose qui le configure.","md","https:\u002F\u002Fres.cloudinary.com\u002Fdpdwhd6ka\u002Fimage\u002Fupload\u002Ff_auto,q_auto\u002Fv1\u002FBlog\u002Farticles\u002Fmongodb-replicaset",{},"\u002Fdevops\u002Fset-up-mongodb-replica-with-docker.fr",{"title":5,"description":3083},"set-up-mongodb-replica-set-with-docker","devops\u002F2.set-up-mongodb-replica-with-docker.fr",[3092,3093,3094,3095],"MongoDB","Replica-Set","Docker","Docker-compose",[3097,2153,3098],"devops","mongodb","r1HzjCuyw8LU_2eGvvEEWx4X9rZ6d5Q-nBF25WRs3-I",{"id":3101,"title":3102,"body":3103,"date":3082,"description":5654,"extension":3084,"img":3085,"meta":5655,"navigation":1287,"path":5656,"seo":5657,"slug":3089,"stem":5658,"tags":5659,"topics":5660,"__hash__":5661},"content\u002Fdevops\u002F2.set-up-mongodb-replica-with-docker.md","Setting Up a 3-Node MongoDB Replica Set Cluster with Docker Compose",{"type":7,"value":3104,"toc":5637},[3105,3107,3110,3114,3118,3121,3124,3128,3134,3140,3146,3152,3158,3161,3165,3172,3179,3183,3189,3216,3219,3917,3923,4008,4012,4015,4018,4044,4060,4065,4069,4073,4082,4492,4496,4524,4532,4536,4794,4798,4801,4813,4821,4825,4831,4859,4872,4875,4885,4896,5354,5359,5363,5372,5510,5523,5532,5536,5554,5557,5561,5564,5566,5572,5579,5582,5586,5634],[10,3106,13],{"id":12},[15,3108,3109],{},"In this blog post, I'll walk you through setting up a 3-node MongoDB replica set cluster using Docker Compose. This\nguide will assume you're familiar with basic Docker concepts such as Docker Compose, volumes, networks, and health\nchecks, as well as MongoDB concepts like replica sets. So, if you're ready, let's dive in!",[10,3111,3113],{"id":3112},"what-is-a-mongodb-replica-set","What is a MongoDB Replica Set?",[23,3115],{"alt":3116,"className":3117,"source":30},"Successful restored backup",[27,28,29],[15,3119,3120],{},"A mongoDB replica set is a group of mongoDB instances that host the same data set. In a replica set, one node is the\nprimary node that receives all write operations. All other nodes, known as secondary nodes, apply operations from the\nprimary so that they have the same data set.",[15,3122,3123],{},"MongoDB replica sets offer redundancy and high availability, keeping the database operational even if one or more nodes\ndie. They replicate data across multiple nodes to ensure integrity and availability.",[47,3125,3127],{"id":3126},"why-use-a-mongodb-replica-set","Why Use a MongoDB Replica Set?",[15,3129,53,3130,3133],{},[35,3131,3132],{},"High Availability",": If the primary node fails, a secondary node can be elected as the new primary, ensuring that the database remains available.",[15,3135,60,3136,3139],{},[35,3137,3138],{},"Data Redundancy",": Data is replicated across multiple nodes, ensuring data integrity and availability.",[15,3141,67,3142,3145],{},[35,3143,3144],{},"Read Scalability",": Secondary nodes can serve read operations, distributing the read load across multiple nodes.",[15,3147,74,3148,3151],{},[35,3149,3150],{},"Automatic Failover",": If the primary node fails, a secondary node is automatically elected as the new primary node.",[15,3153,3154,3155,89],{},"For further reading about MongoDB replication, check out the official MongoDB documentation on ",[83,3156,88],{"href":85,"rel":3157},[87],[10,3159,3102],{"id":3160},"setting-up-a-3-node-mongodb-replica-set-cluster-with-docker-compose",[47,3162,3164],{"id":3163},"prerequisites","Prerequisites",[15,3166,3167,3168,89],{},"In this guide, we'll use Docker Compose to set up a 3-node MongoDB replica set cluster. Before you start, make sure you\nhave Docker and Docker Compose installed on your machine. If you don't have them installed, you can download them from\nthe official ",[83,3169,3171],{"href":102,"rel":3170},[87],"Docker website",[15,3173,3174,3175,89],{},"You may also need to have a basic understanding of MongoDB and mongo shell commands. If you're new to MongoDB, you can\ncheck out the official MongoDB documentation on ",[83,3176,3178],{"href":110,"rel":3177},[87],"MongoDB CRUD Operations",[47,3180,3182],{"id":3181},"step-1-create-a-docker-compose-file","Step 1: Create a Docker Compose File",[15,3184,3185,3186,3188],{},"Begin by creating a ",[121,3187,123],{}," file in a new directory. This file will define the services for the MongoDB\ncontainers. We'll create:",[126,3190,3191,3201,3207],{},[129,3192,3193,3194,135,3196,3198,3199],{},"three services: ",[121,3195,134],{},[121,3197,138],{},", and ",[121,3200,142],{},[129,3202,3203,3204,3206],{},"a network called ",[121,3205,148],{}," and",[129,3208,3209,3210,135,3212,3198,3214],{},"three volumes: ",[121,3211,154],{},[121,3213,157],{},[121,3215,160],{},[15,3217,3218],{},"Let's dot it:",[165,3220,3221],{"className":167,"code":168,"filename":123,"language":169,"meta":170,"style":170},[121,3222,3223,3229,3235,3243,3249,3255,3261,3267,3273,3279,3285,3291,3297,3305,3317,3325,3349,3355,3361,3367,3377,3387,3393,3399,3405,3417,3429,3441,3447,3495,3503,3511,3519,3527,3533,3541,3553,3561,3567,3573,3579,3589,3599,3605,3611,3617,3629,3641,3647,3655,3667,3675,3681,3687,3693,3703,3713,3719,3725,3731,3743,3755,3761,3769,3777,3785,3809,3815,3821,3827,3833,3839,3845,3851,3857,3863,3869,3881,3893,3905],{"__ignoreMap":170},[174,3224,3225,3227],{"class":176,"line":177},[174,3226,181],{"class":180},[174,3228,185],{"class":184},[174,3230,3231,3233],{"class":176,"line":188},[174,3232,191],{"class":180},[174,3234,185],{"class":184},[174,3236,3237,3239,3241],{"class":176,"line":196},[174,3238,199],{"class":180},[174,3240,202],{"class":184},[174,3242,206],{"class":205},[174,3244,3245,3247],{"class":176,"line":209},[174,3246,212],{"class":180},[174,3248,185],{"class":184},[174,3250,3251,3253],{"class":176,"line":217},[174,3252,220],{"class":180},[174,3254,185],{"class":184},[174,3256,3257,3259],{"class":176,"line":225},[174,3258,228],{"class":180},[174,3260,185],{"class":184},[174,3262,3263,3265],{"class":176,"line":233},[174,3264,236],{"class":180},[174,3266,185],{"class":184},[174,3268,3269,3271],{"class":176,"line":241},[174,3270,244],{"class":180},[174,3272,185],{"class":184},[174,3274,3275,3277],{"class":176,"line":249},[174,3276,252],{"class":180},[174,3278,185],{"class":184},[174,3280,3281,3283],{"class":176,"line":257},[174,3282,260],{"class":180},[174,3284,185],{"class":184},[174,3286,3287,3289],{"class":176,"line":265},[174,3288,268],{"class":180},[174,3290,185],{"class":184},[174,3292,3293,3295],{"class":176,"line":273},[174,3294,276],{"class":180},[174,3296,185],{"class":184},[174,3298,3299,3301,3303],{"class":176,"line":281},[174,3300,284],{"class":180},[174,3302,202],{"class":184},[174,3304,289],{"class":205},[174,3306,3307,3309,3311,3313,3315],{"class":176,"line":292},[174,3308,295],{"class":180},[174,3310,202],{"class":184},[174,3312,300],{"class":184},[174,3314,303],{"class":205},[174,3316,306],{"class":184},[174,3318,3319,3321,3323],{"class":176,"line":309},[174,3320,312],{"class":180},[174,3322,202],{"class":184},[174,3324,289],{"class":205},[174,3326,3327,3329,3331,3333,3335,3337,3339,3341,3343,3345,3347],{"class":176,"line":319},[174,3328,322],{"class":180},[174,3330,202],{"class":184},[174,3332,327],{"class":184},[174,3334,330],{"class":184},[174,3336,333],{"class":205},[174,3338,330],{"class":184},[174,3340,338],{"class":184},[174,3342,341],{"class":184},[174,3344,344],{"class":205},[174,3346,330],{"class":184},[174,3348,349],{"class":184},[174,3350,3351,3353],{"class":176,"line":352},[174,3352,355],{"class":180},[174,3354,185],{"class":184},[174,3356,3357,3359],{"class":176,"line":360},[174,3358,363],{"class":184},[174,3360,366],{"class":205},[174,3362,3363,3365],{"class":176,"line":369},[174,3364,363],{"class":184},[174,3366,374],{"class":205},[174,3368,3369,3371,3373,3375],{"class":176,"line":377},[174,3370,363],{"class":184},[174,3372,300],{"class":184},[174,3374,384],{"class":205},[174,3376,306],{"class":184},[174,3378,3379,3381,3383,3385],{"class":176,"line":389},[174,3380,363],{"class":184},[174,3382,300],{"class":184},[174,3384,396],{"class":205},[174,3386,306],{"class":184},[174,3388,3389,3391],{"class":176,"line":401},[174,3390,404],{"class":180},[174,3392,185],{"class":184},[174,3394,3395,3397],{"class":176,"line":409},[174,3396,363],{"class":184},[174,3398,414],{"class":205},[174,3400,3401,3403],{"class":176,"line":417},[174,3402,420],{"class":180},[174,3404,185],{"class":184},[174,3406,3407,3409,3411,3413,3415],{"class":176,"line":425},[174,3408,428],{"class":180},[174,3410,202],{"class":184},[174,3412,300],{"class":184},[174,3414,435],{"class":205},[174,3416,306],{"class":184},[174,3418,3419,3421,3423,3425,3427],{"class":176,"line":440},[174,3420,443],{"class":180},[174,3422,202],{"class":184},[174,3424,300],{"class":184},[174,3426,450],{"class":205},[174,3428,306],{"class":184},[174,3430,3431,3433,3435,3437,3439],{"class":176,"line":455},[174,3432,458],{"class":180},[174,3434,202],{"class":184},[174,3436,300],{"class":184},[174,3438,465],{"class":205},[174,3440,306],{"class":184},[174,3442,3443,3445],{"class":176,"line":470},[174,3444,473],{"class":180},[174,3446,185],{"class":184},[174,3448,3449,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473,3475,3477,3479,3481,3483,3485,3487,3489,3491,3493],{"class":176,"line":478},[174,3450,481],{"class":180},[174,3452,202],{"class":184},[174,3454,327],{"class":184},[174,3456,330],{"class":184},[174,3458,490],{"class":205},[174,3460,330],{"class":184},[174,3462,338],{"class":184},[174,3464,341],{"class":184},[174,3466,499],{"class":205},[174,3468,330],{"class":184},[174,3470,338],{"class":184},[174,3472,341],{"class":184},[174,3474,508],{"class":205},[174,3476,330],{"class":184},[174,3478,338],{"class":184},[174,3480,341],{"class":184},[174,3482,517],{"class":205},[174,3484,330],{"class":184},[174,3486,338],{"class":184},[174,3488,341],{"class":184},[174,3490,526],{"class":205},[174,3492,330],{"class":184},[174,3494,349],{"class":184},[174,3496,3497,3499,3501],{"class":176,"line":533},[174,3498,536],{"class":180},[174,3500,202],{"class":184},[174,3502,541],{"class":205},[174,3504,3505,3507,3509],{"class":176,"line":544},[174,3506,547],{"class":180},[174,3508,202],{"class":184},[174,3510,552],{"class":205},[174,3512,3513,3515,3517],{"class":176,"line":555},[174,3514,558],{"class":180},[174,3516,202],{"class":184},[174,3518,564],{"class":563},[174,3520,3521,3523,3525],{"class":176,"line":567},[174,3522,570],{"class":180},[174,3524,202],{"class":184},[174,3526,575],{"class":205},[174,3528,3529,3531],{"class":176,"line":578},[174,3530,581],{"class":180},[174,3532,185],{"class":184},[174,3534,3535,3537,3539],{"class":176,"line":586},[174,3536,284],{"class":180},[174,3538,202],{"class":184},[174,3540,593],{"class":205},[174,3542,3543,3545,3547,3549,3551],{"class":176,"line":596},[174,3544,295],{"class":180},[174,3546,202],{"class":184},[174,3548,300],{"class":184},[174,3550,303],{"class":205},[174,3552,306],{"class":184},[174,3554,3555,3557,3559],{"class":176,"line":609},[174,3556,312],{"class":180},[174,3558,202],{"class":184},[174,3560,593],{"class":205},[174,3562,3563,3565],{"class":176,"line":618},[174,3564,355],{"class":180},[174,3566,185],{"class":184},[174,3568,3569,3571],{"class":176,"line":625},[174,3570,363],{"class":184},[174,3572,630],{"class":205},[174,3574,3575,3577],{"class":176,"line":633},[174,3576,363],{"class":184},[174,3578,638],{"class":205},[174,3580,3581,3583,3585,3587],{"class":176,"line":641},[174,3582,363],{"class":184},[174,3584,300],{"class":184},[174,3586,384],{"class":205},[174,3588,306],{"class":184},[174,3590,3591,3593,3595,3597],{"class":176,"line":652},[174,3592,363],{"class":184},[174,3594,300],{"class":184},[174,3596,396],{"class":205},[174,3598,306],{"class":184},[174,3600,3601,3603],{"class":176,"line":663},[174,3602,404],{"class":180},[174,3604,185],{"class":184},[174,3606,3607,3609],{"class":176,"line":670},[174,3608,363],{"class":184},[174,3610,414],{"class":205},[174,3612,3613,3615],{"class":176,"line":677},[174,3614,420],{"class":180},[174,3616,185],{"class":184},[174,3618,3619,3621,3623,3625,3627],{"class":176,"line":684},[174,3620,428],{"class":180},[174,3622,202],{"class":184},[174,3624,300],{"class":184},[174,3626,435],{"class":205},[174,3628,306],{"class":184},[174,3630,3631,3633,3635,3637,3639],{"class":176,"line":697},[174,3632,443],{"class":180},[174,3634,202],{"class":184},[174,3636,300],{"class":184},[174,3638,450],{"class":205},[174,3640,306],{"class":184},[174,3642,3643,3645],{"class":176,"line":710},[174,3644,713],{"class":180},[174,3646,185],{"class":184},[174,3648,3649,3651,3653],{"class":176,"line":718},[174,3650,284],{"class":180},[174,3652,202],{"class":184},[174,3654,725],{"class":205},[174,3656,3657,3659,3661,3663,3665],{"class":176,"line":728},[174,3658,295],{"class":180},[174,3660,202],{"class":184},[174,3662,300],{"class":184},[174,3664,303],{"class":205},[174,3666,306],{"class":184},[174,3668,3669,3671,3673],{"class":176,"line":741},[174,3670,312],{"class":180},[174,3672,202],{"class":184},[174,3674,725],{"class":205},[174,3676,3677,3679],{"class":176,"line":750},[174,3678,355],{"class":180},[174,3680,185],{"class":184},[174,3682,3683,3685],{"class":176,"line":757},[174,3684,363],{"class":184},[174,3686,762],{"class":205},[174,3688,3689,3691],{"class":176,"line":765},[174,3690,363],{"class":184},[174,3692,770],{"class":205},[174,3694,3695,3697,3699,3701],{"class":176,"line":773},[174,3696,363],{"class":184},[174,3698,300],{"class":184},[174,3700,384],{"class":205},[174,3702,306],{"class":184},[174,3704,3705,3707,3709,3711],{"class":176,"line":784},[174,3706,363],{"class":184},[174,3708,300],{"class":184},[174,3710,396],{"class":205},[174,3712,306],{"class":184},[174,3714,3715,3717],{"class":176,"line":795},[174,3716,404],{"class":180},[174,3718,185],{"class":184},[174,3720,3721,3723],{"class":176,"line":802},[174,3722,363],{"class":184},[174,3724,414],{"class":205},[174,3726,3727,3729],{"class":176,"line":809},[174,3728,420],{"class":180},[174,3730,185],{"class":184},[174,3732,3733,3735,3737,3739,3741],{"class":176,"line":816},[174,3734,428],{"class":180},[174,3736,202],{"class":184},[174,3738,300],{"class":184},[174,3740,435],{"class":205},[174,3742,306],{"class":184},[174,3744,3745,3747,3749,3751,3753],{"class":176,"line":829},[174,3746,443],{"class":180},[174,3748,202],{"class":184},[174,3750,300],{"class":184},[174,3752,450],{"class":205},[174,3754,306],{"class":184},[174,3756,3757,3759],{"class":176,"line":842},[174,3758,845],{"class":180},[174,3760,185],{"class":184},[174,3762,3763,3765,3767],{"class":176,"line":850},[174,3764,284],{"class":180},[174,3766,202],{"class":184},[174,3768,857],{"class":205},[174,3770,3771,3773,3775],{"class":176,"line":860},[174,3772,295],{"class":180},[174,3774,202],{"class":184},[174,3776,867],{"class":205},[174,3778,3779,3781,3783],{"class":176,"line":870},[174,3780,873],{"class":180},[174,3782,202],{"class":184},[174,3784,879],{"class":878},[174,3786,3787,3789,3791,3793,3795,3797,3799,3801,3803,3805,3807],{"class":176,"line":882},[174,3788,885],{"class":180},[174,3790,202],{"class":184},[174,3792,327],{"class":184},[174,3794,330],{"class":184},[174,3796,894],{"class":205},[174,3798,330],{"class":184},[174,3800,338],{"class":184},[174,3802,341],{"class":184},[174,3804,903],{"class":205},[174,3806,330],{"class":184},[174,3808,349],{"class":184},[174,3810,3811,3813],{"class":176,"line":910},[174,3812,404],{"class":180},[174,3814,185],{"class":184},[174,3816,3817,3819],{"class":176,"line":917},[174,3818,363],{"class":184},[174,3820,414],{"class":205},[174,3822,3823,3825],{"class":176,"line":924},[174,3824,927],{"class":180},[174,3826,185],{"class":184},[174,3828,3829,3831],{"class":176,"line":932},[174,3830,363],{"class":184},[174,3832,289],{"class":205},[174,3834,3835,3837],{"class":176,"line":939},[174,3836,363],{"class":184},[174,3838,593],{"class":205},[174,3840,3841,3843],{"class":176,"line":946},[174,3842,363],{"class":184},[174,3844,725],{"class":205},[174,3846,3847,3849],{"class":176,"line":953},[174,3848,355],{"class":180},[174,3850,185],{"class":184},[174,3852,3853,3855],{"class":176,"line":960},[174,3854,363],{"class":184},[174,3856,965],{"class":205},[174,3858,3859,3861],{"class":176,"line":968},[174,3860,363],{"class":184},[174,3862,973],{"class":205},[174,3864,3865,3867],{"class":176,"line":976},[174,3866,420],{"class":180},[174,3868,185],{"class":184},[174,3870,3871,3873,3875,3877,3879],{"class":176,"line":983},[174,3872,986],{"class":180},[174,3874,202],{"class":184},[174,3876,300],{"class":184},[174,3878,435],{"class":205},[174,3880,306],{"class":184},[174,3882,3883,3885,3887,3889,3891],{"class":176,"line":997},[174,3884,1000],{"class":180},[174,3886,202],{"class":184},[174,3888,300],{"class":184},[174,3890,450],{"class":205},[174,3892,306],{"class":184},[174,3894,3895,3897,3899,3901,3903],{"class":176,"line":1011},[174,3896,1014],{"class":180},[174,3898,202],{"class":184},[174,3900,300],{"class":184},[174,3902,1021],{"class":205},[174,3904,306],{"class":184},[174,3906,3907,3909,3911,3913,3915],{"class":176,"line":1026},[174,3908,1029],{"class":180},[174,3910,202],{"class":184},[174,3912,300],{"class":184},[174,3914,1036],{"class":205},[174,3916,306],{"class":184},[15,3918,3919,3920,3922],{},"Let's break down the ",[121,3921,123],{}," file:",[126,3924,3925,3937,3947,3994],{},[129,3926,3927,3928,3930,3931,135,3933,3198,3935,89],{},"We define a network called ",[121,3929,148],{}," that will be used by all the MongoDB containers. This ensures that the\ncontainers can communicate with each other through the hostnames ",[121,3932,134],{},[121,3934,138],{},[121,3936,142],{},[129,3938,3939,3940,135,3942,3198,3944,3946],{},"We define three volumes: ",[121,3941,1065],{},[121,3943,1068],{},[121,3945,1071],{}," to persist the data for each MongoDB\ncontainer.",[129,3948,3949,3950,135,3952,3198,3954,3956,3957,3959,3960,3962,3963,3965,3966,3968,3969,135,3971,3198,3973,3975,3976,135,3978,3198,3980,3982,3983,3985,3986,3988,3989,3991,3992,89],{},"We define three services: ",[121,3951,134],{},[121,3953,138],{},[121,3955,142],{},". Each service runs a MongoDB container with the\n",[121,3958,303],{}," image. We specify the ",[121,3961,1088],{}," option to set the replica set name to ",[121,3964,1092],{},". We also specify the\n",[121,3967,1096],{}," option to bind the container to the hostnames ",[121,3970,134],{},[121,3972,138],{},[121,3974,142],{},". We mount the volumes to\npersist the data and the keyfile for authentication. We expose the ports ",[121,3977,1107],{},[121,3979,1110],{},[121,3981,1113],{}," for the MongoDB\ncontainers. We define a health check for the ",[121,3984,134],{}," service to check the status of the replica set and initiate it\nif it's not already initiated.  After the healthcheck is successful, the replica set is initiated with the primary node\n",[121,3987,134],{}," and secondary nodes ",[121,3990,138],{}," and ",[121,3993,142],{},[129,3995,3996,3997,135,3999,135,4001,1055,4003,3198,4005,4007],{},"We set the environment variables ",[121,3998,1130],{},[121,4000,1133],{},[121,4002,1136],{},[121,4004,1139],{},[121,4006,1142],{}," for each service to configure the MongoDB authentication. We're using interpolation\nto make sure the default values are used if the environment variables are not set.",[47,4009,4011],{"id":4010},"step-2-create-a-keyfile-for-authentication","Step 2: Create a Keyfile for Authentication",[15,4013,4014],{},"MongoDB uses keyfiles for internal authentication between members of the replica set. In a certain scenario where\ncredentials are not set, we would not need it. But for the sake of this guide, we need to create a keyfile and mount it\nto the MongoDB containers, since we're using authentication.",[15,4016,4017],{},"To create a keyfile, run the following command:",[165,4019,4020],{"className":1156,"code":1157,"language":1158,"meta":170,"style":170},[121,4021,4022],{"__ignoreMap":170},[174,4023,4024,4026,4028,4030,4032,4034,4036,4038,4040,4042],{"class":176,"line":177},[174,4025,1166],{"class":1165},[174,4027,1169],{"class":205},[174,4029,1172],{"class":205},[174,4031,1175],{"class":563},[174,4033,1178],{"class":184},[174,4035,1181],{"class":205},[174,4037,1184],{"class":184},[174,4039,1187],{"class":1165},[174,4041,1190],{"class":563},[174,4043,1193],{"class":205},[15,4045,4046,4047,4049,4050,4052,4053,4055,4056,89],{},"This command generates a random 756-byte key and saves it to the ",[121,4048,1199],{}," file. We then set the file\npermissions to ",[121,4051,1203],{}," to ensure that only the owner ",[121,4054,1207],{}," can read and write to the file. You can read more\nabout keyfiles in the ",[83,4057,4059],{"href":1211,"rel":4058},[87],"MongoDB documentation",[1215,4061,4062],{},[15,4063,4064],{},"Note: the keyfile is used for internal authentication between members of the replica set. It's important to keep the keyfile secure and not expose it to unauthorized users.",[47,4066,4068],{"id":4067},"step-3-initialization-scripts","Step 3: Initialization scripts",[1225,4070,4072],{"id":4071},"mongodb-initialization","MongoDB Initialization",[15,4074,4075,4076,4078,4079,4081],{},"As I mentioned earlier, we'll set up an initial database, username and password for the MongoDB replica set. To do so we'll\nuse an initialization script that will be executed when the MongoDB container starts. Now, create a file called\n",[121,4077,1234],{}," in the ",[121,4080,1238],{}," directory with the following content:",[165,4083,4084],{"className":1242,"code":1243,"filename":1244,"language":1245,"meta":170,"style":170},[121,4085,4086,4110,4114,4120,4130,4144,4152,4184,4208,4232,4236,4240,4244,4248,4260,4266,4284,4304,4314,4330,4334,4348,4352,4368,4372,4376,4390,4406,4422,4426,4430,4442,4446,4456,4480,4488],{"__ignoreMap":170},[174,4087,4088,4090,4092,4094,4096,4098,4100,4102,4104,4106,4108],{"class":176,"line":177},[174,4089,1253],{"class":1252},[174,4091,1256],{"class":184},[174,4093,1259],{"class":1252},[174,4095,89],{"class":184},[174,4097,1265],{"class":1264},[174,4099,1268],{"class":1252},[174,4101,1271],{"class":184},[174,4103,1274],{"class":205},[174,4105,1271],{"class":184},[174,4107,1279],{"class":1252},[174,4109,1282],{"class":184},[174,4111,4112],{"class":176,"line":188},[174,4113,1288],{"emptyLinePlaceholder":1287},[174,4115,4116,4118],{"class":176,"line":196},[174,4117,1294],{"class":1293},[174,4119,1297],{"class":184},[174,4121,4122,4124,4126,4128],{"class":176,"line":209},[174,4123,1303],{"class":1302},[174,4125,1306],{"class":1252},[174,4127,1309],{"class":184},[174,4129,1297],{"class":184},[174,4131,4132,4134,4136,4138,4140,4142],{"class":176,"line":217},[174,4133,1316],{"class":180},[174,4135,202],{"class":184},[174,4137,300],{"class":184},[174,4139,1323],{"class":205},[174,4141,1271],{"class":184},[174,4143,1055],{"class":184},[174,4145,4146,4148,4150],{"class":176,"line":225},[174,4147,1332],{"class":180},[174,4149,202],{"class":184},[174,4151,1337],{"class":180},[174,4153,4154,4156,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178,4180,4182],{"class":176,"line":233},[174,4155,1342],{"class":184},[174,4157,1345],{"class":180},[174,4159,202],{"class":184},[174,4161,1350],{"class":563},[174,4163,338],{"class":184},[174,4165,1355],{"class":180},[174,4167,202],{"class":184},[174,4169,300],{"class":184},[174,4171,1362],{"class":205},[174,4173,1271],{"class":184},[174,4175,338],{"class":184},[174,4177,1369],{"class":180},[174,4179,202],{"class":184},[174,4181,1374],{"class":563},[174,4183,1377],{"class":184},[174,4185,4186,4188,4190,4192,4194,4196,4198,4200,4202,4204,4206],{"class":176,"line":241},[174,4187,1342],{"class":184},[174,4189,1345],{"class":180},[174,4191,202],{"class":184},[174,4193,1388],{"class":563},[174,4195,338],{"class":184},[174,4197,1355],{"class":180},[174,4199,202],{"class":184},[174,4201,300],{"class":184},[174,4203,1399],{"class":205},[174,4205,1271],{"class":184},[174,4207,1377],{"class":184},[174,4209,4210,4212,4214,4216,4218,4220,4222,4224,4226,4228,4230],{"class":176,"line":249},[174,4211,1342],{"class":184},[174,4213,1345],{"class":180},[174,4215,202],{"class":184},[174,4217,1374],{"class":563},[174,4219,338],{"class":184},[174,4221,1355],{"class":180},[174,4223,202],{"class":184},[174,4225,300],{"class":184},[174,4227,1424],{"class":205},[174,4229,1271],{"class":184},[174,4231,1429],{"class":184},[174,4233,4234],{"class":176,"line":257},[174,4235,1434],{"class":180},[174,4237,4238],{"class":176,"line":265},[174,4239,1439],{"class":184},[174,4241,4242],{"class":176,"line":273},[174,4243,1444],{"class":180},[174,4245,4246],{"class":176,"line":281},[174,4247,1450],{"class":1449},[174,4249,4250,4252,4254,4256,4258],{"class":176,"line":292},[174,4251,1303],{"class":1302},[174,4253,1457],{"class":1252},[174,4255,1309],{"class":184},[174,4257,1462],{"class":878},[174,4259,1282],{"class":184},[174,4261,4262,4264],{"class":176,"line":309},[174,4263,1469],{"class":1293},[174,4265,1297],{"class":184},[174,4267,4268,4270,4272,4274,4276,4278,4280,4282],{"class":176,"line":319},[174,4269,1476],{"class":1302},[174,4271,1479],{"class":1252},[174,4273,1309],{"class":184},[174,4275,1484],{"class":1252},[174,4277,89],{"class":184},[174,4279,1489],{"class":1264},[174,4281,1492],{"class":180},[174,4283,1282],{"class":184},[174,4285,4286,4288,4290,4292,4294,4296,4298,4300,4302],{"class":176,"line":352},[174,4287,1499],{"class":1293},[174,4289,1502],{"class":180},[174,4291,1489],{"class":1252},[174,4293,89],{"class":184},[174,4295,1509],{"class":1252},[174,4297,1512],{"class":184},[174,4299,1388],{"class":563},[174,4301,1517],{"class":180},[174,4303,1520],{"class":184},[174,4305,4306,4308,4310,4312],{"class":176,"line":360},[174,4307,1525],{"class":1252},[174,4309,1309],{"class":184},[174,4311,1530],{"class":878},[174,4313,1282],{"class":184},[174,4315,4316,4318,4320,4322,4324,4326,4328],{"class":176,"line":369},[174,4317,1537],{"class":1264},[174,4319,1268],{"class":180},[174,4321,330],{"class":184},[174,4323,1544],{"class":205},[174,4325,330],{"class":184},[174,4327,1279],{"class":180},[174,4329,1282],{"class":184},[174,4331,4332],{"class":176,"line":377},[174,4333,1555],{"class":184},[174,4335,4336,4338,4340,4342,4344,4346],{"class":176,"line":389},[174,4337,1560],{"class":184},[174,4339,1563],{"class":1293},[174,4341,1268],{"class":180},[174,4343,1568],{"class":1252},[174,4345,1517],{"class":180},[174,4347,1520],{"class":184},[174,4349,4350],{"class":176,"line":401},[174,4351,1577],{"class":1449},[174,4353,4354,4356,4358,4360,4362,4364,4366],{"class":176,"line":409},[174,4355,1582],{"class":1264},[174,4357,1268],{"class":180},[174,4359,330],{"class":184},[174,4361,1589],{"class":205},[174,4363,330],{"class":184},[174,4365,1279],{"class":180},[174,4367,1282],{"class":184},[174,4369,4370],{"class":176,"line":417},[174,4371,1600],{"class":184},[174,4373,4374],{"class":176,"line":425},[174,4375,1444],{"class":180},[174,4377,4378,4380,4382,4384,4386,4388],{"class":176,"line":440},[174,4379,1609],{"class":1293},[174,4381,1502],{"class":180},[174,4383,1614],{"class":184},[174,4385,1617],{"class":1252},[174,4387,1517],{"class":180},[174,4389,1520],{"class":184},[174,4391,4392,4394,4396,4398,4400,4402,4404],{"class":176,"line":455},[174,4393,1626],{"class":1252},[174,4395,89],{"class":184},[174,4397,1631],{"class":1264},[174,4399,1268],{"class":180},[174,4401,1636],{"class":1252},[174,4403,1279],{"class":180},[174,4405,1282],{"class":184},[174,4407,4408,4410,4412,4414,4416,4418,4420],{"class":176,"line":470},[174,4409,1582],{"class":1264},[174,4411,1268],{"class":180},[174,4413,330],{"class":184},[174,4415,1651],{"class":205},[174,4417,330],{"class":184},[174,4419,1279],{"class":180},[174,4421,1282],{"class":184},[174,4423,4424],{"class":176,"line":478},[174,4425,1662],{"class":180},[174,4427,4428],{"class":176,"line":533},[174,4429,1667],{"class":1449},[174,4431,4432,4434,4436,4438,4440],{"class":176,"line":544},[174,4433,1672],{"class":1264},[174,4435,1268],{"class":180},[174,4437,1677],{"class":563},[174,4439,1279],{"class":180},[174,4441,1282],{"class":184},[174,4443,4444],{"class":176,"line":555},[174,4445,1600],{"class":184},[174,4447,4448,4450,4452,4454],{"class":176,"line":567},[174,4449,1690],{"class":184},[174,4451,1563],{"class":1293},[174,4453,1695],{"class":1252},[174,4455,1520],{"class":184},[174,4457,4458,4460,4462,4464,4466,4468,4470,4472,4474,4476,4478],{"class":176,"line":578},[174,4459,1702],{"class":1264},[174,4461,1268],{"class":180},[174,4463,330],{"class":184},[174,4465,1709],{"class":205},[174,4467,330],{"class":184},[174,4469,1714],{"class":184},[174,4471,1717],{"class":1252},[174,4473,89],{"class":184},[174,4475,1722],{"class":1252},[174,4477,1279],{"class":180},[174,4479,1282],{"class":184},[174,4481,4482,4484,4486],{"class":176,"line":586},[174,4483,1731],{"class":1293},[174,4485,1717],{"class":1252},[174,4487,1282],{"class":184},[174,4489,4490],{"class":176,"line":596},[174,4491,1740],{"class":184},[15,4493,3919,4494,3922],{},[121,4495,1234],{},[126,4497,4498,4504,4515],{},[129,4499,4500,4501,4503],{},"We connect to the database specified by the ",[121,4502,1136],{}," environment variable.",[129,4505,4506,4507,3991,4509,4511,4512,4514],{},"We create a user specified by the ",[121,4508,1139],{},[121,4510,1142],{}," environment variables with the ",[121,4513,1762],{}," role on the\ndatabase.",[129,4516,4517,4518,4520,4521,4523],{},"We set the write concern to ",[121,4519,1769],{}," with a timeout of ",[121,4522,1773],{}," milliseconds. This ensures that the write operation is\nacknowledged by the majority of the replica set members.",[15,4525,4526,4527,4531],{},"This script will be executed when the MongoDB container starts, creating the initial database and user for the replica\nset. Note that the script part is not mandatory, and you could use hardcoded values. However, according to the ",[83,4528,4530],{"href":1780,"rel":4529},[87],"section\nIII of the 12-factor app",", it's better to use environment variables to store secrets or anything that may vary between\ndeployments.",[1225,4533,4535],{"id":4534},"process-the-replicaset-connection","Process the replicaset connection",[165,4537,4538],{"className":1156,"code":1790,"language":1158,"meta":170,"style":170},[121,4539,4540,4544,4548,4558,4564,4568,4572,4618,4628,4634,4638,4642,4652,4656,4666,4678,4690,4698,4704,4716,4728,4734,4740,4744,4760,4770,4774,4784,4790],{"__ignoreMap":170},[174,4541,4542],{"class":176,"line":177},[174,4543,1797],{"class":1449},[174,4545,4546],{"class":176,"line":188},[174,4547,1288],{"emptyLinePlaceholder":1287},[174,4549,4550,4552,4554,4556],{"class":176,"line":196},[174,4551,1806],{"class":1264},[174,4553,341],{"class":184},[174,4555,1811],{"class":205},[174,4557,1814],{"class":184},[174,4559,4560,4562],{"class":176,"line":209},[174,4561,1819],{"class":1165},[174,4563,1822],{"class":563},[174,4565,4566],{"class":176,"line":217},[174,4567,1288],{"emptyLinePlaceholder":1287},[174,4569,4570],{"class":176,"line":225},[174,4571,1831],{"class":1449},[174,4573,4574,4576,4578,4580,4582,4584,4586,4588,4590,4592,4594,4596,4598,4600,4602,4604,4606,4608,4610,4612,4614,4616],{"class":176,"line":233},[174,4575,1836],{"class":1293},[174,4577,1839],{"class":1165},[174,4579,1842],{"class":205},[174,4581,1845],{"class":205},[174,4583,1848],{"class":205},[174,4585,1851],{"class":184},[174,4587,1854],{"class":1252},[174,4589,1857],{"class":184},[174,4591,1860],{"class":205},[174,4593,1851],{"class":184},[174,4595,1865],{"class":1252},[174,4597,1857],{"class":184},[174,4599,1870],{"class":205},[174,4601,1873],{"class":205},[174,4603,1876],{"class":205},[174,4605,341],{"class":184},[174,4607,1881],{"class":205},[174,4609,330],{"class":184},[174,4611,1178],{"class":184},[174,4613,1888],{"class":205},[174,4615,1891],{"class":184},[174,4617,1894],{"class":1293},[174,4619,4620,4622,4624,4626],{"class":176,"line":241},[174,4621,1899],{"class":1264},[174,4623,341],{"class":184},[174,4625,1904],{"class":205},[174,4627,1814],{"class":184},[174,4629,4630,4632],{"class":176,"line":249},[174,4631,1672],{"class":1165},[174,4633,564],{"class":563},[174,4635,4636],{"class":176,"line":257},[174,4637,1917],{"class":1293},[174,4639,4640],{"class":176,"line":265},[174,4641,1288],{"emptyLinePlaceholder":1287},[174,4643,4644,4646,4648,4650],{"class":176,"line":273},[174,4645,1806],{"class":1264},[174,4647,341],{"class":184},[174,4649,1930],{"class":205},[174,4651,1814],{"class":184},[174,4653,4654],{"class":176,"line":281},[174,4655,1288],{"emptyLinePlaceholder":1287},[174,4657,4658,4660,4662,4664],{"class":176,"line":292},[174,4659,499],{"class":1165},[174,4661,1842],{"class":205},[174,4663,1845],{"class":205},[174,4665,1947],{"class":1252},[174,4667,4668,4670,4672,4674,4676],{"class":176,"line":309},[174,4669,1952],{"class":205},[174,4671,1851],{"class":184},[174,4673,1854],{"class":1252},[174,4675,1857],{"class":184},[174,4677,1947],{"class":1252},[174,4679,4680,4682,4684,4686,4688],{"class":176,"line":319},[174,4681,1965],{"class":205},[174,4683,1851],{"class":184},[174,4685,1865],{"class":1252},[174,4687,1857],{"class":184},[174,4689,1947],{"class":1252},[174,4691,4692,4694,4696],{"class":176,"line":352},[174,4693,1978],{"class":205},[174,4695,1873],{"class":205},[174,4697,1947],{"class":1252},[174,4699,4700,4702],{"class":176,"line":360},[174,4701,1987],{"class":205},[174,4703,1990],{"class":184},[174,4705,4706,4708,4710,4712,4714],{"class":176,"line":369},[174,4707,1995],{"class":205},[174,4709,1998],{"class":184},[174,4711,2001],{"class":1252},[174,4713,1690],{"class":184},[174,4715,2006],{"class":205},[174,4717,4718,4720,4722,4724,4726],{"class":176,"line":377},[174,4719,2011],{"class":205},[174,4721,1998],{"class":184},[174,4723,2016],{"class":1252},[174,4725,1690],{"class":184},[174,4727,2006],{"class":205},[174,4729,4730,4732],{"class":176,"line":389},[174,4731,2025],{"class":184},[174,4733,1947],{"class":1252},[174,4735,4736,4738],{"class":176,"line":401},[174,4737,2032],{"class":205},[174,4739,2035],{"class":205},[174,4741,4742],{"class":176,"line":409},[174,4743,1288],{"emptyLinePlaceholder":1287},[174,4745,4746,4748,4750,4752,4754,4756,4758],{"class":176,"line":417},[174,4747,2044],{"class":1293},[174,4749,327],{"class":184},[174,4751,2049],{"class":1252},[174,4753,2052],{"class":184},[174,4755,1350],{"class":563},[174,4757,2057],{"class":184},[174,4759,2060],{"class":1293},[174,4761,4762,4764,4766,4768],{"class":176,"line":425},[174,4763,1899],{"class":1264},[174,4765,341],{"class":184},[174,4767,2069],{"class":205},[174,4769,1814],{"class":184},[174,4771,4772],{"class":176,"line":440},[174,4773,2076],{"class":1293},[174,4775,4776,4778,4780,4782],{"class":176,"line":455},[174,4777,1899],{"class":1264},[174,4779,341],{"class":184},[174,4781,2085],{"class":205},[174,4783,1814],{"class":184},[174,4785,4786,4788],{"class":176,"line":470},[174,4787,2092],{"class":1264},[174,4789,2095],{"class":563},[174,4791,4792],{"class":176,"line":478},[174,4793,2100],{"class":1293},[47,4795,4797],{"id":4796},"step-4-start-the-mongodb-replica-set-cluster","Step 4: Start the MongoDB Replica Set Cluster",[15,4799,4800],{},"Now that we have everything set up, we can start the MongoDB replica set cluster using Docker Compose by running the\nfollowing command:",[165,4802,4803],{"className":1156,"code":2110,"language":1158,"meta":170,"style":170},[121,4804,4805],{"__ignoreMap":170},[174,4806,4807,4809,4811],{"class":176,"line":177},[174,4808,2117],{"class":1165},[174,4810,2120],{"class":205},[174,4812,2123],{"class":205},[1215,4814,4815],{},[15,4816,4817,4818,4820],{},"Note: The ",[121,4819,2131],{}," flag runs the containers in detached mode, which means they will run in the background.",[47,4822,4824],{"id":4823},"step-5-verify-the-mongodb-replica-set","Step 5: Verify the MongoDB Replica Set",[15,4826,4827,4828,4830],{},"To verify that the MongoDB replica set is running correctly, you can use the ",[121,4829,2142],{}," shell to connect to the primary\nnode and check the status of the replica set. Run the following command to connect to the primary node:",[165,4832,4833],{"className":1156,"code":2146,"language":1158,"meta":170,"style":170},[121,4834,4835],{"__ignoreMap":170},[174,4836,4837,4839,4841,4843,4845,4847,4849,4851,4853,4855,4857],{"class":176,"line":177},[174,4838,2153],{"class":1165},[174,4840,2156],{"class":205},[174,4842,2159],{"class":205},[174,4844,2162],{"class":205},[174,4846,1839],{"class":205},[174,4848,1848],{"class":205},[174,4850,1873],{"class":205},[174,4852,1860],{"class":205},[174,4854,2173],{"class":205},[174,4856,1870],{"class":205},[174,4858,2178],{"class":205},[1215,4860,4861],{},[15,4862,4863,4864,4866,4867,4869,4870,89],{},"Note: Replace ",[121,4865,2186],{}," with the password you set for the ",[121,4868,1133],{}," environment variable. If you didn't set it, use ",[121,4871,2186],{},[15,4873,4874],{},"Once connected, run the following command to check the status of the replica set:",[165,4876,4877],{"className":1156,"code":2198,"language":1158,"meta":170,"style":170},[121,4878,4879],{"__ignoreMap":170},[174,4880,4881,4883],{"class":176,"line":177},[174,4882,2205],{"class":1264},[174,4884,2208],{"class":184},[15,4886,4887,4888,4890,4891,3991,4893,4895],{},"You should see the status of the replica set with the primary node ",[121,4889,134],{}," and the secondary nodes ",[121,4892,138],{},[121,4894,142],{},".\nThe output should like:",[165,4897,4898],{"className":2222,"code":2223,"language":2224,"meta":170,"style":170},[121,4899,4900,4906,4910,4920,4938,4948,4958,4968,4978,5008,5034,5038,5042,5046,5056,5074,5084,5094,5104,5114,5132,5136,5140,5144,5154,5172,5182,5192,5202,5212,5230,5234,5238,5244,5252,5258,5288,5296,5332,5344,5348],{"__ignoreMap":170},[174,4901,4902,4904],{"class":176,"line":177},[174,4903,2231],{"class":1252},[174,4905,2234],{"class":184},[174,4907,4908],{"class":176,"line":188},[174,4909,2239],{"class":184},[174,4911,4912,4914,4916,4918],{"class":176,"line":196},[174,4913,2244],{"class":1252},[174,4915,202],{"class":184},[174,4917,1350],{"class":563},[174,4919,1055],{"class":184},[174,4921,4922,4924,4926,4928,4930,4932,4934,4936],{"class":176,"line":209},[174,4923,2255],{"class":1252},[174,4925,202],{"class":184},[174,4927,2260],{"class":1252},[174,4929,2263],{"class":563},[174,4931,202],{"class":1252},[174,4933,1107],{"class":563},[174,4935,1271],{"class":1252},[174,4937,1055],{"class":184},[174,4939,4940,4942,4944,4946],{"class":176,"line":217},[174,4941,2276],{"class":1252},[174,4943,202],{"class":184},[174,4945,1388],{"class":563},[174,4947,1055],{"class":184},[174,4949,4950,4952,4954,4956],{"class":176,"line":225},[174,4951,2287],{"class":1252},[174,4953,202],{"class":184},[174,4955,1388],{"class":563},[174,4957,1055],{"class":184},[174,4959,4960,4962,4964,4966],{"class":176,"line":233},[174,4961,2298],{"class":1252},[174,4963,202],{"class":184},[174,4965,2303],{"class":1252},[174,4967,1055],{"class":184},[174,4969,4970,4972,4974,4976],{"class":176,"line":241},[174,4971,2310],{"class":1252},[174,4973,202],{"class":184},[174,4975,2315],{"class":563},[174,4977,1055],{"class":184},[174,4979,4980,4982,4984,4986,4988,4990,4992,4994,4996,4998,5000,5002,5004,5006],{"class":176,"line":249},[174,4981,2322],{"class":1252},[174,4983,202],{"class":184},[174,4985,2327],{"class":1252},[174,4987,2330],{"class":184},[174,4989,2333],{"class":1252},[174,4991,202],{"class":184},[174,4993,2338],{"class":563},[174,4995,338],{"class":184},[174,4997,2343],{"class":1252},[174,4999,202],{"class":184},[174,5001,1388],{"class":563},[174,5003,2350],{"class":184},[174,5005,1279],{"class":1252},[174,5007,1055],{"class":184},[174,5009,5010,5012,5014,5016,5018,5020,5022,5024,5026,5028,5030,5032],{"class":176,"line":257},[174,5011,2359],{"class":1252},[174,5013,202],{"class":184},[174,5015,2364],{"class":1252},[174,5017,2367],{"class":563},[174,5019,2370],{"class":1252},[174,5021,2373],{"class":563},[174,5023,202],{"class":1252},[174,5025,2378],{"class":563},[174,5027,202],{"class":1252},[174,5029,2383],{"class":563},[174,5031,2386],{"class":1252},[174,5033,1055],{"class":184},[174,5035,5036],{"class":176,"line":265},[174,5037,2393],{"class":1252},[174,5039,5040],{"class":176,"line":273},[174,5041,2398],{"class":184},[174,5043,5044],{"class":176,"line":281},[174,5045,2239],{"class":184},[174,5047,5048,5050,5052,5054],{"class":176,"line":292},[174,5049,2244],{"class":1252},[174,5051,202],{"class":184},[174,5053,1388],{"class":563},[174,5055,1055],{"class":184},[174,5057,5058,5060,5062,5064,5066,5068,5070,5072],{"class":176,"line":309},[174,5059,2255],{"class":1252},[174,5061,202],{"class":184},[174,5063,2260],{"class":1252},[174,5065,2423],{"class":563},[174,5067,202],{"class":1252},[174,5069,1110],{"class":563},[174,5071,1271],{"class":1252},[174,5073,1055],{"class":184},[174,5075,5076,5078,5080,5082],{"class":176,"line":319},[174,5077,2276],{"class":1252},[174,5079,202],{"class":184},[174,5081,1388],{"class":563},[174,5083,1055],{"class":184},[174,5085,5086,5088,5090,5092],{"class":176,"line":352},[174,5087,2287],{"class":1252},[174,5089,202],{"class":184},[174,5091,1374],{"class":563},[174,5093,1055],{"class":184},[174,5095,5096,5098,5100,5102],{"class":176,"line":360},[174,5097,2298],{"class":1252},[174,5099,202],{"class":184},[174,5101,2460],{"class":1252},[174,5103,1055],{"class":184},[174,5105,5106,5108,5110,5112],{"class":176,"line":369},[174,5107,2310],{"class":1252},[174,5109,202],{"class":184},[174,5111,2471],{"class":563},[174,5113,1055],{"class":184},[174,5115,5116,5118,5120,5122,5124,5126,5128,5130],{"class":176,"line":377},[174,5117,2478],{"class":1252},[174,5119,202],{"class":184},[174,5121,2260],{"class":1252},[174,5123,2263],{"class":563},[174,5125,202],{"class":1252},[174,5127,1107],{"class":563},[174,5129,1271],{"class":1252},[174,5131,1055],{"class":184},[174,5133,5134],{"class":176,"line":389},[174,5135,2393],{"class":1252},[174,5137,5138],{"class":176,"line":401},[174,5139,2398],{"class":184},[174,5141,5142],{"class":176,"line":409},[174,5143,2239],{"class":184},[174,5145,5146,5148,5150,5152],{"class":176,"line":417},[174,5147,2244],{"class":1252},[174,5149,202],{"class":184},[174,5151,1374],{"class":563},[174,5153,1055],{"class":184},[174,5155,5156,5158,5160,5162,5164,5166,5168,5170],{"class":176,"line":425},[174,5157,2255],{"class":1252},[174,5159,202],{"class":184},[174,5161,2260],{"class":1252},[174,5163,2525],{"class":563},[174,5165,202],{"class":1252},[174,5167,1113],{"class":563},[174,5169,1271],{"class":1252},[174,5171,1055],{"class":184},[174,5173,5174,5176,5178,5180],{"class":176,"line":440},[174,5175,2276],{"class":1252},[174,5177,202],{"class":184},[174,5179,1388],{"class":563},[174,5181,1055],{"class":184},[174,5183,5184,5186,5188,5190],{"class":176,"line":455},[174,5185,2287],{"class":1252},[174,5187,202],{"class":184},[174,5189,1374],{"class":563},[174,5191,1055],{"class":184},[174,5193,5194,5196,5198,5200],{"class":176,"line":470},[174,5195,2298],{"class":1252},[174,5197,202],{"class":184},[174,5199,2460],{"class":1252},[174,5201,1055],{"class":184},[174,5203,5204,5206,5208,5210],{"class":176,"line":478},[174,5205,2310],{"class":1252},[174,5207,202],{"class":184},[174,5209,2471],{"class":563},[174,5211,1055],{"class":184},[174,5213,5214,5216,5218,5220,5222,5224,5226,5228],{"class":176,"line":533},[174,5215,2478],{"class":1252},[174,5217,202],{"class":184},[174,5219,2260],{"class":1252},[174,5221,2263],{"class":563},[174,5223,202],{"class":1252},[174,5225,1107],{"class":563},[174,5227,1271],{"class":1252},[174,5229,1055],{"class":184},[174,5231,5232],{"class":176,"line":544},[174,5233,2393],{"class":1252},[174,5235,5236],{"class":176,"line":555},[174,5237,1555],{"class":184},[174,5239,5240,5242],{"class":176,"line":567},[174,5241,2604],{"class":184},[174,5243,1055],{"class":1252},[174,5245,5246,5248,5250],{"class":176,"line":578},[174,5247,2611],{"class":1252},[174,5249,2263],{"class":563},[174,5251,1055],{"class":1252},[174,5253,5254,5256],{"class":176,"line":586},[174,5255,2620],{"class":1252},[174,5257,1520],{"class":184},[174,5259,5260,5262,5264,5266,5268,5270,5272,5274,5276,5278,5280,5282,5284,5286],{"class":176,"line":596},[174,5261,2627],{"class":1252},[174,5263,202],{"class":184},[174,5265,2327],{"class":1252},[174,5267,2330],{"class":184},[174,5269,2333],{"class":1252},[174,5271,202],{"class":184},[174,5273,2640],{"class":563},[174,5275,338],{"class":184},[174,5277,2343],{"class":1252},[174,5279,202],{"class":184},[174,5281,1388],{"class":563},[174,5283,2350],{"class":184},[174,5285,1279],{"class":1252},[174,5287,1055],{"class":184},[174,5289,5290,5292,5294],{"class":176,"line":609},[174,5291,2659],{"class":1252},[174,5293,202],{"class":184},[174,5295,1297],{"class":184},[174,5297,5298,5300,5302,5304,5306,5308,5310,5312,5314,5316,5318,5320,5322,5324,5326,5328,5330],{"class":176,"line":618},[174,5299,2668],{"class":1252},[174,5301,202],{"class":184},[174,5303,2673],{"class":1252},[174,5305,2676],{"class":563},[174,5307,2679],{"class":1252},[174,5309,2682],{"class":563},[174,5311,2685],{"class":1252},[174,5313,2688],{"class":563},[174,5315,2691],{"class":1252},[174,5317,2694],{"class":563},[174,5319,2697],{"class":1252},[174,5321,2700],{"class":563},[174,5323,2703],{"class":1252},[174,5325,2706],{"class":563},[174,5327,2709],{"class":1252},[174,5329,338],{"class":184},[174,5331,2714],{"class":1252},[174,5333,5334,5336,5338,5340,5342],{"class":176,"line":625},[174,5335,2719],{"class":1252},[174,5337,202],{"class":184},[174,5339,2724],{"class":1252},[174,5341,2727],{"class":563},[174,5343,2730],{"class":1252},[174,5345,5346],{"class":176,"line":633},[174,5347,1555],{"class":184},[174,5349,5350,5352],{"class":176,"line":641},[174,5351,1560],{"class":184},[174,5353,1055],{"class":1252},[1215,5355,5356],{},[15,5357,5358],{},"Note: This is a truncated output, and it may vary depending on the version of MongoDB you're using.",[10,5360,5362],{"id":5361},"bonus-add-mongo-express-for-web-based-administration","Bonus: Add Mongo-Express for Web-based Administration",[15,5364,5365,5366,5368,5369,5371],{},"Let's add a web-based administration tool for MongoDB, by using ",[121,5367,2755],{},". To add ",[121,5370,2755],{}," to the Docker\nCompose file, add the following service definition:",[165,5373,5374],{"className":167,"code":2762,"filename":123,"language":169,"meta":170,"style":170},[121,5375,5376,5382,5390,5402,5408,5418,5424,5430,5436,5444,5452,5464,5476,5486,5490,5496,5502],{"__ignoreMap":170},[174,5377,5378,5380],{"class":176,"line":177},[174,5379,2755],{"class":180},[174,5381,185],{"class":184},[174,5383,5384,5386,5388],{"class":176,"line":188},[174,5385,2775],{"class":180},[174,5387,202],{"class":184},[174,5389,2780],{"class":205},[174,5391,5392,5394,5396,5398,5400],{"class":176,"line":196},[174,5393,2785],{"class":180},[174,5395,202],{"class":184},[174,5397,300],{"class":184},[174,5399,2792],{"class":205},[174,5401,306],{"class":184},[174,5403,5404,5406],{"class":176,"line":209},[174,5405,2799],{"class":180},[174,5407,185],{"class":184},[174,5409,5410,5412,5414,5416],{"class":176,"line":217},[174,5411,2806],{"class":184},[174,5413,300],{"class":184},[174,5415,2811],{"class":205},[174,5417,306],{"class":184},[174,5419,5420,5422],{"class":176,"line":225},[174,5421,2818],{"class":180},[174,5423,185],{"class":184},[174,5425,5426,5428],{"class":176,"line":233},[174,5427,2806],{"class":184},[174,5429,414],{"class":205},[174,5431,5432,5434],{"class":176,"line":241},[174,5433,2831],{"class":180},[174,5435,185],{"class":184},[174,5437,5438,5440,5442],{"class":176,"line":249},[174,5439,2838],{"class":180},[174,5441,202],{"class":184},[174,5443,2843],{"class":878},[174,5445,5446,5448,5450],{"class":176,"line":257},[174,5447,2848],{"class":180},[174,5449,202],{"class":184},[174,5451,2843],{"class":878},[174,5453,5454,5456,5458,5460,5462],{"class":176,"line":265},[174,5455,2857],{"class":180},[174,5457,202],{"class":184},[174,5459,300],{"class":184},[174,5461,435],{"class":205},[174,5463,306],{"class":184},[174,5465,5466,5468,5470,5472,5474],{"class":176,"line":273},[174,5467,2870],{"class":180},[174,5469,202],{"class":184},[174,5471,300],{"class":184},[174,5473,2877],{"class":205},[174,5475,306],{"class":184},[174,5477,5478,5480,5482,5484],{"class":176,"line":281},[174,5479,2884],{"class":180},[174,5481,202],{"class":184},[174,5483,1178],{"class":1293},[174,5485,2891],{"class":1302},[174,5487,5488],{"class":176,"line":292},[174,5489,2896],{"class":205},[174,5491,5492,5494],{"class":176,"line":309},[174,5493,2901],{"class":180},[174,5495,185],{"class":184},[174,5497,5498,5500],{"class":176,"line":319},[174,5499,2908],{"class":180},[174,5501,185],{"class":184},[174,5503,5504,5506,5508],{"class":176,"line":352},[174,5505,2915],{"class":180},[174,5507,202],{"class":184},[174,5509,2920],{"class":205},[1215,5511,5512],{},[15,5513,4817,5514,5516,5517,5519,5520,5522],{},[121,5515,2755],{}," service depends on the ",[121,5518,134],{}," service being healthy. This ensures that the replica set is\nup and running before starting the ",[121,5521,2755],{}," service.",[15,5524,5525,5526,5528,5529,5531],{},"You can access ",[121,5527,2755],{}," at ",[121,5530,2942],{}," in your browser, and have something like this:",[23,5533],{"alt":5534,"className":5535,"source":2949},"Successful connected to mongo-express",[27,2948,29],[1215,5537,5538],{},[15,5539,5540,5541,5543,5544,135,5546,3198,5548,5550,5551,5553],{},"Note: To connect your application to the MongoDB replica set, you can use the connection string ",[121,5542,2957],{},".\nAlso make sure to replace the ",[121,5545,1139],{},[121,5547,1142],{},[121,5549,2965],{}," with your application's credentials by setting the environment variables in the ",[121,5552,2969],{}," file.",[15,5555,5556],{},"If everything is set up correctly, you should have something like this in your docker desktop:",[23,5558],{"alt":5559,"className":5560,"source":2977},"Successful created the replicaset",[27,2948,29],[15,5562,5563],{},"And voilà, you have a MongoDB replica set cluster with a web-based administration tool!",[10,5565,2984],{"id":2983},[15,5567,5568,5569,5571],{},"In this article, I walked you through setting up a 3-node MongoDB replica set cluster using Docker Compose. We covered\nthe basics of MongoDB replica sets, the prerequisites for setting up a replica set, and the steps to create a Docker\nCompose file to set up the replica set. I also showed you how to verify the replica set and add a web-based administration\ntool using ",[121,5570,2755],{},". I hope this guide helps you get started with MongoDB replica sets and Docker Compose.",[15,5573,5574,5575,5578],{},"In a future post, I'll talk about something more important:\n",[35,5576,5577],{},"how to back up, and restore a MongoDB database in a containerized environment",".\nYou may have heard that Docker containers are ephemeral, so it's important to have a backup strategy in\nplace to avoid data loss. Stay tuned for that!",[15,5580,5581],{},"If you have any questions or feedback, feel free to reach out to me. Happy coding!",[10,5583,5585],{"id":5584},"references","References",[126,5587,5588,5594,5600,5606,5611,5617,5623,5629],{},[129,5589,5590],{},[83,5591,5593],{"href":85,"rel":5592},[87],"MongoDB Replica Set Documentation",[129,5595,5596],{},[83,5597,5599],{"href":3017,"rel":5598},[87],"Docker Documentation",[129,5601,5602],{},[83,5603,5605],{"href":3024,"rel":5604},[87],"Docker Compose Documentation",[129,5607,5608],{},[83,5609,3178],{"href":110,"rel":5610},[87],[129,5612,5613],{},[83,5614,5616],{"href":3037,"rel":5615},[87],"Docker Volumes",[129,5618,5619],{},[83,5620,5622],{"href":3044,"rel":5621},[87],"Docker Networks",[129,5624,5625],{},[83,5626,5628],{"href":3051,"rel":5627},[87],"Docker Health Checks",[129,5630,5631],{},[83,5632,3060],{"href":3058,"rel":5633},[87],[3062,5635,5636],{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":170,"searchDepth":188,"depth":188,"links":5638},[5639,5640,5643,5651,5652,5653],{"id":12,"depth":188,"text":13},{"id":3112,"depth":188,"text":3113,"children":5641},[5642],{"id":3126,"depth":196,"text":3127},{"id":3160,"depth":188,"text":3102,"children":5644},[5645,5646,5647,5648,5649,5650],{"id":3163,"depth":196,"text":3164},{"id":3181,"depth":196,"text":3182},{"id":4010,"depth":196,"text":4011},{"id":4067,"depth":196,"text":4068},{"id":4796,"depth":196,"text":4797},{"id":4823,"depth":196,"text":4824},{"id":5361,"depth":188,"text":5362},{"id":2983,"depth":188,"text":2984},{"id":5584,"depth":188,"text":5585},"How to set up a 3-node MongoDB replica set cluster using Docker Compose. Learn about MongoDB replica sets, prerequisites, and steps to create a Docker Compose file to set up the replica set.",{},"\u002Fdevops\u002Fset-up-mongodb-replica-with-docker",{"title":3102,"description":5654},"devops\u002F2.set-up-mongodb-replica-with-docker",[3092,3093,3094,3095],[3097,2153,3098],"Yw1b9QsYiiC117mbBj_dwalMYFwKQTGQiQSllDx2V3I",[5663,5666],{"title":5664,"path":5665},"Déployer une API Express.js avec Docker","\u002Fdevops\u002Fdeploy-expressjs-api-using-docker.fr",{"title":5667,"path":5668},"Sauvegarder et restaurer MongoDB dans un environnement Docker","\u002Fdevops\u002Fbackup-and-restore-mongodb-in-docker-environment.fr",[5670,5677],{"path":5668,"title":5667,"description":5671,"date":5672,"tags":5673,"topics":5676},"Comment créer une sauvegarde complète d'une base MongoDB qui tourne dans un conteneur Docker et restaurer la sauvegarde dans un nouveau conteneur MongoDB.","2024-07-18",[3092,3094,3095,5674,5675],"Backup","Restore",[3097,2153,3098],{"path":5665,"title":5664,"description":5678,"date":5679,"tags":5680,"topics":5686},"Comment déployer une API REST Express.js avec Docker, avec un focus sur les performances MongoDB, les builds Docker multi-stage, Jest pour les tests, et Nginx comme reverse proxy.","2024-04-11",[5681,5682,5683,5684,5685,3094],"Express.JS","API","Node.js","Mongo","CI\u002FCD",[5687,3097],"backend",1780074486027]