[{"data":1,"prerenderedAt":1043},["ShallowReactive",2],{"docs-nav":3,"docs:\u002Fdocs\u002Fconcepts\u002Fbuilds-and-deployments":139},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136],{"path":5,"title":6},"\u002Fdocs\u002Faccess-gating","Protect a local route",{"path":8,"title":9},"\u002Fdocs\u002Farchitecture\u002Fsecurity-and-trust","Security and trust",{"path":11,"title":12},"\u002Fdocs\u002Fconcepts\u002Fbuilds-and-deployments","Build and deploy",{"path":14,"title":15},"\u002Fdocs\u002Fconcepts\u002Fconfiguration-ownership","Where configuration belongs",{"path":17,"title":18},"\u002Fdocs\u002Fconcepts\u002Fenvironments-and-secrets","Environment values and secrets",{"path":20,"title":21},"\u002Fdocs\u002Fconcepts\u002Fmental-model","How projects fit together",{"path":23,"title":24},"\u002Fdocs\u002Fconcepts\u002Fplans-and-apply","Plans and apply",{"path":26,"title":27},"\u002Fdocs\u002Fconcepts\u002Ftargets-and-runtimes","Choose a target and runtime",{"path":29,"title":30},"\u002Fdocs\u002Fcontribute\u002Freleases","Publish a release",{"path":32,"title":33},"\u002Fdocs\u002Fdevelopment-mounts","Development mounts",{"path":35,"title":36},"\u002Fdocs\u002Fgetting-started","Getting started",{"path":38,"title":39},"\u002Fdocs\u002Fhelp\u002Ffaq","FAQ",{"path":41,"title":42},"\u002Fdocs\u002Fhelp\u002Ftroubleshooting","Troubleshooting",{"path":44,"title":45},"\u002Fdocs\u002Fhow-to\u002Fdeploy-production","Prepare a deployment environment",{"path":47,"title":48},"\u002Fdocs\u002Fhow-to\u002Fswarm-cluster","Run on a multi-node Swarm",{"path":50,"title":51},"\u002Fdocs","mm documentation",{"path":53,"title":54},"\u002Fdocs\u002Fjobs-and-schedules","Jobs and schedules",{"path":56,"title":57},"\u002Fdocs\u002Flocal-dashboard","Local dashboard",{"path":59,"title":60},"\u002Fdocs\u002Flocal-https","Local HTTPS",{"path":62,"title":63},"\u002Fdocs\u002Flocal-services","Local services",{"path":65,"title":66},"\u002Fdocs\u002Fmcp","Let an AI agent work on your project",{"path":68,"title":69},"\u002Fdocs\u002Fmulti-project-hosts","Run multiple projects on one host",{"path":71,"title":72},"\u002Fdocs\u002Fonboarding","Set up a project",{"path":74,"title":75},"\u002Fdocs\u002Fopenbao","Use OpenBao",{"path":77,"title":78},"\u002Fdocs\u002Fproject\u002Fcontributing","Contributing",{"path":80,"title":81},"\u002Fdocs\u002Fproject\u002Flicense","License",{"path":83,"title":84},"\u002Fdocs\u002Fproject\u002Fsecurity","Security",{"path":86,"title":87},"\u002Fdocs\u002Freference\u002Fcapability-matrix","Supported features and platforms",{"path":89,"title":90},"\u002Fdocs\u002Freference\u002Fcli","CLI command reference",{"path":92,"title":93},"\u002Fdocs\u002Freference\u002Fconfiguration","Configuration",{"path":95,"title":96},"\u002Fdocs\u002Freference\u002Fenvironment-variables","Environment variables",{"path":98,"title":99},"\u002Fdocs\u002Freference\u002Ferrors-and-exit-codes","Errors and exit codes",{"path":101,"title":102},"\u002Fdocs\u002Freference\u002Fknown-issues","Known limitations",{"path":104,"title":105},"\u002Fdocs\u002Fremote-access","Manage remote access",{"path":107,"title":108},"\u002Fdocs\u002Fremote-daemon","Set up a remote host",{"path":110,"title":111},"\u002Fdocs\u002Fruntime-observability","Status, logs, and commands",{"path":113,"title":114},"\u002Fdocs\u002Fsecret-delivery","Pass secrets to your app",{"path":116,"title":117},"\u002Fdocs\u002Fsecret-providers","Choose a secret store",{"path":119,"title":120},"\u002Fdocs\u002Fstart\u002Finstall","Install mm",{"path":122,"title":123},"\u002Fdocs\u002Fterminal-ui","Terminal UI",{"path":125,"title":126},"\u002Fdocs\u002Ftutorials\u002Fdotnet-web-api",".NET web API example",{"path":128,"title":129},"\u002Fdocs\u002Ftutorials\u002Ffirst-local-app","First local app",{"path":131,"title":132},"\u002Fdocs\u002Ftutorials\u002Flaravel-rust","Laravel and Rust example",{"path":134,"title":135},"\u002Fdocs\u002Ftutorials\u002Fnode-fullstack","Node full stack example",{"path":137,"title":138},"\u002Fdocs\u002Fvault","Use HashiCorp Vault",{"id":140,"title":12,"body":141,"description":1036,"extension":1037,"meta":1038,"navigation":1039,"path":11,"seo":1040,"stem":1041,"__hash__":1042},"docs\u002Fdocs\u002Fconcepts\u002Fbuilds-and-deployments.md",{"type":142,"value":143,"toc":1021},"minimark",[144,148,153,156,194,209,213,218,225,258,269,292,303,317,321,324,363,374,378,418,421,428,432,435,510,532,543,547,550,618,637,643,647,653,695,716,730,745,749,756,783,786,793,797,804,989,997,1001,1004,1017],[145,146,147],"p",{},"Builds create container images. Deployments run those images with the selected\nenvironment's configuration. If your project only uses third-party images,\nskip the build step.",[149,150,152],"h2",{"id":151},"before-building","Before building",[145,154,155],{},"You need Docker Buildx, a builder that supports your configured platforms, and\npush access to every configured image repository. Publication also requires a\nclean Git worktree and complete history and tags.",[157,158,163],"pre",{"className":159,"code":160,"language":161,"meta":162,"style":162},"language-sh shiki shiki-themes mm","git status --short\ngit rev-parse --is-shallow-repository\n","sh","",[164,165,166,183],"code",{"__ignoreMap":162},[167,168,171,175,179],"span",{"class":169,"line":170},"line",1,[167,172,174],{"class":173},"svrjQ","git",[167,176,178],{"class":177},"sv8ni"," status",[167,180,182],{"class":181},"sbRf1"," --short\n",[167,184,186,188,191],{"class":169,"line":185},2,[167,187,174],{"class":173},[167,189,190],{"class":177}," rev-parse",[167,192,193],{"class":181}," --is-shallow-repository\n",[145,195,196,197,200,201,204,205,208],{},"Commit your changes. For a shallow clone, fetch the missing history with\n",[164,198,199],{},"git fetch --unshallow --tags","; otherwise use ",[164,202,203],{},"git fetch --tags",".\nReplace any ",[164,206,207],{},"ghcr.io\u002Fexample\u002F..."," image names with repositories you own.",[149,210,212],{"id":211},"build-and-publish","Build and publish",[214,215,217],"h3",{"id":216},"local-build-platforms","Local build platforms",[145,219,220,221,224],{},"To build natively on Apple Silicon while retaining the project's shared platforms,\ncreate ",[164,222,223],{},".config\u002Fmm.overrides.yaml",":",[157,226,230],{"className":227,"code":228,"language":229,"meta":162,"style":162},"language-yaml shiki shiki-themes mm","build:\n  platforms: [linux\u002Farm64]\n","yaml",[164,231,232,242],{"__ignoreMap":162},[167,233,234,238],{"class":169,"line":170},[167,235,237],{"class":236},"sWZmh","build",[167,239,241],{"class":240},"sIbZ0",":\n",[167,243,244,247,249,252,255],{"class":169,"line":185},[167,245,246],{"class":236},"  platforms",[167,248,224],{"class":240},[167,250,251],{"class":240}," [",[167,253,254],{"class":177},"linux\u002Farm64",[167,256,257],{"class":240},"]\n",[145,259,260,261,264,265,268],{},"The list replaces the shared ",[164,262,263],{},"build.platforms"," list. Check the effective platforms\nin ",[164,266,267],{},"mm build --publish plan"," before applying it. Removing the override restores\nthe shared settings; adding, editing, or removing it requires a fresh plan.",[145,270,271,272,275,276,279,280,283,284,287,288,291],{},"New projects receive ",[164,273,274],{},"\u002F.config\u002Fmm.overrides.yaml"," in ",[164,277,278],{},".gitignore"," during reviewed\n",[164,281,282],{},"mm init",". For an existing project, add and commit that rule first. Verify with\n",[164,285,286],{},"git check-ignore .config\u002Fmm.overrides.yaml"," and ",[164,289,290],{},"git status --short",".\nNormal dirty-worktree checks still apply to other changes.",[145,293,294,295,298,299,302],{},"If you used ",[164,296,297],{},"git update-index --skip-worktree .config\u002Fmm.yaml",", first copy your\nlocal settings into the override, then run\n",[164,300,301],{},"git update-index --no-skip-worktree .config\u002Fmm.yaml"," and restore only those local\nsettings in the shared file. Preserve unrelated edits.",[145,304,305,306,308,309,312,313,316],{},"For repository-root build contexts, also exclude ",[164,307,223],{},"\nthrough ",[164,310,311],{},".dockerignore"," (or an existing ",[164,314,315],{},".config"," rule). Git ignore rules do not\ncontrol which files are copied into an image.",[214,318,320],{"id":319},"review-and-apply","Review and apply",[145,322,323],{},"Run from the project directory:",[157,325,327],{"className":159,"code":326,"language":161,"meta":162,"style":162},"mm build --publish plan\nmm build --publish apply --plan BUILD_PLAN_HASH --yes\n",[164,328,329,343],{"__ignoreMap":162},[167,330,331,334,337,340],{"class":169,"line":170},[167,332,333],{"class":173},"mm",[167,335,336],{"class":177}," build",[167,338,339],{"class":181}," --publish",[167,341,342],{"class":177}," plan\n",[167,344,345,347,349,351,354,357,360],{"class":169,"line":185},[167,346,333],{"class":173},[167,348,336],{"class":177},[167,350,339],{"class":181},[167,352,353],{"class":177}," apply",[167,355,356],{"class":181}," --plan",[167,358,359],{"class":177}," BUILD_PLAN_HASH",[167,361,362],{"class":181}," --yes\n",[145,364,365,366,369,370,373],{},"Replace ",[164,367,368],{},"BUILD_PLAN_HASH"," with the hash printed by the plan command. With\n",[164,371,372],{},"--publish",", Buildx pushes the images to your registry. Without it, the build\nproduces a local OCI image archive, which mm cannot use for deployment.",[149,375,377],{"id":376},"deploy-the-build","Deploy the build",[157,379,381],{"className":159,"code":380,"language":161,"meta":162,"style":162},"mm deploy plan\nmm deploy apply --plan DEPLOY_PLAN_HASH --yes\nmm service status\n",[164,382,383,392,407],{"__ignoreMap":162},[167,384,385,387,390],{"class":169,"line":170},[167,386,333],{"class":173},[167,388,389],{"class":177}," deploy",[167,391,342],{"class":177},[167,393,394,396,398,400,402,405],{"class":169,"line":185},[167,395,333],{"class":173},[167,397,389],{"class":177},[167,399,353],{"class":177},[167,401,356],{"class":181},[167,403,404],{"class":177}," DEPLOY_PLAN_HASH",[167,406,362],{"class":181},[167,408,410,412,415],{"class":169,"line":409},3,[167,411,333],{"class":173},[167,413,414],{"class":177}," service",[167,416,417],{"class":177}," status\n",[145,419,420],{},"Use the hash from the deployment plan. mm selects the latest successful published\nbuild for the project, checkout location, and environment. Each module must have\na result compatible with its image repository, build paths, arguments, secret\nIDs, extra-input paths, dependency definitions, platforms, and selected variant.\nA changed base-image definition also requires new images for its dependents.\nmm pins the deployment to each image's digest, so a later tag change cannot\nsilently replace the image.",[145,422,423,424,427],{},"For a named environment, use ",[164,425,426],{},"--environment production"," on both the build and\ndeployment commands. If a plan changes, generate a fresh one.",[214,429,431],{"id":430},"deploy-a-build-to-a-remote-host","Deploy a build to a remote host",[145,433,434],{},"A remote host never builds, and it cannot see this machine's builds. Give it the\nbuild as a receipt: a file with the reviewed build plan and the digests it\npublished.",[157,436,438],{"className":159,"code":437,"language":161,"meta":162,"style":162},"mm --environment production build --publish --yes\nmm --environment production build receipt build-receipt.json\nmm --environment production deploy plan --receipt build-receipt.json\nmm --environment production deploy apply --plan PLAN_HASH --yes\n",[164,439,440,456,472,490],{"__ignoreMap":162},[167,441,442,444,447,450,452,454],{"class":169,"line":170},[167,443,333],{"class":173},[167,445,446],{"class":181}," --environment",[167,448,449],{"class":177}," production",[167,451,336],{"class":177},[167,453,339],{"class":181},[167,455,362],{"class":181},[167,457,458,460,462,464,466,469],{"class":169,"line":185},[167,459,333],{"class":173},[167,461,446],{"class":181},[167,463,449],{"class":177},[167,465,336],{"class":177},[167,467,468],{"class":177}," receipt",[167,470,471],{"class":177}," build-receipt.json\n",[167,473,474,476,478,480,482,485,488],{"class":169,"line":409},[167,475,333],{"class":173},[167,477,446],{"class":181},[167,479,449],{"class":177},[167,481,389],{"class":177},[167,483,484],{"class":177}," plan",[167,486,487],{"class":181}," --receipt",[167,489,471],{"class":177},[167,491,493,495,497,499,501,503,505,508],{"class":169,"line":492},4,[167,494,333],{"class":173},[167,496,446],{"class":181},[167,498,449],{"class":177},[167,500,389],{"class":177},[167,502,353],{"class":177},[167,504,356],{"class":181},[167,506,507],{"class":177}," PLAN_HASH",[167,509,362],{"class":181},[145,511,512,515,516,519,520,523,524,527,528,531],{},[164,513,514],{},"mm build receipt"," writes the latest published build of this checkout for the\nenvironment. The receipt must come from a build of the commit you deploy (HEAD,\nor ",[164,517,518],{},"--commit","). The host checks it against that commit's configuration with\nthe rules above and plans with its digests. When the deployment is applied, the\nhost records the receipt as that commit's build, so ",[164,521,522],{},"mm service status"," and\n",[164,525,526],{},"mm service logs"," find the same images, and a later plan of the same commit\nneeds no ",[164,529,530],{},"--receipt",".",[145,533,534,535,538,539,542],{},"The same works without a remote host: ",[164,536,537],{},"mm deploy plan --receipt FILE"," deploys\na receipt of HEAD to a local target, and ",[164,540,541],{},"mm deploy apply --plan HASH --receipt FILE --yes"," applies that plan.",[214,544,546],{"id":545},"promote-a-build-to-another-environment","Promote a build to another environment",[145,548,549],{},"A receipt built for one environment can deploy to another, so CI can build\nonce and promote the same digests to integration, UAT, and production:",[157,551,553],{"className":159,"code":552,"language":161,"meta":162,"style":162},"mm --environment ci build --publish --yes\nmm --environment ci build receipt build-receipt.json\nmm --environment production deploy plan --receipt build-receipt.json\nmm --environment production deploy apply --plan PLAN_HASH --yes\n",[164,554,555,570,584,600],{"__ignoreMap":162},[167,556,557,559,561,564,566,568],{"class":169,"line":170},[167,558,333],{"class":173},[167,560,446],{"class":181},[167,562,563],{"class":177}," ci",[167,565,336],{"class":177},[167,567,339],{"class":181},[167,569,362],{"class":181},[167,571,572,574,576,578,580,582],{"class":169,"line":185},[167,573,333],{"class":173},[167,575,446],{"class":181},[167,577,563],{"class":177},[167,579,336],{"class":177},[167,581,468],{"class":177},[167,583,471],{"class":177},[167,585,586,588,590,592,594,596,598],{"class":169,"line":409},[167,587,333],{"class":173},[167,589,446],{"class":181},[167,591,449],{"class":177},[167,593,389],{"class":177},[167,595,484],{"class":177},[167,597,487],{"class":181},[167,599,471],{"class":177},[167,601,602,604,606,608,610,612,614,616],{"class":169,"line":492},[167,603,333],{"class":173},[167,605,446],{"class":181},[167,607,449],{"class":177},[167,609,389],{"class":177},[167,611,353],{"class":177},[167,613,356],{"class":181},[167,615,507],{"class":177},[167,617,362],{"class":181},[145,619,620,621,624,625,632,633,636],{},"mm plans the target environment's build of the receipt's commit and accepts\nthe receipt only when it builds exactly the same units: the same modules,\nplatforms, image repositories, variants, build paths, arguments, extra inputs,\ndependencies, and file contents. Otherwise it refuses and names the first\nmodule that differs and what differs, such as ",[164,622,623],{},"build argument FEATURE",". A\nmodule with build secrets is promoted only when every secret is listed under\n",[626,627,629],"a",{"href":628},"..\u002Fsecret-delivery#build-secrets",[164,630,631],{},"credential-only-secrets",": other\nsecrets can hold a different value in each environment. The deployment plan's\n",[164,634,635],{},"build_receipt"," field records the receipt hash, commit, and the environment it\nwas built for.",[145,638,639,640,642],{},"The build context is hashed from the files in the checkout, so files that are\nnot committed but are not excluded by ",[164,641,311],{}," also make the units\ndiffer.",[214,644,646],{"id":645},"import-a-build","Import a build",[145,648,649,652],{},[164,650,651],{},"mm build import"," records a receipt in this machine's state without deploying\nit. It is a reviewed change like the others:",[157,654,656],{"className":159,"code":655,"language":161,"meta":162,"style":162},"mm --environment production build import build-receipt.json\nmm --environment production build import build-receipt.json --plan IMPORT_PLAN_HASH --yes\n",[164,657,658,673],{"__ignoreMap":162},[167,659,660,662,664,666,668,671],{"class":169,"line":170},[167,661,333],{"class":173},[167,663,446],{"class":181},[167,665,449],{"class":177},[167,667,336],{"class":177},[167,669,670],{"class":177}," import",[167,672,471],{"class":177},[167,674,675,677,679,681,683,685,688,690,693],{"class":169,"line":185},[167,676,333],{"class":173},[167,678,446],{"class":181},[167,680,449],{"class":177},[167,682,336],{"class":177},[167,684,670],{"class":177},[167,686,687],{"class":177}," build-receipt.json",[167,689,356],{"class":181},[167,691,692],{"class":177}," IMPORT_PLAN_HASH",[167,694,362],{"class":181},[145,696,697,698,701,702,705,706,709,710,712,713,715],{},"The review prints ",[164,699,700],{},"plan_hash"," (in JSON, ",[164,703,704],{},".plan_hash","). A normal import follows\nthe deployment rules above: the receipt must be a build of HEAD, for this\nenvironment or one that builds the same units. It then becomes this checkout's\npublished build for the environment, so ",[164,707,708],{},"mm deploy plan",", ",[164,711,522],{},",\nand ",[164,714,514],{}," use its digests.",[145,717,718,719,722,723,726,727,729],{},"With ",[164,720,721],{},"--cache-only",", the receipt may be a build of any commit, and mm only\nrecords its images for reuse: a later ",[164,724,725],{},"mm build --publish"," retags an unchanged\nmodule's image instead of rebuilding it. A cache-only import never selects\ndeployment images. Use it on a fresh CI runner, where ",[164,728,725],{}," has\nno local record of earlier builds and does not search the registry for them.\nImages of modules with build secrets that are not credential-only, or whose\nimage repository has changed, are not recorded for reuse.",[145,731,732,733,736,737,740,741,531],{},"A receipt is not signed. Its hash detects a damaged file, but whoever runs\n",[164,734,735],{},"deploy plan"," chooses which published digests run, within the image\nrepositories the commit configures. That needs ",[164,738,739],{},"deploy"," access to the\nenvironment, and the host's audit log records the receipt hash and every\ndigest. See ",[626,742,744],{"href":743},"..\u002Fremote-daemon#deploy-from-ci","deploy from CI",[214,746,748],{"id":747},"change-runtime-environment-variables","Change runtime environment variables",[145,750,751,752,755],{},"Runtime settings, including environment bindings, service ",[164,753,754],{},"env"," values, domains,\nand routes, do not require rebuilding published images. After changing them,\nreview and apply a fresh deployment plan:",[157,757,759],{"className":159,"code":758,"language":161,"meta":162,"style":162},"mm deploy plan\nmm deploy apply --plan DEPLOY_PLAN_HASH --yes\n",[164,760,761,769],{"__ignoreMap":162},[167,762,763,765,767],{"class":169,"line":170},[167,764,333],{"class":173},[167,766,389],{"class":177},[167,768,342],{"class":177},[167,770,771,773,775,777,779,781],{"class":169,"line":185},[167,772,333],{"class":173},[167,774,389],{"class":177},[167,776,353],{"class":177},[167,778,356],{"class":181},[167,780,404],{"class":177},[167,782,362],{"class":181},[145,784,785],{},"The deployment uses the existing image digests with the updated runtime\nconfiguration. YAML comments and formatting changes also preserve image\neligibility. New source commits do not automatically publish or select new\nimages; run the build-and-publish steps when you want to deploy updated code.",[145,787,788,789,792],{},"Values in ",[164,790,791],{},"modules.\u003Cname>.build.args"," are build-time inputs. Changing them requires\na new published build. All reviewed build and deployment plans still require\ntheir exact hashes; configuration edits after review require a fresh plan.",[149,794,796],{"id":795},"build-dependencies-and-variants","Build dependencies and variants",[145,798,799,800,803],{},"This configuration fragment builds a base image before the API and selects the\nAPI Dockerfile's ",[164,801,802],{},"prod"," target for production:",[157,805,807],{"className":227,"code":806,"language":229,"meta":162,"style":162},"build:\n  platforms: [linux\u002Famd64, linux\u002Farm64]\n  tag-strategy: immutable\nmodules:\n  base:\n    path: images\u002Fbase\n    build:\n      image: ghcr.io\u002Fexample\u002Fbase\n  api:\n    path: services\u002Fapi\n    build:\n      image: ghcr.io\u002Fexample\u002Fapi\n      depends-on:\n        base: BASE_IMAGE\n      targets:\n        production: prod\nenvironments:\n  production:\n    build-variant: production\n",[164,808,809,815,834,844,851,859,870,878,889,897,907,914,924,932,943,951,962,970,978],{"__ignoreMap":162},[167,810,811,813],{"class":169,"line":170},[167,812,237],{"class":236},[167,814,241],{"class":240},[167,816,817,819,821,823,826,829,832],{"class":169,"line":185},[167,818,246],{"class":236},[167,820,224],{"class":240},[167,822,251],{"class":240},[167,824,825],{"class":177},"linux\u002Famd64",[167,827,828],{"class":240},",",[167,830,831],{"class":177}," linux\u002Farm64",[167,833,257],{"class":240},[167,835,836,839,841],{"class":169,"line":409},[167,837,838],{"class":236},"  tag-strategy",[167,840,224],{"class":240},[167,842,843],{"class":177}," immutable\n",[167,845,846,849],{"class":169,"line":492},[167,847,848],{"class":236},"modules",[167,850,241],{"class":240},[167,852,854,857],{"class":169,"line":853},5,[167,855,856],{"class":236},"  base",[167,858,241],{"class":240},[167,860,862,865,867],{"class":169,"line":861},6,[167,863,864],{"class":236},"    path",[167,866,224],{"class":240},[167,868,869],{"class":177}," images\u002Fbase\n",[167,871,873,876],{"class":169,"line":872},7,[167,874,875],{"class":236},"    build",[167,877,241],{"class":240},[167,879,881,884,886],{"class":169,"line":880},8,[167,882,883],{"class":236},"      image",[167,885,224],{"class":240},[167,887,888],{"class":177}," ghcr.io\u002Fexample\u002Fbase\n",[167,890,892,895],{"class":169,"line":891},9,[167,893,894],{"class":236},"  api",[167,896,241],{"class":240},[167,898,900,902,904],{"class":169,"line":899},10,[167,901,864],{"class":236},[167,903,224],{"class":240},[167,905,906],{"class":177}," services\u002Fapi\n",[167,908,910,912],{"class":169,"line":909},11,[167,911,875],{"class":236},[167,913,241],{"class":240},[167,915,917,919,921],{"class":169,"line":916},12,[167,918,883],{"class":236},[167,920,224],{"class":240},[167,922,923],{"class":177}," ghcr.io\u002Fexample\u002Fapi\n",[167,925,927,930],{"class":169,"line":926},13,[167,928,929],{"class":236},"      depends-on",[167,931,241],{"class":240},[167,933,935,938,940],{"class":169,"line":934},14,[167,936,937],{"class":236},"        base",[167,939,224],{"class":240},[167,941,942],{"class":177}," BASE_IMAGE\n",[167,944,946,949],{"class":169,"line":945},15,[167,947,948],{"class":236},"      targets",[167,950,241],{"class":240},[167,952,954,957,959],{"class":169,"line":953},16,[167,955,956],{"class":236},"        production",[167,958,224],{"class":240},[167,960,961],{"class":177}," prod\n",[167,963,965,968],{"class":169,"line":964},17,[167,966,967],{"class":236},"environments",[167,969,241],{"class":240},[167,971,973,976],{"class":169,"line":972},18,[167,974,975],{"class":236},"  production",[167,977,241],{"class":240},[167,979,981,984,986],{"class":169,"line":980},19,[167,982,983],{"class":236},"    build-variant",[167,985,224],{"class":240},[167,987,988],{"class":177}," production\n",[145,990,991,992,996],{},"Use ",[626,993,995],{"href":994},"..\u002Fsecret-delivery","BuildKit secrets"," for sensitive build inputs, rather\nthan public build arguments.",[149,998,1000],{"id":999},"recover-from-a-failed-deployment","Recover from a failed deployment",[145,1002,1003],{},"mm attempts to restore the previous successful stacks and routes. An interrupted\ndeployment is checked again on the next apply. Use the same target and runtime\nas the interrupted operation.",[145,1005,1006,1007,287,1010,1012,1013,531],{},"Start with ",[164,1008,1009],{},"mm doctor",[164,1011,522],{},". Fix the reported problem, then\nreview a new deployment plan. Rollback is not guaranteed; if it fails, the error\nreports both failures. Do not delete private state or change ownership labels\nto bypass recovery. See ",[626,1014,1016],{"href":1015},"..\u002Fhelp\u002Ftroubleshooting","troubleshooting",[1018,1019,1020],"style",{},"html pre.shiki code .svrjQ, html code.shiki .svrjQ{--shiki-default:var(--mm-code-function)}html pre.shiki code .sv8ni, html code.shiki .sv8ni{--shiki-default:var(--mm-code-string)}html pre.shiki code .sbRf1, html code.shiki .sbRf1{--shiki-default:var(--mm-code-option)}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 pre.shiki code .sWZmh, html code.shiki .sWZmh{--shiki-default:var(--mm-code-key)}html pre.shiki code .sIbZ0, html code.shiki .sIbZ0{--shiki-default:var(--mm-code-punctuation)}",{"title":162,"searchDepth":185,"depth":185,"links":1022},[1023,1024,1028,1034,1035],{"id":151,"depth":185,"text":152},{"id":211,"depth":185,"text":212,"children":1025},[1026,1027],{"id":216,"depth":409,"text":217},{"id":319,"depth":409,"text":320},{"id":376,"depth":185,"text":377,"children":1029},[1030,1031,1032,1033],{"id":430,"depth":409,"text":431},{"id":545,"depth":409,"text":546},{"id":645,"depth":409,"text":646},{"id":747,"depth":409,"text":748},{"id":795,"depth":185,"text":796},{"id":999,"depth":185,"text":1000},"Publish your application images and deploy the matching build.","md",{},true,{"title":12,"description":1036},"docs\u002Fconcepts\u002Fbuilds-and-deployments","cJLxaKFXQPEItlJPavZQ6dYzf2XMEea9Reri5rtCKbI",1794512546197]