[{"data":1,"prerenderedAt":489},["ShallowReactive",2],{"navigation":3,"page-\u002Fnetworking":213,"surround-\u002Fnetworking":484},[4,17,48,79,95,118,133,144,155,167,186],{"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":47,"exact":11},"Reference","\u002Freference","10.reference\u002F1.index",[22,23,27,31,35,39,43],{"title":18,"path":19,"stem":20,"exact":11,"children":-1},{"title":24,"path":25,"stem":26,"exact":11,"children":-1},"Variables","\u002Freference\u002Fvariables","10.reference\u002F2.variables",{"title":28,"path":29,"stem":30,"exact":11,"children":-1},"Hostnames and DNS","\u002Freference\u002Fhostnames-and-dns","10.reference\u002F3.hostnames-and-dns",{"title":32,"path":33,"stem":34,"exact":11,"children":-1},"Statuses","\u002Freference\u002Fstatuses","10.reference\u002F4.statuses",{"title":36,"path":37,"stem":38,"exact":11,"children":-1},"Limits","\u002Freference\u002Flimits","10.reference\u002F5.limits",{"title":40,"path":41,"stem":42,"exact":11,"children":-1},"Sizes","\u002Freference\u002Fsizes","10.reference\u002F6.sizes",{"title":44,"path":45,"stem":46,"exact":11,"children":-1},"The GitHub App","\u002Freference\u002Fgithub-app","10.reference\u002F7.github-app","i-lucide-book-open",{"title":49,"path":50,"stem":51,"children":52,"icon":78,"exact":11},"Troubleshooting","\u002Ftroubleshooting","11.troubleshooting\u002F1.index",[53,54,58,62,66,70,74],{"title":49,"path":50,"stem":51,"exact":11,"children":-1},{"title":55,"path":56,"stem":57,"exact":11,"children":-1},"Build failures","\u002Ftroubleshooting\u002Fbuild-failures","11.troubleshooting\u002F2.build-failures",{"title":59,"path":60,"stem":61,"exact":11,"children":-1},"Start and health failures","\u002Ftroubleshooting\u002Fstart-and-health-failures","11.troubleshooting\u002F3.start-and-health-failures",{"title":63,"path":64,"stem":65,"exact":11,"children":-1},"Reference failures","\u002Ftroubleshooting\u002Freference-failures","11.troubleshooting\u002F4.reference-failures",{"title":67,"path":68,"stem":69,"exact":11,"children":-1},"Failures that are Kuppit's","\u002Ftroubleshooting\u002Ffailures-that-are-kuppits","11.troubleshooting\u002F5.failures-that-are-kuppits",{"title":71,"path":72,"stem":73,"exact":11,"children":-1},"Domain issues","\u002Ftroubleshooting\u002Fdomain-issues","11.troubleshooting\u002F6.domain-issues",{"title":75,"path":76,"stem":77,"exact":11,"children":-1},"No preview for a pull request","\u002Ftroubleshooting\u002Fno-preview-for-a-pull-request","11.troubleshooting\u002F7.no-preview-for-a-pull-request","i-lucide-life-buoy",{"title":80,"path":81,"stem":82,"children":83,"icon":94,"exact":11},"Concepts","\u002Fconcepts","2.concepts\u002F1.index",[84,86,90],{"title":85,"path":81,"stem":82,"exact":11,"children":-1},"The Kuppit model",{"title":87,"path":88,"stem":89,"exact":11,"children":-1},"The application graph","\u002Fconcepts\u002Fthe-application-graph","2.concepts\u002F2.the-application-graph",{"title":91,"path":92,"stem":93,"exact":11,"children":-1},"How a service runs","\u002Fconcepts\u002Fhow-a-service-runs","2.concepts\u002F3.how-a-service-runs","i-lucide-shapes",{"title":96,"path":97,"stem":98,"children":99,"icon":117,"exact":11},"Deployments","\u002Fdeployments","3.deployments\u002F1.index",[100,101,105,109,113],{"title":96,"path":97,"stem":98,"exact":11,"children":-1},{"title":102,"path":103,"stem":104,"exact":11,"children":-1},"Builds","\u002Fdeployments\u002Fbuilds","3.deployments\u002F2.builds",{"title":106,"path":107,"stem":108,"exact":11,"children":-1},"Redeploy and roll back","\u002Fdeployments\u002Fredeploy-and-rollback","3.deployments\u002F3.redeploy-and-rollback",{"title":110,"path":111,"stem":112,"exact":11,"children":-1},"Logs","\u002Fdeployments\u002Flogs","3.deployments\u002F4.logs",{"title":114,"path":115,"stem":116,"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":119,"path":120,"stem":121,"children":122,"icon":132,"exact":11},"Resources","\u002Fresources","4.resources\u002F1.index",[123,124,128],{"title":119,"path":120,"stem":121,"exact":11,"children":-1},{"title":125,"path":126,"stem":127,"exact":11,"children":-1},"Web services","\u002Fresources\u002Fweb-services","4.resources\u002F2.web-services",{"title":129,"path":130,"stem":131,"exact":11,"children":-1},"PostgreSQL","\u002Fresources\u002Fpostgresql","4.resources\u002F3.postgresql","i-lucide-boxes",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":143,"exact":11},"Configuration","i-lucide-sliders-horizontal","\u002Fconfiguration","5.configuration",[139],{"title":140,"path":141,"stem":142,"exact":11,"children":-1},"Environment variables","\u002Fconfiguration\u002Fvariables","5.configuration\u002F1.variables",false,{"title":145,"path":146,"stem":147,"children":148,"icon":154,"exact":11},"Networking","\u002Fnetworking","6.networking\u002F1.index",[149,150],{"title":145,"path":146,"stem":147,"exact":11,"children":-1},{"title":151,"path":152,"stem":153,"exact":11,"children":-1},"Reaching a database","\u002Fnetworking\u002Freaching-a-database","6.networking\u002F2.reaching-a-database","i-lucide-network",{"title":156,"path":157,"stem":158,"children":159,"icon":166,"exact":11},"Domains","\u002Fdomains","7.domains\u002F1.index",[160,162],{"title":161,"path":157,"stem":158,"exact":11,"children":-1},"Hostnames",{"title":163,"path":164,"stem":165,"exact":11,"children":-1},"Custom domains","\u002Fdomains\u002Fcustom-domains","7.domains\u002F2.custom-domains","i-lucide-globe",{"title":168,"path":169,"stem":170,"children":171,"icon":185,"exact":11},"Environments","\u002Fenvironments","8.environments\u002F1.index",[172,173,177,181],{"title":168,"path":169,"stem":170,"exact":11,"children":-1},{"title":174,"path":175,"stem":176,"exact":11,"children":-1},"Preview environments","\u002Fenvironments\u002Fpreview-environments","8.environments\u002F2.preview-environments",{"title":178,"path":179,"stem":180,"exact":11,"children":-1},"Named environments","\u002Fenvironments\u002Fnamed-environments","8.environments\u002F3.named-environments",{"title":182,"path":183,"stem":184,"exact":11,"children":-1},"Deleting an environment","\u002Fenvironments\u002Fdeleting-an-environment","8.environments\u002F4.deleting-an-environment","i-lucide-git-branch",{"title":187,"path":188,"stem":189,"children":190,"icon":212,"exact":11},"Guides","\u002Fguides","9.guides\u002F1.index",[191,192,196,200,204,208],{"title":187,"path":188,"stem":189,"exact":11,"children":-1},{"title":193,"path":194,"stem":195,"exact":11,"children":-1},"Deploy a Nuxt application","\u002Fguides\u002Fdeploy-a-nuxt-application","9.guides\u002F2.deploy-a-nuxt-application",{"title":197,"path":198,"stem":199,"exact":11,"children":-1},"Deploy a Next.js application","\u002Fguides\u002Fdeploy-a-nextjs-application","9.guides\u002F3.deploy-a-nextjs-application",{"title":201,"path":202,"stem":203,"exact":11,"children":-1},"Deploy an Express application","\u002Fguides\u002Fdeploy-an-express-application","9.guides\u002F4.deploy-an-express-application",{"title":205,"path":206,"stem":207,"exact":11,"children":-1},"Deploy with a Dockerfile","\u002Fguides\u002Fdeploy-with-a-dockerfile","9.guides\u002F5.deploy-with-a-dockerfile",{"title":209,"path":210,"stem":211,"exact":11,"children":-1},"Create a staging environment","\u002Fguides\u002Fcreate-a-staging-environment","9.guides\u002F6.create-a-staging-environment","i-lucide-map",{"id":214,"title":145,"badge":215,"body":216,"category":215,"description":478,"draft":143,"extension":479,"links":215,"meta":480,"navigation":11,"path":146,"seo":481,"sitemap":482,"stem":147,"__hash__":483},"docs\u002F6.networking\u002F1.index.md",null,{"type":217,"value":218,"toc":467},"minimark",[219,228,233,256,260,324,331,335,394,397,401,413,416,420,430,434],[220,221,222,223,227],"p",{},"Every request to a Kuppit hostname, generated or custom, passes through Kuppit's edge before it reaches the revision that is ",[224,225,226],"strong",{},"Live",". The edge terminates TLS, checks the hostname, forwards the request to the right service, and hands back whatever the service answers. Your application sees an ordinary HTTP request with a few headers Kuppit sets.",[229,230,232],"h2",{"id":231},"what-happens-to-a-request","What happens to a request",[234,235,236,240,247,253],"ol",{},[237,238,239],"li",{},"Plain HTTP is redirected to HTTPS with a permanent redirect. Certificates are Kuppit's to manage; you never upload one.",[237,241,242,243,246],{},"The hostname is matched to a service. A hostname Kuppit does not route, or one whose environment has been removed, gets a plain ",[224,244,245],{},"404 Domain Not Found"," from the edge.",[237,248,249,250,252],{},"The request is forwarded to the ",[224,251,226],{}," revision with its path and query intact. Redirects your application returns go back to the browser as they are; the edge does not follow them.",[237,254,255],{},"The response streams back. Bodies in both directions are streamed, not buffered.",[229,257,259],{"id":258},"headers-your-service-receives","Headers your service receives",[261,262,263,276],"table",{},[264,265,266],"thead",{},[267,268,269,273],"tr",{},[270,271,272],"th",{},"Header",[270,274,275],{},"Value",[277,278,279,291,304,314],"tbody",{},[267,280,281,288],{},[282,283,284],"td",{},[285,286,287],"code",{},"X-Forwarded-Host",[282,289,290],{},"The hostname the request came in on.",[267,292,293,298],{},[282,294,295],{},[285,296,297],{},"X-Forwarded-Proto",[282,299,300,303],{},[285,301,302],{},"https",", always.",[267,305,306,311],{},[282,307,308],{},[285,309,310],{},"X-Forwarded-For",[282,312,313],{},"The client's address.",[267,315,316,321],{},[282,317,318],{},[285,319,320],{},"X-Kuppit-Request-ID",[282,322,323],{},"An id for the request. Every error page from the edge prints it, so a report can be matched to a log line.",[220,325,326,327,330],{},"Any values a client sent in those headers are replaced, so they can be trusted. Hop-by-hop headers are stripped from the request before it is forwarded; your service's response is returned as it is. A request carrying ",[285,328,329],{},"Upgrade: websocket"," keeps its upgrade headers on the way through; Kuppit makes no further claim about WebSocket support and has no settings for it.",[229,332,334],{"id":333},"limits-and-timeouts","Limits and timeouts",[261,336,337,349],{},[264,338,339],{},[267,340,341,344,346],{},[270,342,343],{},"Limit",[270,345,275],{},[270,347,348],{},"What happens beyond it",[277,350,351,368,382],{},[267,352,353,359,362],{},[282,354,355,356],{},"Request body, as declared by ",[285,357,358],{},"Content-Length",[282,360,361],{},"100 MB",[282,363,364,367],{},[224,365,366],{},"413 Payload Too Large",", before anything is forwarded. A body sent without a length is streamed through unchecked.",[267,369,370,373,376],{},[282,371,372],{},"Time to first byte from your service",[282,374,375],{},"120 seconds",[282,377,378,381],{},[224,379,380],{},"504 Gateway Timeout",".",[267,383,384,387,389],{},[282,385,386],{},"A service that refuses the connection",[282,388],{},[282,390,391,381],{},[224,392,393],{},"502 Bad Gateway",[220,395,396],{},"Error pages from the edge are plain text with the request id.",[229,398,400],{"id":399},"services-reaching-each-other","Services reaching each other",[220,402,403,404,407,408,412],{},"Services have no private network between them. One service calling another does so over the other's public hostname, ",[285,405,406],{},"https:\u002F\u002Facme-api-d4e5f6.kuppit.app",", like any other client, and its request passes through the edge the same way. Put the hostname in a ",[409,410,411],"a",{"href":141},"variable"," rather than in code, because each environment has its own.",[220,414,415],{},"A web service exposes no variables of its own for others to reference. Only a database does.",[229,417,419],{"id":418},"services-reaching-databases","Services reaching databases",[220,421,422,423,426,427,381],{},"A service reaches a PostgreSQL database in the same environment over a connection the infrastructure attaches, not over the public network. The details, and why ",[285,424,425],{},"PGHOST"," is not a hostname, are on ",[409,428,429],{"href":152},"reaching a database",[229,431,433],{"id":432},"what-is-not-here","What is not here",[435,436,437,443,449,455,461],"ul",{},[237,438,439,442],{},[224,440,441],{},"Private networking, VPCs, private IPs."," There is no network to configure.",[237,444,445,448],{},[224,446,447],{},"IP allowlists, firewall rules, a WAF."," Nothing filters requests by source.",[237,450,451,454],{},[224,452,453],{},"Static addresses."," Neither inbound nor outbound. A custom domain routes by CNAME, never by A record.",[237,456,457,460],{},[224,458,459],{},"Caching, path routing, redirects, custom headers, rate limits at the edge."," The edge routes one hostname to one service, whole.",[237,462,463,466],{},[224,464,465],{},"The origin behind the edge is not hidden."," The Kuppit hostname is the supported public interface, and the hostname is what carries the certificate and the headers above.",{"title":468,"searchDepth":469,"depth":469,"links":470},"",3,[471,473,474,475,476,477],{"id":231,"depth":472,"text":232},2,{"id":258,"depth":472,"text":259},{"id":333,"depth":472,"text":334},{"id":399,"depth":472,"text":400},{"id":418,"depth":472,"text":419},{"id":432,"depth":472,"text":433},"How a request reaches your service, what Kuppit's edge does to it on the way, how services reach each other, and what is not there.","md",{},{"title":145,"description":478},{"loc":146},"EMUp4YwW-rZcPLMZNV0bxETNSJRMHk97EFnAHxscgWs",[485,487],{"title":140,"path":141,"stem":142,"description":486,"children":-1},"How variables are set on services and environments, how references connect resources, and how secrets are handled.",{"title":151,"path":152,"stem":153,"description":488,"children":-1},"How a service connects to a PostgreSQL database in its environment, why PGHOST is a path, and what a connection string looks like.",1788549618624]