[{"data":1,"prerenderedAt":609},["ShallowReactive",2],{"docs-nav":3,"docs:\u002Fdocs\u002Ftutorials\u002Flaravel-rust":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":132,"body":141,"description":602,"extension":603,"meta":604,"navigation":605,"path":131,"seo":606,"stem":607,"__hash__":608},"docs\u002Fdocs\u002Ftutorials\u002Flaravel-rust.md",{"type":142,"value":143,"toc":595},"minimark",[144,152,162,167,176,180,199,348,359,363,391,397,476,480,491,552,559,563,581,588,591],[145,146,147,151],"p",{},[148,149,150],"code",{},"examples\u002Flaravel-rust"," separates data and application stacks while joining both\nto one mm-managed network. Laravel web and queue reuse one image; Rust pricing\nuses its own Rust 1.98 build.",[153,154,160],"pre",{"className":155,"code":157,"language":158,"meta":159},[156],"language-text","Laravel web -> pricing -> Valkey\n     |           |\n     +-> queue   +-> health\n     +-> PostgreSQL\n     +-> shared Mailpit\n","text","",[148,161,157],{"__ignoreMap":159},[163,164,166],"h2",{"id":165},"before-you-start","Before you start",[145,168,169,170,175],{},"Complete ",[171,172,174],"a",{"href":173},".\u002Ffirst-local-app#set-up-the-workstation","workstation setup"," on a\nLinux systemd host with HAProxy. You need Docker Buildx, a Compose runtime, and\nregistry access. Replace both example image repositories, commit the changes,\nand use a full checkout with tags.",[163,177,179],{"id":178},"inspect-and-deploy","Inspect and deploy",[145,181,182,183,186,187,190,191,194,195,198],{},"The Laravel mount preset attaches source at ",[148,184,185],{},"\u002Fapp"," to web and queue while\npreserving ",[148,188,189],{},"\u002Fapp\u002Fvendor",". PostgreSQL and Valkey remain pinned third-party\nCompose services. Local delivery is ",[148,192,193],{},"env-file","; production is ",[148,196,197],{},"direct",".",[153,200,204],{"className":201,"code":202,"language":203,"meta":159,"style":159},"language-sh shiki shiki-themes mm","cd examples\u002Flaravel-rust\nmm config validate\nmm env review\nmm dev mounts plan laravel\nmm secret init age\nmm secret generate --missing\nmm build --publish plan\nmm build --publish apply --plan BUILD_PLAN_HASH --yes\nmm deploy plan\nmm deploy apply --plan DEPLOY_PLAN_HASH --yes\n","sh",[148,205,206,219,231,242,259,273,287,301,322,332],{"__ignoreMap":159},[207,208,211,215],"span",{"class":209,"line":210},"line",1,[207,212,214],{"class":213},"svrjQ","cd",[207,216,218],{"class":217},"sv8ni"," examples\u002Flaravel-rust\n",[207,220,222,225,228],{"class":209,"line":221},2,[207,223,224],{"class":213},"mm",[207,226,227],{"class":217}," config",[207,229,230],{"class":217}," validate\n",[207,232,234,236,239],{"class":209,"line":233},3,[207,235,224],{"class":213},[207,237,238],{"class":217}," env",[207,240,241],{"class":217}," review\n",[207,243,245,247,250,253,256],{"class":209,"line":244},4,[207,246,224],{"class":213},[207,248,249],{"class":217}," dev",[207,251,252],{"class":217}," mounts",[207,254,255],{"class":217}," plan",[207,257,258],{"class":217}," laravel\n",[207,260,262,264,267,270],{"class":209,"line":261},5,[207,263,224],{"class":213},[207,265,266],{"class":217}," secret",[207,268,269],{"class":217}," init",[207,271,272],{"class":217}," age\n",[207,274,276,278,280,283],{"class":209,"line":275},6,[207,277,224],{"class":213},[207,279,266],{"class":217},[207,281,282],{"class":217}," generate",[207,284,286],{"class":285},"sbRf1"," --missing\n",[207,288,290,292,295,298],{"class":209,"line":289},7,[207,291,224],{"class":213},[207,293,294],{"class":217}," build",[207,296,297],{"class":285}," --publish",[207,299,300],{"class":217}," plan\n",[207,302,304,306,308,310,313,316,319],{"class":209,"line":303},8,[207,305,224],{"class":213},[207,307,294],{"class":217},[207,309,297],{"class":285},[207,311,312],{"class":217}," apply",[207,314,315],{"class":285}," --plan",[207,317,318],{"class":217}," BUILD_PLAN_HASH",[207,320,321],{"class":285}," --yes\n",[207,323,325,327,330],{"class":209,"line":324},9,[207,326,224],{"class":213},[207,328,329],{"class":217}," deploy",[207,331,300],{"class":217},[207,333,335,337,339,341,343,346],{"class":209,"line":334},10,[207,336,224],{"class":213},[207,338,329],{"class":217},[207,340,312],{"class":217},[207,342,315],{"class":285},[207,344,345],{"class":217}," DEPLOY_PLAN_HASH",[207,347,321],{"class":285},[145,349,350,351,354,355,358],{},"Replace both illustrative repositories before publication. The build result\ncontains one Laravel digest reused by ",[148,352,353],{},"web",", ",[148,356,357],{},"queue",", and jobs, plus one pricing\ndigest.",[163,360,362],{"id":361},"use-the-local-platform","Use the local platform",[364,365,366,373,379,385],"ul",{},[367,368,369,370],"li",{},"Laravel: ",[148,371,372],{},"https:\u002F\u002Fweb.laravel-rust.test",[367,374,375,376],{},"Pricing: ",[148,377,378],{},"https:\u002F\u002Fpricing.laravel-rust.test",[367,380,381,382],{},"Installation: ",[148,383,384],{},"https:\u002F\u002Fmm.test",[367,386,387,388],{},"Mailpit: ",[148,389,390],{},"https:\u002F\u002Fmail.mm.test",[145,392,393,394,396],{},"Follow the project dashboard link from ",[148,395,384],{},". Browser access needs\nDNS or hosts-file entries for these names; the curl commands below bypass DNS.",[153,398,400],{"className":201,"code":399,"language":203,"meta":159,"style":159},"curl --resolve web.laravel-rust.test:443:127.0.0.1 \\\n  https:\u002F\u002Fweb.laravel-rust.test\u002Fapi\u002Fquotes\u002Fexample-sku\ncurl --resolve web.laravel-rust.test:443:127.0.0.1 \\\n  -H 'content-type: application\u002Fjson' \\\n  -d '{\"to\":\"developer@example.test\"}' \\\n  https:\u002F\u002Fweb.laravel-rust.test\u002Fapi\u002Fmail-preview\nmm service logs queue --tail 50\n",[148,401,402,417,422,432,442,452,457],{"__ignoreMap":159},[207,403,404,407,410,413],{"class":209,"line":210},[207,405,406],{"class":213},"curl",[207,408,409],{"class":285}," --resolve",[207,411,412],{"class":217}," web.laravel-rust.test:443:127.0.0.1",[207,414,416],{"class":415},"s1Wbj"," \\\n",[207,418,419],{"class":209,"line":221},[207,420,421],{"class":217},"  https:\u002F\u002Fweb.laravel-rust.test\u002Fapi\u002Fquotes\u002Fexample-sku\n",[207,423,424,426,428,430],{"class":209,"line":233},[207,425,406],{"class":213},[207,427,409],{"class":285},[207,429,412],{"class":217},[207,431,416],{"class":415},[207,433,434,437,440],{"class":209,"line":244},[207,435,436],{"class":285},"  -H",[207,438,439],{"class":217}," 'content-type: application\u002Fjson'",[207,441,416],{"class":415},[207,443,444,447,450],{"class":209,"line":261},[207,445,446],{"class":285},"  -d",[207,448,449],{"class":217}," '{\"to\":\"developer@example.test\"}'",[207,451,416],{"class":415},[207,453,454],{"class":209,"line":275},[207,455,456],{"class":217},"  https:\u002F\u002Fweb.laravel-rust.test\u002Fapi\u002Fmail-preview\n",[207,458,459,461,464,467,470,473],{"class":209,"line":289},[207,460,224],{"class":213},[207,462,463],{"class":217}," service",[207,465,466],{"class":217}," logs",[207,468,469],{"class":217}," queue",[207,471,472],{"class":285}," --tail",[207,474,475],{"class":415}," 50\n",[163,477,479],{"id":478},"run-scheduled-tasks","Run scheduled tasks",[145,481,482,483,486,487,490],{},"There is no scheduler container. ",[148,484,485],{},"schedule-run"," uses the web service's image and settings,\nand ",[148,488,489],{},"laravel-schedule"," triggers it every minute:",[153,492,494],{"className":201,"code":493,"language":203,"meta":159,"style":159},"mm job schedule reconcile\nmm job schedule reconcile --plan SCHEDULE_PLAN_HASH --yes\nmm job schedule list\nmm job schedule run-now laravel-schedule\n",[148,495,496,509,527,538],{"__ignoreMap":159},[207,497,498,500,503,506],{"class":209,"line":210},[207,499,224],{"class":213},[207,501,502],{"class":217}," job",[207,504,505],{"class":217}," schedule",[207,507,508],{"class":217}," reconcile\n",[207,510,511,513,515,517,520,522,525],{"class":209,"line":221},[207,512,224],{"class":213},[207,514,502],{"class":217},[207,516,505],{"class":217},[207,518,519],{"class":217}," reconcile",[207,521,315],{"class":285},[207,523,524],{"class":217}," SCHEDULE_PLAN_HASH",[207,526,321],{"class":285},[207,528,529,531,533,535],{"class":209,"line":233},[207,530,224],{"class":213},[207,532,502],{"class":217},[207,534,505],{"class":217},[207,536,537],{"class":217}," list\n",[207,539,540,542,544,546,549],{"class":209,"line":244},[207,541,224],{"class":213},[207,543,502],{"class":217},[207,545,505],{"class":217},[207,547,548],{"class":217}," run-now",[207,550,551],{"class":217}," laravel-schedule\n",[145,553,554,555,558],{},"Keep ",[148,556,557],{},"mm job schedule daemon"," running to process due jobs. Use a service manager\nfor persistent development setups. Run history survives restarts.",[163,560,562],{"id":561},"gate-and-provider-options","Gate and provider options",[145,564,565,566,569,570,573,574,576,577,580],{},"The public ",[148,567,568],{},"staff-preview"," gate names the ",[148,571,572],{},"password-cap"," driver and production\n",[148,575,353],{}," ingress reference. Users, credentials, Cap policy, and sessions are\nprivate state configured through reviewed ",[148,578,579],{},"mm access"," commands. Do not expose a\nroute until that policy has been reviewed and tested.",[145,582,583,584,587],{},"Age is the easy local secret provider. An advanced evaluation can create and\ntest a private external OpenBao connection, then change a secret's public\nstorage provider\u002Fconnection\u002Flocation. AppRole credentials never enter Git.\nRuntime-native ",[148,585,586],{},"secret-files"," are appropriate for applications that accept file\npaths; Laravel expects these values in its environment, so this example does\nnot claim otherwise.",[145,589,590],{},"Coordinate database password and Laravel app-key rotations with persistent\nstate. Remove resources through reviewed deploy\u002Fservice removal, preserving\nvolumes unless an explicit purge is intended.",[592,593,594],"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 .s1Wbj, html code.shiki .s1Wbj{--shiki-default:var(--mm-code-constant)}",{"title":159,"searchDepth":221,"depth":221,"links":596},[597,598,599,600,601],{"id":165,"depth":221,"text":166},{"id":178,"depth":221,"text":179},{"id":361,"depth":221,"text":362},{"id":478,"depth":221,"text":479},{"id":561,"depth":221,"text":562},"Run image reuse, two stacks, native schedules, a gate, Mailpit, and Rust 1.98.","md",{},true,{"title":132,"description":602},"docs\u002Ftutorials\u002Flaravel-rust","BaOondX5E97_0JRRGF3r0ZcrTiNWpaUt1t3PzLjYw1M",1794512546196]