[{"data":1,"prerenderedAt":562},["ShallowReactive",2],{"navigation_docs":3,"-concepts-existing-projects":144,"-concepts-existing-projects-surround":557},[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":80,"body":146,"description":549,"extension":550,"links":551,"meta":552,"navigation":553,"path":81,"seo":554,"stem":82,"__hash__":556},"docs\u002F2.concepts\u002F9.existing-projects.md",{"type":147,"value":148,"toc":541},"minimark",[149,153,158,169,253,276,310,323,327,333,348,367,371,381,408,418,422,429,432,483,487,490,520,523,527,537],[150,151,152],"p",{},"Ant manages what it deploys. Workloads that already exist on a machine are left\nalone: they are not listed, stopped, pruned, or adopted automatically. There are\nthree ways to bring something existing under management, one recipe for a\nhand-managed compose stack, and one supported exit.",[154,155,157],"h2",{"id":156},"from-existing-source","From existing source",[150,159,160,164,165,168],{},[161,162,163],"code",{},"ant nest init"," writes ",[161,166,167],{},"ant.yaml"," for the project in the current directory and\nauto-detects the build and run from the files present:",[170,171,172,185],"table",{},[173,174,175],"thead",{},[176,177,178,182],"tr",{},[179,180,181],"th",{},"File",[179,183,184],{},"Detected",[186,187,188,201,213,229,241],"tbody",{},[176,189,190,196],{},[191,192,193],"td",{},[161,194,195],{},"railpack.toml",[191,197,198],{},[161,199,200],{},"build: railpack",[176,202,203,208],{},[191,204,205],{},[161,206,207],{},"nixpacks.toml",[191,209,210],{},[161,211,212],{},"build: nixpacks",[176,214,215,224],{},[191,216,217,220,221],{},[161,218,219],{},"docker-compose.yml"," \u002F ",[161,222,223],{},"compose.yaml",[191,225,226],{},[161,227,228],{},"build: none, run: compose",[176,230,231,236],{},[191,232,233],{},[161,234,235],{},"Dockerfile",[191,237,238],{},[161,239,240],{},"build: dockerfile",[176,242,243,248],{},[191,244,245],{},[161,246,247],{},"Procfile",[191,249,250],{},[161,251,252],{},"build: buildpacks",[254,255,260],"pre",{"className":256,"code":257,"language":258,"meta":259,"style":259},"language-sh shiki shiki-themes material-theme-lighter github-light github-dark","ant nest init\nant nest init --build none --file docker-compose.yml   # explicit\n","sh","",[161,261,262,270],{"__ignoreMap":259},[263,264,267],"span",{"class":265,"line":266},"line",1,[263,268,269],{},"ant nest init\n",[263,271,273],{"class":265,"line":272},2,[263,274,275],{},"ant nest init --build none --file docker-compose.yml   # explicit\n",[150,277,278,279,282,283,286,287,290,291,294,295,297,298,301,302,305,306,309],{},"Override with ",[161,280,281],{},"--build",", ",[161,284,285],{},"--run",", and ",[161,288,289],{},"--file","; ",[161,292,293],{},"--force"," overwrites an existing\n",[161,296,167],{},". Then ",[161,299,300],{},"ant haul"," builds and ",[161,303,304],{},"ant trail deploy"," runs it, locally, or\non a registered machine through the deployment's ",[161,307,308],{},"server:",". Remote deploys ship\nthe project context, so the source does not need to exist on the target machine.",[150,311,312,313,282,316,282,319,322],{},"Review the result before deploying: env, secrets, and domains are yours to add\n(",[161,314,315],{},"ant nest edit env",[161,317,318],{},"ant nest edit secret",[161,320,321],{},"ant nest edit domain",").",[154,324,326],{"id":325},"from-an-existing-image","From an existing image",[150,328,329,332],{},[161,330,331],{},"ant trail deploy --image"," runs a prebuilt image as an Ant-managed container on\na registered machine:",[254,334,336],{"className":256,"code":335,"language":258,"meta":259,"style":259},"ant trail deploy --image ghcr.io\u002Facme\u002Fapi:1.4.2 --machine prod --pull \\\n  --port 8080 --env LOG_LEVEL=info --domain api.example.com\n",[161,337,338,343],{"__ignoreMap":259},[263,339,340],{"class":265,"line":266},[263,341,342],{},"ant trail deploy --image ghcr.io\u002Facme\u002Fapi:1.4.2 --machine prod --pull \\\n",[263,344,345],{"class":265,"line":272},[263,346,347],{},"  --port 8080 --env LOG_LEVEL=info --domain api.example.com\n",[150,349,350,353,354,357,358,361,362,366],{},[161,351,352],{},"--from-tar"," uploads a ",[161,355,356],{},"docker save"," archive instead of pulling. The container\ncarries Ant's labels, so it appears in ",[161,359,360],{},"ant nest containers list"," and the\ndashboard's Docker tab, takes logs, and can be started, stopped, or removed like\nany other Ant workload. The dashboard's ",[363,364,365],"strong",{},"Run image"," action on a machine is the\nsame path.",[154,368,370],{"id":369},"onboarding-an-existing-machine","Onboarding an existing machine",[150,372,373,376,377,380],{},[161,374,375],{},"ant nest machines add"," plus ",[161,378,379],{},"ant nest bootstrap"," install the worker without\ntouching what is already running. Re-running bootstrap is the upgrade path and\npreserves the machine identity and roster.",[254,382,384],{"className":256,"code":383,"language":258,"meta":259,"style":259},"ant nest machines add prod --host 173.87.3.89 --ssh-key ~\u002F.ssh\u002Fid_ed25519\nant nest machines add prod --node-id 7f2e…          # worker already running\nant nest doctor --machine prod                      # host checks\nant nest tools                                      # builders and helpers on the machine\n",[161,385,386,391,396,402],{"__ignoreMap":259},[263,387,388],{"class":265,"line":266},[263,389,390],{},"ant nest machines add prod --host 173.87.3.89 --ssh-key ~\u002F.ssh\u002Fid_ed25519\n",[263,392,393],{"class":265,"line":272},[263,394,395],{},"ant nest machines add prod --node-id 7f2e…          # worker already running\n",[263,397,399],{"class":265,"line":398},3,[263,400,401],{},"ant nest doctor --machine prod                      # host checks\n",[263,403,405],{"class":265,"line":404},4,[263,406,407],{},"ant nest tools                                      # builders and helpers on the machine\n",[150,409,410,413,414,417],{},[161,411,412],{},"ant nest reconcile --apply"," is the operator-run root path for privileged host\nsetup (exact argv, no shell; see ",[415,416,115],"a",{"href":116},"). Ant\nprograms the Caddy it manages; a Caddy the machine already runs for other\nworkloads is detected, not reconfigured.",[154,419,421],{"id":420},"cutover-an-existing-compose-stack","Cutover: an existing compose stack",[150,423,424,425,428],{},"Ant does not adopt a running compose project. Resource names are derived\n(",[161,426,427],{},"\u003Cgroup>-\u003Capp>-\u003Cenv>-\u003Cbranch>","), so a hand-managed stack with a different name\nis never matched, replaced, or removed; a deploy would create a parallel stack\nand fail loudly on port conflicts rather than clobber.",[150,430,431],{},"To take one over deliberately:",[433,434,435,450,460,469],"ol",{},[436,437,438,441,442,445,446,449],"li",{},[363,439,440],{},"Scaffold from the same source."," ",[161,443,444],{},"ant nest init --build none --file docker-compose.yml",", then set ",[161,447,448],{},"app"," and review ports, volumes, and domains.",[436,451,452,455,456,459],{},[363,453,454],{},"Handle data."," Bind mounts keep working unchanged. Named volumes are owned\nby the compose project, so either declare the old ones ",[161,457,458],{},"external: true"," in\nthe compose file (Docker reuses them as-is) or accept Ant-namespaced volumes\nand migrate the data.",[436,461,462,465,466,468],{},[363,463,464],{},"Stage, then cut over."," Run on different host ports first to verify, then\nstop the old stack and ",[161,467,304],{},". Zero-downtime staging happens\nwithin one deployment; it does not span two different stacks, so expect a\nshort gap at this step.",[436,470,471,474,475,478,479,482],{},[363,472,473],{},"Move the routing."," If the machine has an external proxy, either add the\nhostnames to Ant's Caddy (",[161,476,477],{},"ant nest edit domain add",") or keep routing outside\nand deploy with ",[161,480,481],{},"--no-caddy",".",[154,484,486],{"id":485},"what-stays-out-of-scope","What stays out of scope",[150,488,489],{},"Existing workloads are not addressable through Ant's surfaces, by design:",[491,492,493,499,511,514],"ul",{},[436,494,495,498],{},[161,496,497],{},"ant nest containers"," lists, controls, and reads logs for Ant-managed\ncontainers only; unmanaged names are refused.",[436,500,501,504,505,508,509,482],{},[161,502,503],{},"ant nest volume list"," hides unmanaged volumes unless ",[161,506,507],{},"--all"," is given, and\nremoval refuses them without ",[161,510,507],{},[436,512,513],{},"Pruning removes only what it can positively identify as Ant-managed; unknown\nprojects and containers are always kept.",[436,515,516,519],{},[161,517,518],{},"ant nest tunnel"," forwards to Ant-managed containers.",[150,521,522],{},"This is what keeps a shared machine safe: Ant cannot accidentally stop, prune,\nor reconfigure somebody else's stack.",[154,524,526],{"id":525},"leaving","Leaving",[150,528,529,532,533,536],{},[161,530,531],{},"ant nest machines decommission --host ADDR --handover --yes"," exports a\nplain-compose takeover bundle to ",[161,534,535],{},"~\u002Fant-handover"," on the machine, so the\nworkloads keep running without Ant. There is no import for that bundle back into\nAnt; re-onboard with the source or image paths above.",[538,539,540],"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);}",{"title":259,"searchDepth":272,"depth":272,"links":542},[543,544,545,546,547,548],{"id":156,"depth":272,"text":157},{"id":325,"depth":272,"text":326},{"id":369,"depth":272,"text":370},{"id":420,"depth":272,"text":421},{"id":485,"depth":272,"text":486},{"id":525,"depth":272,"text":526},"Bring a project, an image, or a machine that Ant did not create under management, and what deliberately stays out of scope.","md",null,{},{"icon":83},{"title":80,"description":555},"How Ant handles workloads that already exist on a machine: scaffold from source, run a prebuilt image, onboard a machine, and cut over a hand-managed compose stack.","QYJPCfhHwSFpfsaUNi7TS37wMJnX2YmPTGdmuBbA1ys",[558,560],{"title":75,"path":76,"stem":77,"description":559,"icon":78,"children":-1},"Create a ready-to-deploy project from a catalog template.",{"title":90,"path":91,"stem":92,"description":561,"icon":93,"children":-1},"Register a machine, provision the worker, and authenticate.",1791494556774]