[{"data":1,"prerenderedAt":526},["ShallowReactive",2],{"navigation_docs":3,"-docs-deploy-projects-and-services":130,"-docs-deploy-projects-and-services-surround":521},[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":31,"body":132,"description":514,"extension":515,"links":516,"meta":517,"navigation":518,"path":32,"seo":519,"stem":33,"__hash__":520},"docs\u002Fdocs\u002F2.deploy\u002F1.projects-and-services.md",{"type":133,"value":134,"toc":501},"minimark",[135,148,153,184,195,199,203,210,230,237,241,256,266,273,297,331,335,339,342,440,446,458,462,472,480,484,488,497],[136,137,138,139,143,144,147],"p",{},"A ",[140,141,142],"strong",{},"project"," groups the services of one app, such as its web server, its workers and its database. A ",[140,145,146],{},"service"," is one thing that runs in it.",[149,150,152],"h2",{"id":151},"create-a-project","Create a project",[154,155,157,162,173,177],"steps",{"level":156},"3",[158,159,161],"h3",{"id":160},"open-projects","Open Projects",[136,163,164,165,168,169,172],{},"Click ",[140,166,167],{},"Projects"," in the sidebar, then ",[140,170,171],{},"New project",".",[158,174,176],{"id":175},"name-it","Name it",[136,178,179,180,183],{},"Enter a name of up to 64 characters and click ",[140,181,182],{},"Create project",". Project names are unique within your Harblet.",[136,185,186,187,190,191,194],{},"Harblet opens the new project. Its ",[140,188,189],{},"Services"," tab lists the services in it, and the ",[140,192,193],{},"Settings"," tab lets you delete it.",[196,197,198],"note",{},"Projects can't be renamed at the moment.",[149,200,202],{"id":201},"add-a-service","Add a service",[136,204,205,206,209],{},"On the project's page, click ",[140,207,208],{},"New service"," and choose what to deploy:",[211,212,213,218,226],"card-group",{},[214,215,217],"card",{"icon":44,"title":216,"to":42},"Git repository","Harblet builds the repository with its Dockerfile, or with Railpack if it has none.",[214,219,221,222,172],{"icon":39,"title":220,"to":37},"Docker image","Harblet runs a public image, such as ",[223,224,225],"code",{},"nginx:latest",[214,227,229],{"icon":49,"title":228,"to":47},"Database","PostgreSQL or MySQL in one click.",[136,231,232,233,172],{},"Every new service deploys right away. Its card on the project page shows the status of its latest ",[234,235,236],"a",{"href":57},"deployment",[149,238,240],{"id":239},"connect-services-to-each-other","Connect services to each other",[136,242,243,244,247,248,251,252,255],{},"Services in the same project reach each other over a private network. Each service with a port has an ",[140,245,246],{},"internal address",", shown on its ",[140,249,250],{},"Overview"," tab under ",[140,253,254],{},"Connection",":",[257,258,264],"pre",{"className":259,"code":261,"language":262,"meta":263},[260],"language-text","web-k3x9:3000\n","text","",[223,265,261],{"__ignoreMap":263},[136,267,268,269,272],{},"The first part is the service's internal hostname. Harblet makes it from the service's name when you create the service, plus four random characters. The second part is the service's port. Use the address in the other services' ",[234,270,271],{"href":52},"environment variables",", for example:",[257,274,278],{"className":275,"code":276,"language":277,"meta":263,"style":263},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","API_URL=http:\u002F\u002Fapi-m2p7:8080\n","bash",[223,279,280],{"__ignoreMap":263},[281,282,285,289,293],"span",{"class":283,"line":284},"line",1,[281,286,288],{"class":287},"sTEyZ","API_URL",[281,290,292],{"class":291},"sMK4o","=",[281,294,296],{"class":295},"sfazB","http:\u002F\u002Fapi-m2p7:8080\n",[298,299,300,307,316,322],"ul",{},[301,302,303,306],"li",{},[140,304,305],{},"Other projects can't reach the address."," Each project is isolated from the others.",[301,308,309,312,313,172],{},[140,310,311],{},"The internet can't reach it either."," Visitors only reach a service through its ",[234,314,315],{"href":67},"domains",[301,317,318,321],{},[140,319,320],{},"The hostname never changes."," Renaming the service later keeps its internal address.",[301,323,324,327,328,330],{},[140,325,326],{},"A service without a port has no address."," Set one under ",[140,329,193],{}," if other services need to connect to it.",[332,333,334],"tip",{},"Services that only do background work, such as a queue worker, don't need a port.",[149,336,338],{"id":337},"the-service-page","The service page",[136,340,341],{},"Open a service from its project to see its tabs:",[343,344,345,358],"table",{},[346,347,348],"thead",{},[349,350,351,355],"tr",{},[352,353,354],"th",{},"Tab",[352,356,357],{},"What it's for",[359,360,361,371,383,393,405,416,427],"tbody",{},[349,362,363,368],{},[364,365,366],"td",{},[140,367,250],{},[364,369,370],{},"The internal address, or a database's connection details",[349,372,373,378],{},[364,374,375],{},[140,376,377],{},"Deployments",[364,379,380,381,172],{},"Every deployment with its build output and events. See ",[234,382,56],{"href":57},[349,384,385,390],{},[364,386,387],{},[140,388,389],{},"Logs",[364,391,392],{},"The live output of the running service",[349,394,395,399],{},[364,396,397],{},[140,398,51],{},[364,400,401,402,404],{},"See ",[234,403,51],{"href":52},". Not for databases.",[349,406,407,412],{},[364,408,409],{},[140,410,411],{},"Domains",[364,413,401,414,404],{},[234,415,66],{"href":67},[349,417,418,422],{},[364,419,420],{},[140,421,71],{},[364,423,401,424,426],{},[234,425,81],{"href":82},". Databases only.",[349,428,429,433],{},[364,430,431],{},[140,432,193],{},[364,434,435,436,439],{},"Name, source, port, health check, ",[234,437,438],{"href":62},"deploy hook",", and deleting the service",[136,441,442,443,445],{},"The ",[140,444,26],{}," button at the top right of every tab starts a new deployment.",[196,447,448,449,451,452,454,455,457],{},"Changes under ",[140,450,193],{}," and ",[140,453,51],{}," apply on the next deployment. Saving them doesn't deploy, so click ",[140,456,26],{}," afterwards. Domains apply right away.",[149,459,461],{"id":460},"delete-a-service","Delete a service",[136,463,464,465,467,468,471],{},"Open the service's ",[140,466,193],{}," tab and click ",[140,469,470],{},"Delete service",". Harblet deletes the service, its domains, environment variables and deployments.",[136,473,474,475,479],{},"You can't delete a service while one of its deployments is building or deploying. Wait for it to finish, or ",[234,476,478],{"href":477},"\u002Fdocs\u002Fdeploy\u002Fdeployments#cancel-a-deployment","cancel"," the build.",[481,482,483],"caution",{},"Deleting a database deletes all its data. Its backups stay at their destination, but Harblet no longer lists them.",[149,485,487],{"id":486},"delete-a-project","Delete a project",[136,489,490,491,467,493,496],{},"Open the project's ",[140,492,193],{},[140,494,495],{},"Delete project",". Harblet deletes the project and all of its services, including their data. This can't be undone.",[498,499,500],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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":263,"searchDepth":502,"depth":502,"links":503},2,[504,509,510,511,512,513],{"id":151,"depth":502,"text":152,"children":505},[506,508],{"id":160,"depth":507,"text":161},3,{"id":175,"depth":507,"text":176},{"id":201,"depth":502,"text":202},{"id":239,"depth":502,"text":240},{"id":337,"depth":502,"text":338},{"id":460,"depth":502,"text":461},{"id":486,"depth":502,"text":487},"Group the services of one app in a project, and connect them over the project's private network.","md",null,{},{"icon":34},{"title":31,"description":514},"Bu7wBAa8qNcNVm62L5NKMHFfNDArZEKAA7Y2VmX61As",[522,524],{"title":21,"path":22,"stem":23,"description":523,"icon":24,"children":-1},"From a fresh install to a service with a database on your own domain.",{"title":36,"path":37,"stem":38,"description":525,"icon":39,"children":-1},"Run a public Docker image as a service.",1794744117952]