[{"data":1,"prerenderedAt":930},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-guides-fastapi":164,"-docs-guides-fastapi-surround":838,"doc-previews":843},[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":831,"extension":832,"links":833,"meta":834,"navigation":835,"path":36,"seo":836,"stem":37,"__hash__":837},"docs\u002Fdocs\u002F02.guides\u002F6.fastapi.md","Deploy a FastAPI service",{"type":168,"value":169,"toc":823},"minimark",[170,174,179,182,213,221,270,279,323,454,458,476,479,507,510,514,521,524,558,561,565,580,742,748,752,755,794,797,801,819],[171,172,173],"p",{},"FastAPI deploys here without configuration when your project matches the layout detection expects, and needs exactly one setting when it does not. Most real projects do not match, so this guide starts there.",[175,176,178],"h2",{"id":177},"what-detection-looks-for","What detection looks for",[171,180,181],{},"Three things have to be true for a start command to be derived automatically:",[183,184,185,197,203],"ol",{},[186,187,188,192,193,196],"li",{},[189,190,191],"code",{},"requirements.txt"," (or a ",[189,194,195],{},"pyproject.toml",") exists, so the project reads as Python.",[186,198,199,202],{},[189,200,201],{},"uvicorn"," is among the dependencies.",[186,204,205,208,209,212],{},[189,206,207],{},"main.py"," sits at the repository root, with the FastAPI instance named ",[189,210,211],{},"app",".",[171,214,215,216,220],{},"When all three hold, the ",[217,218,219],"a",{"href":60},"build"," produces this:",[222,223,228],"pre",{"className":224,"code":225,"language":226,"meta":227,"style":227},"language-bash shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","uvicorn main:app --host 0.0.0.0 --port ${PORT:-8000}\n","bash","",[189,229,230],{"__ignoreMap":227},[231,232,235,238,242,246,249,252,256,260,264,267],"span",{"class":233,"line":234},"line",1,[231,236,201],{"class":237},"sX5TD",[231,239,241],{"class":240},"sQLXx"," main:app",[231,243,245],{"class":244},"s1Tsi"," --host",[231,247,248],{"class":244}," 0.0.0.0",[231,250,251],{"class":244}," --port",[231,253,255],{"class":254},"si-ur"," ${",[231,257,259],{"class":258},"sIi04","PORT",[231,261,263],{"class":262},"s3drp",":-",[231,265,266],{"class":258},"8000",[231,268,269],{"class":254},"}\n",[171,271,272,278],{},[217,273,277],{"href":274,"rel":275},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Ffastapi-example",[276],"nofollow","zeitlos\u002Ffastapi-example"," is that layout in three files:",[222,280,282],{"className":224,"code":281,"language":226,"meta":227,"style":227},"mkdir my-api && cd my-api\nprintf 'fastapi\\nuvicorn[standard]\\n' > requirements.txt\n",[189,283,284,302],{"__ignoreMap":227},[231,285,286,289,292,295,299],{"class":233,"line":234},[231,287,288],{"class":237},"mkdir",[231,290,291],{"class":240}," my-api",[231,293,294],{"class":254}," &&",[231,296,298],{"class":297},"sjx4h"," cd",[231,300,301],{"class":240}," my-api\n",[231,303,305,308,311,314,317,320],{"class":233,"line":304},2,[231,306,307],{"class":297},"printf",[231,309,310],{"class":254}," '",[231,312,313],{"class":240},"fastapi\\nuvicorn[standard]\\n",[231,315,316],{"class":254},"'",[231,318,319],{"class":262}," >",[231,321,322],{"class":240}," requirements.txt\n",[222,324,328],{"className":325,"code":326,"language":327,"meta":227,"style":227},"language-python shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","# main.py\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n\n@app.get(\"\u002F\")\ndef read_root():\n    return {\"message\": \"Deployed on Lucity\"}\n","python",[189,329,330,336,352,359,374,379,384,413,425],{"__ignoreMap":227},[231,331,332],{"class":233,"line":234},[231,333,335],{"class":334},"sIIdi","# main.py\n",[231,337,338,342,346,349],{"class":233,"line":304},[231,339,341],{"class":340},"sJHtc","from",[231,343,345],{"class":344},"spvMa"," fastapi ",[231,347,348],{"class":340},"import",[231,350,351],{"class":344}," FastAPI\n",[231,353,355],{"class":233,"line":354},3,[231,356,358],{"emptyLinePlaceholder":357},true,"\n",[231,360,362,365,368,371],{"class":233,"line":361},4,[231,363,364],{"class":344},"app ",[231,366,367],{"class":262},"=",[231,369,370],{"class":258}," FastAPI",[231,372,373],{"class":254},"()\n",[231,375,377],{"class":233,"line":376},5,[231,378,358],{"emptyLinePlaceholder":357},[231,380,382],{"class":233,"line":381},6,[231,383,358],{"emptyLinePlaceholder":357},[231,385,387,391,394,396,399,402,405,408,410],{"class":233,"line":386},7,[231,388,390],{"class":389},"sdM15","@",[231,392,211],{"class":393},"sk-14",[231,395,212],{"class":389},[231,397,398],{"class":393},"get",[231,400,401],{"class":254},"(",[231,403,404],{"class":254},"\"",[231,406,407],{"class":240},"\u002F",[231,409,404],{"class":254},[231,411,412],{"class":254},")\n",[231,414,416,419,422],{"class":233,"line":415},8,[231,417,418],{"class":340},"def",[231,420,421],{"class":262}," read_root",[231,423,424],{"class":254},"():\n",[231,426,428,431,434,436,439,441,444,447,450,452],{"class":233,"line":427},9,[231,429,430],{"class":340},"    return",[231,432,433],{"class":254}," {",[231,435,404],{"class":254},[231,437,438],{"class":240},"message",[231,440,404],{"class":254},[231,442,443],{"class":254},":",[231,445,446],{"class":254}," \"",[231,448,449],{"class":240},"Deployed on Lucity",[231,451,404],{"class":254},[231,453,269],{"class":254},[175,455,457],{"id":456},"when-your-app-is-not-at-the-root","When your app is not at the root",[171,459,460,461,464,465,468,469,472,473,475],{},"The common production layout puts the app in a package, ",[189,462,463],{},"app\u002Fmain.py"," or ",[189,466,467],{},"src\u002Fapi\u002Fmain.py",", and adds a ",[189,470,471],{},"create_app()"," factory. Detection does not find ",[189,474,207],{}," at the root, so it derives nothing and the service has no command to run.",[171,477,478],{},"Set the start command yourself in the service settings, and it is used verbatim:",[222,480,482],{"className":224,"code":481,"language":226,"meta":227,"style":227},"uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8000}\n",[189,483,484],{"__ignoreMap":227},[231,485,486,488,491,493,495,497,499,501,503,505],{"class":233,"line":234},[231,487,201],{"class":237},[231,489,490],{"class":240}," app.main:app",[231,492,245],{"class":244},[231,494,248],{"class":244},[231,496,251],{"class":244},[231,498,255],{"class":254},[231,500,259],{"class":258},[231,502,263],{"class":262},[231,504,266],{"class":258},[231,506,269],{"class":254},[171,508,509],{},"That is not a workaround. Once you have set it, it survives every future build, and you control the worker count, the log level and everything else uvicorn accepts.",[175,511,513],{"id":512},"workers-and-when-to-add-them","Workers, and when to add them",[171,515,516,517,520],{},"Uvicorn runs a single process by default. That is usually the right choice here: to add capacity, raise the replica count on the ",[217,518,519],{"href":52},"service"," and let the platform spread traffic across containers that can be scheduled on different nodes.",[171,522,523],{},"Workers inside one container still make sense when your app is CPU-bound in Python and you want to use a container's full CPU allocation:",[222,525,527],{"className":224,"code":526,"language":226,"meta":227,"style":227},"uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8000} --workers 4\n",[189,528,529],{"__ignoreMap":227},[231,530,531,533,535,537,539,541,543,545,547,549,552,555],{"class":233,"line":234},[231,532,201],{"class":237},[231,534,490],{"class":240},[231,536,245],{"class":244},[231,538,248],{"class":244},[231,540,251],{"class":244},[231,542,255],{"class":254},[231,544,259],{"class":258},[231,546,263],{"class":262},[231,548,266],{"class":258},[231,550,551],{"class":254},"}",[231,553,554],{"class":244}," --workers",[231,556,557],{"class":244}," 4\n",[171,559,560],{},"Match the worker count to the CPU you allocated, not to the node's core count.",[175,562,564],{"id":563},"async-database-access","Async database access",[171,566,567,568,571,572,575,576,579],{},"Add a ",[217,569,570],{"href":72},"PostgreSQL database"," and link ",[189,573,574],{},"DATABASE_URL"," to its ",[189,577,578],{},"fqdn-uri",". FastAPI's concurrency model means an async driver is worth having:",[222,581,583],{"className":325,"code":582,"language":327,"meta":227,"style":227},"import os\nfrom sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine\n\nurl = os.environ[\"DATABASE_URL\"].replace(\"postgresql:\u002F\u002F\", \"postgresql+asyncpg:\u002F\u002F\", 1)\nengine = create_async_engine(url, pool_size=5, max_overflow=5)\nsession = async_sessionmaker(engine, expire_on_commit=False)\n",[189,584,585,592,620,624,679,716],{"__ignoreMap":227},[231,586,587,589],{"class":233,"line":234},[231,588,348],{"class":340},[231,590,591],{"class":344}," os\n",[231,593,594,596,599,601,604,606,609,611,614,617],{"class":233,"line":304},[231,595,341],{"class":340},[231,597,598],{"class":344}," sqlalchemy",[231,600,212],{"class":254},[231,602,603],{"class":344},"ext",[231,605,212],{"class":254},[231,607,608],{"class":344},"asyncio ",[231,610,348],{"class":340},[231,612,613],{"class":344}," async_sessionmaker",[231,615,616],{"class":254},",",[231,618,619],{"class":344}," create_async_engine\n",[231,621,622],{"class":233,"line":354},[231,623,358],{"emptyLinePlaceholder":357},[231,625,626,629,631,634,636,639,642,644,646,648,651,654,656,658,661,663,665,667,670,672,674,677],{"class":233,"line":361},[231,627,628],{"class":344},"url ",[231,630,367],{"class":262},[231,632,633],{"class":344}," os",[231,635,212],{"class":254},[231,637,638],{"class":344},"environ",[231,640,641],{"class":254},"[",[231,643,404],{"class":254},[231,645,574],{"class":240},[231,647,404],{"class":254},[231,649,650],{"class":254},"].",[231,652,653],{"class":258},"replace",[231,655,401],{"class":254},[231,657,404],{"class":254},[231,659,660],{"class":240},"postgresql:\u002F\u002F",[231,662,404],{"class":254},[231,664,616],{"class":254},[231,666,446],{"class":254},[231,668,669],{"class":240},"postgresql+asyncpg:\u002F\u002F",[231,671,404],{"class":254},[231,673,616],{"class":254},[231,675,676],{"class":244}," 1",[231,678,412],{"class":254},[231,680,681,684,686,689,691,695,697,700,702,705,707,710,712,714],{"class":233,"line":376},[231,682,683],{"class":344},"engine ",[231,685,367],{"class":262},[231,687,688],{"class":258}," create_async_engine",[231,690,401],{"class":254},[231,692,694],{"class":693},"sXJz0","url",[231,696,616],{"class":254},[231,698,699],{"class":258}," pool_size",[231,701,367],{"class":262},[231,703,704],{"class":244},"5",[231,706,616],{"class":254},[231,708,709],{"class":258}," max_overflow",[231,711,367],{"class":262},[231,713,704],{"class":244},[231,715,412],{"class":254},[231,717,718,721,723,725,727,730,732,735,737,740],{"class":233,"line":381},[231,719,720],{"class":344},"session ",[231,722,367],{"class":262},[231,724,613],{"class":258},[231,726,401],{"class":254},[231,728,729],{"class":693},"engine",[231,731,616],{"class":254},[231,733,734],{"class":258}," expire_on_commit",[231,736,367],{"class":262},[231,738,739],{"class":244},"False",[231,741,412],{"class":254},[171,743,744,745,747],{},"The dynamic variable gives you a ",[189,746,660],{}," URL, which SQLAlchemy reads as the sync driver, hence the rewrite. Keep the pool small and remember it is per replica.",[175,749,751],{"id":750},"migrations-belong-in-the-start-command","Migrations belong in the start command",[171,753,754],{},"Nothing runs Alembic for you. Chain it ahead of the server so a rollout cannot serve traffic against an old schema:",[222,756,758],{"className":224,"code":757,"language":226,"meta":227,"style":227},"alembic upgrade head && uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8000}\n",[189,759,760],{"__ignoreMap":227},[231,761,762,765,768,771,773,776,778,780,782,784,786,788,790,792],{"class":233,"line":234},[231,763,764],{"class":237},"alembic",[231,766,767],{"class":240}," upgrade",[231,769,770],{"class":240}," head",[231,772,294],{"class":254},[231,774,775],{"class":237}," uvicorn",[231,777,490],{"class":240},[231,779,245],{"class":244},[231,781,248],{"class":244},[231,783,251],{"class":244},[231,785,255],{"class":254},[231,787,259],{"class":258},[231,789,263],{"class":262},[231,791,266],{"class":258},[231,793,269],{"class":254},[171,795,796],{},"Every replica will run it on start. Alembic handles that safely, but a long migration delays every start, so run big ones separately.",[175,798,800],{"id":799},"next-steps","Next steps",[802,803,804,809,814],"ul",{},[186,805,806,808],{},[217,807,51],{"href":52}," for replicas, resources and health checks",[186,810,811,813],{},[217,812,71],{"href":72}," for connection details and backups",[186,815,816,818],{},[217,817,63],{"href":64}," for configuration and secrets",[820,821,822],"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 .s1Tsi, html code.shiki .s1Tsi{--shiki-light:#D3869B;--shiki-default:#D3869B;--shiki-dark:#D3869B}html pre.shiki code .si-ur, html code.shiki .si-ur{--shiki-light:#A89984;--shiki-default:#A89984;--shiki-dark:#A89984}html pre.shiki code .sIi04, html code.shiki .sIi04{--shiki-light:#83A598;--shiki-default:#83A598;--shiki-dark:#83A598}html pre.shiki code .s3drp, html code.shiki .s3drp{--shiki-light:#8EC07C;--shiki-default:#8EC07C;--shiki-dark:#8EC07C}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 .sjx4h, html code.shiki .sjx4h{--shiki-light:#FE8019;--shiki-default:#FE8019;--shiki-dark:#FE8019}html pre.shiki code .sIIdi, html code.shiki .sIIdi{--shiki-light:#928374;--shiki-light-font-style:italic;--shiki-default:#928374;--shiki-default-font-style:italic;--shiki-dark:#928374;--shiki-dark-font-style:italic}html pre.shiki code .sJHtc, html code.shiki .sJHtc{--shiki-light:#FB4934;--shiki-default:#FB4934;--shiki-dark:#FB4934}html pre.shiki code .spvMa, html code.shiki .spvMa{--shiki-light:#EBDBB2;--shiki-default:#EBDBB2;--shiki-dark:#EBDBB2}html pre.shiki code .sdM15, html code.shiki .sdM15{--shiki-light:#A89984;--shiki-light-font-weight:bold;--shiki-default:#A89984;--shiki-default-font-weight:bold;--shiki-dark:#A89984;--shiki-dark-font-weight:bold}html pre.shiki code .sk-14, html code.shiki .sk-14{--shiki-light:#FABD2F;--shiki-light-font-weight:bold;--shiki-default:#FABD2F;--shiki-default-font-weight:bold;--shiki-dark:#FABD2F;--shiki-dark-font-weight:bold}html pre.shiki code .sXJz0, html code.shiki .sXJz0{--shiki-light:#D5C4A1;--shiki-default:#D5C4A1;--shiki-dark:#D5C4A1}",{"title":227,"searchDepth":304,"depth":304,"links":824},[825,826,827,828,829,830],{"id":177,"depth":304,"text":178},{"id":456,"depth":304,"text":457},{"id":512,"depth":304,"text":513},{"id":563,"depth":304,"text":564},{"id":750,"depth":304,"text":751},{"id":799,"depth":304,"text":800},"Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.","md",null,{},{"title":35},{"title":166,"description":831},"fIowfVmAhoJLsfUDbTQk-1GiioXz3y-oOumUe0dPmco",[839,841],{"title":31,"path":32,"stem":33,"description":840,"children":-1},"Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",{"title":39,"path":40,"stem":41,"description":842,"children":-1},"Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",[844,847,849,852,855,858,861,863,864,866,869,872,875,877,879,881,883,885,887,889,891,893,895,897,899,901,903,905,907,909,911,913,915,918,922,926],{"path":6,"title":845,"description":846},"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":848,"title":9,"description":833},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":850,"description":851},"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":853,"description":854},"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":856,"description":857},"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":859,"description":860},"Deploy an Astro site","Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.",{"path":32,"title":862,"description":840},"Deploy an Express API",{"path":36,"title":166,"description":831},{"path":40,"title":865,"description":842},"Deploy a Django project",{"path":44,"title":867,"description":868},"Deploy a Laravel application","Deploy a Laravel application on Lucity, with migrations, caches and a queue worker, and no server to configure.",{"path":48,"title":870,"description":871},"Deploy a Go service","Deploy a Go service on Lucity. Compiled in the build, shipped as a binary, nothing else in the image.",{"path":10,"title":873,"description":874},"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":876},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":878},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":880},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":882},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":884},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":886},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":888},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":890},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":892},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":894},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":896},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":898},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":900},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":902},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":904},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":906},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":908},"CPU and memory for every service, and disk usage for every volume.",{"path":120,"title":119,"description":910},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":912},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":914},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":916,"title":917,"description":833},"\u002Flegal\u002F.navigation","Legal",{"path":919,"title":920,"description":921},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":923,"title":924,"description":925},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":927,"title":928,"description":929},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1791216729237]