[{"data":1,"prerenderedAt":323},["ShallowReactive",2],{"navigation":3,"page-\u002Fdomains":105,"surround-\u002Fdomains":318},[4,17,25,48,63,74,86],{"title":5,"path":6,"stem":7,"children":8,"icon":16,"exact":11},"Getting started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"exact":11,"children":-1},"Introduction",true,{"title":13,"path":14,"stem":15,"exact":11,"children":-1},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-lucide-rocket",{"title":18,"path":19,"stem":20,"children":21,"icon":24,"exact":11},"Concepts","\u002Fconcepts","2.concepts\u002F1.index",[22],{"title":23,"path":19,"stem":20,"exact":11,"children":-1},"The Kuppit model","i-lucide-shapes",{"title":26,"path":27,"stem":28,"children":29,"icon":47,"exact":11},"Deployments","\u002Fdeployments","3.deployments\u002F1.index",[30,31,35,39,43],{"title":26,"path":27,"stem":28,"exact":11,"children":-1},{"title":32,"path":33,"stem":34,"exact":11,"children":-1},"Builds","\u002Fdeployments\u002Fbuilds","3.deployments\u002F2.builds",{"title":36,"path":37,"stem":38,"exact":11,"children":-1},"Redeploy and roll back","\u002Fdeployments\u002Fredeploy-and-rollback","3.deployments\u002F3.redeploy-and-rollback",{"title":40,"path":41,"stem":42,"exact":11,"children":-1},"Logs","\u002Fdeployments\u002Flogs","3.deployments\u002F4.logs",{"title":44,"path":45,"stem":46,"exact":11,"children":-1},"When a deployment fails","\u002Fdeployments\u002Fwhen-a-deployment-fails","3.deployments\u002F5.when-a-deployment-fails","i-lucide-cloud-upload",{"title":49,"path":50,"stem":51,"children":52,"icon":62,"exact":11},"Resources","\u002Fresources","4.resources\u002F1.index",[53,54,58],{"title":49,"path":50,"stem":51,"exact":11,"children":-1},{"title":55,"path":56,"stem":57,"exact":11,"children":-1},"Web services","\u002Fresources\u002Fweb-services","4.resources\u002F2.web-services",{"title":59,"path":60,"stem":61,"exact":11,"children":-1},"PostgreSQL","\u002Fresources\u002Fpostgresql","4.resources\u002F3.postgresql","i-lucide-boxes",{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":73,"exact":11},"Configuration","i-lucide-sliders-horizontal","\u002Fconfiguration","5.configuration",[69],{"title":70,"path":71,"stem":72,"exact":11,"children":-1},"Environment variables","\u002Fconfiguration\u002Fvariables","5.configuration\u002F1.variables",false,{"title":75,"path":76,"stem":77,"children":78,"icon":85,"exact":11},"Domains","\u002Fdomains","7.domains\u002F1.index",[79,81],{"title":80,"path":76,"stem":77,"exact":11,"children":-1},"Hostnames",{"title":82,"path":83,"stem":84,"exact":11,"children":-1},"Custom domains","\u002Fdomains\u002Fcustom-domains","7.domains\u002F2.custom-domains","i-lucide-globe",{"title":87,"path":88,"stem":89,"children":90,"icon":104,"exact":11},"Environments","\u002Fenvironments","8.environments\u002F1.index",[91,92,96,100],{"title":87,"path":88,"stem":89,"exact":11,"children":-1},{"title":93,"path":94,"stem":95,"exact":11,"children":-1},"Preview environments","\u002Fenvironments\u002Fpreview-environments","8.environments\u002F2.preview-environments",{"title":97,"path":98,"stem":99,"exact":11,"children":-1},"Named environments","\u002Fenvironments\u002Fnamed-environments","8.environments\u002F3.named-environments",{"title":101,"path":102,"stem":103,"exact":11,"children":-1},"Deleting an environment","\u002Fenvironments\u002Fdeleting-an-environment","8.environments\u002F4.deleting-an-environment","i-lucide-git-branch",{"id":106,"title":80,"badge":107,"body":108,"category":107,"description":312,"draft":73,"extension":313,"links":107,"meta":314,"navigation":11,"path":76,"seo":315,"sitemap":316,"stem":77,"__hash__":317},"docs\u002F7.domains\u002F1.index.md",null,{"type":109,"value":110,"toc":304},"minimark",[111,133,138,148,183,190,196,219,223,226,230,248,252,255,301],[112,113,114,115,119,120,124,125,127,128,132],"p",{},"Every web service has a stable hostname on ",[116,117,118],"code",{},"kuppit.app"," from the moment it is created, with HTTPS. It is the address of the service in every environment, and the one the dashboard shows under ",[121,122,123],"strong",{},"Kuppit domain"," on the service's ",[121,126,75],{}," tab. Custom domains are attached beside it; see ",[129,130,131],"a",{"href":83},"custom domains",".",[134,135,137],"h2",{"id":136},"how-a-hostname-is-formed","How a hostname is formed",[139,140,146],"pre",{"className":141,"code":143,"language":144,"meta":145},[142],"language-text","[\u003Cenvironment>-]\u003Cproject>[-\u003Cservice>]-\u003Cid>.kuppit.app\n","text","",[116,147,143],{"__ignoreMap":145},[149,150,151,158,167,173],"ul",{},[152,153,154,157],"li",{},[121,155,156],{},"Project"," is the project's name, lowercased, with anything that is not a letter or digit turned into a hyphen.",[152,159,160,163,164,132],{},[121,161,162],{},"Service"," is the service's name, omitted when the service is named ",[116,165,166],{},"web",[152,168,169,172],{},[121,170,171],{},"Id"," is six characters derived from the service, so no two services share a hostname and a new service never takes over an old one's.",[152,174,175,178,179,182],{},[121,176,177],{},"Environment"," leads the hostname everywhere but Production: a preview's ",[116,180,181],{},"pr-42",", a named environment's slug.",[112,184,185,186,189],{},"For a project named ",[116,187,188],{},"acme",":",[139,191,194],{"className":192,"code":193,"language":144,"meta":145},[142],"acme-a1b2c3.kuppit.app             web, in Production\nacme-api-d4e5f6.kuppit.app         api, in Production\npr-42-acme-a1b2c3.kuppit.app       web, in the preview for pull request 42\nstaging-acme-a1b2c3.kuppit.app     web, in staging\n",[116,195,193],{"__ignoreMap":145},[112,197,198,199,202,203,206,207,210,211,214,215,218],{},"A few labels are reserved for Kuppit's own use, such as ",[116,200,201],{},"www",", ",[116,204,205],{},"app"," and ",[116,208,209],{},"docs",", and the ",[116,212,213],{},"pr-\u003Cnumber>-"," shape is reserved for previews. A project that would collide with one gets ",[116,216,217],{},"-2"," appended instead.",[134,220,222],{"id":221},"what-does-not-change-it","What does not change it",[112,224,225],{},"The hostname is reserved once and kept. Deployments, rollbacks, renaming the project and moving infrastructure underneath all leave it alone, and a preview that closes keeps its hostname for when its pull request reopens. It cannot be edited or removed. The id is what makes it unique, not what keeps it private: a generated hostname serves whatever the service serves, to anyone who reaches it.",[134,227,229],{"id":228},"when-it-starts-answering","When it starts answering",[112,231,232,233,236,237,239,240,243,244,247],{},"The hostname exists from creation, and answers once the service's first deployment goes ",[121,234,235],{},"Live",". Until then the ",[121,238,75],{}," tab shows it as ",[121,241,242],{},"Provisioning",". When an environment is removed or a preview closes, routing is withdrawn before the service is destroyed, and a visitor gets a plain ",[121,245,246],{},"404 Domain Not Found"," from the edge rather than a half-removed service.",[134,249,251],{"id":250},"what-happens-to-a-request","What happens to a request",[112,253,254],{},"Requests to any hostname, generated or custom, pass through Kuppit's edge before reaching your service.",[149,256,257,260,266,284,291],{},[152,258,259],{},"Plain HTTP is redirected to HTTPS with a permanent redirect. Certificates are Kuppit's to manage; you never upload one.",[152,261,262,263,265],{},"The request is forwarded to the revision that is ",[121,264,235],{},", with its path and query intact. Redirects your application returns go back to the browser as they are.",[152,267,268,269,202,272,275,276,279,280,283],{},"Your service sees the original hostname in ",[116,270,271],{},"X-Forwarded-Host",[116,273,274],{},"https"," in ",[116,277,278],{},"X-Forwarded-Proto",", and the client's address in ",[116,281,282],{},"X-Forwarded-For",". Any values a client sent in those headers are replaced, so they can be trusted.",[152,285,286,287,290],{},"Every request carries an ",[116,288,289],{},"X-Kuppit-Request-ID",", and every error page from the edge prints it, so a report can be matched to a log line.",[152,292,293,294,297,298,132],{},"A request body larger than 100 MB is refused with ",[121,295,296],{},"413",". Your service has 120 seconds to start responding; after that the edge answers ",[121,299,300],{},"504",[112,302,303],{},"Services do not have a private network between them. One service reaching another does so over its public hostname, like any other client.",{"title":145,"searchDepth":305,"depth":305,"links":306},3,[307,309,310,311],{"id":136,"depth":308,"text":137},2,{"id":221,"depth":308,"text":222},{"id":228,"depth":308,"text":229},{"id":250,"depth":308,"text":251},"The kuppit.app hostname every web service gets, how it is formed, and what happens to a request on its way to your service.","md",{},{"title":80,"description":312},{"loc":76},"Bxo4vqXjVv2QGa1N-5ghdDlRgCX93gMn_t_HRy9zVrc",[319,321],{"title":70,"path":71,"stem":72,"description":320,"children":-1},"How variables are set on services and environments, how references connect resources, and how secrets are handled.",{"title":82,"path":83,"stem":84,"description":322,"children":-1},"Point your own domain at a web service, the two DNS records it takes, and what each status on the way to Active means.",1788534986349]