[{"data":1,"prerenderedAt":400},["ShallowReactive",2],{"navigation":3,"page-\u002Fdomains\u002Fcustom-domains":105,"surround-\u002Fdomains\u002Fcustom-domains":395},[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":82,"badge":107,"body":108,"category":107,"description":389,"draft":73,"extension":390,"links":107,"meta":391,"navigation":11,"path":83,"seo":392,"sitemap":393,"stem":84,"__hash__":394},"docs\u002F7.domains\u002F2.custom-domains.md",null,{"type":109,"value":110,"toc":377},"minimark",[111,124,129,151,156,163,167,211,218,225,229,322,331,335,341,344,348],[112,113,114,115,119,120,123],"p",{},"A custom domain is your own hostname, ",[116,117,118],"code",{},"app.example.com"," or ",[116,121,122],{},"example.com",", routed to one web service with a certificate Kuppit issues and renews. It takes two DNS records: one to prove you own the name, one to send traffic to Kuppit.",[125,126,128],"h2",{"id":127},"adding-a-domain","Adding a domain",[112,130,131,132,135,136,138,139,142,143,146,147,150],{},"On the service's ",[133,134,75],"strong",{}," tab, under ",[133,137,82],{},", enter the hostname and choose ",[133,140,141],{},"Add domain",". Kuppit checks that it is a real, registrable name: no wildcards, no IP addresses, nothing under ",[116,144,145],{},"kuppit.app",". The domain appears immediately as ",[133,148,149],{},"Needs ownership",", with the records to create.",[152,153,155],"h3",{"id":154},"_1-prove-ownership","1. Prove ownership",[112,157,158,159,162],{},"Create a TXT record at ",[116,160,161],{},"_kuppit-verification.\u003Chostname>"," with the value the tab shows. This is the only proof Kuppit accepts. A CNAME already pointing at Kuppit proves nothing, on purpose: it stops a hostname a previous tenant left behind from being claimed by someone else.",[152,164,166],{"id":165},"_2-route-traffic","2. Route traffic",[168,169,170,183],"table",{},[171,172,173],"thead",{},[174,175,176,180],"tr",{},[177,178,179],"th",{},"Hostname",[177,181,182],{},"Record",[184,185,186,201],"tbody",{},[174,187,188,194],{},[189,190,191,192],"td",{},"A subdomain, ",[116,193,118],{},[189,195,196,197,200],{},"A CNAME to ",[116,198,199],{},"domains.kuppit.app",".",[174,202,203,208],{},[189,204,205,206],{},"A root domain, ",[116,207,122],{},[189,209,210],{},"The same target, through your DNS provider's CNAME flattening, ALIAS or ANAME feature.",[112,212,213,214,217],{},"Some DNS providers do not support aliasing at the root domain. If yours does not, use a subdomain such as ",[116,215,216],{},"www.example.com",". Kuppit has no fixed IP address to point an A record at.",[112,219,220,221,224],{},"The tab shows the exact records with copy buttons, and rechecks on its own while anything is pending. ",[133,222,223],{},"Check DNS"," asks for a check right now, if you would rather not wait.",[125,226,228],{"id":227},"statuses","Statuses",[168,230,231,241],{},[171,232,233],{},[174,234,235,238],{},[177,236,237],{},"Status",[177,239,240],{},"Meaning",[184,242,243,252,262,272,282,292,302,312],{},[174,244,245,249],{},[189,246,247],{},[133,248,149],{},[189,250,251],{},"Add the ownership TXT record.",[174,253,254,259],{},[189,255,256],{},[133,257,258],{},"Verifying",[189,260,261],{},"Confirming domain ownership.",[174,263,264,269],{},[189,265,266],{},[133,267,268],{},"Needs routing",[189,270,271],{},"Point the hostname to Kuppit using the displayed DNS target.",[174,273,274,279],{},[189,275,276],{},[133,277,278],{},"Securing",[189,280,281],{},"Issuing and deploying the TLS certificate.",[174,283,284,289],{},[189,285,286],{},[133,287,288],{},"Active",[189,290,291],{},"Serving traffic securely through Kuppit.",[174,293,294,299],{},[189,295,296],{},[133,297,298],{},"DNS issue",[189,300,301],{},"The domain DNS no longer points to Kuppit.",[174,303,304,309],{},[189,305,306],{},[133,307,308],{},"Failed",[189,310,311],{},"Certificate issuance failed. Kuppit keeps retrying.",[174,313,314,319],{},[189,315,316],{},[133,317,318],{},"Removing",[189,320,321],{},"Stopping traffic and removing the certificate.",[112,323,324,325,327,328,330],{},"Ownership is checked first, routing second, and the certificate is issued once both hold; the record you create for the second step can be there from the start. Once a domain is ",[133,326,288],{},", Kuppit rechecks it periodically, and a domain whose DNS changes underneath it becomes ",[133,329,298],{}," rather than silently going dark.",[125,332,334],{"id":333},"removing-a-domain","Removing a domain",[112,336,337,340],{},[133,338,339],{},"Remove domain"," stops the hostname routing to the service. Visitors get an error until you point it somewhere else, and DNS caches may hold the old answer for a while. Kuppit withdraws routing first, waits for the withdrawal to propagate, then removes the certificate.",[112,342,343],{},"For 24 hours after removal, the hostname cannot be attached to any service, including by you. A hostname whose DNS still points at Kuppit would otherwise be claimable by whoever asked first.",[125,345,347],{"id":346},"limits-and-rules","Limits and rules",[349,350,351,355,361,364],"ul",{},[352,353,354],"li",{},"A hostname is attached to one service, and cannot be attached to another anywhere on Kuppit while it is.",[352,356,357,358,360],{},"Each plan allows a number of custom domains per service. The ",[133,359,75],{}," tab shows the count in use against the allowance.",[352,362,363],{},"A preview environment's custom domains are removed when the pull request closes, and do not come back if it reopens. The generated hostname does.",[352,365,366,367,370,371,373,374,376],{},"There are no wildcard domains, no redirect rules, no automatic ",[116,368,369],{},"www"," redirect, and no path-based routing: one hostname, one service, whole. For ",[116,372,122],{}," and ",[116,375,216],{},", attach both.",{"title":378,"searchDepth":379,"depth":379,"links":380},"",3,[381,386,387,388],{"id":127,"depth":382,"text":128,"children":383},2,[384,385],{"id":154,"depth":379,"text":155},{"id":165,"depth":379,"text":166},{"id":227,"depth":382,"text":228},{"id":333,"depth":382,"text":334},{"id":346,"depth":382,"text":347},"Point your own domain at a web service, the two DNS records it takes, and what each status on the way to Active means.","md",{},{"title":82,"description":389},{"loc":83},"u-oon8jxktbg12v5Z0r9fX8-0ZcLq-KZkT0DRKENlRo",[396,398],{"title":80,"path":76,"stem":77,"description":397,"children":-1},"The kuppit.app hostname every web service gets, how it is formed, and what happens to a request on its way to your service.",{"title":87,"path":88,"stem":89,"description":399,"children":-1},"Production, preview and named environments, what each one contains, and how they stay isolated from each other.",1788534985201]