[{"data":1,"prerenderedAt":409},["ShallowReactive",2],{"navigation_docs":3,"-concepts-groups":144,"-concepts-groups-surround":404},[4,35,84,109,124,134,139],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Get Started","\u002Fget-started","1.get-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fget-started\u002Fintroduction","1.get-started\u002F1.introduction","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fget-started\u002Finstallation","1.get-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick start","\u002Fget-started\u002Fquickstart","1.get-started\u002F3.quickstart","i-lucide-rocket",{"title":25,"path":26,"stem":27,"icon":28},"Project structure","\u002Fget-started\u002Fproject-structure","1.get-started\u002F4.project-structure","i-lucide-folder-tree",{"title":30,"path":31,"stem":32,"icon":33},"Dashboard","\u002Fget-started\u002Fdashboard","1.get-started\u002F5.dashboard","i-lucide-layout-dashboard",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Concepts","\u002Fconcepts","2.concepts",[40,45,50,55,60,65,69,74,79],{"title":41,"path":42,"stem":43,"icon":44},"Architecture","\u002Fconcepts\u002Farchitecture","2.concepts\u002F1.architecture","i-lucide-layers",{"title":46,"path":47,"stem":48,"icon":49},"Machines","\u002Fconcepts\u002Fmachines","2.concepts\u002F2.machines","i-lucide-server",{"title":51,"path":52,"stem":53,"icon":54},"Colony & users","\u002Fconcepts\u002Fcolony","2.concepts\u002F3.colony","i-lucide-users",{"title":56,"path":57,"stem":58,"icon":59},"Transport","\u002Fconcepts\u002Ftransport","2.concepts\u002F4.transport","i-lucide-network",{"title":61,"path":62,"stem":63,"icon":64},"Configuration","\u002Fconcepts\u002Fconfiguration","2.concepts\u002F5.configuration","i-lucide-settings",{"title":66,"path":67,"stem":68,"icon":23},"Deploy","\u002Fconcepts\u002Fdeploy","2.concepts\u002F6.deploy",{"title":70,"path":71,"stem":72,"icon":73},"Groups","\u002Fconcepts\u002Fgroups","2.concepts\u002F7.groups","i-lucide-boxes",{"title":75,"path":76,"stem":77,"icon":78},"Templates","\u002Fconcepts\u002Ftemplates","2.concepts\u002F8.templates","i-lucide-package-plus",{"title":80,"path":81,"stem":82,"icon":83},"Existing projects","\u002Fconcepts\u002Fexisting-projects","2.concepts\u002F9.existing-projects","i-lucide-folder-open",{"title":85,"path":86,"stem":87,"children":88,"page":34},"Remote","\u002Fremote","3.remote",[89,94,99,104],{"title":90,"path":91,"stem":92,"icon":93},"Remote machines","\u002Fremote\u002Foverview","3.remote\u002F1.overview","i-lucide-cloud",{"title":95,"path":96,"stem":97,"icon":98},"Remote deploy","\u002Fremote\u002Fdeploy","3.remote\u002F2.deploy","i-lucide-send",{"title":100,"path":101,"stem":102,"icon":103},"CI","\u002Fremote\u002Fci","3.remote\u002F3.ci","i-lucide-workflow",{"title":105,"path":106,"stem":107,"icon":108},"Tunnels","\u002Fremote\u002Ftunnel","3.remote\u002F4.tunnel","i-lucide-cable",{"title":110,"path":111,"stem":112,"children":113,"page":34},"Security","\u002Fsecurity","4.security",[114,119],{"title":115,"path":116,"stem":117,"icon":118},"Security model","\u002Fsecurity\u002Fmodel","4.security\u002F1.model","i-lucide-shield",{"title":120,"path":121,"stem":122,"icon":123},"Known issues","\u002Fsecurity\u002Fknown-issues","4.security\u002F2.known-issues","i-lucide-triangle-alert",{"title":125,"path":126,"stem":127,"children":128,"page":34},"Reference","\u002Freference","5.reference",[129],{"title":130,"path":131,"stem":132,"icon":133},"CLI reference","\u002Freference\u002Fcli","5.reference\u002F1.cli","i-lucide-terminal",{"title":135,"path":136,"stem":137,"icon":138},"Changelog","\u002Fchangelog","changelog","i-lucide-history",{"title":140,"path":141,"stem":142,"icon":143},"Communities","\u002Fcommunities","communities","i-lucide-heart-handshake",{"id":145,"title":70,"body":146,"description":396,"extension":397,"links":398,"meta":399,"navigation":400,"path":71,"seo":401,"stem":72,"__hash__":403},"docs\u002F2.concepts\u002F7.groups.md",{"type":147,"value":148,"toc":390},"minimark",[149,158,212,219,224,248,252,259,279,293,315,319,322,330,341,345,348,383,386],[150,151,152,153,157],"p",{},"A ",[154,155,156],"strong",{},"group"," is machine-local organisation plus a shared network and shared\nenv\u002Fsecrets defaults. It is how a codebase gets divided into pieces a team can\nown on its own.",[159,160,165],"pre",{"className":161,"code":162,"language":163,"meta":164,"style":164},"language-sh shiki shiki-themes material-theme-lighter github-light github-dark","ant nest groups list                              # list groups\nant nest groups create backend --domain example.com   # create with a base domain\nant nest groups add backend api worker            # add projects to a group\nant nest groups remove worker                     # remove a project\nant nest groups rename backend services\nant nest groups network backend                   # show\u002Fset the shared docker network\nant nest groups delete backend --yes\n","sh","",[166,167,168,176,182,188,194,200,206],"code",{"__ignoreMap":164},[169,170,173],"span",{"class":171,"line":172},"line",1,[169,174,175],{},"ant nest groups list                              # list groups\n",[169,177,179],{"class":171,"line":178},2,[169,180,181],{},"ant nest groups create backend --domain example.com   # create with a base domain\n",[169,183,185],{"class":171,"line":184},3,[169,186,187],{},"ant nest groups add backend api worker            # add projects to a group\n",[169,189,191],{"class":171,"line":190},4,[169,192,193],{},"ant nest groups remove worker                     # remove a project\n",[169,195,197],{"class":171,"line":196},5,[169,198,199],{},"ant nest groups rename backend services\n",[169,201,203],{"class":171,"line":202},6,[169,204,205],{},"ant nest groups network backend                   # show\u002Fset the shared docker network\n",[169,207,209],{"class":171,"line":208},7,[169,210,211],{},"ant nest groups delete backend --yes\n",[150,213,214,215,218],{},"Group env and secret defaults are edited in ",[166,216,217],{},"~\u002F.ant\u002Fconfig.json"," (or the\ndashboard's group page); the CLI exposes the network and domains.",[220,221,223],"h2",{"id":222},"what-a-group-provides","What a group provides",[225,226,227,235,241],"ul",{},[228,229,230,231,234],"li",{},"a ",[154,232,233],{},"shared docker network"," its projects join, so services reach each other by\nname;",[228,236,237,240],{},[154,238,239],{},"env and secret defaults"," inherited by every project in the group;",[228,242,243,244,247],{},"a natural boundary for ",[154,245,246],{},"ownership",": a group is the unit a team can own.",[220,249,251],{"id":250},"groups-belong-to-a-machine","Groups belong to a machine",[150,253,254,255,258],{},"A group is defined ",[154,256,257],{},"on one machine",": the nest its projects deploy to, and\nits shared docker network lives there:",[159,260,262],{"className":161,"code":261,"language":163,"meta":164,"style":164},"ant nest groups create backend --target-machine prod\nant nest groups network backend --name backend-net\nant nest groups domains backend prod.example.com\n",[166,263,264,269,274],{"__ignoreMap":164},[169,265,266],{"class":171,"line":172},[169,267,268],{},"ant nest groups create backend --target-machine prod\n",[169,270,271],{"class":171,"line":178},[169,272,273],{},"ant nest groups network backend --name backend-net\n",[169,275,276],{"class":171,"line":184},[169,277,278],{},"ant nest groups domains backend prod.example.com\n",[150,280,281,284,285,288,289,292],{},[166,282,283],{},"create"," records the machine the group belongs to (",[166,286,287],{},"--target-machine","); every\nother\ngroup command resolves the group by its globally-unique name, so it does not\ntake ",[166,290,291],{},"--machine",".",[150,294,295,296,299,300,303,304,307,308,311,312,292],{},"Names are globally unique across machines, so the same logical team on two\nmachines needs two groups (",[166,297,298],{},"backend-local",", ",[166,301,302],{},"backend-prod","). A project joins its\ngroup's network only when the group is defined on the machine the project\ntargets: a project with ",[166,305,306],{},"machine: prod"," whose group exists only on ",[166,309,310],{},"local"," keeps\nthe group's env and secrets defaults but not the network, because that network\ndoes not exist on ",[166,313,314],{},"prod",[220,316,318],{"id":317},"project-directories","Project directories",[150,320,321],{},"In schema v2 a project's location is a fact about the machine it lives on. The\nmachine lists the directories it scans for projects, and a group can list extra\ndirectories for its own members:",[159,323,328],{"className":324,"code":326,"language":327},[325],"language-text","machines.local.project_dirs                 = [\"\u002Fhome\u002Fme\u002Fcode\"]\nmachines.local.groups.backend.project_dirs  = [\"\u002Fhome\u002Fme\u002Fcode\u002Fapi\", \"\u002Fhome\u002Fme\u002Fcode\u002Fworker\"]\n","text",[166,329,326],{"__ignoreMap":164},[150,331,332,333,336,337,340],{},"A project joins the group with ",[166,334,335],{},"group: backend"," in its ",[166,338,339],{},"ant.yaml","; the group's\ndirectories are scanned on top of the machine's own.",[220,342,344],{"id":343},"opting-out-of-the-network","Opting out of the network",[150,346,347],{},"A project can keep the group's env but decline its network:",[159,349,353],{"className":350,"code":351,"language":352,"meta":164,"style":164},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","# ant.yaml\ndeploy:\n  use_group_network: false\n","yaml",[166,354,355,361,371],{"__ignoreMap":164},[169,356,357],{"class":171,"line":172},[169,358,360],{"class":359},"sutJx","# ant.yaml\n",[169,362,363,367],{"class":171,"line":178},[169,364,366],{"class":365},"sQzsp","deploy",[169,368,370],{"class":369},"sP7_E",":\n",[169,372,373,376,379],{"class":171,"line":184},[169,374,375],{"class":365},"  use_group_network",[169,377,378],{"class":369},":",[169,380,382],{"class":381},"syTEX"," false\n",[150,384,385],{},"The project page in the dashboard lists every network a project uses (its own,\nthe group's inherited one, and the compose file's) with driver, subnet, and\nwhether it is external.",[387,388,389],"style",{},"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 .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":164,"searchDepth":178,"depth":178,"links":391},[392,393,394,395],{"id":222,"depth":178,"text":223},{"id":250,"depth":178,"text":251},{"id":317,"depth":178,"text":318},{"id":343,"depth":178,"text":344},"Divide a codebase into shared networks, env, and secrets.","md",null,{},{"icon":73},{"title":70,"description":402},"Groups organise projects on a machine and give them a shared docker network plus env and secrets defaults.","87leYJxF9Cuuw-IT66E0hQVyfgLpdTcWcZ7eHu4U6cw",[405,407],{"title":66,"path":67,"stem":68,"description":406,"icon":23,"children":-1},"Build an image, run it locally, and reclaim disk.",{"title":75,"path":76,"stem":77,"description":408,"icon":78,"children":-1},"Create a ready-to-deploy project from a catalog template.",1791494556623]