[{"data":1,"prerenderedAt":546},["ShallowReactive",2],{"navigation_docs":3,"section-navigation-docs":130,"-docs-guides-astro":164,"-docs-guides-astro-surround":454,"doc-previews":459},[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":447,"extension":448,"links":449,"meta":450,"navigation":451,"path":28,"seo":452,"stem":29,"__hash__":453},"docs\u002Fdocs\u002F02.guides\u002F4.astro.md","Deploy an Astro site",{"type":168,"value":169,"toc":441},"minimark",[170,174,203,216,221,240,243,257,261,264,283,290,356,363,377,389,393,400,407,414,418,437],[171,172,173],"p",{},"An Astro project deploys as one of two quite different things, and your config decides which. Knowing which one you are getting is most of what there is to know.",[175,176,181],"pre",{"className":177,"code":178,"language":179,"meta":180,"style":180},"language-bash shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","npm create astro@latest my-site\n","bash","",[182,183,184],"code",{"__ignoreMap":180},[185,186,189,193,197,200],"span",{"class":187,"line":188},"line",1,[185,190,192],{"class":191},"sX5TD","npm",[185,194,196],{"class":195},"sQLXx"," create",[185,198,199],{"class":195}," astro@latest",[185,201,202],{"class":195}," my-site\n",[171,204,205,206,210,211,215],{},"Push it to GitHub and connect it as in the ",[207,208,209],"a",{"href":6},"quickstart",", or fork ",[207,212,214],{"href":213},"https:\u002F\u002Fgithub.com\u002Fzeitlos\u002Fastro-example","zeitlos\u002Fastro-example",", which is the minimal template unchanged.",[217,218,220],"h2",{"id":219},"static-by-default","Static by default",[171,222,223,224,227,228,231,232,235,236,239],{},"A stock Astro project has no adapter and no ",[182,225,226],{},"output: 'server'",". The ",[207,229,230],{"href":60},"build"," runs ",[182,233,234],{},"npm run build",", produces ",[182,237,238],{},"dist\u002F",", and Lucity serves those files from a small static web server. No Node process runs at all.",[171,241,242],{},"That is the cheapest way to run a site here. It also means anything that executes per request is unavailable: no API endpoints, no server islands, no session handling, no reading a database on page load. Content is fixed at build time, so publishing new content means a new build.",[171,244,245,246,249,250,253,254,256],{},"If your ",[182,247,248],{},"astro.config.mjs"," sets ",[182,251,252],{},"outDir",", the builder reads it rather than assuming ",[182,255,238],{},".",[217,258,260],{"id":259},"server-rendering-when-you-need-it","Server rendering when you need it",[171,262,263],{},"Add the Node adapter and the deployment changes shape:",[175,265,267],{"className":177,"code":266,"language":179,"meta":180,"style":180},"npx astro add node\n",[182,268,269],{"__ignoreMap":180},[185,270,271,274,277,280],{"class":187,"line":188},[185,272,273],{"class":191},"npx",[185,275,276],{"class":195}," astro",[185,278,279],{"class":195}," add",[185,281,282],{"class":195}," node\n",[171,284,285,286,289],{},"That writes an adapter into your config and switches the build to produce a server. Detection then starts it through your ",[182,287,288],{},"start"," script, so make sure you have one:",[175,291,295],{"className":292,"code":293,"language":294,"meta":180,"style":180},"language-json shiki shiki-themes gruvbox-dark-medium gruvbox-dark-medium gruvbox-dark-medium","{\n  \"scripts\": {\n    \"start\": \"node .\u002Fdist\u002Fserver\u002Fentry.mjs\"\n  }\n}\n","json",[182,296,297,303,322,344,350],{"__ignoreMap":180},[185,298,299],{"class":187,"line":188},[185,300,302],{"class":301},"si-ur","{\n",[185,304,306,309,313,316,319],{"class":187,"line":305},2,[185,307,308],{"class":301},"  \"",[185,310,312],{"class":311},"slqHI","scripts",[185,314,315],{"class":301},"\"",[185,317,318],{"class":301},":",[185,320,321],{"class":301}," {\n",[185,323,325,328,330,332,334,337,341],{"class":187,"line":324},3,[185,326,327],{"class":301},"    \"",[185,329,288],{"class":311},[185,331,315],{"class":301},[185,333,318],{"class":301},[185,335,336],{"class":301}," \"",[185,338,340],{"class":339},"sIi04","node .\u002Fdist\u002Fserver\u002Fentry.mjs",[185,342,343],{"class":301},"\"\n",[185,345,347],{"class":187,"line":346},4,[185,348,349],{"class":301},"  }\n",[185,351,353],{"class":187,"line":352},5,[185,354,355],{"class":301},"}\n",[171,357,358,359,362],{},"The adapter reads the ",[182,360,361],{},"PORT"," Lucity injects. From that point on you have API routes, per-request rendering and everything else a server can do, and you are paying for a running container.",[171,364,365,366,369,370,373,374,376],{},"Use ",[182,367,368],{},"output: 'static'"," with selected pages marked ",[182,371,372],{},"export const prerender = false",", or ",[182,375,226],{}," with the reverse, depending on which side the majority of your pages fall on.",[378,379,380,381,384,385,388],"note",{},"Adapters for other hosts, ",[182,382,383],{},"@astrojs\u002Fvercel"," and friends, produce output shaped for those platforms. On Lucity use ",[182,386,387],{},"@astrojs\u002Fnode",", which produces a plain Node server that runs anywhere.",[217,390,392],{"id":391},"content-images-and-data","Content, images and data",[171,394,395,396,399],{},"A static Astro build talks to APIs at build time, so any database or CMS it reads must be reachable from the build. For a ",[207,397,398],{"href":72},"PostgreSQL database"," on Lucity, that means the static path will not work: the database is only reachable from inside the environment at runtime. Use the Node adapter if your pages need live data.",[171,401,402,403,406],{},"Images processed by ",[182,404,405],{},"astro:assets"," are optimized during the build, which is memory-hungry on large sites. If a build dies without an error message, that is usually why.",[171,408,409,410,413],{},"User uploads belong in a ",[207,411,412],{"href":76},"bucket"," regardless of which mode you choose, since neither a static server nor a container keeps files between rollouts.",[217,415,417],{"id":416},"next-steps","Next steps",[419,420,421,427,432],"ul",{},[422,423,424,426],"li",{},[207,425,59],{"href":60}," for detection and build caching",[422,428,429,431],{},[207,430,67],{"href":68}," to put the site on your own hostname",[422,433,434,436],{},[207,435,75],{"href":76}," for anything users upload",[438,439,440],"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 .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 .si-ur, html code.shiki .si-ur{--shiki-light:#A89984;--shiki-default:#A89984;--shiki-dark:#A89984}html pre.shiki code .slqHI, html code.shiki .slqHI{--shiki-light:#689D6A;--shiki-default:#689D6A;--shiki-dark:#689D6A}html pre.shiki code .sIi04, html code.shiki .sIi04{--shiki-light:#83A598;--shiki-default:#83A598;--shiki-dark:#83A598}",{"title":180,"searchDepth":305,"depth":305,"links":442},[443,444,445,446],{"id":219,"depth":305,"text":220},{"id":259,"depth":305,"text":260},{"id":391,"depth":305,"text":392},{"id":416,"depth":305,"text":417},"Deploy an Astro site on Lucity, static by default and server rendered when you add an adapter.","md",null,{},{"title":27},{"title":166,"description":447},"K2Pjag_vPgnYCrWsHk8Do81KuccFwnfil_C60Q7YihM",[455,457],{"title":23,"path":24,"stem":25,"description":456,"children":-1},"Deploy a SvelteKit app on Lucity. One adapter change stands between a fresh project and a running service.",{"title":31,"path":32,"stem":33,"description":458,"children":-1},"Deploy an Express API on Lucity. Three requirements, none of them platform-specific.",[460,463,465,468,471,473,474,476,479,482,485,488,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,534,538,542],{"path":6,"title":461,"description":462},"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":464,"title":9,"description":449},"\u002Fdocs\u002Fguides\u002F.navigation",{"path":16,"title":466,"description":467},"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":469,"description":470},"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":472,"description":456},"Deploy a SvelteKit app",{"path":28,"title":166,"description":447},{"path":32,"title":475,"description":458},"Deploy an Express API",{"path":36,"title":477,"description":478},"Deploy a FastAPI service","Deploy a FastAPI service on Lucity. Detection is picky about layout, and the fix is one setting.",{"path":40,"title":480,"description":481},"Deploy a Django project","Deploy a Django project on Lucity, with migrations that run themselves and static files that do not.",{"path":44,"title":483,"description":484},"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":486,"description":487},"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":489,"description":490},"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":492},"Services are the deployable units of a project: what they are, how they are configured, and how they scale.",{"path":56,"title":55,"description":494},"How a deployment goes live on Lucity, and the ways to trigger one.",{"path":60,"title":59,"description":496},"How Lucity turns your source code into a container image.",{"path":64,"title":63,"description":498},"Configuration for your services: service variables, shared variables, and dynamic variables.",{"path":68,"title":67,"description":500},"Put a service on the internet. Use a platform hostname for quick tests, or a domain you own.",{"path":72,"title":71,"description":502},"Managed PostgreSQL databases, replicated and backed up, connected to your services without copying credentials.",{"path":76,"title":75,"description":504},"S3-compatible buckets for uploads, exports and anything else your service needs to keep.",{"path":80,"title":79,"description":506},"Persistent disks for services that need to keep state on the filesystem.",{"path":84,"title":83,"description":508},"A Redis®-compatible key-value store for caching, sessions and queues.",{"path":88,"title":87,"description":510},"Workspaces represent your organization in Lucity, with their own members, isolation and billing.",{"path":92,"title":91,"description":512},"Projects group services, databases and the environments they run in.",{"path":96,"title":95,"description":514},"Development, staging, production: isolated copies of the same application.",{"path":100,"title":99,"description":516},"Download a project as a Helm chart and run it on a Kubernetes cluster of your own.",{"path":104,"title":103,"description":518},"The GraphQL API behind the dashboard, with an interactive playground.",{"path":108,"title":107,"description":520},"Deploy and manage your services from a terminal or a CI pipeline.",{"path":112,"title":111,"description":522},"Deploy and manage your services from Claude Code, Codex, Cursor or any other MCP client.",{"path":116,"title":115,"description":524},"CPU and memory for every service, activity for every database, and disk usage for every volume.",{"path":120,"title":119,"description":526},"What your services print while they run, and the output of every deployment step.",{"path":124,"title":123,"description":528},"Plans, resource usage, the free trial, and what happens when a payment fails.",{"path":128,"title":127,"description":530},"Run the whole platform on a Kubernetes cluster you own, using the same two Helm charts we run ourselves.",{"path":532,"title":533,"description":449},"\u002Flegal\u002F.navigation","Legal",{"path":535,"title":536,"description":537},"\u002Flegal\u002Fdata-processing-agreement","Data Processing Agreement","How Lucity processes personal data on your behalf.",{"path":539,"title":540,"description":541},"\u002Flegal\u002Fprivacy-policy","Privacy Policy","How Lucity handles your data.",{"path":543,"title":544,"description":545},"\u002Flegal\u002Fterms-of-use","Terms of Use","Terms governing your use of Lucity.",1793630526015]