[{"data":1,"prerenderedAt":536},["ShallowReactive",2],{"navigation_docs":3,"landing":130},[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":132,"body":133,"description":132,"extension":527,"meta":528,"navigation":529,"path":530,"seo":531,"stem":534,"__hash__":535},"landing\u002Findex.md","",{"type":134,"value":135,"toc":525},"minimark",[136,219,244,330,399,462,513,521],[137,138,140,151,160,163,176],"u-page-hero",{"orientation":139},"vertical",[141,142,143],"template",{"v-slot:headline":132},[144,145,150],"u-button",{"size":146,"to":12,"color":147,"trailing-icon":148,"variant":149},"sm","neutral","i-lucide-arrow-right","subtle","Self-hosted · Source available",[141,152,153,154],{"v-slot:title":132},"The deploy platform on ",[155,156,159],"span",{"className":157},[158],"text-primary","your own servers",[141,161,162],{"v-slot:description":132},"Harblet is an alternative to Vercel, Render and Heroku that you host yourself. One command installs it on a fresh Ubuntu server. From then on you deploy Docker images, Git repositories and databases from the browser.",[141,164,165,169],{"v-slot:links":132},[144,166,168],{"size":167,"to":17,"trailing-icon":148},"xl","Install Harblet",[144,170,175],{"size":167,"to":171,"color":147,"variant":172,"icon":173,"target":174},"https:\u002F\u002Fgithub.com\u002Fharblet\u002Fharblet","outline","i-simple-icons-github","_blank","View on GitHub",[177,178,184],"div",{"className":179},[180,181,182,183],"max-w-3xl","mx-auto","w-full","text-left",[185,186,191],"pre",{"className":187,"code":188,"filename":189,"language":190,"meta":132,"style":132},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fharblet\u002Fharblet\u002Fmain\u002Finstall.sh | sudo sh\n","Run on a fresh Ubuntu server","bash",[192,193,194],"code",{"__ignoreMap":132},[155,195,198,202,206,209,213,216],{"class":196,"line":197},"line",1,[155,199,201],{"class":200},"sBMFI","curl",[155,203,205],{"class":204},"sfazB"," -fsSL",[155,207,208],{"class":204}," https:\u002F\u002Fraw.githubusercontent.com\u002Fharblet\u002Fharblet\u002Fmain\u002Finstall.sh",[155,210,212],{"class":211},"sMK4o"," |",[155,214,215],{"class":200}," sudo",[155,217,218],{"class":204}," sh\n",[220,221,222,225,228],"u-page-section",{},[141,223,224],{"v-slot:title":132},"From a fresh server to production in three steps",[141,226,227],{"v-slot:description":132},"No Kubernetes to learn and no YAML to write. Everything after the install happens in the browser.",[229,230,231,236,240],"u-page-grid",{},[232,233],"u-page-card",{"description":234,"icon":19,"title":235,"to":17},"Run one command on a fresh Ubuntu server. It sets up k3s and Harblet and prints the address to open. There you create the first account.","1. Install",[232,237],{"description":238,"icon":24,"title":239,"to":22},"Create a project and add services from a Docker image, a Git repository or a one-click database. Add your domain and its certificate.","2. Deploy",[232,241],{"description":242,"icon":104,"title":243,"to":102},"Run one command on a new server and it joins. Harblet places services on all servers and moves them when a server fails.","3. Grow",[220,245,246,249,252],{},[141,247,248],{"v-slot:title":132},"Everything a deploy needs",[141,250,251],{"v-slot:description":132},"Harblet covers the path from code to a running service with a domain, plus the backups and updates that keep it running.",[141,253,254,263,271,279,287,295,303,314,322],{"v-slot:features":132},[255,256,257,260],"u-page-feature",{"icon":39,"to":42},[141,258,259],{"v-slot:title":132},"Docker images and Git repositories",[141,261,262],{"v-slot:description":132},"A repository builds from its Dockerfile, or without one through Railpack. Private GitHub repositories connect through a GitHub App that Harblet sets up for you, and private GitLab repositories through an access token, on GitLab.com or your own GitLab.",[255,264,265,268],{"icon":49,"to":47},[141,266,267],{"v-slot:title":132},"One-click databases",[141,269,270],{"v-slot:description":132},"PostgreSQL 18 and MySQL 8.4 or 9.7. Only services in the same project can reach them.",[255,272,273,276],{"icon":84,"to":82},[141,274,275],{"v-slot:title":132},"Backups to S3",[141,277,278],{"v-slot:description":132},"Database dumps go to S3-compatible storage every 15 minutes, every hour or every day. Download or restore any of them. Harblet backs up its own database the same way.",[255,280,281,284],{"icon":69,"to":67},[141,282,283],{"v-slot:title":132},"Domains with HTTPS",[141,285,286],{"v-slot:description":132},"Add your domains to a service and upload their certificates. Wildcard certificates work.",[255,288,289,292],{"icon":59,"to":57},[141,290,291],{"v-slot:title":132},"Deployments you can follow",[141,293,294],{"v-slot:description":132},"Build logs, live logs and health checks. If a deployment fails, the version before it keeps running.",[255,296,297,300],{"icon":54,"to":52},[141,298,299],{"v-slot:title":132},"Encrypted variables",[141,301,302],{"v-slot:description":132},"Environment variables are stored encrypted in Harblet's database and reach your builds too.",[255,304,305,307],{"icon":64,"to":62},[141,306,61],{"v-slot:title":132},[141,308,309,310,313],{"v-slot:description":132},"Every image and Git service has a secret URL. A ",[192,311,312],{},"POST"," from your CI pipeline deploys it.",[255,315,316,319],{"icon":109,"to":107},[141,317,318],{"v-slot:title":132},"Your team",[141,320,321],{"v-slot:description":132},"Invite colleagues with a link, as admins or members.",[255,323,324,327],{"icon":114,"to":112},[141,325,326],{"v-slot:title":132},"Updates from the browser",[141,328,329],{"v-slot:description":132},"One click updates Harblet, and Harblet keeps k3s on your servers up to date.",[220,331,333,336,339,362],{"orientation":332},"horizontal",[141,334,335],{"v-slot:title":132},"Add a server with one command",[141,337,338],{"v-slot:description":132},"Harblet runs on k3s, the lightweight Kubernetes from the CNCF. It installs it, configures it and upgrades it for you. You never touch Kubernetes.",[141,340,341,351,356],{"v-slot:features":132},[255,342,344],{"icon":343},"i-lucide-plus",[141,345,346,350],{"v-slot:description":132},[347,348,349],"strong",{},"Servers → Add server"," shows a command with a token that expires after 24 hours. Harblet keeps no SSH keys.",[255,352,353],{"icon":89},[141,354,355],{"v-slot:description":132},"Traffic between servers goes through WireGuard, and each project's services are isolated from other projects.",[255,357,359],{"icon":358},"i-lucide-heart-pulse",[141,360,361],{"v-slot:description":132},"When a server fails, its image and Git services start on another one. Services keep running even while Harblet itself is down.",[177,363,365],{"className":364},[182],[185,366,369],{"className":187,"code":367,"filename":368,"language":190,"meta":132,"style":132},"curl -fsSL https:\u002F\u002Fharblet.example.com\u002Fapi\u002Fjoin-scripts\u002F\u003Ctoken> | sudo sh\n","Run on the new server",[192,370,371],{"__ignoreMap":132},[155,372,373,375,377,380,383,386,390,393,395,397],{"class":196,"line":197},[155,374,201],{"class":200},[155,376,205],{"class":204},[155,378,379],{"class":204}," https:\u002F\u002Fharblet.example.com\u002Fapi\u002Fjoin-scripts\u002F",[155,381,382],{"class":211},"\u003C",[155,384,385],{"class":204},"toke",[155,387,389],{"class":388},"sTEyZ","n",[155,391,392],{"class":211},">",[155,394,212],{"class":211},[155,396,215],{"class":200},[155,398,218],{"class":204},[220,400,402,405,408,425],{"orientation":332,":reverse":401},"true",[141,403,404],{"v-slot:title":132},"Deploy from your pipeline",[141,406,407],{"v-slot:description":132},"Every image and Git service has a secret deploy URL. Call it at the end of your CI pipeline, after tests and linting pass.",[141,409,410,415],{"v-slot:features":132},[255,411,412],{"icon":44},[141,413,414],{"v-slot:description":132},"A Git service builds the newest commit of its branch. An image service pulls the tag again.",[255,416,418],{"icon":417},"i-lucide-circle-x",[141,419,420,421,424],{"v-slot:description":132},"If the deployment can't start, the hook answers with an error, so ",[192,422,423],{},"curl --fail"," fails the pipeline.",[177,426,428],{"className":427},[182],[185,429,434],{"className":430,"code":431,"filename":432,"language":433,"meta":132,"style":132},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- name: Deploy\n  run: curl --fail -X POST ${{ secrets.HARBLET_DEPLOY_HOOK }}\n",".github\u002Fworkflows\u002Fdeploy.yml","yaml",[192,435,436,451],{"__ignoreMap":132},[155,437,438,441,445,448],{"class":196,"line":197},[155,439,440],{"class":211},"-",[155,442,444],{"class":443},"swJcz"," name",[155,446,447],{"class":211},":",[155,449,450],{"class":204}," Deploy\n",[155,452,454,457,459],{"class":196,"line":453},2,[155,455,456],{"class":443},"  run",[155,458,447],{"class":211},[155,460,461],{"class":204}," curl --fail -X POST ${{ secrets.HARBLET_DEPLOY_HOOK }}\n",[220,463,464,467],{},[141,465,466],{"v-slot:title":132},"Questions",[468,469,470,485,491,495,503],"accordion",{},[471,472,475,476,481,482,484],"accordion-item",{"icon":473,"label":474},"i-lucide-circle-help","Is Harblet free?","Harblet is source-available under the Business Source License 1.1. Production use is free while all your installs together manage one server and you don't offer Harblet to others as a hosted or managed service. For more servers, write to ",[477,478,480],"a",{"href":479},"mailto:mail@harblet.com","mail@harblet.com"," about a commercial license. Each version becomes available under the Apache License 2.0 four years after its release. See ",[477,483,126],{"href":127},".",[471,486,488,489,484],{"icon":473,"label":487},"What do I need to run it?","A fresh server with Ubuntu 24.04 or 26.04, root access, at least 2 CPUs and 4 GB of memory, and internet access. Ports 80 and 443 must be open for your services, and port 3000 for Harblet until it has its own domain. See ",[477,490,16],{"href":17},[471,492,494],{"icon":473,"label":493},"Do I need to know Kubernetes?","No. The install script sets up k3s, and Harblet manages it from then on, upgrades included. You work in Harblet's browser interface.",[471,496,498,499,502],{"icon":473,"label":497},"How does HTTPS work?","You upload a certificate for your domains under ",[347,500,501],{},"SSL Certificates",", and Harblet serves it for every domain it covers. Wildcard certificates work. Harblet doesn't request certificates from Let's Encrypt for you at the moment.",[471,504,506,507,510,511,484],{"icon":473,"label":505},"What happens when a server fails?","Its services start on another server, in tests about 80 seconds after the failure. Databases stay with the server that holds their data and come back when it does. The first server runs Harblet and receives all traffic, so keep a ",[477,508,509],{"href":87},"backup of Harblet"," to restore it onto a new server if it fails. See ",[477,512,101],{"href":102},[220,514,515],{},[516,517],"u-page-c-t-a",{":links":518,"description":519,"title":520,"variant":149},"[{\"label\":\"Install Harblet\",\"to\":\"\u002Fdocs\u002Fgetting-started\u002Finstallation\",\"trailingIcon\":\"i-lucide-arrow-right\"},{\"label\":\"Read the docs\",\"to\":\"\u002Fdocs\u002Fgetting-started\u002Fintroduction\",\"color\":\"neutral\",\"variant\":\"outline\"}]","One command on a fresh Ubuntu server, then open the address it prints and create the first account.","Deploy on your own servers today",[522,523,524],"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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":132,"searchDepth":453,"depth":453,"links":526},[],"md",{},true,"\u002F",{"title":532,"description":533},"Harblet, the deploy platform on your own servers","Harblet is a self-hosted alternative to Vercel, Render and Heroku. One command installs it on a fresh Ubuntu server. Then you deploy Docker images, Git repositories and databases from the browser.","index","_65qLJGiXVqPnzn9a2BosgSr7DQh_AVtEseKquxGWc4",1794744115911]