Create the node in the panel, install the daemon and give it ports.
A node is a machine that runs game servers: Linux (x86_64 or arm64) and systemd. The script
installs Docker if missing. The node can be the API’s machine
(Everything on one machine).
In the panel: Infrastructure › Nodes › Add a node. Give it a technical name (a-z, 0-9,
-), written into its certificate and therefore permanent, and a label if you like.Kuro shows, only once:
an enrollment token, single-use and valid for a few minutes;
the certificate authority fingerprint (sha256:…);
the command to run on the node, fingerprint and API address included.
You create neither the token nor the fingerprint: Kuro provides them. The fingerprint lets the
node check it is talking to your API before sending it the token
(why).
Token expired or lost: on the node’s page, Enrollment › Issue a token (previous ones stop
working). Same to re-enroll a revoked node.
On the node, paste the command shown by the panel.
The token goes through an environment variable or a file, never an argument: it would end
up in the shell history. The read line waits for it: paste it, then press Enter.
The daemon generates its private key on the machine (it never leaves), gets its certificate,
then opens its connection to the API. The node shows as online in the panel.With --full (fresh server, Debian 12-13 or Ubuntu 22.04-24.04), the script first prepares the
machine: updates, fail2ban, key-only SSH if a key is already authorized, Docker, and a ufw
firewall that only opens SSH and the --ports range (TCP and UDP). The node needs no other
port: it connects to the API itself. --plan shows everything without changing anything.
Option
Purpose
--api
The API’s daemon listener (https://host:8443). Required on first enrollment.
--ca-fingerprint
Fingerprint shown when the node was created. Required on first enrollment.
--token-file
File holding the token, instead of KURO_ENROLL_TOKEN.
--ports
Game server range, opened in the firewall by --full (e.g. 25565-25600).
--full
Prepares a fresh server (see above).
--plan
Shows what would be done, without changing anything.
On the node’s page, Ports: add the same range (for example 25565-25600). Each server gets
a port from this range.Players must be able to reach these ports. Without --full, open them in the node’s firewall;
if the node is at home, also forward them on your router (see
How it works).
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Kuroctl","colors":{"primary":"#4e61ed","light":"#4e61ed","dark":"#667efe"},"logo":{"light":"https://mintcdn.com/nihilo/dkpD-84WRtB8xLBL/logo/light.png?fit=max\u0026auto=format\u0026n=dkpD-84WRtB8xLBL\u0026q=85\u0026s=e0d3c070f234875fb30efe4d7b531513","dark":"https://mintcdn.com/nihilo/dkpD-84WRtB8xLBL/logo/dark.png?fit=max\u0026auto=format\u0026n=dkpD-84WRtB8xLBL\u0026q=85\u0026s=94c462c15a0f5a40c4cedba4a618dc61"},"favicon":"https://mintcdn.com/nihilo/TyX4AxI5RlrYgWYX/favicon.svg?fit=max\u0026auto=format\u0026n=TyX4AxI5RlrYgWYX\u0026q=85\u0026s=2871539fd048dea718876b485ff58abd","navbar":{"links":[{"href":"https://github.com/kuroctl/kuro","label":"GitHub"}],"primary":{"type":"button","label":"Kuroctl","href":"https://get.kuroctl.com"}},"footer":{"socials":{"github":"https://github.com/kuroctl/kuro"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"languages":[{"language":"fr","href":"fr"},{"language":"en","default":true,"href":"en"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nihilo","hasAudioNarration":false,"actualSubdomain":"nihilo","customDomains":["docs.kuroctl.com"],"gitSource":{"type":"github","owner":"kuroctl","repo":"kuro","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":"","_id":"6ae3a932728445593464713c"},"chroma":{"latestBuiltDeploymentHistoryId":"6ae46873737a5e6c8f10b205","collectionId":"f7e7a572-7fbf-455a-85b0-905bf53d6b78","liveDeploymentHistoryId":"6ae46873737a5e6c8f10b205","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae46c0f812f7e980ce4f1ee","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"en","tag":"Install","count":4},{"language":"fr","tag":"Installer","count":4},{"language":"en","tag":"Configure","count":3},{"language":"en","tag":"Get started","count":3},{"language":"fr","tag":"Configurer","count":3},{"language":"fr","tag":"Démarrer","count":3},{"language":"en","tag":"Help","count":1},{"language":"fr","tag":"Aide","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/add-a-node","slug":"/en/add-a-node","pageMetadata":{"title":"Add a node","description":"Create the node in the panel, install the daemon and give it ports.","href":"/en/add-a-node"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Create the node in the panel, install the daemon and give it ports.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`A node is a machine that runs game servers: Linux (x86_64 or arm64) and systemd. The script\ninstalls Docker if missing. The node can be the API’s machine\n(`,_jsx(_components.a,{href:`/en/install-api#everything-on-one-machine`,children:`Everything on one machine`}),`).`]}),`\n`,_jsx(Heading,{level:`2`,id:`1-create-the-node-in-kuro`,children:`1. Create the node in Kuro`}),`\n`,_jsxs(_components.p,{children:[`In the panel: `,_jsx(_components.strong,{children:`Infrastructure › Nodes › Add a node`}),`. Give it a technical name (`,_jsx(_components.code,{children:`a-z`}),`, `,_jsx(_components.code,{children:`0-9`}),`,\n`,_jsx(_components.code,{children:`-`}),`), written into its certificate and therefore permanent, and a label if you like.`]}),`\n`,_jsxs(_components.p,{children:[`Kuro shows, `,_jsx(_components.strong,{children:`only once`}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`an `,_jsx(_components.strong,{children:`enrollment token`}),`, single-use and valid for a few minutes;`]}),`\n`,_jsxs(_components.li,{children:[`the `,_jsx(_components.strong,{children:`certificate authority fingerprint`}),` (`,_jsx(_components.code,{children:`sha256:…`}),`);`]}),`\n`,_jsxs(_components.li,{children:[`the `,_jsx(_components.strong,{children:`command`}),` to run on the node, fingerprint and API address included.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`You create neither the token nor the fingerprint: Kuro provides them. The fingerprint lets the\nnode check it is talking to `,_jsx(_components.strong,{children:`your`}),` API before sending it the token\n(`,_jsx(_components.a,{href:`/en/verification`,children:`why`}),`).`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Token expired or lost: on the node’s page, `,_jsx(_components.strong,{children:`Enrollment › Issue a token`}),` (previous ones stop\nworking). Same to re-enroll a revoked node.`]})}),`\n`,_jsx(_components.p,{children:`From the command line, on the API machine:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` kuro-api-admin`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` node`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-node`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # options: --display-name, --region, --location`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` kuro-api-admin`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` node`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` token`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --name`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-node`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # new token`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`2-install-the-daemon`,children:`2. Install the daemon`}),`\n`,_jsx(_components.p,{children:`On the node, paste the command shown by the panel.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The token goes through an environment variable or a file, `,_jsx(_components.strong,{children:`never an argument`}),`: it would end\nup in the shell history. The `,_jsx(_components.code,{children:`read`}),` line waits for it: paste it, then press Enter.`]})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -fsSLo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install.sh`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://get.kuroctl.com/node`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`less`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install.sh`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`read`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -rs`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` KURO_ENROLL_TOKEN`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` KURO_ENROLL_TOKEN`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # paste the token, then Enter`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -E`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` bash`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install.sh`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --api`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://panel.example.com:8443`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --ca-fingerprint`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` sha256:…`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --ports`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 25565-25600`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --full`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The daemon generates its private key on the machine (it never leaves), gets its certificate,\nthen opens its connection to the API. The node shows as `,_jsx(_components.strong,{children:`online`}),` in the panel.`]}),`\n`,_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`--full`}),` (fresh server, Debian 12-13 or Ubuntu 22.04-24.04), the script first prepares the\nmachine: updates, `,_jsx(_components.code,{children:`fail2ban`}),`, key-only SSH if a key is already authorized, Docker, and a `,_jsx(_components.code,{children:`ufw`}),`\nfirewall that only opens SSH and the `,_jsx(_components.code,{children:`--ports`}),` range (TCP and UDP). The node needs no other\nport: it connects to the API itself. `,_jsx(_components.code,{children:`--plan`}),` shows everything without changing anything.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Option`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--api`})}),_jsxs(_components.td,{children:[`The API’s daemon listener (`,_jsx(_components.code,{children:`https://host:8443`}),`). Required on first enrollment.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--ca-fingerprint`})}),_jsx(_components.td,{children:`Fingerprint shown when the node was created. Required on first enrollment.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--token-file`})}),_jsxs(_components.td,{children:[`File holding the token, instead of `,_jsx(_components.code,{children:`KURO_ENROLL_TOKEN`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--ports`})}),_jsxs(_components.td,{children:[`Game server range, opened in the firewall by `,_jsx(_components.code,{children:`--full`}),` (e.g. `,_jsx(_components.code,{children:`25565-25600`}),`).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--full`})}),_jsx(_components.td,{children:`Prepares a fresh server (see above).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--plan`})}),_jsx(_components.td,{children:`Shows what would be done, without changing anything.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--yes`})}),_jsxs(_components.td,{children:[`No confirmation (`,_jsx(_components.code,{children:`--full`}),`).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`--version`})}),_jsx(_components.td,{children:`Version to install (default: latest).`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`3-give-the-node-ports`,children:`3. Give the node ports`}),`\n`,_jsxs(_components.p,{children:[`On the node’s page, `,_jsx(_components.strong,{children:`Ports`}),`: add the same range (for example `,_jsx(_components.code,{children:`25565-25600`}),`). Each server gets\na port from this range.`]}),`\n`,_jsxs(_components.p,{children:[`Players must be able to reach these ports. Without `,_jsx(_components.code,{children:`--full`}),`, open them in the node’s firewall;\nif the node is at home, also forward them on your router (see\n`,_jsx(_components.a,{href:`/en/how-it-works`,children:`How it works`}),`).`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Add a node","description":"Create the node in the panel, install the daemon and give it ports.","href":"/en/add-a-node"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"1. Create the node in Kuro","slug":"1-create-the-node-in-kuro","depth":2,"children":[]},{"title":"2. Install the daemon","slug":"2-install-the-daemon","depth":2,"children":[]},{"title":"3. Give the node ports","slug":"3-give-the-node-ports","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"nihilo","siteName":"Kuroctl","title":"Add a node - Kuroctl","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"fr":{"href":"/fr/add-a-node","matchLevel":1},"en":{"href":"/en/add-a-node","matchLevel":0}}},"lastModified":"2026-10-30T08:37:33.314Z","originalFileLocation":"en/add-a-node.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Create the node in the panel, install the daemon and give it ports.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Kuroctl\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Add a node - Kuroctl\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create the node in the panel, install the daemon and give it ports.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Kuroctl\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.kuroctl.com/en/add-a-node\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nihilo.mintlify.app/_mintlify/api/og/v2?division=Install\u0026amp;title=Add+a+node\u0026amp;description=Create+the+node+in+the+panel%2C+install+the+daemon+and+give+it+ports.\u0026amp;theme=bcc2fd2b88c804bd269ee961\u0026amp;signature=e5eb0e06424c974817ee46d17e301fb60c096522e63a26776ae35582429574c7\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Add a node - Kuroctl\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create the node in the panel, install the daemon and give it ports.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nihilo.mintlify.app/_mintlify/api/og/v2?division=Install\u0026amp;title=Add+a+node\u0026amp;description=Create+the+node+in+the+panel%2C+install+the+daemon+and+give+it+ports.\u0026amp;theme=bcc2fd2b88c804bd269ee961\u0026amp;signature=e5eb0e06424c974817ee46d17e301fb60c096522e63a26776ae35582429574c7\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/nihilo/jtrXauOrOnZvCzpb/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Kuroctl\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4e61ed\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.kuroctl.com/en/add-a-node\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/add-a-node.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.kuroctl.com/en/add-a-node\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://docs.kuroctl.com/fr/add-a-node\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.kuroctl.com/en/add-a-node\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.kuroctl.com/#organization\",\"name\":\"Kuroctl\",\"url\":\"https://docs.kuroctl.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/nihilo/dkpD-84WRtB8xLBL/logo/light.png?fit=max\u0026auto=format\u0026n=dkpD-84WRtB8xLBL\u0026q=85\u0026s=e0d3c070f234875fb30efe4d7b531513\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.kuroctl.com#website\",\"name\":\"Kuroctl\",\"url\":\"https://docs.kuroctl.com\",\"publisher\":{\"@id\":\"https://docs.kuroctl.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.kuroctl.com/en/add-a-node#webpage\",\"url\":\"https://docs.kuroctl.com/en/add-a-node\",\"name\":\"Add a node\",\"description\":\"Create the node in the panel, install the daemon and give it ports.\",\"dateModified\":\"2026-10-30T08:37:33.314Z\",\"isPartOf\":{\"@id\":\"https://docs.kuroctl.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.kuroctl.com/en/add-a-node#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.kuroctl.com/en/add-a-node#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Install\",\"item\":\"https://docs.kuroctl.com/en/install-api\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Add a node\",\"item\":\"https://docs.kuroctl.com/en/add-a-node\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.kuroctl.com/en/add-a-node#article\",\"headline\":\"Add a node\",\"name\":\"Add a node\",\"description\":\"Create the node in the panel, install the daemon and give it ports.\",\"url\":\"https://docs.kuroctl.com/en/add-a-node\",\"mainEntityOfPage\":{\"@id\":\"https://docs.kuroctl.com/en/add-a-node#webpage\"},\"dateModified\":\"2026-10-30T08:37:33.314Z\",\"publisher\":{\"@id\":\"https://docs.kuroctl.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.kuroctl.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Kuroctl\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Kuroctl","nav":{"global":null,"languages":[{"language":"fr","pages":[{"title":"fr","href":"/fr/add-a-node"}]},{"language":"en","default":true,"groups":[{"group":"Get started","pages":[{"title":"Kuro","sidebarTitle":"Home","href":"/en"},{"title":"Introduction","href":"/en/introduction"},{"title":"How it works","href":"/en/how-it-works"}]},{"group":"Install","pages":[{"title":"Install the API and panel","sidebarTitle":"Install the API","description":"One script installs the API, the panel and the official prefabs, and can prepare a fresh server.","href":"/en/install-api"},{"title":"Add a node","href":"/en/add-a-node"},{"title":"Verify what you install","sidebarTitle":"Verification","description":"Download signatures and the certificate authority fingerprint.","href":"/en/verification"},{"title":"Updating","href":"/en/updating"}]},{"group":"Configure","pages":[{"title":"Configuration file","sidebarTitle":"Configuration","href":"/en/configuration"},{"title":"DNS (optional)","sidebarTitle":"DNS","href":"/en/dns"},{"title":"AI agents (MCP)","sidebarTitle":"AI agents","href":"/en/mcp"}]},{"group":"Help","pages":[{"title":"Troubleshooting","href":"/en/troubleshooting"}]}]}]},"title":"Add a node - Kuroctl","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}