[{"data":1,"prerenderedAt":452},["ShallowReactive",2],{"navigation_docs":3,"-docs-administration-servers":130,"-docs-administration-servers-surround":447},[4,25,70,90,115],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation","i-lucide-terminal",{"title":21,"path":22,"stem":23,"icon":24},"Quickstart","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F1.getting-started\u002F3.quickstart","i-lucide-rocket",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Deploy","\u002Fdocs\u002Fdeploy","docs\u002F2.deploy",[30,35,40,45,50,55,60,65],{"title":31,"path":32,"stem":33,"icon":34},"Projects and services","\u002Fdocs\u002Fdeploy\u002Fprojects-and-services","docs\u002F2.deploy\u002F1.projects-and-services","i-lucide-folder-kanban",{"title":36,"path":37,"stem":38,"icon":39},"Docker images","\u002Fdocs\u002Fdeploy\u002Fdocker-images","docs\u002F2.deploy\u002F2.docker-images","i-lucide-container",{"title":41,"path":42,"stem":43,"icon":44},"Git repositories","\u002Fdocs\u002Fdeploy\u002Fgit-repositories","docs\u002F2.deploy\u002F3.git-repositories","i-lucide-git-branch",{"title":46,"path":47,"stem":48,"icon":49},"Databases","\u002Fdocs\u002Fdeploy\u002Fdatabases","docs\u002F2.deploy\u002F4.databases","i-lucide-database",{"title":51,"path":52,"stem":53,"icon":54},"Environment variables","\u002Fdocs\u002Fdeploy\u002Fenvironment-variables","docs\u002F2.deploy\u002F5.environment-variables","i-lucide-key-round",{"title":56,"path":57,"stem":58,"icon":59},"Deployments and logs","\u002Fdocs\u002Fdeploy\u002Fdeployments","docs\u002F2.deploy\u002F6.deployments","i-lucide-scroll-text",{"title":61,"path":62,"stem":63,"icon":64},"Deploy hooks","\u002Fdocs\u002Fdeploy\u002Fdeploy-hooks","docs\u002F2.deploy\u002F7.deploy-hooks","i-lucide-webhook",{"title":66,"path":67,"stem":68,"icon":69},"Domains and HTTPS","\u002Fdocs\u002Fdeploy\u002Fdomains","docs\u002F2.deploy\u002F8.domains","i-lucide-lock",{"title":71,"icon":6,"path":72,"stem":73,"children":74,"page":6},"Backups","\u002Fdocs\u002Fbackups","docs\u002F3.backups",[75,80,85],{"title":76,"path":77,"stem":78,"icon":79},"Backup destinations","\u002Fdocs\u002Fbackups\u002Fbackup-destinations","docs\u002F3.backups\u002F1.backup-destinations","i-lucide-hard-drive-upload",{"title":81,"path":82,"stem":83,"icon":84},"Database backups","\u002Fdocs\u002Fbackups\u002Fdatabase-backups","docs\u002F3.backups\u002F2.database-backups","i-lucide-archive-restore",{"title":86,"path":87,"stem":88,"icon":89},"Backing up Harblet","\u002Fdocs\u002Fbackups\u002Fharblet-backups","docs\u002F3.backups\u002F3.harblet-backups","i-lucide-shield-check",{"title":91,"icon":6,"path":92,"stem":93,"children":94,"page":6},"Administration","\u002Fdocs\u002Fadministration","docs\u002F4.administration",[95,100,105,110],{"title":96,"path":97,"stem":98,"icon":99},"Harblet's domain","\u002Fdocs\u002Fadministration\u002Fharblet-domain","docs\u002F4.administration\u002F1.harblet-domain","i-lucide-globe",{"title":101,"path":102,"stem":103,"icon":104},"Servers","\u002Fdocs\u002Fadministration\u002Fservers","docs\u002F4.administration\u002F2.servers","i-lucide-server",{"title":106,"path":107,"stem":108,"icon":109},"Team and account","\u002Fdocs\u002Fadministration\u002Fteam","docs\u002F4.administration\u002F3.team","i-lucide-users",{"title":111,"path":112,"stem":113,"icon":114},"Updates","\u002Fdocs\u002Fadministration\u002Fupdates","docs\u002F4.administration\u002F4.updates","i-lucide-refresh-cw",{"title":116,"icon":6,"path":117,"stem":118,"children":119,"page":6},"Reference","\u002Fdocs\u002Freference","docs\u002F5.reference",[120,125],{"title":121,"path":122,"stem":123,"icon":124},"Troubleshooting","\u002Fdocs\u002Freference\u002Ftroubleshooting","docs\u002F5.reference\u002F1.troubleshooting","i-lucide-life-buoy",{"title":126,"path":127,"stem":128,"icon":129},"License","\u002Fdocs\u002Freference\u002Flicense","docs\u002F5.reference\u002F2.license","i-lucide-scale",{"id":131,"title":101,"body":132,"description":440,"extension":441,"links":442,"meta":443,"navigation":444,"path":102,"seo":445,"stem":103,"__hash__":446},"docs\u002Fdocs\u002F4.administration\u002F2.servers.md",{"type":133,"value":134,"toc":422},"minimark",[135,139,147,152,160,173,181,185,202,206,312,316,320,342,345,349,390,393,397,404,418],[136,137,138],"p",{},"Harblet starts on one server. Add more servers to run more services, and Harblet places services on all of them. When a server fails, its services start on another one.",[140,141,142,143,146],"note",{},"The Servers page is for admins. Production use on more than one server needs a commercial license, see ",[144,145,126],"a",{"href":127},".",[148,149,151],"h2",{"id":150},"the-first-server","The first server",[136,153,154,155,159],{},"The server you installed Harblet on is the ",[156,157,158],"strong",{},"first server",". It has a special role:",[161,162,163,167,170],"ul",{},[164,165,166],"li",{},"It runs Harblet, Harblet's database, the image registry and the build service.",[164,168,169],{},"It receives all traffic for your domains and routes it to the services on every server. Point all DNS records at it.",[164,171,172],{},"It can't be removed.",[174,175,176,177,180],"warning",{},"If the first server fails, Harblet and all domains are unreachable until it's back, even though services on other servers keep running. Set up ",[144,178,179],{"href":87},"backups of Harblet"," so you can restore it onto a new server.",[148,182,184],{"id":183},"see-your-servers","See your servers",[136,186,187,189,190,193,194,197,198,201],{},[156,188,101],{}," in the sidebar lists every server with its status (",[156,191,192],{},"Ready"," or ",[156,195,196],{},"Not ready","), IP address, operating system, k3s version, and CPU and memory use. The page refreshes every 5 seconds. Admins also see a card per server on the ",[156,199,200],{},"Overview"," page.",[148,203,205],{"id":204},"add-a-server","Add a server",[207,208,210,215,218,236,239,243,253,302,305,309],"steps",{"level":209},"3",[211,212,214],"h3",{"id":213},"prepare-the-server","Prepare the server",[136,216,217],{},"Set up a fresh server with Ubuntu 24.04 or 26.04, like the first one. It must be able to:",[161,219,220,223],{},[164,221,222],{},"reach Harblet's address, to download the join script,",[164,224,225,226,229,230,229,233,146],{},"reach the other servers directly on ",[156,227,228],{},"TCP 6443"," and ",[156,231,232],{},"10250",[156,234,235],{},"UDP 51820",[136,237,238],{},"Servers in one private network, or servers with public IP addresses, work. Servers behind NAT at different providers don't, yet.",[211,240,242],{"id":241},"get-the-join-command","Get the join command",[136,244,245,246,248,249,252],{},"On ",[156,247,101],{},", click ",[156,250,251],{},"Add server",". Harblet shows a command:",[254,255,260],"pre",{"className":256,"code":257,"language":258,"meta":259,"style":259},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -fsSL https:\u002F\u002Fharblet.example.com\u002Fapi\u002Fjoin-scripts\u002F\u003Ctoken> | sudo sh\n","bash","",[261,262,263],"code",{"__ignoreMap":259},[264,265,268,272,276,279,283,286,290,293,296,299],"span",{"class":266,"line":267},"line",1,[264,269,271],{"class":270},"sBMFI","curl",[264,273,275],{"class":274},"sfazB"," -fsSL",[264,277,278],{"class":274}," https:\u002F\u002Fharblet.example.com\u002Fapi\u002Fjoin-scripts\u002F",[264,280,282],{"class":281},"sMK4o","\u003C",[264,284,285],{"class":274},"toke",[264,287,289],{"class":288},"sTEyZ","n",[264,291,292],{"class":281},">",[264,294,295],{"class":281}," |",[264,297,298],{"class":270}," sudo",[264,300,301],{"class":274}," sh\n",[136,303,304],{},"The command works for 24 hours. Every click creates a new one.",[211,306,308],{"id":307},"run-it-on-the-new-server","Run it on the new server",[136,310,311],{},"Run the command on the new server as root. It installs the k3s agent at the same version as the first server. The server shows up on the page within seconds, and Harblet starts placing services on it.",[313,314,315],"tip",{},"If Harblet has its own domain, the new server downloads the join script over HTTPS, so it has to trust the domain's certificate. Certificates from public CAs work. For certificates from your own CA, add the CA to the new server first.",[148,317,319],{"id":318},"when-a-server-fails","When a server fails",[161,321,322,331,336],{},[164,323,324,327,328,330],{},[156,325,326],{},"Services without data"," start on another server. In tests, a failed server was marked ",[156,329,196],{}," after about 50 seconds, and its services ran on another server about 30 seconds later.",[164,332,333,335],{},[156,334,46],{}," stay on the server that holds their data. They wait for it to come back.",[164,337,338,341],{},[156,339,340],{},"When the server comes back,"," it rejoins by itself.",[136,343,344],{},"Services keep running when Harblet itself is down. Only deploys, logs and backups need Harblet.",[148,346,348],{"id":347},"remove-a-server","Remove a server",[207,350,351,355,358,362,367,371,374,387],{"level":209},[211,352,354],{"id":353},"delete-its-databases","Delete its databases",[136,356,357],{},"Harblet refuses to remove a server that stores the data of a database. The message names them. Harblet can't move a database to another server, so download a backup first if you need the data, then delete them.",[211,359,361],{"id":360},"remove-it","Remove it",[136,363,245,364,366],{},[156,365,101],{},", click the trash button of the server and confirm. Harblet moves the server's services to the other servers and removes it. Join commands that are still valid stop working.",[211,368,370],{"id":369},"uninstall-it","Uninstall it",[136,372,373],{},"Run the command Harblet shows on the removed server:",[254,375,377],{"className":256,"code":376,"language":258,"meta":259,"style":259},"sudo \u002Fusr\u002Flocal\u002Fbin\u002Fk3s-agent-uninstall.sh\n",[261,378,379],{"__ignoreMap":259},[264,380,381,384],{"class":266,"line":267},[264,382,383],{"class":270},"sudo",[264,385,386],{"class":274}," \u002Fusr\u002Flocal\u002Fbin\u002Fk3s-agent-uninstall.sh\n",[136,388,389],{},"Until you run it, the removed server keeps trying to reconnect and its boot doesn't finish, though SSH still works.",[136,391,392],{},"Removing a server that's powered off works too. You can add the same machine again later.",[148,394,396],{"id":395},"k3s-upgrades","k3s upgrades",[136,398,399,400,403],{},"Each Harblet release comes with the k3s version it was tested with. After you ",[144,401,402],{"href":112},"update Harblet",", it upgrades k3s on every server by itself, the first server first and then one server at a time. Services keep running.",[136,405,406,407,410,411,414,415,146],{},"While a server upgrades, its k3s version shows ",[156,408,409],{},"Upgrading to"," the new version. If an upgrade gets stuck, an alert ",[156,412,413],{},"The k3s upgrade is stuck"," above the list shows Kubernetes' message. See ",[144,416,121],{"href":417},"\u002Fdocs\u002Freference\u002Ftroubleshooting#a-k3s-upgrade-is-stuck",[419,420,421],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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":423,"depth":423,"links":424},2,[425,426,427,433,434,439],{"id":150,"depth":423,"text":151},{"id":183,"depth":423,"text":184},{"id":204,"depth":423,"text":205,"children":428},[429,431,432],{"id":213,"depth":430,"text":214},3,{"id":241,"depth":430,"text":242},{"id":307,"depth":430,"text":308},{"id":318,"depth":423,"text":319},{"id":347,"depth":423,"text":348,"children":435},[436,437,438],{"id":353,"depth":430,"text":354},{"id":360,"depth":430,"text":361},{"id":369,"depth":430,"text":370},{"id":395,"depth":423,"text":396},"Add servers with one command, see their load, and remove them again.","md",null,{},{"icon":104},{"title":101,"description":440},"dNQjPSO-sQWfI85yjK-AOLoaCgA4s0X4N9kn_hNnZBY",[448,450],{"title":96,"path":97,"stem":98,"description":449,"icon":99,"children":-1},"Reach Harblet at your own domain over HTTPS instead of the server's IP address.",{"title":106,"path":107,"stem":108,"description":451,"icon":109,"children":-1},"Invite colleagues as admins or members, manage their roles, and change your own name and password.",1794744116397]