[{"data":1,"prerenderedAt":947},["ShallowReactive",2],{"navigation_docs":3,"-fleet-join-nodes":320,"-fleet-join-nodes-surround":942},[4,35,69,109,133,193,228,262,305],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-ph-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-ph-rocket-launch",{"title":21,"path":22,"stem":23,"icon":24},"Concepts","\u002Fgetting-started\u002Fconcepts","1.getting-started\u002F3.concepts","i-ph-book-open",{"title":26,"path":27,"stem":28,"icon":29},"Install","\u002Fgetting-started\u002Finstall","1.getting-started\u002F4.install","i-ph-download-simple",{"title":31,"path":32,"stem":33,"icon":34},"What works today","\u002Fgetting-started\u002Fstatus","1.getting-started\u002F5.status","i-ph-list-checks",{"title":21,"icon":6,"path":36,"stem":37,"children":38,"page":6},"\u002Fconcepts","2.concepts",[39,44,49,54,59,64],{"title":40,"path":41,"stem":42,"icon":43},"Architecture","\u002Fconcepts\u002Farchitecture","2.concepts\u002F1.architecture","i-ph-planet",{"title":45,"path":46,"stem":47,"icon":48},"Jobs and durability","\u002Fconcepts\u002Fjobs","2.concepts\u002F2.jobs","i-ph-infinity",{"title":50,"path":51,"stem":52,"icon":53},"Routing","\u002Fconcepts\u002Frouting","2.concepts\u002F3.routing","i-ph-path",{"title":55,"path":56,"stem":57,"icon":58},"Security model","\u002Fconcepts\u002Fsecurity","2.concepts\u002F4.security","i-ph-shield-check",{"title":60,"path":61,"stem":62,"icon":63},"Tenants","\u002Fconcepts\u002Ftenants","2.concepts\u002F5.tenants","i-ph-buildings",{"title":65,"path":66,"stem":67,"icon":68},"Temporal","\u002Fconcepts\u002Ftemporal","2.concepts\u002F6.temporal","i-ph-clock",{"title":70,"icon":6,"path":71,"stem":72,"children":73,"page":6},"Run a fleet","\u002Ffleet","3.fleet",[74,79,84,89,94,99,104],{"title":75,"path":76,"stem":77,"icon":78},"Dev mode","\u002Ffleet\u002Fdev-mode","3.fleet\u002F1.dev-mode","i-ph-laptop",{"title":80,"path":81,"stem":82,"icon":83},"Run a cluster","\u002Ffleet\u002Fcluster","3.fleet\u002F2.cluster","i-ph-hard-drives",{"title":85,"path":86,"stem":87,"icon":88},"Join nodes","\u002Ffleet\u002Fjoin-nodes","3.fleet\u002F3.join-nodes","i-ph-plugs-connected",{"title":90,"path":91,"stem":92,"icon":93},"Manage nodes","\u002Ffleet\u002Fmanage-nodes","3.fleet\u002F4.manage-nodes","i-ph-list-bullets",{"title":95,"path":96,"stem":97,"icon":98},"Secrets","\u002Ffleet\u002Fsecrets","3.fleet\u002F5.secrets","i-ph-key",{"title":100,"path":101,"stem":102,"icon":103},"High availability","\u002Ffleet\u002Fhigh-availability","3.fleet\u002F6.high-availability","i-ph-copy",{"title":105,"path":106,"stem":107,"icon":108},"Upgrades, backups and restores","\u002Ffleet\u002Fupgrades","3.fleet\u002F7.upgrades","i-ph-arrows-clockwise",{"title":110,"icon":6,"path":111,"stem":112,"children":113,"page":6},"Use plugins","\u002Fplugins","4.plugins",[114,119,124,128],{"title":115,"path":116,"stem":117,"icon":118},"What a plugin is","\u002Fplugins\u002Foverview","4.plugins\u002F1.overview","i-ph-puzzle-piece",{"title":120,"path":121,"stem":122,"icon":123},"Install and update","\u002Fplugins\u002Finstall","4.plugins\u002F2.install","i-ph-package",{"title":125,"path":126,"stem":127,"icon":123},"Existing MCP packages","\u002Fplugins\u002Fpackages","4.plugins\u002F3.packages",{"title":129,"path":130,"stem":131,"icon":132},"The catalog","\u002Fplugins\u002Fcatalog","4.plugins\u002F4.catalog","i-ph-books",{"title":134,"icon":6,"path":135,"stem":136,"children":137,"page":6},"Build plugins","\u002Fbuild-plugins","5.build-plugins",[138,143,148,153,158,163,168,173,178,183,188],{"title":139,"path":140,"stem":141,"icon":142},"Your first plugin","\u002Fbuild-plugins\u002Ffirst-plugin","5.build-plugins\u002F1.first-plugin","i-ph-hammer",{"title":144,"path":145,"stem":146,"icon":147},"Harnesses","\u002Fbuild-plugins\u002Fharnesses","5.build-plugins\u002F10.harnesses","i-ph-cpu",{"title":149,"path":150,"stem":151,"icon":152},"Example: support triage","\u002Fbuild-plugins\u002Fexample-support-triage","5.build-plugins\u002F11.example-support-triage","i-ph-lifebuoy",{"title":154,"path":155,"stem":156,"icon":157},"Tools","\u002Fbuild-plugins\u002Ftools","5.build-plugins\u002F2.tools","i-ph-wrench",{"title":159,"path":160,"stem":161,"icon":162},"Agents","\u002Fbuild-plugins\u002Fagents","5.build-plugins\u002F3.agents","i-ph-robot",{"title":164,"path":165,"stem":166,"icon":167},"Skills","\u002Fbuild-plugins\u002Fskills","5.build-plugins\u002F4.skills","i-ph-graduation-cap",{"title":169,"path":170,"stem":171,"icon":172},"Develop and test","\u002Fbuild-plugins\u002Fdevelop-and-test","5.build-plugins\u002F5.develop-and-test","i-ph-flask",{"title":174,"path":175,"stem":176,"icon":177},"Publish and version","\u002Fbuild-plugins\u002Fpublish","5.build-plugins\u002F6.publish","i-ph-tag",{"title":179,"path":180,"stem":181,"icon":182},"Hooks","\u002Fbuild-plugins\u002Fhooks","5.build-plugins\u002F7.hooks","i-ph-anchor",{"title":184,"path":185,"stem":186,"icon":187},"Flows","\u002Fbuild-plugins\u002Fflows","5.build-plugins\u002F8.flows","i-ph-flow-arrow",{"title":189,"path":190,"stem":191,"icon":192},"Evals and quality gates","\u002Fbuild-plugins\u002Fevals","5.build-plugins\u002F9.evals","i-ph-seal-check",{"title":194,"icon":6,"path":195,"stem":196,"children":197,"page":6},"Run agents","\u002Fagents","6.agents",[198,203,208,213,218,223],{"title":199,"path":200,"stem":201,"icon":202},"Run jobs","\u002Fagents\u002Frun-jobs","6.agents\u002F1.run-jobs","i-ph-play",{"title":204,"path":205,"stem":206,"icon":207},"Models and keys","\u002Fagents\u002Fmodels-and-keys","6.agents\u002F2.models-and-keys","i-ph-sparkle",{"title":209,"path":210,"stem":211,"icon":212},"Delegation","\u002Fagents\u002Fdelegation","6.agents\u002F3.delegation","i-ph-git-fork",{"title":214,"path":215,"stem":216,"icon":217},"Contracts and limits","\u002Fagents\u002Fcontracts-and-limits","6.agents\u002F4.contracts-and-limits","i-ph-ruler",{"title":219,"path":220,"stem":221,"icon":222},"Runtime API","\u002Fagents\u002Fruntime-api","6.agents\u002F5.runtime-api","i-ph-plug",{"title":224,"path":225,"stem":226,"icon":227},"Approvals","\u002Fagents\u002Fapprovals","6.agents\u002F6.approvals","i-ph-hand-palm",{"title":229,"icon":6,"path":230,"stem":231,"children":232,"page":6},"Monitor","\u002Fmonitor","7.monitor",[233,238,243,248,253,258],{"title":234,"path":235,"stem":236,"icon":237},"Web UI","\u002Fmonitor\u002Fweb-ui","7.monitor\u002F0.web-ui","i-ph-monitor",{"title":239,"path":240,"stem":241,"icon":242},"Cost and usage","\u002Fmonitor\u002Fcost-and-usage","7.monitor\u002F1.cost-and-usage","i-ph-coins",{"title":244,"path":245,"stem":246,"icon":247},"Node health","\u002Fmonitor\u002Fnodes","7.monitor\u002F2.nodes","i-ph-heartbeat",{"title":249,"path":250,"stem":251,"icon":252},"Job history","\u002Fmonitor\u002Fhistory","7.monitor\u002F3.history","i-ph-clock-counter-clockwise",{"title":254,"path":255,"stem":256,"icon":257},"Tracing and metrics","\u002Fmonitor\u002Fobservability","7.monitor\u002F4.observability","i-ph-chart-line",{"title":259,"path":260,"stem":261,"icon":152},"Troubleshooting","\u002Fmonitor\u002Ftroubleshooting","7.monitor\u002F5.troubleshooting",{"title":263,"icon":6,"path":264,"stem":265,"children":266,"page":6},"Reference","\u002Freference","8.reference",[267,281,286,290,295,300],{"title":268,"icon":269,"path":270,"stem":271,"children":272,"page":6},"CLI","i-ph-terminal-window","\u002Freference\u002Fcli","8.reference\u002F1.cli",[273,277],{"title":274,"path":275,"stem":276},"orchestrator-zero","\u002Freference\u002Fcli\u002Forchestrator-zero","8.reference\u002F1.cli\u002F1.orchestrator-zero",{"title":278,"path":279,"stem":280},"orchestrator-zero-node","\u002Freference\u002Fcli\u002Forchestrator-zero-node","8.reference\u002F1.cli\u002F2.orchestrator-zero-node",{"title":282,"path":283,"stem":284,"icon":285},"oz0-plugin.yaml","\u002Freference\u002Fplugin-manifest","8.reference\u002F2.plugin-manifest","i-ph-file-code",{"title":287,"path":288,"stem":289,"icon":162},"Agent definition","\u002Freference\u002Fagent-definition","8.reference\u002F3.agent-definition",{"title":291,"path":292,"stem":293,"icon":294},"Ports","\u002Freference\u002Fports","8.reference\u002F4.ports","i-ph-network",{"title":296,"path":297,"stem":298,"icon":299},"Environment variables","\u002Freference\u002Fenvironment","8.reference\u002F5.environment","i-ph-brackets-curly",{"title":301,"path":302,"stem":303,"icon":304},"Files and directories","\u002Freference\u002Ffiles","8.reference\u002F6.files","i-ph-tree-structure",{"title":306,"icon":6,"path":307,"stem":308,"children":309,"page":6},"About","\u002Fabout","9.about",[310,315],{"title":311,"path":312,"stem":313,"icon":314},"Licensing","\u002Fabout\u002Flicensing","9.about\u002F1.licensing","i-ph-scales",{"title":316,"path":317,"stem":318,"icon":319},"About these docs","\u002Fabout\u002Fcontributing-docs","9.about\u002F2.contributing-docs","i-ph-pencil-simple",{"id":321,"title":85,"body":322,"description":935,"extension":936,"links":937,"meta":938,"navigation":939,"path":86,"seo":940,"stem":87,"__hash__":941},"docs\u002F3.fleet\u002F3.join-nodes.md",{"type":323,"value":324,"toc":925},"minimark",[325,329,334,352,487,501,529,533,536,575,578,616,619,623,630,649,652,674,677,716,722,730,740,768,771,775,799,809,813,816,899,906,910,921],[326,327,328],"p",{},"A node needs only outbound access to the edge on ports 7233 and 7443. It creates its own key when it joins; the key never leaves the machine.",[330,331,333],"h2",{"id":332},"with-one-command","With one command",[326,335,336,337,341,342,346,347,351],{},"On the ",[338,339,340],"a",{"href":235},"web UI","'s ",[343,344,345],"em",{},"Nodes"," page, ",[348,349,350],"strong",{},"Add nodes"," creates a join token and shows one command for Linux and macOS:",[353,354,360],"pre",{"className":355,"code":356,"filename":357,"language":358,"meta":359,"style":359},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -fsSk https:\u002F\u002Fedge.example.com:7443\u002Fv1\u002Fca.crt -o \u002Ftmp\u002Foz0-ca.crt \\\n  && echo '\u003Csha256 of the CA>  \u002Ftmp\u002Foz0-ca.crt' | (sha256sum -c --quiet || shasum -a 256 -c --quiet) \\\n  && curl -fsS --cacert \u002Ftmp\u002Foz0-ca.crt https:\u002F\u002Fedge.example.com:7443\u002Finstall.sh | sh -s -- --token 'K10...'\n","Terminal","bash","",[361,362,363,389,446],"code",{"__ignoreMap":359},[364,365,368,372,376,379,382,385],"span",{"class":366,"line":367},"line",1,[364,369,371],{"class":370},"sBMFI","curl",[364,373,375],{"class":374},"sfazB"," -fsSk",[364,377,378],{"class":374}," https:\u002F\u002Fedge.example.com:7443\u002Fv1\u002Fca.crt",[364,380,381],{"class":374}," -o",[364,383,384],{"class":374}," \u002Ftmp\u002Foz0-ca.crt",[364,386,388],{"class":387},"sTEyZ"," \\\n",[364,390,392,396,400,403,406,409,412,415,418,421,424,427,430,433,437,439,441,444],{"class":366,"line":391},2,[364,393,395],{"class":394},"sMK4o","  &&",[364,397,399],{"class":398},"s2Zo4"," echo",[364,401,402],{"class":394}," '",[364,404,405],{"class":374},"\u003Csha256 of the CA>  \u002Ftmp\u002Foz0-ca.crt",[364,407,408],{"class":394},"'",[364,410,411],{"class":394}," |",[364,413,414],{"class":394}," (",[364,416,417],{"class":370},"sha256sum",[364,419,420],{"class":374}," -c",[364,422,423],{"class":374}," --quiet",[364,425,426],{"class":394}," ||",[364,428,429],{"class":370}," shasum",[364,431,432],{"class":374}," -a",[364,434,436],{"class":435},"sbssI"," 256",[364,438,420],{"class":374},[364,440,423],{"class":374},[364,442,443],{"class":394},")",[364,445,388],{"class":387},[364,447,449,451,454,457,460,462,465,467,470,473,476,479,481,484],{"class":366,"line":448},3,[364,450,395],{"class":394},[364,452,453],{"class":370}," curl",[364,455,456],{"class":374}," -fsS",[364,458,459],{"class":374}," --cacert",[364,461,384],{"class":374},[364,463,464],{"class":374}," https:\u002F\u002Fedge.example.com:7443\u002Finstall.sh",[364,466,411],{"class":394},[364,468,469],{"class":370}," sh",[364,471,472],{"class":374}," -s",[364,474,475],{"class":374}," --",[364,477,478],{"class":374}," --token",[364,480,402],{"class":394},[364,482,483],{"class":374},"K10...",[364,485,486],{"class":394},"'\n",[326,488,489,490,492,493,496,497,500],{},"It downloads the cluster's CA certificate, checks it against the hash in the command, and fetches the install script over TLS that trusts only that CA, so nothing it runs can have been changed on the way. The script downloads ",[361,491,278],{}," for the machine's platform and checks its digest, installs it in ",[361,494,495],{},"\u002Fusr\u002Flocal\u002Fbin"," (or ",[361,498,499],{},"~\u002F.local\u002Fbin"," without root), joins, and starts the node in the foreground. On its first start the node downloads the runtime from the edge too.",[326,502,503,506,507,510,511,510,514,517,518,521,522,525,526,528],{},[361,504,505],{},"install.sh"," takes ",[361,508,509],{},"--name",", ",[361,512,513],{},"--data-dir",[361,515,516],{},"--dir"," for the binary, and ",[361,519,520],{},"--no-run"," to install and join only. The edge serves what ",[361,523,524],{},"make dist"," built; see ",[338,527,26],{"href":27},".",[330,530,532],{"id":531},"with-a-join-token","With a join token",[326,534,535],{},"A token admits nodes without an operator approving each one. Create it on the operator side:",[353,537,539],{"className":355,"code":538,"filename":357,"language":358,"meta":359,"style":359},"orchestrator-zero token create --tenant default --max-uses 10 --ttl 24h --label gpu=a100\n",[361,540,541],{"__ignoreMap":359},[364,542,543,545,548,551,554,557,560,563,566,569,572],{"class":366,"line":367},[364,544,274],{"class":370},[364,546,547],{"class":374}," token",[364,549,550],{"class":374}," create",[364,552,553],{"class":374}," --tenant",[364,555,556],{"class":374}," default",[364,558,559],{"class":374}," --max-uses",[364,561,562],{"class":435}," 10",[364,564,565],{"class":374}," --ttl",[364,567,568],{"class":374}," 24h",[364,570,571],{"class":374}," --label",[364,573,574],{"class":374}," gpu=a100\n",[326,576,577],{},"The token is shown once. It carries the cluster's CA hash, so the node can check the server before it sends anything. On the machine:",[353,579,581],{"className":355,"code":580,"filename":357,"language":358,"meta":359,"style":359},"OZ0_JOIN_TOKEN='K10...' orchestrator-zero-node join --server https:\u002F\u002Fedge.example.com:7443\norchestrator-zero-node run\n",[361,582,583,609],{"__ignoreMap":359},[364,584,585,588,591,593,595,597,600,603,606],{"class":366,"line":367},[364,586,587],{"class":387},"OZ0_JOIN_TOKEN",[364,589,590],{"class":394},"=",[364,592,408],{"class":394},[364,594,483],{"class":374},[364,596,408],{"class":394},[364,598,599],{"class":370}," orchestrator-zero-node",[364,601,602],{"class":374}," join",[364,604,605],{"class":374}," --server",[364,607,608],{"class":374}," https:\u002F\u002Fedge.example.com:7443\n",[364,610,611,613],{"class":366,"line":391},[364,612,278],{"class":370},[364,614,615],{"class":374}," run\n",[326,617,618],{},"Labels on the token are given to every node that joins with it.",[330,620,622],{"id":621},"by-approval","By approval",[326,624,625,626,629],{},"Without a token, the node waits until an operator accepts it, as with ",[361,627,628],{},"salt-key -a",". Get the CA hash first:",[353,631,633],{"className":355,"code":632,"filename":357,"language":358,"meta":359,"style":359},"orchestrator-zero cluster info                 # shows the CA hash\n",[361,634,635],{"__ignoreMap":359},[364,636,637,639,642,645],{"class":366,"line":367},[364,638,274],{"class":370},[364,640,641],{"class":374}," cluster",[364,643,644],{"class":374}," info",[364,646,648],{"class":647},"sHwdD","                 # shows the CA hash\n",[326,650,651],{},"On the machine:",[353,653,655],{"className":355,"code":654,"filename":357,"language":358,"meta":359,"style":359},"orchestrator-zero-node join --server https:\u002F\u002Fedge.example.com:7443 --ca-hash sha256:...\n",[361,656,657],{"__ignoreMap":359},[364,658,659,661,663,665,668,671],{"class":366,"line":367},[364,660,278],{"class":370},[364,662,602],{"class":374},[364,664,605],{"class":374},[364,666,667],{"class":374}," https:\u002F\u002Fedge.example.com:7443",[364,669,670],{"class":374}," --ca-hash",[364,672,673],{"class":374}," sha256:...\n",[326,675,676],{},"The node prints its fingerprint and waits. On the operator side, compare the fingerprint and accept it:",[353,678,680],{"className":355,"code":679,"filename":357,"language":358,"meta":359,"style":359},"orchestrator-zero node list --pending\norchestrator-zero node accept node-7f3a01b2c4d5 --tenant default --label zone=eu\n",[361,681,682,695],{"__ignoreMap":359},[364,683,684,686,689,692],{"class":366,"line":367},[364,685,274],{"class":370},[364,687,688],{"class":374}," node",[364,690,691],{"class":374}," list",[364,693,694],{"class":374}," --pending\n",[364,696,697,699,701,704,707,709,711,713],{"class":366,"line":391},[364,698,274],{"class":370},[364,700,688],{"class":374},[364,702,703],{"class":374}," accept",[364,705,706],{"class":374}," node-7f3a01b2c4d5",[364,708,553],{"class":374},[364,710,556],{"class":374},[364,712,571],{"class":374},[364,714,715],{"class":374}," zone=eu\n",[326,717,718,721],{},[361,719,720],{},"node reject"," refuses it instead.",[330,723,725,726,729],{"id":724},"what-run-does","What ",[361,727,728],{},"run"," does",[326,731,732,735,736,739],{},[361,733,734],{},"orchestrator-zero-node run"," runs in the foreground. On first start it installs a pinned uv and a managed Python, and the runtime: the bundle given with ",[361,737,738],{},"--runtime-bundle",", or else the one the edge serves, checked against its digest. Then it:",[741,742,743,747,750,765],"ul",{},[744,745,746],"li",{},"opens the control stream to the edge and keeps it open,",[744,748,749],{},"runs a local Temporal proxy and a local LLM proxy, both holding the node's certificate,",[744,751,752,753,756,757,760,761,764],{},"starts the agent runtime, which polls ",[361,754,755],{},"oz0.default",", the node's own ",[361,758,759],{},"node.\u003Cid>"," queue, the queues of the agents it has, and any queues listed in its ",[361,762,763],{},"queues"," label,",[744,766,767],{},"downloads, builds and starts the plugins its tenant has installed for it.",[326,769,770],{},"Certificates renew themselves. A blocked node stops its runtime and asks again every ten seconds.",[330,772,774],{"id":773},"labels-and-queues","Labels and queues",[326,776,777,778,510,781,510,784,787,788,791,792,795,796,528],{},"Labels are key-value pairs: ",[361,779,780],{},"gpu=a100",[361,782,783],{},"zone=eu-north",[361,785,786],{},"team=data",". They decide which plugins a node gets (",[361,789,790],{},"plugin install --select",") and which agents it may run (",[361,793,794],{},"requires.labels"," in an agent). Set them on the token or at ",[361,797,798],{},"node accept",[326,800,801,802,804,805,808],{},"The special label ",[361,803,763],{}," lists extra task queues the node polls, for example ",[361,806,807],{},"--label queues=reports,batch",". Only operators set it.",[330,810,812],{"id":811},"run-a-node-as-a-service","Run a node as a service",[326,814,815],{},"Built-in service installation (systemd, launchd and Windows services) is planned. Until then, use your service manager. A systemd unit, for example:",[353,817,822],{"className":818,"code":819,"filename":820,"language":821,"meta":359,"style":359},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Orchestrator Zero node\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nUser=oz0\nExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Forchestrator-zero-node run\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n","\u002Fetc\u002Fsystemd\u002Fsystem\u002Forchestrator-zero-node.service","ini",[361,823,824,829,834,839,845,852,858,864,870,876,882,887,893],{"__ignoreMap":359},[364,825,826],{"class":366,"line":367},[364,827,828],{},"[Unit]\n",[364,830,831],{"class":366,"line":391},[364,832,833],{},"Description=Orchestrator Zero node\n",[364,835,836],{"class":366,"line":448},[364,837,838],{},"After=network-online.target\n",[364,840,842],{"class":366,"line":841},4,[364,843,844],{},"Wants=network-online.target\n",[364,846,848],{"class":366,"line":847},5,[364,849,851],{"emptyLinePlaceholder":850},true,"\n",[364,853,855],{"class":366,"line":854},6,[364,856,857],{},"[Service]\n",[364,859,861],{"class":366,"line":860},7,[364,862,863],{},"User=oz0\n",[364,865,867],{"class":366,"line":866},8,[364,868,869],{},"ExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Forchestrator-zero-node run\n",[364,871,873],{"class":366,"line":872},9,[364,874,875],{},"Restart=always\n",[364,877,879],{"class":366,"line":878},10,[364,880,881],{},"RestartSec=5\n",[364,883,885],{"class":366,"line":884},11,[364,886,851],{"emptyLinePlaceholder":850},[364,888,890],{"class":366,"line":889},12,[364,891,892],{},"[Install]\n",[364,894,896],{"class":366,"line":895},13,[364,897,898],{},"WantedBy=multi-user.target\n",[326,900,901,902,905],{},"Join once as the same user (",[361,903,904],{},"sudo -u oz0 orchestrator-zero-node join ...",") before you enable the service, and run nodes as a user without root: plugins run with the node's permissions.",[330,907,909],{"id":908},"small-machines","Small machines",[326,911,912,913,916,917,920],{},"A Raspberry Pi with a 64-bit OS is a ",[361,914,915],{},"linux\u002Farm64"," node like any other, good for agents that drive local hardware or run light tools. Give it a label such as ",[361,918,919],{},"device=pi"," and require it in the agents that need it.",[922,923,924],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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":359,"searchDepth":391,"depth":391,"links":926},[927,928,929,930,932,933,934],{"id":332,"depth":391,"text":333},{"id":531,"depth":391,"text":532},{"id":621,"depth":391,"text":622},{"id":724,"depth":391,"text":931},"What run does",{"id":773,"depth":391,"text":774},{"id":811,"depth":391,"text":812},{"id":908,"depth":391,"text":909},"Turn any machine into a node, with a join token or by approval.","md",null,{},{"icon":88},{"title":85,"description":935},"w2CErevNAQTOg5pc7_Rfp3HlGlDATBEMO-GuFQEzZO0",[943,945],{"title":80,"path":81,"stem":82,"description":944,"icon":83,"children":-1},"Servers on PostgreSQL: create the cluster once, then start as many servers as you need.",{"title":90,"path":91,"stem":92,"description":946,"icon":93,"children":-1},"List, inspect, accept, block, purge and remove nodes, and manage join tokens.",1791135407894]