[{"data":1,"prerenderedAt":1248},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-guides-go":164,"-docs-guides-go-surround":1156,"doc-previews":1161},[4,8,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126],{"title":5,"path":6,"stem":7},"Quickstart","\u002Fdocs\u002Fquickstart","docs\u002F01.quickstart",{"title":9,"path":10,"stem":11,"children":12},"Guides","\u002Fdocs\u002Fguides","docs\u002F02.guides\u002Findex",[13,14,18,22,26,30,34,38,42,46],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17},"Next.js","\u002Fdocs\u002Fguides\u002Fnextjs","docs\u002F02.guides\u002F1.nextjs",{"title":19,"path":20,"stem":21},"Nuxt","\u002Fdocs\u002Fguides\u002Fnuxt","docs\u002F02.guides\u002F2.nuxt",{"title":23,"path":24,"stem":25},"SvelteKit","\u002Fdocs\u002Fguides\u002Fsveltekit","docs\u002F02.guides\u002F3.sveltekit",{"title":27,"path":28,"stem":29},"Astro","\u002Fdocs\u002Fguides\u002Fastro","docs\u002F02.guides\u002F4.astro",{"title":31,"path":32,"stem":33},"Express","\u002Fdocs\u002Fguides\u002Fexpress","docs\u002F02.guides\u002F5.express",{"title":35,"path":36,"stem":37},"FastAPI","\u002Fdocs\u002Fguides\u002Ffastapi","docs\u002F02.guides\u002F6.fastapi",{"title":39,"path":40,"stem":41},"Django","\u002Fdocs\u002Fguides\u002Fdjango","docs\u002F02.guides\u002F7.django",{"title":43,"path":44,"stem":45},"Laravel","\u002Fdocs\u002Fguides\u002Flaravel","docs\u002F02.guides\u002F8.laravel",{"title":47,"path":48,"stem":49},"Go","\u002Fdocs\u002Fguides\u002Fgo","docs\u002F02.guides\u002F9.go",{"title":51,"path":52,"stem":53},"Services","\u002Fdocs\u002Fservices","docs\u002F03.services",{"title":55,"path":56,"stem":57},"Deployments","\u002Fdocs\u002Fdeployments","docs\u002F04.deployments",{"title":59,"path":60,"stem":61},"Builds","\u002Fdocs\u002Fbuilds","docs\u002F05.builds",{"title":63,"path":64,"stem":65},"Variables","\u002Fdocs\u002Fvariables","docs\u002F06.variables",{"title":67,"path":68,"stem":69},"Domains","\u002Fdocs\u002Fdomains","docs\u002F07.domains",{"title":71,"path":72,"stem":73},"PostgreSQL","\u002Fdocs\u002Fpostgres","docs\u002F08.postgres",{"title":75,"path":76,"stem":77},"Object storage","\u002Fdocs\u002Fobject-storage","docs\u002F09.object-storage",{"title":79,"path":80,"stem":81},"Volumes","\u002Fdocs\u002Fvolumes","docs\u002F10.volumes",{"title":83,"path":84,"stem":85},"Key-value store","\u002Fdocs\u002Fredis","docs\u002F11.redis",{"title":87,"path":88,"stem":89},"Workspaces","\u002Fdocs\u002Fworkspaces","docs\u002F12.workspaces",{"title":91,"path":92,"stem":93},"Projects","\u002Fdocs\u002Fprojects","docs\u002F13.projects",{"title":95,"path":96,"stem":97},"Environments","\u002Fdocs\u002Fenvironments","docs\u002F14.environments",{"title":99,"path":100,"stem":101},"Eject","\u002Fdocs\u002Feject","docs\u002F15.eject",{"title":103,"path":104,"stem":105},"API","\u002Fdocs\u002Fapi","docs\u002F16.api",{"title":107,"path":108,"stem":109},"CLI","\u002Fdocs\u002Fcli","docs\u002F17.cli",{"title":111,"path":112,"stem":113},"Claude Plugin & MCP","\u002Fdocs\u002Fclaude-plugin","docs\u002F18.claude-plugin",{"title":115,"path":116,"stem":117},"Metrics","\u002Fdocs\u002Fmetrics","docs\u002F19.metrics",{"title":119,"path":120,"stem":121},"Logs","\u002Fdocs\u002Flogs","docs\u002F20.logs",{"title":123,"path":124,"stem":125},"Billing","\u002Fdocs\u002Fbilling","docs\u002F21.billing",{"title":127,"path":128,"stem":129},"Self-hosting","\u002Fdocs\u002Fself-hosting","docs\u002F22.self-hosting",[131,132,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],{"title":5,"path":6,"stem":7},{"title":9,"path":10,"stem":11,"children":133},[134,135,136,137,138,139,140,141,142,143],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17},{"title":19,"path":20,"stem":21},{"title":23,"path":24,"stem":25},{"title":27,"path":28,"stem":29},{"title":31,"path":32,"stem":33},{"title":35,"path":36,"stem":37},{"title":39,"path":40,"stem":41},{"title":43,"path":44,"stem":45},{"title":47,"path":48,"stem":49},{"title":51,"path":52,"stem":53},{"title":55,"path":56,"stem":57},{"title":59,"path":60,"stem":61},{"title":63,"path":64,"stem":65},{"title":67,"path":68,"stem":69},{"title":71,"path":72,"stem":73},{"title":75,"path":76,"stem":77},{"title":79,"path":80,"stem":81},{"title":83,"path":84,"stem":85},{"title":87,"path":88,"stem":89},{"title":91,"path":92,"stem":93},{"title":95,"path":96,"stem":97},{"title":99,"path":100,"stem":101},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109},{"title":111,"path":112,"stem":113},{"title":115,"path":116,"stem":117},{"title":119,"path":120,"stem":121},{"title":123,"path":124,"stem":125},{"title":127,"path":128,"stem":129},{"id":165,"title":166,"body":167,"description":1149,"extension":1150,"links":1151,"meta":1152,"navigation":1153,"path":48,"seo":1154,"stem":49,"__hash__":1155},"docs\u002Fdocs\u002F02.guides\u002F9.go.md","Deploy a Go service",{"type":168,"value":169,"toc":1141},"minimark",[170,179,228,248,563,568,588,591,595,606,638,649,659,663,666,673,836,839,843,857,904,911,915,922,1111,1114,1118,1137],[171,172,173,174,178],"p",{},"Go is the least eventful deployment on the platform. The ",[175,176,177],"a",{"href":60},"build"," compiles your module and the image runs the resulting binary. There is no runtime to install, no package manager at boot and no framework conventions to satisfy.",[180,181,186],"pre",{"className":182,"code":183,"language":184,"meta":185,"style":185},"language-bash shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","mkdir my-service && cd my-service\ngo mod init github.com\u002Fyou\u002Fmy-service\n","bash","",[187,188,189,213],"code",{"__ignoreMap":185},[190,191,194,198,202,206,210],"span",{"class":192,"line":193},"line",1,[190,195,197],{"class":196},"sX5TD","mkdir",[190,199,201],{"class":200},"sQLXx"," my-service",[190,203,205],{"class":204},"si-ur"," &&",[190,207,209],{"class":208},"sjx4h"," cd",[190,211,212],{"class":200}," my-service\n",[190,214,216,219,222,225],{"class":192,"line":215},2,[190,217,218],{"class":196},"go",[190,220,221],{"class":200}," mod",[190,223,224],{"class":200}," init",[190,226,227],{"class":200}," github.com\u002Fyou\u002Fmy-service\n",[171,229,230,231,234,235,238,239,242,243,247],{},"Write a ",[187,232,233],{},"main.go"," that reads ",[187,236,237],{},"PORT",", push it, and connect the repository as in the ",[175,240,241],{"href":6},"quickstart",". ",[175,244,246],{"href":245},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Fgo-example","zeitlos\u002Fgo-example"," is the whole thing in one file:",[180,249,252],{"className":250,"code":251,"language":218,"meta":185,"style":185},"language-go shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","package main\n\nimport (\n    \"log\"\n    \"net\u002Fhttp\"\n    \"os\"\n)\n\nfunc main() {\n    port := os.Getenv(\"PORT\")\n    if port == \"\" {\n        port = \"8080\"\n    }\n\n    http.HandleFunc(\"\u002F\", func(w http.ResponseWriter, r *http.Request) {\n        w.Write([]byte(\"Deployed on Lucity\"))\n    })\n\n    log.Fatal(http.ListenAndServe(\":\"+port, nil))\n}\n",[187,253,254,264,270,280,292,302,312,318,323,339,370,387,404,410,415,475,504,510,515,557],{"__ignoreMap":185},[190,255,256,260],{"class":192,"line":193},[190,257,259],{"class":258},"s3drp","package",[190,261,263],{"class":262},"spvMa"," main\n",[190,265,266],{"class":192,"line":215},[190,267,269],{"emptyLinePlaceholder":268},true,"\n",[190,271,273,277],{"class":192,"line":272},3,[190,274,276],{"class":275},"sJHtc","import",[190,278,279],{"class":204}," (\n",[190,281,283,286,289],{"class":192,"line":282},4,[190,284,285],{"class":204},"    \"",[190,287,288],{"class":200},"log",[190,290,291],{"class":204},"\"\n",[190,293,295,297,300],{"class":192,"line":294},5,[190,296,285],{"class":204},[190,298,299],{"class":200},"net\u002Fhttp",[190,301,291],{"class":204},[190,303,305,307,310],{"class":192,"line":304},6,[190,306,285],{"class":204},[190,308,309],{"class":200},"os",[190,311,291],{"class":204},[190,313,315],{"class":192,"line":314},7,[190,316,317],{"class":204},")\n",[190,319,321],{"class":192,"line":320},8,[190,322,269],{"emptyLinePlaceholder":268},[190,324,326,329,333,336],{"class":192,"line":325},9,[190,327,328],{"class":275},"func",[190,330,332],{"class":331},"s1Tsi"," main",[190,334,335],{"class":204},"()",[190,337,338],{"class":204}," {\n",[190,340,342,346,349,352,355,358,361,364,366,368],{"class":192,"line":341},10,[190,343,345],{"class":344},"sIi04","    port",[190,347,348],{"class":258}," :=",[190,350,351],{"class":344}," os",[190,353,354],{"class":204},".",[190,356,357],{"class":331},"Getenv",[190,359,360],{"class":204},"(",[190,362,363],{"class":204},"\"",[190,365,237],{"class":200},[190,367,363],{"class":204},[190,369,317],{"class":204},[190,371,373,376,379,382,385],{"class":192,"line":372},11,[190,374,375],{"class":275},"    if",[190,377,378],{"class":344}," port",[190,380,381],{"class":258}," ==",[190,383,384],{"class":204}," \"\"",[190,386,338],{"class":204},[190,388,390,393,396,399,402],{"class":192,"line":389},12,[190,391,392],{"class":344},"        port",[190,394,395],{"class":258}," =",[190,397,398],{"class":204}," \"",[190,400,401],{"class":200},"8080",[190,403,291],{"class":204},[190,405,407],{"class":192,"line":406},13,[190,408,409],{"class":204},"    }\n",[190,411,413],{"class":192,"line":412},14,[190,414,269],{"emptyLinePlaceholder":268},[190,416,418,421,423,426,428,430,433,435,438,441,443,446,449,451,454,456,459,462,465,467,470,473],{"class":192,"line":417},15,[190,419,420],{"class":344},"    http",[190,422,354],{"class":204},[190,424,425],{"class":331},"HandleFunc",[190,427,360],{"class":204},[190,429,363],{"class":204},[190,431,432],{"class":200},"\u002F",[190,434,363],{"class":204},[190,436,437],{"class":204},",",[190,439,440],{"class":275}," func",[190,442,360],{"class":204},[190,444,445],{"class":344},"w",[190,447,448],{"class":262}," http",[190,450,354],{"class":204},[190,452,453],{"class":262},"ResponseWriter",[190,455,437],{"class":204},[190,457,458],{"class":344}," r",[190,460,461],{"class":258}," *",[190,463,464],{"class":262},"http",[190,466,354],{"class":204},[190,468,469],{"class":262},"Request",[190,471,472],{"class":204},")",[190,474,338],{"class":204},[190,476,478,481,483,486,489,492,494,496,499,501],{"class":192,"line":477},16,[190,479,480],{"class":344},"        w",[190,482,354],{"class":204},[190,484,485],{"class":331},"Write",[190,487,488],{"class":204},"([]",[190,490,491],{"class":196},"byte",[190,493,360],{"class":204},[190,495,363],{"class":204},[190,497,498],{"class":200},"Deployed on Lucity",[190,500,363],{"class":204},[190,502,503],{"class":204},"))\n",[190,505,507],{"class":192,"line":506},17,[190,508,509],{"class":204},"    })\n",[190,511,513],{"class":192,"line":512},18,[190,514,269],{"emptyLinePlaceholder":268},[190,516,518,521,523,526,528,530,532,535,537,539,542,544,547,550,552,555],{"class":192,"line":517},19,[190,519,520],{"class":344},"    log",[190,522,354],{"class":204},[190,524,525],{"class":331},"Fatal",[190,527,360],{"class":204},[190,529,464],{"class":344},[190,531,354],{"class":204},[190,533,534],{"class":331},"ListenAndServe",[190,536,360],{"class":204},[190,538,363],{"class":204},[190,540,541],{"class":200},":",[190,543,363],{"class":204},[190,545,546],{"class":258},"+",[190,548,549],{"class":344},"port",[190,551,437],{"class":204},[190,553,554],{"class":331}," nil",[190,556,503],{"class":204},[190,558,560],{"class":192,"line":559},20,[190,561,562],{"class":204},"}\n",[564,565,567],"h2",{"id":566},"what-the-build-does","What the build does",[171,569,570,571,574,575,577,578,581,582,584,585,587],{},"Detection keys on ",[187,572,573],{},"go.mod",", a Go workspace, or a ",[187,576,233],{}," at the root. The build compiles with ",[187,579,580],{},"go build"," and the service starts the binary it produced. The Go toolchain version comes from the ",[187,583,218],{}," directive in your ",[187,586,573],{},", so bumping Go is a one-line change in the file that already declares it.",[171,589,590],{},"Because the runtime image carries a binary rather than a toolchain, Go services start fast and use very little memory. A service that idles at 300MB in a JavaScript runtime often idles under 20MB here, which is worth remembering when you set resources.",[564,592,594],{"id":593},"repositories-with-more-than-one-binary","Repositories with more than one binary",[171,596,597,598,601,602,605],{},"A ",[187,599,600],{},"cmd\u002F"," directory with several programs is the common case that needs a decision, because only one of them is your service. There is no build command field in the dashboard, but ",[175,603,604],{"href":64},"variables"," reach the builder, and the builder reads one that replaces the compile step:",[607,608,609,622],"table",{},[610,611,612],"thead",{},[613,614,615,619],"tr",{},[616,617,618],"th",{},"Variable",[616,620,621],{},"Value",[623,624,625],"tbody",{},[613,626,627,633],{},[628,629,630],"td",{},[187,631,632],{},"RAILPACK_BUILD_CMD",[628,634,635],{},[187,636,637],{},"go build -o out .\u002Fcmd\u002Fapi",[171,639,640,641,644,645,648],{},"Keep the output name as ",[187,642,643],{},"out",": the derived start command runs ",[187,646,647],{},".\u002Fout",", so a different name leaves nothing to start. Set that variable and the build compiles the package you named instead of guessing.",[171,650,651,652,655,656,658],{},"Deploy the other binaries as their own ",[175,653,654],{"href":52},"services"," from the same repository, each with its own ",[187,657,632],{},". A worker and an API sharing a module, deployed separately and scaled separately, is a natural fit for the way projects work here.",[564,660,662],{"id":661},"health-checks-earn-their-keep","Health checks earn their keep",[171,664,665],{},"The default check opens a TCP connection to your port. A Go service that has crashed stops accepting connections, so this catches the obvious failure. It does not catch a service whose database pool is exhausted while the listener stays open.",[171,667,668,669,672],{},"Add an endpoint that answers what you actually care about, then point the ",[175,670,671],{"href":52},"service"," health check at it:",[180,674,676],{"className":250,"code":675,"language":218,"meta":185,"style":185},"http.HandleFunc(\"\u002Fhealthz\", func(w http.ResponseWriter, r *http.Request) {\n    if err := db.PingContext(r.Context()); err != nil {\n        http.Error(w, \"database unreachable\", http.StatusServiceUnavailable)\n        return\n    }\n    w.Write([]byte(\"ok\"))\n})\n",[187,677,678,725,764,798,803,807,831],{"__ignoreMap":185},[190,679,680,682,684,686,688,690,693,695,697,699,701,703,705,707,709,711,713,715,717,719,721,723],{"class":192,"line":193},[190,681,464],{"class":344},[190,683,354],{"class":204},[190,685,425],{"class":331},[190,687,360],{"class":204},[190,689,363],{"class":204},[190,691,692],{"class":200},"\u002Fhealthz",[190,694,363],{"class":204},[190,696,437],{"class":204},[190,698,440],{"class":275},[190,700,360],{"class":204},[190,702,445],{"class":344},[190,704,448],{"class":262},[190,706,354],{"class":204},[190,708,453],{"class":262},[190,710,437],{"class":204},[190,712,458],{"class":344},[190,714,461],{"class":258},[190,716,464],{"class":262},[190,718,354],{"class":204},[190,720,469],{"class":262},[190,722,472],{"class":204},[190,724,338],{"class":204},[190,726,727,729,732,734,737,739,742,744,747,749,752,755,757,760,762],{"class":192,"line":215},[190,728,375],{"class":275},[190,730,731],{"class":344}," err",[190,733,348],{"class":258},[190,735,736],{"class":344}," db",[190,738,354],{"class":204},[190,740,741],{"class":331},"PingContext",[190,743,360],{"class":204},[190,745,746],{"class":344},"r",[190,748,354],{"class":204},[190,750,751],{"class":331},"Context",[190,753,754],{"class":204},"());",[190,756,731],{"class":344},[190,758,759],{"class":258}," !=",[190,761,554],{"class":331},[190,763,338],{"class":204},[190,765,766,769,771,774,776,778,780,782,785,787,789,791,793,796],{"class":192,"line":272},[190,767,768],{"class":344},"        http",[190,770,354],{"class":204},[190,772,773],{"class":331},"Error",[190,775,360],{"class":204},[190,777,445],{"class":344},[190,779,437],{"class":204},[190,781,398],{"class":204},[190,783,784],{"class":200},"database unreachable",[190,786,363],{"class":204},[190,788,437],{"class":204},[190,790,448],{"class":344},[190,792,354],{"class":204},[190,794,795],{"class":344},"StatusServiceUnavailable",[190,797,317],{"class":204},[190,799,800],{"class":192,"line":282},[190,801,802],{"class":275},"        return\n",[190,804,805],{"class":192,"line":294},[190,806,409],{"class":204},[190,808,809,812,814,816,818,820,822,824,827,829],{"class":192,"line":304},[190,810,811],{"class":344},"    w",[190,813,354],{"class":204},[190,815,485],{"class":331},[190,817,488],{"class":204},[190,819,491],{"class":196},[190,821,360],{"class":204},[190,823,363],{"class":204},[190,825,826],{"class":200},"ok",[190,828,363],{"class":204},[190,830,503],{"class":204},[190,832,833],{"class":192,"line":314},[190,834,835],{"class":204},"})\n",[171,837,838],{},"Keep the check cheap. It runs on a schedule, and a slow check under load turns into a restart under load.",[564,840,842],{"id":841},"connecting-a-database","Connecting a database",[171,844,845,846,849,850,853,854,541],{},"Add a ",[175,847,848],{"href":72},"PostgreSQL database"," and link ",[187,851,852],{},"DATABASE_URL"," to its ",[187,855,856],{},"fqdn-uri",[180,858,860],{"className":250,"code":859,"language":218,"meta":185,"style":185},"pool, err := pgxpool.New(ctx, os.Getenv(\"DATABASE_URL\"))\n",[187,861,862],{"__ignoreMap":185},[190,863,864,867,869,871,873,876,878,881,883,886,888,890,892,894,896,898,900,902],{"class":192,"line":193},[190,865,866],{"class":344},"pool",[190,868,437],{"class":204},[190,870,731],{"class":344},[190,872,348],{"class":258},[190,874,875],{"class":344}," pgxpool",[190,877,354],{"class":204},[190,879,880],{"class":331},"New",[190,882,360],{"class":204},[190,884,885],{"class":344},"ctx",[190,887,437],{"class":204},[190,889,351],{"class":344},[190,891,354],{"class":204},[190,893,357],{"class":331},[190,895,360],{"class":204},[190,897,363],{"class":204},[190,899,852],{"class":200},[190,901,363],{"class":204},[190,903,503],{"class":204},[171,905,906,907,910],{},"Set ",[187,908,909],{},"MaxConns"," deliberately. The limit that matters is per replica, so four replicas with a pool of 25 each is 100 connections against a database that may allow fewer.",[564,912,914],{"id":913},"shutting-down-cleanly","Shutting down cleanly",[171,916,917,918,921],{},"Rollouts send ",[187,919,920],{},"SIGTERM"," and then wait before killing the container. Handling it means in-flight requests finish instead of failing:",[180,923,925],{"className":250,"code":924,"language":218,"meta":185,"style":185},"ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)\ndefer stop()\n\ngo func() { log.Fatal(server.ListenAndServe()) }()\n\n\u003C-ctx.Done()\nshutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)\ndefer cancel()\nserver.Shutdown(shutdownCtx)\n",[187,926,927,977,987,991,1024,1028,1042,1088,1096],{"__ignoreMap":185},[190,928,929,931,933,936,938,941,943,946,948,951,953,956,959,961,963,966,968,971,973,975],{"class":192,"line":193},[190,930,885],{"class":344},[190,932,437],{"class":204},[190,934,935],{"class":344}," stop",[190,937,348],{"class":258},[190,939,940],{"class":344}," signal",[190,942,354],{"class":204},[190,944,945],{"class":331},"NotifyContext",[190,947,360],{"class":204},[190,949,950],{"class":344},"context",[190,952,354],{"class":204},[190,954,955],{"class":331},"Background",[190,957,958],{"class":204},"(),",[190,960,351],{"class":344},[190,962,354],{"class":204},[190,964,965],{"class":344},"Interrupt",[190,967,437],{"class":204},[190,969,970],{"class":344}," syscall",[190,972,354],{"class":204},[190,974,920],{"class":344},[190,976,317],{"class":204},[190,978,979,982,984],{"class":192,"line":215},[190,980,981],{"class":275},"defer",[190,983,935],{"class":331},[190,985,986],{"class":204},"()\n",[190,988,989],{"class":192,"line":272},[190,990,269],{"emptyLinePlaceholder":268},[190,992,993,995,997,999,1002,1005,1007,1009,1011,1014,1016,1018,1021],{"class":192,"line":282},[190,994,218],{"class":275},[190,996,440],{"class":275},[190,998,335],{"class":204},[190,1000,1001],{"class":204}," {",[190,1003,1004],{"class":344}," log",[190,1006,354],{"class":204},[190,1008,525],{"class":331},[190,1010,360],{"class":204},[190,1012,1013],{"class":344},"server",[190,1015,354],{"class":204},[190,1017,534],{"class":331},[190,1019,1020],{"class":204},"())",[190,1022,1023],{"class":204}," }()\n",[190,1025,1026],{"class":192,"line":294},[190,1027,269],{"emptyLinePlaceholder":268},[190,1029,1030,1033,1035,1037,1040],{"class":192,"line":304},[190,1031,1032],{"class":258},"\u003C-",[190,1034,885],{"class":344},[190,1036,354],{"class":204},[190,1038,1039],{"class":331},"Done",[190,1041,986],{"class":204},[190,1043,1044,1047,1049,1052,1054,1057,1059,1062,1064,1066,1068,1070,1072,1075,1078,1081,1083,1086],{"class":192,"line":314},[190,1045,1046],{"class":344},"shutdownCtx",[190,1048,437],{"class":204},[190,1050,1051],{"class":344}," cancel",[190,1053,348],{"class":258},[190,1055,1056],{"class":344}," context",[190,1058,354],{"class":204},[190,1060,1061],{"class":331},"WithTimeout",[190,1063,360],{"class":204},[190,1065,950],{"class":344},[190,1067,354],{"class":204},[190,1069,955],{"class":331},[190,1071,958],{"class":204},[190,1073,1074],{"class":331}," 10",[190,1076,1077],{"class":258},"*",[190,1079,1080],{"class":344},"time",[190,1082,354],{"class":204},[190,1084,1085],{"class":344},"Second",[190,1087,317],{"class":204},[190,1089,1090,1092,1094],{"class":192,"line":320},[190,1091,981],{"class":275},[190,1093,1051],{"class":331},[190,1095,986],{"class":204},[190,1097,1098,1100,1102,1105,1107,1109],{"class":192,"line":325},[190,1099,1013],{"class":344},[190,1101,354],{"class":204},[190,1103,1104],{"class":331},"Shutdown",[190,1106,360],{"class":204},[190,1108,1046],{"class":344},[190,1110,317],{"class":204},[171,1112,1113],{},"Without it, every deploy drops whatever was in flight. With it, deploys are invisible to users.",[564,1115,1117],{"id":1116},"next-steps","Next steps",[1119,1120,1121,1127,1132],"ul",{},[1122,1123,1124,1126],"li",{},[175,1125,51],{"href":52}," for resources, replicas and health checks",[1122,1128,1129,1131],{},[175,1130,55],{"href":56}," for rollout and rollback behavior",[1122,1133,1134,1136],{},[175,1135,115],{"href":116}," to see how little memory it actually uses",[1138,1139,1140],"style",{},"html pre.shiki code .sX5TD, html code.shiki .sX5TD{--shiki-light:#FABD2F;--shiki-default:#FABD2F;--shiki-dark:#FABD2F}html pre.shiki code .sQLXx, html code.shiki .sQLXx{--shiki-light:#B8BB26;--shiki-default:#B8BB26;--shiki-dark:#B8BB26}html pre.shiki code .si-ur, html code.shiki .si-ur{--shiki-light:#A89984;--shiki-default:#A89984;--shiki-dark:#A89984}html pre.shiki code .sjx4h, html code.shiki .sjx4h{--shiki-light:#FE8019;--shiki-default:#FE8019;--shiki-dark:#FE8019}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);}html pre.shiki code .s3drp, html code.shiki .s3drp{--shiki-light:#8EC07C;--shiki-default:#8EC07C;--shiki-dark:#8EC07C}html pre.shiki code .spvMa, html code.shiki .spvMa{--shiki-light:#EBDBB2;--shiki-default:#EBDBB2;--shiki-dark:#EBDBB2}html pre.shiki code .sJHtc, html code.shiki .sJHtc{--shiki-light:#FB4934;--shiki-default:#FB4934;--shiki-dark:#FB4934}html pre.shiki code .s1Tsi, html code.shiki .s1Tsi{--shiki-light:#D3869B;--shiki-default:#D3869B;--shiki-dark:#D3869B}html pre.shiki code .sIi04, html code.shiki .sIi04{--shiki-light:#83A598;--shiki-default:#83A598;--shiki-dark:#83A598}",{"title":185,"searchDepth":215,"depth":215,"links":1142},[1143,1144,1145,1146,1147,1148],{"id":566,"depth":215,"text":567},{"id":593,"depth":215,"text":594},{"id":661,"depth":215,"text":662},{"id":841,"depth":215,"text":842},{"id":913,"depth":215,"text":914},{"id":1116,"depth":215,"text":1117},"Deploy a Go service on Lucity. Compiled in the build, shipped as a binary, nothing else in the image.","md",null,{},{"title":47},{"title":166,"description":1149},"-d-ge_YjUOMsiGSsDY9T4z9_FijHo5N7N6b8TLENukA",[1157,1159],{"title":43,"path":44,"stem":45,"description":1158,"children":-1},"Deploy a Laravel application on Lucity, with migrations, caches and a queue worker, and no server to configure.",{"title":51,"path":52,"stem":53,"description":1160,"children":-1},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",[1162,1165,1167,1170,1173,1176,1179,1182,1185,1188,1190,1191,1194,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233,1236,1240,1244],{"path":6,"title":1163,"description":1164},"Deploy your first service","Deploy an app to Lucity, put it on a public domain, and connect a PostgreSQL database and an object storage bucket in about fifteen minutes.",{"path":1166,"title":9,"description":1151},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":1168,"description":1169},"Deploy a Next.js app","Deploy a Next.js app on Lucity, with a database, environment variables that behave, and no Dockerfile.",{"path":20,"title":1171,"description":1172},"Deploy a Nuxt app","Deploy a Nuxt app on Lucity. Nitro output, runtime config, and a database, with no preset to pick.",{"path":24,"title":1174,"description":1175},"Deploy a SvelteKit app","Deploy a SvelteKit app on Lucity. One adapter change stands between a fresh project and a running service.",{"path":28,"title":1177,"description":1178},"Deploy an Astro site","Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",{"path":32,"title":1180,"description":1181},"Deploy an Express API","Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"path":36,"title":1183,"description":1184},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":1186,"description":1187},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":1189,"description":1158},"Deploy a Laravel application",{"path":48,"title":166,"description":1149},{"path":10,"title":1192,"description":1193},"Deploy your framework","Deploy guides for the frameworks people actually ship: Next.js, Nuxt, SvelteKit, Astro, Express, FastAPI, Django, Laravel, and Go.",{"path":52,"title":51,"description":1160},{"path":56,"title":55,"description":1196},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":1198},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":1200},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":1202},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":1204},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":1206},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":1208},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":1210},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":1212},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":1214},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":1216},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":1218},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":1220},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":1222},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":1224},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":1226},"CPU and memory for every service, activity for every database, and disk usage for every volume.",{"path":120,"title":119,"description":1228},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":1230},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":1232},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":1234,"title":1235,"description":1151},"\u002Flegal\u002F.navigation","Legal",{"path":1237,"title":1238,"description":1239},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":1241,"title":1242,"description":1243},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":1245,"title":1246,"description":1247},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1793630526591]