[{"data":1,"prerenderedAt":496},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-your-own-server":34,"-getting-started-your-own-server-surround":491},[4,25],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Connect your agent","\u002Fgetting-started\u002Fconnect","1.getting-started\u002F1.connect","i-lucide-plug",{"title":16,"path":17,"stem":18,"icon":19},"Your first VM","\u002Fgetting-started\u002Ffirst-vm","1.getting-started\u002F2.first-vm","i-lucide-server",{"title":21,"path":22,"stem":23,"icon":24},"Your own server","\u002Fgetting-started\u002Fyour-own-server","1.getting-started\u002F3.your-own-server","i-lucide-house",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Networks","\u002Fnetworks","2.networks",[30],{"title":31,"path":32,"stem":33},"Internet access","\u002Fnetworks\u002Finternet-access","2.networks\u002F1.internet-access",{"id":35,"title":21,"body":36,"description":483,"extension":484,"links":485,"meta":486,"navigation":488,"path":22,"seo":489,"stem":23,"__hash__":490},"docs\u002F1.getting-started\u002F3.your-own-server.md",{"type":37,"value":38,"toc":474},"minimark",[39,43,46,51,70,73,116,119,123,130,141,148,152,158,224,231,234,260,264,267,301,309,312,337,341,420,449,455,459,470],[40,41,42],"p",{},"Ghostdock runs on your hardware as happily as on ours. Bring any Linux server: a box in the\noffice, a dedicated machine at your hosting provider, a VPS. Your agent gets the same VMs, the\nsame URLs and the same tools, and the machines, the data and the bill stay yours.",[40,44,45],{},"Idle VMs stop by themselves and wake when they are needed, so a server holds far more VMs than it\ncould keep running at once.",[47,48,50],"h2",{"id":49},"incus-the-perfect-fit","Incus, the perfect fit",[40,52,53,54,64,65,69],{},"Ghostdock runs on your server through ",[55,56,57],"strong",{},[58,59,63],"a",{"href":60,"rel":61},"https:\u002F\u002Flinuxcontainers.org\u002Fincus\u002F",[62],"nofollow","Incus",", the open-source manager for Linux system\ncontainers and VMs. Never used it? You don't need to. The setup installs Incus 7.0 LTS for you,\ngives Ghostdock a project of its own, and leaves everything else on the server alone. You never\nhave to type an ",[66,67,68],"code",{},"incus"," command.",[40,71,72],{},"Why Incus: every Ghostdock VM gets limits that Incus enforces, in a project Ghostdock can never\nleave. Your own containers, VMs, networks and storage pools stay exactly as they are.",[74,75,76,88],"table",{},[77,78,79],"thead",{},[80,81,82,86],"tr",{},[83,84,85],"th",{},"The server needs",[83,87],{},[89,90,91,100,108],"tbody",{},[80,92,93,97],{},[94,95,96],"td",{},"System",[94,98,99],{},"Debian 13, Ubuntu 26.04, or Ubuntu 24.04 with its HWE kernel (Linux 6.12 or later), x86-64",[80,101,102,105],{},[94,103,104],{},"Memory",[94,106,107],{},"2 GiB or more; everything above that is room for VMs",[80,109,110,113],{},[94,111,112],{},"Network",[94,114,115],{},"Ports 80, 443 and 2222 reachable, or a web server of your own in front (the setup handles both)",[40,117,118],{},"Already running Incus 7.0 or later on another system? That works too.",[47,120,122],{"id":121},"let-your-agent-do-it","Let your agent do it",[40,124,125,126,129],{},"The easiest way. In Ghostdock, open ",[55,127,128],{},"Providers → Incus",", name the server, and copy the prompt\nit shows into your agent. Or ask an agent that has Ghostdock connected:",[131,132,139],"pre",{"className":133,"code":135,"filename":136,"language":137,"meta":138},[134],"language-text","Connect my server 203.0.113.10 to Ghostdock as an Incus host. You can reach it with\nssh root@203.0.113.10.\n","Prompt","text","",[66,140,135],{"__ignoreMap":138},[40,142,143,144,147],{},"The agent reads Ghostdock's ",[66,145,146],{},"host-setup"," skill. It checks the server first, asks you the few\nquestions that matter in one message (is the server only for Ghostdock, where should VM data\nlive, which domain should VM URLs use), runs the setup, and walks through what is left until\nyour first VM has a URL.",[47,149,151],{"id":150},"or-run-one-command","Or run one command",[40,153,154,155,157],{},"In Ghostdock, open ",[55,156,128],{},", name the server, and copy its command. It carries a\njoin token that works once, within an hour:",[131,159,164],{"className":160,"code":161,"filename":162,"language":163,"meta":138,"style":138},"language-bash shiki shiki-themes material-theme-lighter github-dark-default github-dark-default","curl -fsSL https:\u002F\u002Fghostdock.ai\u002Fincus-host.sh | sudo sh -s -- --app https:\u002F\u002Fghostdock.ai --token \u003Cjoin token>\n","On your server","bash",[66,165,166],{"__ignoreMap":138},[167,168,171,175,179,183,187,190,193,196,199,202,205,208,211,214,217,221],"span",{"class":169,"line":170},"line",1,[167,172,174],{"class":173},"se-ri","curl",[167,176,178],{"class":177},"sx258"," -fsSL",[167,180,182],{"class":181},"soMwW"," https:\u002F\u002Fghostdock.ai\u002Fincus-host.sh",[167,184,186],{"class":185},"sebAQ"," |",[167,188,189],{"class":173}," sudo",[167,191,192],{"class":181}," sh",[167,194,195],{"class":177}," -s",[167,197,198],{"class":177}," --",[167,200,201],{"class":177}," --app",[167,203,204],{"class":181}," https:\u002F\u002Fghostdock.ai",[167,206,207],{"class":177}," --token",[167,209,210],{"class":185}," \u003C",[167,212,213],{"class":181},"join",[167,215,216],{"class":181}," toke",[167,218,220],{"class":219},"sINcL","n",[167,222,223],{"class":185},">\n",[40,225,226,227,230],{},"The script checks the server, prints its plan, and asks before it changes anything. Run it with\n",[66,228,229],{},"--check"," first to see the plan and change nothing. On a fresh server the whole setup, Incus\nincluded, takes about a minute. It is safe to run again after a failure.",[40,232,233],{},"The CLI gets you the same command:",[131,235,238],{"className":160,"code":236,"filename":237,"language":163,"meta":138,"style":138},"ghostdock provider connect incus --name office\n","Terminal",[66,239,240],{"__ignoreMap":138},[167,241,242,245,248,251,254,257],{"class":169,"line":170},[167,243,244],{"class":173},"ghostdock",[167,246,247],{"class":181}," provider",[167,249,250],{"class":181}," connect",[167,252,253],{"class":181}," incus",[167,255,256],{"class":177}," --name",[167,258,259],{"class":181}," office\n",[47,261,263],{"id":262},"then-finish-in-ghostdock","Then finish in Ghostdock",[40,265,266],{},"The script ends with the steps that are left, in order, and a link to the provider's page in\nGhostdock, which tracks them:",[268,269,270,277,283,289,295],"ol",{},[271,272,273,276],"li",{},[55,274,275],{},"Firewall:"," open TCP 80, 443 and 2222 in your hosting provider's firewall or router, if\nthere is one. The server's own firewall is already done; this one Ghostdock can't see.",[271,278,279,282],{},[55,280,281],{},"Connect:"," Ghostdock checks the server.",[271,284,285,288],{},[55,286,287],{},"Domain:"," a domain of yours for VM URLs. Ghostdock names the two DNS records to create.",[271,290,291,294],{},[55,292,293],{},"Reach:"," Ghostdock opens a URL on your server from outside, to prove the way in works.",[271,296,297,300],{},[55,298,299],{},"Default:"," whether new VMs land on this server unless someone picks another.",[40,302,303,304,308],{},"Or hand the rest to your agent, as the script suggests: ",[305,306,307],"em",{},"\"Finish setting up the Ghostdock\nprovider office.\""," It asks Ghostdock what is left and does each step.",[40,310,311],{},"Then create a VM on it like any other:",[131,313,315],{"className":160,"code":314,"filename":237,"language":163,"meta":138,"style":138},"ghostdock vm up --name hello --provider office\n",[66,316,317],{"__ignoreMap":138},[167,318,319,321,324,327,329,332,335],{"class":169,"line":170},[167,320,244],{"class":173},[167,322,323],{"class":181}," vm",[167,325,326],{"class":181}," up",[167,328,256],{"class":177},[167,330,331],{"class":181}," hello",[167,333,334],{"class":177}," --provider",[167,336,259],{"class":181},[47,338,340],{"id":339},"good-to-know","Good to know",[342,343,344,354,364,374,383,389,395],"ul",{},[271,345,346,349,350,353],{},[55,347,348],{},"\"Ghostdock's router is not running\""," on the first check of a fresh server: its first\nimage download can take longer than the setup waits. Start it once and check again:\n",[66,351,352],{},"sudo incus start ghostdock-router --project ghostdock",". Host release 0.4.14 retries by\nitself.",[271,355,356,359,360,363],{},[55,357,358],{},"Your other data:"," the setup never erases or formats a disk. To keep VMs on a ZFS pool of\nyour own, pass ",[66,361,362],{},"--pool-dataset tank\u002Fghostdock","; otherwise it offers a pool in a file on the\nsystem disk.",[271,365,366,369,370,373],{},[55,367,368],{},"A server that does other things:"," ",[66,371,372],{},"--memory-reserve 4GiB"," keeps that much RAM for them.",[271,375,376,369,379,382],{},[55,377,378],{},"Folders of the server in VMs:",[66,380,381],{},"--host-paths \u002Fsrv\u002Fmedia:ro,\u002Fsrv\u002Fprojects"," lists the only\nfolders VMs may ever mount.",[271,384,385,388],{},[55,386,387],{},"Updates:"," the host updates itself a day after each Ghostdock release, and rolls back if the\nnew release isn't healthy within five minutes. Incus itself stays yours to update.",[271,390,391,394],{},[55,392,393],{},"Isolation:"," VMs on your server share its kernel. Work that needs a hard boundary between\nstrangers belongs on Ghostdock Cloud.",[271,396,397,400,401,404,405,407,408,411,412,415,416,419],{},[55,398,399],{},"Taking it off again:"," the same script with ",[66,402,403],{},"uninstall"," removes exactly what it added and\ndisconnects the server. ",[66,406,229],{}," shows what it would remove; without it, it asks first.\nYour VMs go only with ",[66,409,410],{},"--remove-vms",", and your data (Disks, snapshots) only with\n",[66,413,414],{},"--remove-data","; without it, the uninstall keeps them and says what stays. Incus stays unless\nyou add ",[66,417,418],{},"--remove-incus",".",[131,421,423],{"className":160,"code":422,"filename":162,"language":163,"meta":138,"style":138},"curl -fsSL https:\u002F\u002Fghostdock.ai\u002Fincus-host.sh | sudo sh -s -- uninstall --check\n",[66,424,425],{"__ignoreMap":138},[167,426,427,429,431,433,435,437,439,441,443,446],{"class":169,"line":170},[167,428,174],{"class":173},[167,430,178],{"class":177},[167,432,182],{"class":181},[167,434,186],{"class":185},[167,436,189],{"class":173},[167,438,192],{"class":181},[167,440,195],{"class":177},[167,442,198],{"class":177},[167,444,445],{"class":181}," uninstall",[167,447,448],{"class":177}," --check\n",[40,450,451,452,419],{},"Every option: ",[66,453,454],{},"incus-host.sh --help",[47,456,458],{"id":457},"docker-hosts-experimental","Docker hosts (experimental)",[40,460,461,462,465,466,469],{},"Already running everything on Docker and don't want Incus? Ghostdock can run VMs as containers\nnext to yours, on Docker 28 or later, with Sysbox for systemd and Docker inside VMs. Choose\n",[55,463,464],{},"Providers → Docker (experimental)",", or ",[66,467,468],{},"ghostdock provider connect docker",". It works, but Incus\nis where Ghostdock is at home: stronger limits, snapshots, and a clean line between your things\nand ours.",[471,472,473],"style",{},"html pre.shiki code .se-ri, html code.shiki .se-ri{--shiki-light:#E2931D;--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .sx258, html code.shiki .sx258{--shiki-light:#91B859;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .soMwW, html code.shiki .soMwW{--shiki-light:#91B859;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .sebAQ, html code.shiki .sebAQ{--shiki-light:#39ADB5;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .sINcL, html code.shiki .sINcL{--shiki-light:#90A4AE;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}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":138,"searchDepth":475,"depth":475,"links":476},2,[477,478,479,480,481,482],{"id":49,"depth":475,"text":50},{"id":121,"depth":475,"text":122},{"id":150,"depth":475,"text":151},{"id":262,"depth":475,"text":263},{"id":339,"depth":475,"text":340},{"id":457,"depth":475,"text":458},"Run Ghostdock's VMs on a server you own. One command sets it up, or your agent does it for you.","md",null,{"skills":487},[146],{"icon":24},{"title":21,"description":483},"MkAwLqTY00yRCb9YmsU87FWikgay2kMcRqQ626USdZM",[492,494],{"title":16,"path":17,"stem":18,"description":493,"icon":19,"children":-1},"A whole Linux machine, a web server and a public URL in about a minute. Then make it vanish.",{"title":31,"path":32,"stem":33,"description":495,"children":-1},"[object Object]",1794023544772]