[{"data":1,"prerenderedAt":1250},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-guides-go":164,"-docs-guides-go-surround":1158,"doc-previews":1163},[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":1151,"extension":1152,"links":1153,"meta":1154,"navigation":1155,"path":48,"seo":1156,"stem":49,"__hash__":1157},"docs\u002Fdocs\u002F02.guides\u002F9.go.md","Deploy a Go service",{"type":168,"value":169,"toc":1143},"minimark",[170,179,228,250,565,570,590,593,597,608,640,651,661,665,668,675,838,841,845,859,906,913,917,924,1113,1116,1120,1139],[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,249],{},"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,248],{"href":245,"rel":246},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Fgo-example",[247],"nofollow","zeitlos\u002Fgo-example"," is the whole thing in one file:",[180,251,254],{"className":252,"code":253,"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,255,256,266,272,282,294,304,314,320,325,341,372,389,406,412,417,477,506,512,517,559],{"__ignoreMap":185},[190,257,258,262],{"class":192,"line":193},[190,259,261],{"class":260},"s3drp","package",[190,263,265],{"class":264},"spvMa"," main\n",[190,267,268],{"class":192,"line":215},[190,269,271],{"emptyLinePlaceholder":270},true,"\n",[190,273,275,279],{"class":192,"line":274},3,[190,276,278],{"class":277},"sJHtc","import",[190,280,281],{"class":204}," (\n",[190,283,285,288,291],{"class":192,"line":284},4,[190,286,287],{"class":204},"    \"",[190,289,290],{"class":200},"log",[190,292,293],{"class":204},"\"\n",[190,295,297,299,302],{"class":192,"line":296},5,[190,298,287],{"class":204},[190,300,301],{"class":200},"net\u002Fhttp",[190,303,293],{"class":204},[190,305,307,309,312],{"class":192,"line":306},6,[190,308,287],{"class":204},[190,310,311],{"class":200},"os",[190,313,293],{"class":204},[190,315,317],{"class":192,"line":316},7,[190,318,319],{"class":204},")\n",[190,321,323],{"class":192,"line":322},8,[190,324,271],{"emptyLinePlaceholder":270},[190,326,328,331,335,338],{"class":192,"line":327},9,[190,329,330],{"class":277},"func",[190,332,334],{"class":333},"s1Tsi"," main",[190,336,337],{"class":204},"()",[190,339,340],{"class":204}," {\n",[190,342,344,348,351,354,357,360,363,366,368,370],{"class":192,"line":343},10,[190,345,347],{"class":346},"sIi04","    port",[190,349,350],{"class":260}," :=",[190,352,353],{"class":346}," os",[190,355,356],{"class":204},".",[190,358,359],{"class":333},"Getenv",[190,361,362],{"class":204},"(",[190,364,365],{"class":204},"\"",[190,367,237],{"class":200},[190,369,365],{"class":204},[190,371,319],{"class":204},[190,373,375,378,381,384,387],{"class":192,"line":374},11,[190,376,377],{"class":277},"    if",[190,379,380],{"class":346}," port",[190,382,383],{"class":260}," ==",[190,385,386],{"class":204}," \"\"",[190,388,340],{"class":204},[190,390,392,395,398,401,404],{"class":192,"line":391},12,[190,393,394],{"class":346},"        port",[190,396,397],{"class":260}," =",[190,399,400],{"class":204}," \"",[190,402,403],{"class":200},"8080",[190,405,293],{"class":204},[190,407,409],{"class":192,"line":408},13,[190,410,411],{"class":204},"    }\n",[190,413,415],{"class":192,"line":414},14,[190,416,271],{"emptyLinePlaceholder":270},[190,418,420,423,425,428,430,432,435,437,440,443,445,448,451,453,456,458,461,464,467,469,472,475],{"class":192,"line":419},15,[190,421,422],{"class":346},"    http",[190,424,356],{"class":204},[190,426,427],{"class":333},"HandleFunc",[190,429,362],{"class":204},[190,431,365],{"class":204},[190,433,434],{"class":200},"\u002F",[190,436,365],{"class":204},[190,438,439],{"class":204},",",[190,441,442],{"class":277}," func",[190,444,362],{"class":204},[190,446,447],{"class":346},"w",[190,449,450],{"class":264}," http",[190,452,356],{"class":204},[190,454,455],{"class":264},"ResponseWriter",[190,457,439],{"class":204},[190,459,460],{"class":346}," r",[190,462,463],{"class":260}," *",[190,465,466],{"class":264},"http",[190,468,356],{"class":204},[190,470,471],{"class":264},"Request",[190,473,474],{"class":204},")",[190,476,340],{"class":204},[190,478,480,483,485,488,491,494,496,498,501,503],{"class":192,"line":479},16,[190,481,482],{"class":346},"        w",[190,484,356],{"class":204},[190,486,487],{"class":333},"Write",[190,489,490],{"class":204},"([]",[190,492,493],{"class":196},"byte",[190,495,362],{"class":204},[190,497,365],{"class":204},[190,499,500],{"class":200},"Deployed on Lucity",[190,502,365],{"class":204},[190,504,505],{"class":204},"))\n",[190,507,509],{"class":192,"line":508},17,[190,510,511],{"class":204},"    })\n",[190,513,515],{"class":192,"line":514},18,[190,516,271],{"emptyLinePlaceholder":270},[190,518,520,523,525,528,530,532,534,537,539,541,544,546,549,552,554,557],{"class":192,"line":519},19,[190,521,522],{"class":346},"    log",[190,524,356],{"class":204},[190,526,527],{"class":333},"Fatal",[190,529,362],{"class":204},[190,531,466],{"class":346},[190,533,356],{"class":204},[190,535,536],{"class":333},"ListenAndServe",[190,538,362],{"class":204},[190,540,365],{"class":204},[190,542,543],{"class":200},":",[190,545,365],{"class":204},[190,547,548],{"class":260},"+",[190,550,551],{"class":346},"port",[190,553,439],{"class":204},[190,555,556],{"class":333}," nil",[190,558,505],{"class":204},[190,560,562],{"class":192,"line":561},20,[190,563,564],{"class":204},"}\n",[566,567,569],"h2",{"id":568},"what-the-build-does","What the build does",[171,571,572,573,576,577,579,580,583,584,586,587,589],{},"Detection keys on ",[187,574,575],{},"go.mod",", a Go workspace, or a ",[187,578,233],{}," at the root. The build compiles with ",[187,581,582],{},"go build"," and the service starts the binary it produced. The Go toolchain version comes from the ",[187,585,218],{}," directive in your ",[187,588,575],{},", so bumping Go is a one-line change in the file that already declares it.",[171,591,592],{},"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.",[566,594,596],{"id":595},"repositories-with-more-than-one-binary","Repositories with more than one binary",[171,598,599,600,603,604,607],{},"A ",[187,601,602],{},"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,605,606],{"href":64},"variables"," reach the builder, and the builder reads one that replaces the compile step:",[609,610,611,624],"table",{},[612,613,614],"thead",{},[615,616,617,621],"tr",{},[618,619,620],"th",{},"Variable",[618,622,623],{},"Value",[625,626,627],"tbody",{},[615,628,629,635],{},[630,631,632],"td",{},[187,633,634],{},"RAILPACK_BUILD_CMD",[630,636,637],{},[187,638,639],{},"go build -o out .\u002Fcmd\u002Fapi",[171,641,642,643,646,647,650],{},"Keep the output name as ",[187,644,645],{},"out",": the derived start command runs ",[187,648,649],{},".\u002Fout",", so a different name leaves nothing to start. Set that variable and the build compiles the package you named instead of guessing.",[171,652,653,654,657,658,660],{},"Deploy the other binaries as their own ",[175,655,656],{"href":52},"services"," from the same repository, each with its own ",[187,659,634],{},". A worker and an API sharing a module, deployed separately and scaled separately, is a natural fit for the way projects work here.",[566,662,664],{"id":663},"health-checks-earn-their-keep","Health checks earn their keep",[171,666,667],{},"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,669,670,671,674],{},"Add an endpoint that answers what you actually care about, then point the ",[175,672,673],{"href":52},"service"," health check at it:",[180,676,678],{"className":252,"code":677,"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,679,680,727,766,800,805,809,833],{"__ignoreMap":185},[190,681,682,684,686,688,690,692,695,697,699,701,703,705,707,709,711,713,715,717,719,721,723,725],{"class":192,"line":193},[190,683,466],{"class":346},[190,685,356],{"class":204},[190,687,427],{"class":333},[190,689,362],{"class":204},[190,691,365],{"class":204},[190,693,694],{"class":200},"\u002Fhealthz",[190,696,365],{"class":204},[190,698,439],{"class":204},[190,700,442],{"class":277},[190,702,362],{"class":204},[190,704,447],{"class":346},[190,706,450],{"class":264},[190,708,356],{"class":204},[190,710,455],{"class":264},[190,712,439],{"class":204},[190,714,460],{"class":346},[190,716,463],{"class":260},[190,718,466],{"class":264},[190,720,356],{"class":204},[190,722,471],{"class":264},[190,724,474],{"class":204},[190,726,340],{"class":204},[190,728,729,731,734,736,739,741,744,746,749,751,754,757,759,762,764],{"class":192,"line":215},[190,730,377],{"class":277},[190,732,733],{"class":346}," err",[190,735,350],{"class":260},[190,737,738],{"class":346}," db",[190,740,356],{"class":204},[190,742,743],{"class":333},"PingContext",[190,745,362],{"class":204},[190,747,748],{"class":346},"r",[190,750,356],{"class":204},[190,752,753],{"class":333},"Context",[190,755,756],{"class":204},"());",[190,758,733],{"class":346},[190,760,761],{"class":260}," !=",[190,763,556],{"class":333},[190,765,340],{"class":204},[190,767,768,771,773,776,778,780,782,784,787,789,791,793,795,798],{"class":192,"line":274},[190,769,770],{"class":346},"        http",[190,772,356],{"class":204},[190,774,775],{"class":333},"Error",[190,777,362],{"class":204},[190,779,447],{"class":346},[190,781,439],{"class":204},[190,783,400],{"class":204},[190,785,786],{"class":200},"database unreachable",[190,788,365],{"class":204},[190,790,439],{"class":204},[190,792,450],{"class":346},[190,794,356],{"class":204},[190,796,797],{"class":346},"StatusServiceUnavailable",[190,799,319],{"class":204},[190,801,802],{"class":192,"line":284},[190,803,804],{"class":277},"        return\n",[190,806,807],{"class":192,"line":296},[190,808,411],{"class":204},[190,810,811,814,816,818,820,822,824,826,829,831],{"class":192,"line":306},[190,812,813],{"class":346},"    w",[190,815,356],{"class":204},[190,817,487],{"class":333},[190,819,490],{"class":204},[190,821,493],{"class":196},[190,823,362],{"class":204},[190,825,365],{"class":204},[190,827,828],{"class":200},"ok",[190,830,365],{"class":204},[190,832,505],{"class":204},[190,834,835],{"class":192,"line":316},[190,836,837],{"class":204},"})\n",[171,839,840],{},"Keep the check cheap. It runs on a schedule, and a slow check under load turns into a restart under load.",[566,842,844],{"id":843},"connecting-a-database","Connecting a database",[171,846,847,848,851,852,855,856,543],{},"Add a ",[175,849,850],{"href":72},"PostgreSQL database"," and link ",[187,853,854],{},"DATABASE_URL"," to its ",[187,857,858],{},"fqdn-uri",[180,860,862],{"className":252,"code":861,"language":218,"meta":185,"style":185},"pool, err := pgxpool.New(ctx, os.Getenv(\"DATABASE_URL\"))\n",[187,863,864],{"__ignoreMap":185},[190,865,866,869,871,873,875,878,880,883,885,888,890,892,894,896,898,900,902,904],{"class":192,"line":193},[190,867,868],{"class":346},"pool",[190,870,439],{"class":204},[190,872,733],{"class":346},[190,874,350],{"class":260},[190,876,877],{"class":346}," pgxpool",[190,879,356],{"class":204},[190,881,882],{"class":333},"New",[190,884,362],{"class":204},[190,886,887],{"class":346},"ctx",[190,889,439],{"class":204},[190,891,353],{"class":346},[190,893,356],{"class":204},[190,895,359],{"class":333},[190,897,362],{"class":204},[190,899,365],{"class":204},[190,901,854],{"class":200},[190,903,365],{"class":204},[190,905,505],{"class":204},[171,907,908,909,912],{},"Set ",[187,910,911],{},"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.",[566,914,916],{"id":915},"shutting-down-cleanly","Shutting down cleanly",[171,918,919,920,923],{},"Rollouts send ",[187,921,922],{},"SIGTERM"," and then wait before killing the container. Handling it means in-flight requests finish instead of failing:",[180,925,927],{"className":252,"code":926,"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,928,929,979,989,993,1026,1030,1044,1090,1098],{"__ignoreMap":185},[190,930,931,933,935,938,940,943,945,948,950,953,955,958,961,963,965,968,970,973,975,977],{"class":192,"line":193},[190,932,887],{"class":346},[190,934,439],{"class":204},[190,936,937],{"class":346}," stop",[190,939,350],{"class":260},[190,941,942],{"class":346}," signal",[190,944,356],{"class":204},[190,946,947],{"class":333},"NotifyContext",[190,949,362],{"class":204},[190,951,952],{"class":346},"context",[190,954,356],{"class":204},[190,956,957],{"class":333},"Background",[190,959,960],{"class":204},"(),",[190,962,353],{"class":346},[190,964,356],{"class":204},[190,966,967],{"class":346},"Interrupt",[190,969,439],{"class":204},[190,971,972],{"class":346}," syscall",[190,974,356],{"class":204},[190,976,922],{"class":346},[190,978,319],{"class":204},[190,980,981,984,986],{"class":192,"line":215},[190,982,983],{"class":277},"defer",[190,985,937],{"class":333},[190,987,988],{"class":204},"()\n",[190,990,991],{"class":192,"line":274},[190,992,271],{"emptyLinePlaceholder":270},[190,994,995,997,999,1001,1004,1007,1009,1011,1013,1016,1018,1020,1023],{"class":192,"line":284},[190,996,218],{"class":277},[190,998,442],{"class":277},[190,1000,337],{"class":204},[190,1002,1003],{"class":204}," {",[190,1005,1006],{"class":346}," log",[190,1008,356],{"class":204},[190,1010,527],{"class":333},[190,1012,362],{"class":204},[190,1014,1015],{"class":346},"server",[190,1017,356],{"class":204},[190,1019,536],{"class":333},[190,1021,1022],{"class":204},"())",[190,1024,1025],{"class":204}," }()\n",[190,1027,1028],{"class":192,"line":296},[190,1029,271],{"emptyLinePlaceholder":270},[190,1031,1032,1035,1037,1039,1042],{"class":192,"line":306},[190,1033,1034],{"class":260},"\u003C-",[190,1036,887],{"class":346},[190,1038,356],{"class":204},[190,1040,1041],{"class":333},"Done",[190,1043,988],{"class":204},[190,1045,1046,1049,1051,1054,1056,1059,1061,1064,1066,1068,1070,1072,1074,1077,1080,1083,1085,1088],{"class":192,"line":316},[190,1047,1048],{"class":346},"shutdownCtx",[190,1050,439],{"class":204},[190,1052,1053],{"class":346}," cancel",[190,1055,350],{"class":260},[190,1057,1058],{"class":346}," context",[190,1060,356],{"class":204},[190,1062,1063],{"class":333},"WithTimeout",[190,1065,362],{"class":204},[190,1067,952],{"class":346},[190,1069,356],{"class":204},[190,1071,957],{"class":333},[190,1073,960],{"class":204},[190,1075,1076],{"class":333}," 10",[190,1078,1079],{"class":260},"*",[190,1081,1082],{"class":346},"time",[190,1084,356],{"class":204},[190,1086,1087],{"class":346},"Second",[190,1089,319],{"class":204},[190,1091,1092,1094,1096],{"class":192,"line":322},[190,1093,983],{"class":277},[190,1095,1053],{"class":333},[190,1097,988],{"class":204},[190,1099,1100,1102,1104,1107,1109,1111],{"class":192,"line":327},[190,1101,1015],{"class":346},[190,1103,356],{"class":204},[190,1105,1106],{"class":333},"Shutdown",[190,1108,362],{"class":204},[190,1110,1048],{"class":346},[190,1112,319],{"class":204},[171,1114,1115],{},"Without it, every deploy drops whatever was in flight. With it, deploys are invisible to users.",[566,1117,1119],{"id":1118},"next-steps","Next steps",[1121,1122,1123,1129,1134],"ul",{},[1124,1125,1126,1128],"li",{},[175,1127,51],{"href":52}," for resources, replicas and health checks",[1124,1130,1131,1133],{},[175,1132,55],{"href":56}," for rollout and rollback behavior",[1124,1135,1136,1138],{},[175,1137,115],{"href":116}," to see how little memory it actually uses",[1140,1141,1142],"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":1144},[1145,1146,1147,1148,1149,1150],{"id":568,"depth":215,"text":569},{"id":595,"depth":215,"text":596},{"id":663,"depth":215,"text":664},{"id":843,"depth":215,"text":844},{"id":915,"depth":215,"text":916},{"id":1118,"depth":215,"text":1119},"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":1151},"rg44xgGtz5hBZpbITIWaiFxHgjGoK4g7mvSiBaZeZHQ",[1159,1161],{"title":43,"path":44,"stem":45,"description":1160,"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":1162,"children":-1},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",[1164,1167,1169,1172,1175,1178,1181,1184,1187,1190,1192,1193,1196,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1238,1242,1246],{"path":6,"title":1165,"description":1166},"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":1168,"title":9,"description":1153},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":1170,"description":1171},"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":1173,"description":1174},"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":1176,"description":1177},"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":1179,"description":1180},"Deploy an Astro site","Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",{"path":32,"title":1182,"description":1183},"Deploy an Express API","Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"path":36,"title":1185,"description":1186},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":1188,"description":1189},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":1191,"description":1160},"Deploy a Laravel application",{"path":48,"title":166,"description":1151},{"path":10,"title":1194,"description":1195},"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":1162},{"path":56,"title":55,"description":1198},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":1200},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":1202},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":1204},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":1206},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":1208},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":1210},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":1212},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":1214},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":1216},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":1218},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":1220},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":1222},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":1224},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":1226},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":1228},"CPU and memory for every service, and disk usage for every volume.",{"path":120,"title":119,"description":1230},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":1232},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":1234},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":1236,"title":1237,"description":1153},"\u002Flegal\u002F.navigation","Legal",{"path":1239,"title":1240,"description":1241},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":1243,"title":1244,"description":1245},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":1247,"title":1248,"description":1249},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1791216729445]