[{"data":1,"prerenderedAt":497},["ShallowReactive",2],{"navigation":3,"page-\u002Fdeployments\u002Fbuilds":105,"surround-\u002Fdeployments\u002Fbuilds":492},[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":32,"badge":107,"body":108,"category":107,"description":486,"draft":73,"extension":487,"links":107,"meta":488,"navigation":11,"path":33,"seo":489,"sitemap":490,"stem":34,"__hash__":491},"docs\u002F3.deployments\u002F2.builds.md",null,{"type":109,"value":110,"toc":476},"minimark",[111,120,125,178,185,189,192,294,297,300,306,424,431,437,441,448,452],[112,113,114,115,119],"p",{},"Every deployment starts with a build: the commit becomes a container image, one of two ways. Kuppit decides which when the service is created, from what is in the repository, and records the result as the service's build configuration. You can change any of it on the service's ",[116,117,118],"strong",{},"Settings"," tab.",[121,122,124],"h2",{"id":123},"dockerfile-or-automatic","Dockerfile or Automatic",[126,127,128,144],"table",{},[129,130,131],"thead",{},[132,133,134,138,141],"tr",{},[135,136,137],"th",{},"Strategy",[135,139,140],{},"Kuppit chooses it when",[135,142,143],{},"What it does",[145,146,147,165],"tbody",{},[132,148,149,155,162],{},[150,151,152],"td",{},[116,153,154],{},"Dockerfile",[150,156,157,158,161],{},"A ",[159,160,154],"code",{}," exists in the root directory. Recommended whenever one is present.",[150,163,164],{},"Builds the Dockerfile exactly as written, with a layer cache kept per service between builds.",[132,166,167,172,175],{},[150,168,169],{},[116,170,171],{},"Automatic",[150,173,174],{},"No Dockerfile, and a Node.js application is detected.",[150,176,177],{},"Installs dependencies, runs the build command if there is one, and starts the start command.",[112,179,180,181,184],{},"Detection reads the repository; it never guesses. If neither applies, the service's settings say ",[116,182,183],{},"Automatic configuration not detected",": add a Dockerfile, or set the framework and commands by hand.",[121,186,188],{"id":187},"what-automatic-detects","What Automatic detects",[112,190,191],{},"An automatic build supports Node.js applications only.",[193,194,195,206,224,240,265,285],"ul",{},[196,197,198,201,202,205],"li",{},[116,199,200],{},"Framework:"," Nuxt, Next.js, Express, or plain Node with a ",[159,203,204],{},"start"," script.",[196,207,208,211,212,215,216,219,220,223],{},[116,209,210],{},"Node.js version:"," 24 or 22. Kuppit reads ",[159,213,214],{},"engines.node"," in ",[159,217,218],{},"package.json",", or ",[159,221,222],{},".nvmrc",", and defaults to 24. The range must admit the current release of that major.",[196,225,226,229,230,233,234,236,237,239],{},[116,227,228],{},"Package manager:"," pnpm, npm or Yarn, from the lockfile or the ",[159,231,232],{},"packageManager"," field. Two lockfiles, or a ",[159,235,232],{}," that disagrees with the lockfile, is an error. Yarn Classic is recognised from its lockfile; Yarn Modern needs an exact ",[159,238,232],{}," version.",[196,241,242,245,246,249,250,253,254,257,258,260,261,264],{},[116,243,244],{},"Build command:"," ",[159,247,248],{},"pnpm build",", ",[159,251,252],{},"npm run build"," or ",[159,255,256],{},"yarn build"," when ",[159,259,218],{}," has a ",[159,262,263],{},"build"," script; none otherwise.",[196,266,267,270,271,274,275,277,278,281,282,284],{},[116,268,269],{},"Start command:"," for Nuxt, ",[159,272,273],{},"node .output\u002Fserver\u002Findex.mjs","; for Next.js without a ",[159,276,204],{}," script, ",[159,279,280],{},"next start","; otherwise the package manager's ",[159,283,204],{},".",[196,286,287,290,291,284],{},[116,288,289],{},"Port:"," 3000 when detected, and the runtime tells your server the real port through ",[159,292,293],{},"PORT",[112,295,296],{},"Workspaces are understood: an application inside a pnpm, npm or Yarn workspace builds from the workspace root with the application as its root directory.",[121,298,118],{"id":299},"settings",[112,301,302,303],{},"Each setting is what Kuppit detected until you change it, and only the values you change are stored. Saving shows ",[116,304,305],{},"Build settings saved. Changes apply to the next deployment.",[126,307,308,321],{},[129,309,310],{},[132,311,312,315,318],{},[135,313,314],{},"Setting",[135,316,317],{},"Applies to",[135,319,320],{},"Notes",[145,322,323,336,348,360,372,388,400,412],{},[132,324,325,330,333],{},[150,326,327],{},[116,328,329],{},"Root directory",[150,331,332],{},"Both",[150,334,335],{},"Where the application lives in the repository. Changing it needs a fresh inspection before you can save.",[132,337,338,343,345],{},[150,339,340],{},[116,341,342],{},"Dockerfile path",[150,344,154],{},[150,346,347],{},"Relative to the root directory.",[132,349,350,355,357],{},[150,351,352],{},[116,353,354],{},"Framework",[150,356,171],{},[150,358,359],{},"Nuxt, Next.js, Express or Node.",[132,361,362,367,369],{},[150,363,364],{},[116,365,366],{},"Node version",[150,368,171],{},[150,370,371],{},"24 or 22.",[132,373,374,383,385],{},[150,375,376,379,380],{},[116,377,378],{},"Package manager"," and ",[116,381,382],{},"version",[150,384,171],{},[150,386,387],{},"pnpm, npm or Yarn.",[132,389,390,395,397],{},[150,391,392],{},[116,393,394],{},"Build command",[150,396,171],{},[150,398,399],{},"Optional. Clearing it removes a detected build step.",[132,401,402,407,409],{},[150,403,404],{},[116,405,406],{},"Start command",[150,408,171],{},[150,410,411],{},"Required.",[132,413,414,419,421],{},[150,415,416],{},[116,417,418],{},"Port",[150,420,171],{},[150,422,423],{},"1 to 65535. A Dockerfile build always listens on 8080.",[112,425,426,427,284],{},"Commands run as POSIX shell scripts inside the isolated build or runtime environment, and are limited to 4 KB. Do not put secrets in them; use ",[428,429,430],"a",{"href":71},"variables",[112,432,433,436],{},[116,434,435],{},"Inspect latest"," re-detects from the newest commit and shows what changed before you save it. Kuppit never re-detects on its own: automatic defaults stay fixed until you explicitly inspect and save, so a commit that adds a Dockerfile does not silently change how the service builds.",[121,438,440],{"id":439},"what-the-deployment-keeps","What the deployment keeps",[112,442,443,444,447],{},"Each deployment snapshots the build configuration it was resolved with and shows it read-only under ",[116,445,446],{},"Build configuration"," on the deployment page, with the commit it inspected. Changing settings afterwards changes the next deployment, never this one.",[121,449,451],{"id":450},"limits","Limits",[193,453,454,460,466],{},[196,455,456,457,284],{},"A repository is read up to 20,000 files, and extraction stops after 60 seconds. Beyond that the build fails with ",[116,458,459],{},"The repository is too large for Kuppit to build",[196,461,462,463,284],{},"A build has 15 minutes to produce an image. Beyond that it fails with ",[116,464,465],{},"The build ran out of time",[196,467,468,469,249,472,475],{},"Symbolic links are never followed, and ",[159,470,471],{},"node_modules",[159,473,474],{},".git",", build output directories and caches are never walked during detection.",{"title":477,"searchDepth":478,"depth":478,"links":479},"",3,[480,482,483,484,485],{"id":123,"depth":481,"text":124},2,{"id":187,"depth":481,"text":188},{"id":299,"depth":481,"text":118},{"id":439,"depth":481,"text":440},{"id":450,"depth":481,"text":451},"How Kuppit turns a commit into a container image, what it detects from the repository, and every build setting you can change.","md",{},{"title":32,"description":486},{"loc":33},"Lu1ZrWqvf2DVV2j4vd08BzM_htC5GdtF08BWtv8JT50",[493,495],{"title":26,"path":27,"stem":28,"description":494,"children":-1},"How one commit becomes a running revision of a web service, what each status means, and what happens to the deployment before it.",{"title":36,"path":37,"stem":38,"description":496,"children":-1},"Deploy a commit again with today's configuration, or return to a previous deployment exactly as it ran.",1788534986677]