Control your apps and how they’re built and deployed on Upsun Cloud with YAML configuration.
Within a single project, you can have one or more apps and each app can have multiple instances.
Instances are where the same code can be run with different configurations,
such as one for external communication and one for background processes.
Apps and instances use similar properties, with minor differences depending on the image type that you choose:
You might have multiple apps you want to run from a single Git repository,
such as a RESTful web service and a front-end or a main website and a blog.
In such cases, you configure each app separately and define the relationships among them.
See the various ways to set up a multi-app project.
Your app generally needs to undergo some steps to be turned from the code in your Git repository into a running app.
If you’re running a PHP or Node.js app, this starts with the build flavor,
which runs a default set of tasks.
Then any global dependencies can be installed.Once these optional tasks are done, you can run hooks at various points in the process.
Hooks are places for your custom scripts to control how your app is built and deployed.
Once your app is built, it needs a defined way to communicate with the outside world.
Define its behavior with a web instance.
There you can set what command runs every time your app is restarted,
how dynamic requests are handled, and how to respond with static files.
Response compression reduces payload sizes and generally increases your app’s response times.
Requests for static files that are served directly by Upsun Cloud are compressed automatically
using either gzip or Brotli compression if:
The request headers for the file support gzip or Brotli compression.
The file is served directly from disk by Upsun Cloud and not passed through your application.
The file would be served with a cache expiration time in the future.
The file type is one of: HTML, JavaScript, JSON, PDF, PostScript, SVG, CSS, CSV, plain text, or XML.
Also, if there is a request for a file and another file exists with the same name plus a .gz or .br extension,
the compressed file is served regardless of the original file type.
So a request for styles.css that accepts a gzipped file (according to the request headers)
automatically returns a styles.css.gz file if it exists.
This approach supports any file type and offers some CPU optimization, especially if the cache lifetime is short.Dynamic responses generated by your app aren’t compressed by default,
because compressing them reintroduces the theoretical BREACH attack surface.
If your framework mitigates BREACH, which most do by default,
you can opt in per location with the
dynamic_compression setting.
Unlike other runtimes, most PHP applications do not have a start command. There is a daemon running configured to work automatically with the web server. More often than not there will be a single entry-point a “front-controller”. In the case of PHP the passthru property is a string with the location of the front-controller rather than a boolean.
The following example shows a setup for a PHP app with comments to explain the settings.
Last modified on September 16, 2026
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Upsun Developer","description":"Upsun Developer — documentation, guides, and more.","colors":{"primary":"#6046ff","light":"#F7F8F8","dark":"#646F75"},"logo":{"light":"https://mintcdn.com/upsun-c9761871/WSCgazBk0GWUPP4l/logo/Upsun-dev-center-light.svg?fit=max\u0026auto=format\u0026n=WSCgazBk0GWUPP4l\u0026q=85\u0026s=c35e42815c3d17de292fb0a86d41aa5f","dark":"https://mintcdn.com/upsun-c9761871/WSCgazBk0GWUPP4l/logo/Upsun-dev-center-dark.svg?fit=max\u0026auto=format\u0026n=WSCgazBk0GWUPP4l\u0026q=85\u0026s=6bdea7a02f9b19da987e3502457d1ce8","href":"https://developer.upsun.com/"},"favicon":"https://mintcdn.com/upsun-c9761871/zc3aDujkEk92gVGr/favicon.png?fit=max\u0026auto=format\u0026n=zc3aDujkEk92gVGr\u0026q=85\u0026s=3b2ecb4deccafac0ea68acf519ab577b","api":{"examples":{"prefill":true}},"appearance":{"default":"system"},"background":{"color":{"light":"#F7F8F8","dark":"#0E1113"}},"navbar":{"links":[{"href":"https://auth.upsun.com/","label":"Console"},{"href":"https://upsun.com/demo/","label":"Watch a demo"}],"primary":{"type":"button","label":"Free trial","href":"https://auth.upsun.com/register"}},"footer":{"socials":{"github":"https://github.com/upsun","youtube":"https://www.youtube.com/@upsundotcom","x":"https://x.com/upsundotcom","linkedin":"https://www.linkedin.com/company/upsundotcom"},"links":[{"header":"Docs","items":[{"label":"Documentation","href":"/docs/get-started"},{"label":"Tutorials","href":"/tutorials"},{"label":"API Reference","href":"/api"},{"label":"CLI Reference","href":"/cli"}]},{"header":"Resources","items":[{"label":"Changelog","href":"/changelog"},{"label":"Upsun Blog","href":"https://upsun.com/blog"},{"label":"Community","href":"https://community.upsun.com"},{"label":"Support","href":"/docs/get-started/here/support"}]},{"header":"Company","items":[{"label":"About","href":"https://upsun.com/about-us"},{"label":"Pricing","href":"https://upsun.com/pricing"},{"label":"Careers","href":"https://upsun.com/jobs"}]}]},"seo":{"metatags":{"robots":"index, follow","description":"Upsun User Documentation, Dev Center, news, and more."},"indexing":"all"},"fonts":{"heading":{"family":"Instrument Sans","weight":700},"body":{"family":"Instrument Sans","weight":400}},"icons":{"library":"lucide"},"integrations":{"gtm":{"tagId":"GTM-KJ4F382K"},"telemetry":{"enabled":true}},"errors":{"404":{"redirect":false,"title":"This page took an unexpected detour","description":"It might have moved, or maybe it never existed. Either way, let's get you back on track. Try searching above or head to one of these:\n\n\u003cdiv style={{textAlign: 'left'}}>\n\n\u003cColumns cols={2}>\n \u003cCard title=\"Get Started\" icon=\"rocket\" href=\"/docs/get-started\">\n Deploy your first app on Upsun\n \u003c/Card>\n \u003cCard title=\"Documentation\" icon=\"book-open\" href=\"/docs/core-concepts\">\n Explore the full documentation\n \u003c/Card>\n \u003cCard title=\"Tutorials\" icon=\"play\" href=\"/tutorials\">\n Follow step-by-step guides\n \u003c/Card>\n \u003cCard title=\"API Reference\" icon=\"code\" href=\"/api\">\n REST API and SDK reference\n \u003c/Card>\n\u003c/Columns>\n\n\u003c/div>"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"variables":{"config_platformsh":"Platform.sh","config_config_dir":".upsun/","config_config_files_app":".upsun/config.yaml","config_config_files_services":".upsun/config.yaml","config_config_files_routes":".upsun/config.yaml","config_config_files_env":".environment","config_glossary_mb":"MB","config_product_blackfire":"Upsun Blackfire","config_product_cloud":"Upsun Cloud","config_product_dispatch":"Upsun Dispatch","config_vendor_name":"Upsun","config_vendor_cli":"upsun","config_vendor_alt":"upsun","config_vendor_prefix":"UPSUN","config_vendor_community_url":"https://community.upsun.com/","config_vendor_hostname":"platformsh.site","config_vendor_host":"upsun.com","config_vendor_docs":"https://developer.upsun.com","config_vendor_api":"https://api.upsun.com","config_vendor_console":"https://console.upsun.com","config_vendor_sales":"https://upsun.com/contact-us/","config_vendor_support_url":"https://support.upsun.com","config_vendor_support_ticket":"https://support.upsun.com/hc/en-us/requests/new?ticket_form_id=35294051960082","config_vendor_support_feature":"https://support.upsun.com/hc/en-us/requests/new?ticket_form_id=37982573191442","config_vendor_support_requests":"https://support.upsun.com/hc/en-us/requests","config_vendor_register":"https://auth.upsun.com/register/","meta_version_solr":"10.0","meta_version_composable":"26.05","meta_version_nodejs":"26","meta_version_python":"3.14","meta_version_php_latest":"8.5"},"styling":{"latex":true},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"upsun-c9761871","hasAudioNarration":false,"actualSubdomain":"upsun-c9761871","customDomains":["developer.upsun.com"],"gitSource":{"type":"github","owner":"upsun","repo":"devcenter-mintlify","deployBranch":"main","contentDirectory":"contents","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae143a71208be8074bff486","collectionId":"26791ad0-a645-4cae-9dad-5867b2c4e7c0","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae143a71208be8074bff486"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae143a71208be8074bff486","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Cloud","count":543},{"language":"default","tag":"API","count":271},{"language":"default","tag":"OpenAPI Reference","count":263},{"language":"default","tag":"Docs","count":255},{"language":"default","tag":"Configure Apps \u0026 Services","count":79},{"language":"default","tag":"Get Started","count":41},{"language":"default","tag":"Manage Projects","count":36},{"language":"default","tag":"Configure apps","count":30},{"language":"default","tag":"Pick a Stack","count":27},{"language":"default","tag":"PHP","count":26}],"searchSettings":{"maxResults":16}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"type":"email","email":"advocacy@upsun.com"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"styles.css","href":"/_mintlify/custom/upsun-c9761871/0cd1b08b3290f735/styles.css"}],"page":{"pagePath":"docs/configure-apps","slug":"/docs/configure-apps","pageMetadata":{"title":"Configure apps","sidebarTitle":"Overview","weight":-210,"description":"Control your apps and how they're built and deployed on Upsun Cloud with YAML configuration.\n","layout":"single","keywords":["{{config_config_files_app}}"],"href":"/docs/configure-apps/index"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Control your apps and how they’re built and deployed on Upsun Cloud with YAML configuration.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const DynamicCodeBlock=({language=`yaml`,filename,icon,lines,wrap,expandable,highlight,focus,children})=>{const{CodeBlock}=_provideComponents()||{};if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);const STORAGE_KEY=`upsun_versions_cache`;const COMPOSABLE_STORAGE_KEY=`upsun_composable_cache`;const CACHE_TTL=5*60*1e3;const API_URL=`https://meta.upsun.com/images`;const COMPOSABLE_API_URL=`https://meta.upsun.com/composable`;const DEBUG_PREFIX=`[DynamicCodeBlock cache]`;const[versionData,setVersionData]=useState(null);const[versionError,setVersionError]=useState(false);const[composableData,setComposableData]=useState(null);const[composableError,setComposableError]=useState(false);useEffect(()=>{const fetchData=async()=>{let cachedData=null;let cachedEtag=null;if(typeof localStorage!==`undefined`){try{const cached=localStorage.getItem(STORAGE_KEY);if(cached){const parsed=JSON.parse(cached);cachedData=parsed?.data||null;cachedEtag=parsed?.etag||null;if(cachedData\u0026\u0026Date.now()-parsed.timestamp\u003cCACHE_TTL){return cachedData}}}catch(err){console.error(`Failed to load from cache:`,err)}}const requestHeaders=cachedEtag?{\"If-None-Match\":cachedEtag}:{};console.debug(`${DEBUG_PREFIX} revalidating`,{storageKey:STORAGE_KEY,hasCachedData:Boolean(cachedData),hasCachedEtag:Boolean(cachedEtag)});const response=await fetch(API_URL,{headers:requestHeaders});if(response.status===304\u0026\u0026cachedData){console.debug(`${DEBUG_PREFIX} revalidated (304)`,{storageKey:STORAGE_KEY});if(typeof localStorage!==`undefined`){try{const etag=response.headers.get(`etag`)||cachedEtag;localStorage.setItem(STORAGE_KEY,JSON.stringify({data:cachedData,etag,timestamp:Date.now()}))}catch(err){console.error(`Failed to refresh cache metadata:`,err)}}return cachedData}if(!response.ok)throw new Error(`API request failed: ${response.statusText}`);const data=await response.json();const etag=response.headers.get(`etag`);console.debug(`${DEBUG_PREFIX} refreshed (200)`,{storageKey:STORAGE_KEY,etag});if(typeof localStorage!==`undefined`){try{localStorage.setItem(STORAGE_KEY,JSON.stringify({data,etag,timestamp:Date.now()}))}catch(err){console.error(`Failed to cache data:`,err)}}return data};fetchData().then(data=>setVersionData(data)).catch(err=>console.error(`Failed to fetch version data:`,err))},[]);const findHighestVersion=versionsMap=>{if(!versionsMap||Object.keys(versionsMap).length===0)return null;const entries=Object.entries(versionsMap);const active=entries.filter(([,v])=>v.upsun\u0026\u0026v.upsun.status===`supported`||v.upsun\u0026\u0026v.upsun.status===`deprecated`);const candidates=active.length>0?active:entries;let[highestName]=candidates[0];for(let i=1;i\u003ccandidates.length;i++){const[currentName]=candidates[i];const cp=currentName.split(`.`).map(Number);const hp=highestName.split(`.`).map(Number);for(let j=0;j\u003cMath.max(cp.length,hp.length);j++){if((cp[j]||0)>(hp[j]||0)){highestName=currentName;break}else if((cp[j]||0)\u003c(hp[j]||0)){break}}}return highestName};const getVersion=(lang,requestedVersion=`latest`)=>{if(lang===`composable`){if(!composableData||!composableData.versions||Object.keys(composableData.versions).length===0)return null;if(requestedVersion\u0026\u0026requestedVersion!==`latest`){return requestedVersion in composableData.versions?requestedVersion:null}return findHighestVersion(composableData.versions)}if(!versionData)return null;const imageData=versionData[lang];if(!imageData||!imageData.versions||Object.keys(imageData.versions).length===0){return null}if(requestedVersion\u0026\u0026requestedVersion!==`latest`){return requestedVersion in imageData.versions?requestedVersion:null}return findHighestVersion(imageData.versions)};let code=typeof children===`string`?children:String(children||``);const codeLines=code.split(`\n`);while(codeLines.length>0\u0026\u0026codeLines[0].trim()===``)codeLines.shift();while(codeLines.length>0\u0026\u0026codeLines[codeLines.length-1].trim()===``)codeLines.pop();if(codeLines.length>0){const indents=codeLines.filter(line=>line.trim().length>0).map(line=>line.match(/^[ \\t]*/)[0].length);const minIndent=Math.min(...indents);code=codeLines.map(line=>line.slice(minIndent)).join(`\n`)}code=code.replace(/\\{\\{version:(.*?)\\}\\}/g,(match,params)=>{const parts=params.split(`:`);const lang=parts[0];const ver=parts[1]||`latest`;const isComposable=lang===`composable`;const hasError=isComposable?composableError:versionError;const dataReady=isComposable?composableData!==null:versionData!==null;if(hasError)return`(unavailable)`;if(dataReady){const resolvedVersion=getVersion(lang,ver);return resolvedVersion||match}return`...`});const codeBlockProps={language,...filename\u0026\u0026{filename},...icon\u0026\u0026{icon},...lines!==undefined\u0026\u0026{lines},...wrap!==undefined\u0026\u0026{wrap},...expandable!==undefined\u0026\u0026{expandable},...highlight\u0026\u0026{highlight},...focus\u0026\u0026{focus}};return _jsx(CodeBlock,{...codeBlockProps,children:code})};function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Info,Tab,Tabs,_MdxComponentBoundary}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Within a single project, you can have one or more apps and each app can have multiple instances.\nInstances are where the same code can be run with different configurations,\nsuch as one for external communication and one for background processes.\nApps and instances use similar properties, with minor differences depending on the image type that you choose:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/docs/configure-apps/app-reference/single-runtime-image`,children:`Single-runtime image`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/docs/configure-apps/app-reference/composable-image`,children:`Composable image`})}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Not sure which image type to use? See `,_jsx(_components.a,{href:`/docs/configure-apps/app-reference`,children:`choosing an image type`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`a-minimal-application`,children:`A minimal application`}),`\n`,_jsx(_components.p,{children:`To create a very basic app (for this example, using a single-runtime image), you need a few things:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A unique name not shared by any other app in the project.`}),`\n`,_jsxs(_components.li,{children:[`The runtime `,_jsx(_components.code,{children:`type`}),` defining what language it uses.`]}),`\n`,_jsxs(_components.li,{children:[`A definition of how to handle requests from the outside `,_jsx(_components.code,{children:`web`}),`.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The following example shows such a basic setup for Node.js:`}),`\n`,_jsx(_MdxComponentBoundary,{name:`DynamicCodeBlock`,children:_jsx(DynamicCodeBlock,{language:`yaml`,filename:`.upsun/config.yaml`,children:`\n # Top-level key, which contains configurations for all app containers.\n applications:\n # The app's name, which must be unique within the project.\n myapp:\n # The language and version for your app.\n type: 'nodejs:{{version:nodejs:latest}}'\n\n # The app's configuration when it's exposed to the web.\n web:\n commands:\n start: npm start\n locations:\n '/':\n # The public directory relative to the app root.\n root: 'public'\n # Forward resources to the app.\n passthru: true\n # What files to use when serving a directory.\n index: [\"index.html\"]\n # Allow files even without specified rules.\n allow: true`})}),`\n`,_jsx(Heading,{level:`2`,id:`use-multiple-apps`,children:`Use multiple apps`}),`\n`,_jsxs(_components.p,{children:[`You might have multiple apps you want to run from a single Git repository,\nsuch as a RESTful web service and a front-end or a main website and a blog.\nIn such cases, you configure each app separately and define the relationships among them.\nSee the various ways to set up a `,_jsx(_components.a,{href:`/docs/configure-apps/multi-app`,children:`multi-app project`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`connect-to-services`,children:`Connect to services`}),`\n`,_jsxs(_components.p,{children:[`If you want to use one of the `,_jsx(_components.a,{href:`/docs/add-services`,children:`databases or other services Upsun Cloud provides`}),`,\nset it up by following these steps:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Configure the service based on the documentation for that service.`}),`\n`,_jsxs(_components.li,{children:[`Use the information from that service inside your app’s `,_jsxs(_components.a,{href:`/docs/configure-apps/image-properties/relationships`,children:[_jsx(_components.code,{children:`relationships`}),` definition`]}),`\nto configure how your app communicates with the service.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`control-the-build-and-deploy-process`,children:`Control the build and deploy process`}),`\n`,_jsxs(_components.p,{children:[`Your app generally needs to undergo some steps to be turned from the code in your Git repository into a running app.\nIf you’re running a PHP or Node.js app, this starts with the `,_jsx(_components.a,{href:`/docs/configure-apps/app-reference/single-runtime-image#build`,children:`build flavor`}),`,\nwhich runs a default set of tasks.\nThen any `,_jsx(_components.a,{href:`/docs/configure-apps/app-reference/single-runtime-image#dependencies`,children:`global dependencies`}),` can be installed.`]}),`\n`,_jsxs(_components.p,{children:[`Once these optional tasks are done, you can run `,_jsx(_components.a,{href:`/docs/configure-apps/hooks`,children:`hooks`}),` at various points in the process.\nHooks are places for your custom scripts to control how your app is built and deployed.`]}),`\n`,_jsx(Heading,{level:`2`,id:`configure-what’s-served`,children:`Configure what’s served`}),`\n`,_jsxs(_components.p,{children:[`Once your app is built, it needs a defined way to communicate with the outside world.\nDefine its behavior with a `,_jsxs(_components.a,{href:`/docs/configure-apps/image-properties/web`,children:[_jsx(_components.code,{children:`web`}),` instance`]}),`.\nThere you can set what command runs every time your app is restarted,\nhow dynamic requests are handled, and how to respond with static files.`]}),`\n`,_jsx(Heading,{level:`2`,id:`response-compression`,children:`Response compression`}),`\n`,_jsx(_components.p,{children:`Response compression reduces payload sizes and generally increases your app’s response times.\nRequests for static files that are served directly by Upsun Cloud are compressed automatically\nusing either gzip or Brotli compression if:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The request headers for the file support gzip or Brotli compression.`}),`\n`,_jsx(_components.li,{children:`The file is served directly from disk by Upsun Cloud and not passed through your application.`}),`\n`,_jsx(_components.li,{children:`The file would be served with a cache expiration time in the future.`}),`\n`,_jsx(_components.li,{children:`The file type is one of: HTML, JavaScript, JSON, PDF, PostScript, SVG, CSS, CSV, plain text, or XML.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Also, if there is a request for a file and another file exists with the same name plus a `,_jsx(_components.code,{children:`.gz`}),` or `,_jsx(_components.code,{children:`.br`}),` extension,\nthe compressed file is served regardless of the original file type.\nSo a request for `,_jsx(_components.code,{children:`styles.css`}),` that accepts a gzipped file (according to the request headers)\nautomatically returns a `,_jsx(_components.code,{children:`styles.css.gz`}),` file if it exists.\nThis approach supports any file type and offers some CPU optimization, especially if the cache lifetime is short.`]}),`\n`,_jsxs(_components.p,{children:[`Dynamic responses generated by your app aren’t compressed by default,\nbecause compressing them reintroduces the theoretical `,_jsx(_components.a,{href:`https://en.wikipedia.org/wiki/BREACH`,children:`BREACH`}),` attack surface.\nIf your framework mitigates BREACH, which most do by default,\nyou can opt in per location with the\n`,_jsxs(_components.a,{href:`/docs/configure-apps/image-properties/web#dynamic-response-compression`,children:[_jsx(_components.code,{children:`dynamic_compression`}),` setting`]}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`comprehensive-example`,children:`Comprehensive example`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(`h4`,{children:`PHP specifics`}),`\nUnlike other runtimes, most PHP applications do not have a start command. There is a daemon running configured to work automatically with the web server. More often than not there will be a single entry-point a “front-controller”. In the case of PHP the `,_jsx(_components.code,{children:`passthru`}),` property is a string with the location of the front-controller rather than a boolean.`]})}),`\n`,_jsx(_components.p,{children:`The following example shows a setup for a PHP app with comments to explain the settings.`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Single-runtime image`,id:`single-runtime-image`,children:_jsx(_MdxComponentBoundary,{name:`DynamicCodeBlock`,children:_jsx(DynamicCodeBlock,{language:`yaml`,filename:`.upsun/config.yaml`,children:`\n applications:\n # The app's name, which must be unique within the project.\n \u003cAPP_NAME>:\n # The language and version for your app.\n type: 'php:{{version:php:latest}}'\n\n # Relationships enable an app container's access to a service or another app.\n # The example below shows simplified configuration leveraging a default service\n # (identified from the relationship name) and a default endpoint.\n # See the Application reference for all options for defining relationships and endpoints.\n relationships:\n mysql:\n\n # Scripts that are run as part of the build and deploy process.\n hooks:\n # Build hooks can modify app files on disk but not access any services like databases.\n build: ./build.sh\n # Deploy hooks can access services but the file system is now read-only.\n deploy: ./deploy.sh\n # Post deploy hooks run when the app is accepting outside requests.\n post_deploy: ./post_deploy.sh\n\n # Define writable, persistent filesystem mounts.\n # The key is the directory path relative to the application root.\n # In this case, \\`web-files\\` is just a unique name for the mount.\n mounts:\n 'web/files':\n source: storage\n source_path: 'web-files'\n\n # The app's configuration when it's exposed to the web.\n web:\n locations:\n '/':\n # The app's public directory relative to its root.\n root: 'public'\n # A front controller to determine how to handle requests.\n passthru: '/app.php'\n # Allow uploaded files to be served, but don't run scripts.\n # Missing files get sent to the front controller.\n '/files':\n root: 'web/files'\n scripts: false\n allow: true\n passthru: '/app.php'\n\n services:\n mysql:\n type: mariadb:{{version:mariadb:latest}}`})})}),_jsx(Tab,{title:`Composable image`,id:`composable-image`,children:_jsx(_MdxComponentBoundary,{name:`DynamicCodeBlock`,children:_jsx(DynamicCodeBlock,{language:`yaml`,filename:`.upsun/config.yaml`,children:`\n applications:\n # The app's name, which must be unique within the project.\n \u003cAPP_NAME>:\n # The list of packages you want installed (from the Upsun Cloud collection\n # of supported runtimes and/or from Nixpkgs).\n # For more information, see the Composable image page in the App reference section.\n type: \"composable:{{version:composable:latest}}\"\n stack:\n runtimes:\n - \"php@8.4\":\n # The list of PHP extensions you want installed.\n extensions:\n - apcu\n - ctype\n - iconv\n - mbstring\n - pdo_pgsql\n - sodium\n - xsl\n disabled_extensions:\n - gd\n - \"nodejs@{{version:nodejs:latest}}\"\n packages:\n - yarn\n - imagemagick\n - package: wkhtmltopdf\n channel: unstable\n # Relationships enable an app container's access to a service or another app.\n # The example below shows simplified configuration leveraging a default service\n # (identified from the relationship name) and a default endpoint.\n # See the Application reference for all options for defining relationships and endpoints.\n relationships:\n mysql:\n\n # Scripts that are run as part of the build and deploy process.\n hooks:\n # Build hooks can modify app files on disk but not access any services like databases.\n build: ./build.sh\n # Deploy hooks can access services but the file system is now read-only.\n deploy: ./deploy.sh\n # Post deploy hooks run when the app is accepting outside requests.\n post_deploy: ./post_deploy.sh\n\n # Define writable, persistent filesystem mounts.\n # The key is the directory path relative to the application root.\n # In this case, \\`web-files\\` is just a unique name for the mount.\n mounts:\n 'web/files':\n source: storage\n source_path: 'web-files'\n\n # The app's configuration when it's exposed to the web.\n web:\n locations:\n '/':\n # The app's public directory relative to its root.\n root: 'public'\n # A front controller to determine how to handle requests.\n passthru: '/app.php'\n # Allow uploaded files to be served, but don't run scripts.\n # Missing files get sent to the front controller.\n '/files':\n root: 'web/files'\n scripts: false\n allow: true\n passthru: '/app.php'\n\n services:\n mysql:\n type: mariadb:{{version:mariadb:latest}}`})})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{DynamicCodeBlock,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Configure apps","sidebarTitle":"Overview","weight":-210,"description":"Control your apps and how they're built and deployed on Upsun Cloud with YAML configuration.\n","layout":"single","keywords":["{{config_config_files_app}}"],"href":"/docs/configure-apps/index"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[152,4942,")=>null;function _cr"],[5089,5120,""],[5226,5387,""],[7077,8042,""],[13543,19242,""]]},"mdxExtracts":{"tableOfContents":[{"title":"A minimal application","slug":"a-minimal-application","depth":2,"children":[]},{"title":"Use multiple apps","slug":"use-multiple-apps","depth":2,"children":[]},{"title":"Connect to services","slug":"connect-to-services","depth":2,"children":[]},{"title":"Control the build and deploy process","slug":"control-the-build-and-deploy-process","depth":2,"children":[]},{"title":"Configure what’s served","slug":"configure-what’s-served","depth":2,"children":[]},{"title":"Response compression","slug":"response-compression","depth":2,"children":[]},{"title":"Comprehensive example","slug":"comprehensive-example","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/upsun-c9761871/426c6190a2163560/sidebar-fix.js","/_mintlify/custom/upsun-c9761871/af4757650ec2f1cc/search-override.js"],"subdomain":"upsun-c9761871","siteName":"Upsun Developer","title":"Configure apps - Upsun Developer","contextualStarterQuestions":[],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-16T21:43:22.167Z","gitLastModified":"2026-09-16T21:39:49.000Z","originalFileLocation":"docs/configure-apps/index.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Control your apps and how they\u0026#x27;re built and deployed on Upsun Cloud with YAML configuration.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Upsun Developer\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Configure apps - Upsun Developer\">\u003cmeta data-mint-head property=\"og:description\" content=\"Control your apps and how they\u0026#x27;re built and deployed on Upsun Cloud with YAML configuration.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Upsun Developer\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developer.upsun.com/docs/configure-apps\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://upsun-c9761871.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Configure+apps\u0026amp;description=Control+your+apps+and+how+they%27re+built+and+deployed+on+Upsun+Cloud+with+YAML+configuration.%0A\u0026amp;theme=a5db750ae46123aa22d266f2\u0026amp;signature=1e8f2cccd6940675908014009305e7dca7bf01ede8258f51948526d902eb8b2e\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Configure apps - Upsun Developer\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Control your apps and how they\u0026#x27;re built and deployed on Upsun Cloud with YAML configuration.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://upsun-c9761871.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Configure+apps\u0026amp;description=Control+your+apps+and+how+they%27re+built+and+deployed+on+Upsun+Cloud+with+YAML+configuration.%0A\u0026amp;theme=a5db750ae46123aa22d266f2\u0026amp;signature=1e8f2cccd6940675908014009305e7dca7bf01ede8258f51948526d902eb8b2e\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/upsun-c9761871/rMHAq1HO1s16sbdD/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Upsun Developer\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6046ff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developer.upsun.com/docs/configure-apps\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/configure-apps.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developer.upsun.com/#organization\",\"name\":\"Upsun Developer\",\"url\":\"https://developer.upsun.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/upsun-c9761871/WSCgazBk0GWUPP4l/logo/Upsun-dev-center-light.svg?fit=max\u0026auto=format\u0026n=WSCgazBk0GWUPP4l\u0026q=85\u0026s=c35e42815c3d17de292fb0a86d41aa5f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developer.upsun.com#website\",\"name\":\"Upsun Developer\",\"url\":\"https://developer.upsun.com\",\"publisher\":{\"@id\":\"https://developer.upsun.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developer.upsun.com/docs/configure-apps#webpage\",\"url\":\"https://developer.upsun.com/docs/configure-apps\",\"name\":\"Configure apps\",\"description\":\"Control your apps and how they're built and deployed on Upsun Cloud with YAML configuration.\",\"dateModified\":\"2026-09-16T21:39:49.000Z\",\"isPartOf\":{\"@id\":\"https://developer.upsun.com#website\"},\"breadcrumb\":{\"@id\":\"https://developer.upsun.com/docs/configure-apps#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developer.upsun.com/docs/configure-apps#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Configure Apps \u0026 Services\",\"item\":\"https://developer.upsun.com/docs/configure-apps/app-reference/single-runtime-image\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configure apps\",\"item\":\"https://developer.upsun.com/docs/configure-apps/index\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Configure apps\",\"item\":\"https://developer.upsun.com/docs/configure-apps\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://developer.upsun.com/docs/configure-apps#article\",\"headline\":\"Configure apps\",\"name\":\"Configure apps\",\"description\":\"Control your apps and how they're built and deployed on Upsun Cloud with YAML configuration.\",\"url\":\"https://developer.upsun.com/docs/configure-apps\",\"mainEntityOfPage\":{\"@id\":\"https://developer.upsun.com/docs/configure-apps#webpage\"},\"dateModified\":\"2026-09-16T21:39:49.000Z\",\"keywords\":\"{{config_config_files_app}}\",\"publisher\":{\"@id\":\"https://developer.upsun.com/#organization\"},\"isPartOf\":{\"@id\":\"https://developer.upsun.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Upsun Developer\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Upsun Developer","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Home","icon":"house","pages":[{"title":"Home","href":""}]},{"tab":"Dispatch","icon":"https://mintlify.s3.us-west-1.amazonaws.com/upsun-c9761871/images/icons/dispatch.svg","pages":[{"title":"Dispatch","href":"/dispatch"}]},{"tab":"Cloud","icon":"https://mintlify.s3.us-west-1.amazonaws.com/upsun-c9761871/images/icons/cloud.svg","anchors":[{"anchor":"Docs","icon":"book","pages":[{"mode":"custom","title":"Upsun Cloud","href":"/cloud"},{"group":"Get Started","icon":"rocket","expanded":false,"pages":[{"title":"Get Started with Upsun Cloud","sidebarTitle":"Quickstart","href":"/docs/get-started/index"},{"group":"Setup Guide","root":{"title":"Getting started with Upsun Cloud","sidebarTitle":"Introduction","href":"/docs/get-started/here/index"},"pages":[{"title":"Setup","href":"/docs/get-started/here/setup"},{"title":"Create a project","href":"/docs/get-started/here/create-project"},{"group":"Configure your project","root":{"title":"Configure your project","href":"/docs/get-started/here/configure/index"},"pages":[{"title":"JavaScript/Node.js","href":"/docs/get-started/here/configure/nodejs"},{"title":"PHP","href":"/docs/get-started/here/configure/php"},{"title":"Python","href":"/docs/get-started/here/configure/python"}]},{"title":"Set resources","href":"/docs/get-started/here/set-resources"},{"title":"Make changes to your project","sidebarTitle":"Revisions","href":"/docs/get-started/here/make-changes"},{"group":"Local development","root":{"title":"Local development","href":"/docs/get-started/here/local/index"},"pages":[{"title":"Tethered","href":"/docs/get-started/here/local/tethered"}]},{"title":"Third party integrations","href":"/docs/get-started/here/third-party"},{"title":"Get support","href":"/docs/get-started/here/support"}]},{"group":"Pick a Stack","root":{"title":"How to deploy","sidebarTitle":"Overview","href":"/docs/get-started/stacks/index"},"pages":[{"group":"PHP","root":{"title":"Deploy PHP apps on Upsun Cloud","sidebarTitle":"Overview","href":"/docs/get-started/stacks/php"},"pages":[{"group":"Laravel","root":{"title":"Deploy Laravel on Upsun Cloud","sidebarTitle":"Laravel","href":"/docs/get-started/stacks/laravel/index"},"pages":[{"title":"Get started","sidebarTitle":"Get started","href":"/docs/get-started/stacks/laravel/get-started"},{"title":"Configure environment variables","sidebarTitle":"Environment variables","href":"/docs/get-started/stacks/laravel/environment-variables"},{"title":"Set up cron jobs","sidebarTitle":"Cron jobs","href":"/docs/get-started/stacks/laravel/crons"},{"title":"Set up Redis","sidebarTitle":"Set up Redis","href":"/docs/get-started/stacks/laravel/setup-redis"},{"title":"Manage continuous observability with Upsun Blackfire","sidebarTitle":"Upsun Blackfire","href":"/docs/get-started/stacks/laravel/blackfire"},{"title":"Handle queues with Horizon","sidebarTitle":"Handle queues with Horizon","href":"/docs/get-started/stacks/laravel/laravel-horizon"},{"title":"Debug with Laravel Telescope","sidebarTitle":"Debug with Laravel Telescope","href":"/docs/get-started/stacks/laravel/laravel-telescope"},{"title":"FAQ","sidebarTitle":"FAQ","href":"/docs/get-started/stacks/laravel/faq"}]},{"group":"Symfony","root":{"title":"Deploy Symfony on Upsun Cloud","sidebarTitle":"Symfony","href":"/docs/get-started/stacks/symfony/index"},"pages":[{"title":"Get started","sidebarTitle":"Get started","href":"/docs/get-started/stacks/symfony/get-started"},{"title":"Configure environment variables","href":"/docs/get-started/stacks/symfony/environment-variables"},{"title":"Set up cron jobs","sidebarTitle":"Cron jobs","href":"/docs/get-started/stacks/symfony/crons"},{"title":"Configure workers","sidebarTitle":"Workers","href":"/docs/get-started/stacks/symfony/workers"},{"title":"Manage continuous observability with Upsun Blackfire","sidebarTitle":"Upsun Blackfire","href":"/docs/get-started/stacks/symfony/blackfire"},{"title":"Symfony integration","sidebarTitle":"Symfony integration","href":"/docs/get-started/stacks/symfony/integration"},{"title":"Local development","sidebarTitle":"Local development","href":"/docs/get-started/stacks/symfony/local"},{"title":"Symfony CLI Tips","sidebarTitle":"Symfony CLI Tips","href":"/docs/get-started/stacks/symfony/symfony-cli-tips"},{"title":"FAQ","sidebarTitle":"FAQ","href":"/docs/get-started/stacks/symfony/faq"}]}]},{"group":"JavaScript","root":{"title":"Deploy JavaScript apps on Upsun Cloud","sidebarTitle":"Overview","href":"/docs/get-started/stacks/javascript"},"pages":[{"title":"Deploy Next.js on Upsun Cloud","sidebarTitle":"Next.js","href":"/docs/get-started/stacks/nextjs"},{"group":"Express","root":{"title":"Deploy Express on Upsun Cloud","sidebarTitle":"Express","href":"/docs/get-started/stacks/express/index"},"pages":[{"title":"Add a database to Express","href":"/docs/get-started/stacks/express/add-database"}]},{"group":"Strapi","root":{"title":"Deploy Strapi on Upsun Cloud","sidebarTitle":"Strapi","href":"/docs/get-started/stacks/strapi/index"},"pages":[{"title":"Add a database to Strapi","sidebarTitle":"Add a database to Strapi","href":"/docs/get-started/stacks/strapi/add-database"}]}]},{"group":"Python","root":{"title":"Deploy Python apps on Upsun Cloud","sidebarTitle":"Overview","href":"/docs/get-started/stacks/python"},"pages":[{"title":"Deploy Django on Upsun Cloud","sidebarTitle":"Django","href":"/docs/get-started/stacks/django"},{"title":"Deploy Flask on Upsun Cloud","sidebarTitle":"Flask","href":"/docs/get-started/stacks/flask"}]},{"group":"AI","root":{"title":"How to deploy AI","href":"/docs/get-started/ai/index"},"pages":[{"title":"Host AI Agents","sidebarTitle":"AI Agents","href":"/docs/get-started/ai/aiagent"},{"title":"Hosting Model Context Protocol (MCP) Servers","sidebarTitle":"Deploy MCP","href":"/docs/get-started/ai/deploy-mcp"},{"title":"The Upsun MCP Server","href":"/docs/get-started/ai/using-the-mcp"},{"title":"Upsun Cloud performance agent","href":"/docs/get-started/ai/upsun-cloud-performance-agent"},{"title":"Upsun Cloud log-analyzer agent","href":"/docs/get-started/ai/upsun-cloud-log-analyzer-agent"}]}]}]},{"group":"Core Concepts","icon":"layers","expanded":false,"pages":[{"group":"How Upsun Cloud Works","root":{"title":"What is Upsun Cloud?","sidebarTitle":"What is Upsun Cloud?","href":"/docs/core-concepts/index"},"pages":[{"title":"Philosophy","href":"/docs/core-concepts/philosophy"}]},{"group":"Workflow Overview","root":{"title":"Workflow Overview","href":"/docs/core-concepts/workflow"},"pages":[{"group":"YAML","root":{"title":"YAML","href":"/docs/core-concepts/yaml/index"},"pages":[{"title":"What YAML is","href":"/docs/core-concepts/yaml/what-is-yaml"},{"title":"Upsun Cloud YAML structure","href":"/docs/core-concepts/yaml/yaml-structure"},{"title":"Upsun Cloud YAML tags","href":"/docs/core-concepts/yaml/platform-yaml-tags"}]},{"title":"Structure","href":"/docs/core-concepts/structure"},{"title":"Get support","href":"/docs/core-concepts/get-support"}]},{"group":"Using Upsun Cloud Effectively","root":{"title":"Using Upsun Cloud Effectively","sidebarTitle":"Best practices","href":"/docs/core-concepts/best-practices/index"},"pages":[{"title":"HTTP caching","href":"/docs/core-concepts/best-practices/http-caching"},{"title":"From monoliths through headless to microservices","sidebarTitle":"Monolith, headless or microservices?","href":"/docs/core-concepts/best-practices/oneormany"},{"title":"Keep your Git repository clean","sidebarTitle":"Clean repository","href":"/docs/core-concepts/best-practices/clean-repository"}]},{"group":"Common Tasks","root":{"title":"Common Tasks","sidebarTitle":"Common Tasks","href":"/docs/core-concepts/common-tasks/index"},"pages":[{"title":"Automate your code updates","sidebarTitle":"Automate your code updates","href":"/docs/core-concepts/common-tasks/dependency-updates"},{"title":"Restrict access to a service","sidebarTitle":"Restrict service access","href":"/docs/core-concepts/common-tasks/restrict-service-access"},{"title":"Exporting data","sidebarTitle":"Exporting data","href":"/docs/core-concepts/common-tasks/exporting"},{"title":"Upgrade to a maintained version of a runtime or service","sidebarTitle":"Upgrade runtimes and services","description":"Upgrade a runtime or service to a maintained version to avoid build failures and stay protected against known CVEs.","href":"/docs/core-concepts/upgrade-runtimes-services"}]}]},{"group":"Configure Apps \u0026 Services","icon":"settings","expanded":false,"pages":[{"group":"Configure apps","root":{"title":"Configure apps","sidebarTitle":"Overview","href":"/docs/configure-apps/index"},"pages":[{"group":"Image types","root":{"title":"Choose an image type","description":"Configure your app and control how it's built and deployed on Upsun Cloud.","href":"/docs/configure-apps/app-reference/index"},"pages":[{"title":"Single-runtime image","description":"See all of the options for controlling your apps and how they're built and deployed on Upsun Cloud.","href":"/docs/configure-apps/app-reference/single-runtime-image"},{"title":"Composable image","description":"Use the Upsun Cloud composable image to build and deploy your app.","href":"/docs/configure-apps/app-reference/composable-image"}]},{"group":"Image properties","root":{"title":"Image properties","sidebarTitle":"Overview","href":"/docs/configure-apps/image-properties/index"},"pages":[{"title":"Access","description":"An access dictionary that defines the access control for roles accessing app environments.","href":"/docs/configure-apps/image-properties/access"},{"title":"Additional hosts","description":"An additional hosts dictionary that maps hostnames to IP addresses.","href":"/docs/configure-apps/image-properties/additional_hosts"},{"title":"Workload authorizations","sidebarTitle":"Authorizations","description":"An authorizations list that grants applications and tasks narrowly-scoped access to the environment API and task operations.","href":"/docs/configure-apps/image-properties/authorizations"},{"title":"Container profile","description":"Defines the container profile of the application.","href":"/docs/configure-apps/image-properties/container_profile"},{"title":"Crons","description":"A cron dictionary that defines scheduled tasks for the app.","href":"/docs/configure-apps/image-properties/crons"},{"title":"Hooks","description":"A hooks dictionary that defines which commands run at different stages in the build and deploy process.","href":"/docs/configure-apps/image-properties/hooks"},{"title":"Mounts","description":"Directories that are writable even after the app is built.","href":"/docs/configure-apps/image-properties/mounts"},{"title":"Relationships","description":"A dictionary of relationships that defines the connections to other services and apps.","href":"/docs/configure-apps/image-properties/relationships"},{"title":"Source","description":"Contains information about the app’s source code and operations that can be run on it.","href":"/docs/configure-apps/image-properties/source"},{"title":"Variables","description":"A variables dictionary that defines variables to control the environment.","href":"/docs/configure-apps/image-properties/variables"},{"title":"Web","description":"A web instance that defines how the web application is served.","href":"/docs/configure-apps/image-properties/web"},{"title":"Workers","description":"Defines the list of worker names, which are alternate copies of the application to run as background processes.","href":"/docs/configure-apps/image-properties/workers"}]},{"group":"Advanced","pages":[{"title":"Source operations","description":"Run automated code updates via source operations.","href":"/docs/configure-apps/source-operations"},{"title":"Runtime operations","description":"Set up runtime operations to run one-off commands on your project through the Upsun Cloud CLI.","href":"/docs/configure-apps/runtime-operations"},{"group":"Configure what's served","root":{"title":"Configure what's served","sidebarTitle":"Overview","href":"/docs/configure-apps/web/index"},"pages":[{"title":"Create a basic PHP app with a front controller","sidebarTitle":"PHP with front controller","href":"/docs/configure-apps/web/php-basic"},{"title":"Rewrite requests without redirects","sidebarTitle":"Rewrite requests","href":"/docs/configure-apps/web/rewrite-requests"},{"title":"Serve directories at different paths","sidebarTitle":"Serve different paths","href":"/docs/configure-apps/web/serve-different-directories"},{"title":"Serve static sites","sidebarTitle":"Static sites","href":"/docs/configure-apps/web/static"},{"title":"Set custom headers on static content","sidebarTitle":"Custom headers","href":"/docs/configure-apps/web/custom-headers"}]},{"group":"Multiple apps","root":{"title":"Set up multiple apps in a single project","sidebarTitle":"Overview","href":"/docs/configure-apps/multi-app/index"},"pages":[{"title":"Choose a project structure","href":"/docs/configure-apps/multi-app/project-structure"},{"title":"Define routes for your multiple apps","sidebarTitle":"Define routes","href":"/docs/configure-apps/multi-app/routes"},{"title":"Define relationships between your multiple apps","sidebarTitle":"Define relationships","href":"/docs/configure-apps/multi-app/relationships"}]},{"title":"Timezones","sidebarTitle":"Timezones","description":"Learn more about the different timezones on Upsun Cloud and when you can customize them.","href":"/docs/configure-apps/timezone"},{"group":"Use build and deploy hooks","root":{"title":"Use build and deploy hooks","sidebarTitle":"Overview","href":"/docs/configure-apps/hooks/index"},"pages":[{"title":"Change hooks in different environments","href":"/docs/configure-apps/hooks/vary-hooks-by-environment"},{"title":"Comparison of hooks","href":"/docs/configure-apps/hooks/hooks-comparison"},{"title":"Use hooks with dependencies","href":"/docs/configure-apps/hooks/hooks-and-dependencies"}]},{"title":"Work with workers","sidebarTitle":"Work with workers","description":"Interact with your worker instances to handle background tasks for your apps.","href":"/docs/configure-apps/workers"},{"title":"Configure tasks to run on-demand workloads and AI agents","sidebarTitle":"Task containers","description":"Run on-demand workloads like AI agents and batch jobs alongside your apps and services, triggered from the Console or through the API.","href":"/docs/configure-apps/tasks"}]}]},{"group":"Languages","root":{"title":"Languages","sidebarTitle":"Overview","href":"/docs/languages/index"},"pages":[{"title":"C#/.NET Core","href":"/docs/languages/dotnet"},{"title":"Elixir","href":"/docs/languages/elixir"},{"title":"Go","href":"/docs/languages/go"},{"group":"Java","root":{"title":"Java","sidebarTitle":"Overview","href":"/docs/languages/java/index"},"pages":[{"title":"Moving a Java application to Upsun Cloud","sidebarTitle":"Moving to Upsun Cloud","href":"/docs/languages/java/migration"},{"title":"Performance tuning Java","sidebarTitle":"Tuning","href":"/docs/languages/java/tuning"}]},{"group":"JavaScript/Node.js","root":{"title":"JavaScript/Node.js","sidebarTitle":"Overview","href":"/docs/languages/nodejs/index"},"pages":[{"title":"Debugging","href":"/docs/languages/nodejs/debug"},{"title":"Manage Node.js versions","href":"/docs/languages/nodejs/node-version"}]},{"group":"PHP","root":{"title":"PHP","sidebarTitle":"Overview","href":"/docs/languages/php/index"},"pages":[{"title":"Extensions","href":"/docs/languages/php/extensions"},{"title":"PHP performance tuning","href":"/docs/languages/php/tuning"},{"title":"PHP-FPM sizing","href":"/docs/languages/php/fpm"},{"title":"FrankenPHP","sidebarTitle":"FrankenPHP","href":"/docs/languages/php/frankenphp"},{"title":"Using Xdebug","sidebarTitle":"Xdebug","href":"/docs/languages/php/xdebug"},{"title":"Custom Redis versions","sidebarTitle":"Custom Redis","href":"/docs/languages/php/redis"},{"title":"Swoole","sidebarTitle":"Swoole","href":"/docs/languages/php/swoole"},{"title":"Authenticated Composer repositories","sidebarTitle":"Authenticated Composer","href":"/docs/languages/php/composer-auth"},{"title":"Troubleshoot PHP","sidebarTitle":"Troubleshoot","href":"/docs/languages/php/troubleshoot"}]},{"group":"Python","root":{"title":"Python","sidebarTitle":"Overview","href":"/docs/languages/python/index"},"pages":[{"title":"Manage Python dependencies","sidebarTitle":"Manage dependencies","href":"/docs/languages/python/dependencies"},{"title":"Web servers","href":"/docs/languages/python/server"},{"title":"Manage Python versions in non-Python containers","sidebarTitle":"Python in non-Python containers","href":"/docs/languages/python/python-version"}]},{"title":"Ruby","href":"/docs/languages/ruby"},{"title":"Rust","href":"/docs/languages/rust"}]},{"group":"Services","root":{"title":"Add services","href":"/docs/add-services/index"},"pages":[{"title":"ClickHouse","href":"/docs/add-services/clickhouse"},{"title":"Elasticsearch and Enterprise Search (search service)","sidebarTitle":"Elasticsearch and Enterprise Search","href":"/docs/add-services/elasticsearch"},{"title":"Gotenberg","href":"/docs/add-services/gotenberg"},{"title":"Headless Chrome","href":"/docs/add-services/headless-chrome"},{"title":"InfluxDB (Database service)","sidebarTitle":"InfluxDB","href":"/docs/add-services/influxdb"},{"title":"Kafka (Message queue service)","sidebarTitle":"Kafka","href":"/docs/add-services/kafka"},{"title":"Memcached (Object cache)","sidebarTitle":"Memcached","href":"/docs/add-services/memcached"},{"title":"Mercure","sidebarTitle":"Mercure","href":"/docs/add-services/mercure"},{"title":"MongoDB (Database service)","sidebarTitle":"MongoDB","href":"/docs/add-services/mongodb"},{"group":"MariaDB/MySQL","root":{"title":"MariaDB/MySQL (database service)","sidebarTitle":"Overview","href":"/docs/add-services/mysql/index"},"pages":[{"title":"MariaDB read-only replication","sidebarTitle":"MariaDB read-only replication","href":"/docs/add-services/mysql/mysql-readonly-replication"},{"title":"MariaDB/MySQL external replication","sidebarTitle":"External replication","href":"/docs/add-services/mysql/mysql-replication"},{"title":"Troubleshoot MySQL","sidebarTitle":"Troubleshoot","href":"/docs/add-services/mysql/troubleshoot"}]},{"title":"Network Storage","href":"/docs/add-services/network-storage"},{"title":"OpenSearch (search service)","sidebarTitle":"OpenSearch","href":"/docs/add-services/opensearch"},{"group":"PostgreSQL","root":{"title":"PostgreSQL (Database service)","sidebarTitle":"Overview","href":"/docs/add-services/postgresql/index"},"pages":[{"title":"PostgreSQL read-only replication","sidebarTitle":"Read-only replication","href":"/docs/add-services/postgresql/postgresql-readonly-replication"}]},{"title":"RabbitMQ (message queue service)","sidebarTitle":"RabbitMQ","href":"/docs/add-services/rabbitmq"},{"title":"Redis (Object cache)","sidebarTitle":"Redis","href":"/docs/add-services/redis"},{"title":"Solr (Search service)","sidebarTitle":"Solr","href":"/docs/add-services/solr"},{"title":"Valkey","sidebarTitle":"Valkey","href":"/docs/add-services/valkey"},{"title":"Varnish","href":"/docs/add-services/varnish"},{"title":"Vault key management service","sidebarTitle":"Vault KMS","href":"/docs/add-services/vault"},{"group":"Self-hosted services","root":{"title":"Self-hosted services","sidebarTitle":"Self-hosted services","href":"/docs/add-services/self-hosted"},"pages":[{"group":"Public Docker images","root":{"title":"Self-hosted services from public Docker images","sidebarTitle":"Public Docker images","href":"/docs/add-services/docker-images/index"},"pages":[{"title":"Meilisearch","sidebarTitle":"Meilisearch","href":"/docs/add-services/docker-images/docker-meilisearch"},{"title":"n8n","sidebarTitle":"n8n","href":"/docs/add-services/docker-images/docker-n8n"}]}]}]},{"group":"Routes","root":{"title":"Define routes","sidebarTitle":"Overview","href":"/docs/routes/index"},"pages":[{"title":"Server Side Includes (SSI)","href":"/docs/routes/ssi"},{"title":"HTTP cache","href":"/docs/routes/cache"},{"title":"HTTPS","sidebarTitle":"HTTPS","href":"/docs/routes/https"},{"title":"Proxy routes","href":"/docs/routes/proxy"},{"title":"Redirects","href":"/docs/routes/redirects"}]}]},{"group":"Build, Deploy \u0026 Run","icon":"server","expanded":false,"pages":[{"title":"Build and deploy","href":"/docs/core-concepts/build-deploy"},{"group":"Local development","root":{"title":"Set up your local development environment","sidebarTitle":"Overview","href":"/docs/development/local/index"},"pages":[{"group":"Integrated environments","pages":[{"title":"Use DDEV for local development","sidebarTitle":"DDEV","href":"/docs/development/local/ddev"}]},{"group":"Supported environments","pages":[{"title":"Tethered local development","sidebarTitle":"Tethered","href":"/docs/development/local/tethered"},{"title":"Untethered local development","sidebarTitle":"Untethered","href":"/docs/development/local/untethered"}]}]},{"group":"Variables","root":{"title":"Variables overview","sidebarTitle":"Overview","href":"/docs/development/variables/index"},"pages":[{"title":"Set variables","href":"/docs/development/variables/set-variables"},{"title":"Use variables","href":"/docs/development/variables/use-variables"}]},{"group":"Development tools","root":{"title":"Development tools","href":"/docs/development/tools"},"pages":[{"title":"Access your site","href":"/docs/development/access-site"},{"title":"Transfer files to and from your app","sidebarTitle":"Transfer files","href":"/docs/development/file-transfer"},{"title":"HTTP Headers","sidebarTitle":"Headers","href":"/docs/development/headers"},{"title":"Send email from your Upsun Cloud environment using an SMTP proxy","sidebarTitle":"Email","href":"/docs/development/email"},{"title":"Pull code from a private Git repository","sidebarTitle":"Private repositories","href":"/docs/development/private-repository"},{"title":"Use Git submodules","sidebarTitle":"Git submodules","href":"/docs/development/submodules"},{"title":"Regions","href":"/docs/development/regions"},{"title":"Use Drush with Upsun Cloud","sidebarTitle":"Drush","href":"/docs/development/drush"}]},{"group":"SSH","root":{"title":"Connect securely with SSH","sidebarTitle":"Overview","href":"/docs/development/ssh/index"},"pages":[{"title":"Authenticate with SSH keys","sidebarTitle":"SSH keys","href":"/docs/development/ssh/ssh-keys"},{"title":"Troubleshoot SSH","href":"/docs/development/ssh/troubleshoot-ssh"}]},{"group":"Database management","root":{"title":"Sanitize databases","sidebarTitle":"Overview","href":"/docs/development/sanitize-db/index"},"pages":[{"title":"Sanitizing databases: MariaDB and Drupal","sidebarTitle":"MariaDB and Drupal","href":"/docs/development/sanitize-db/mariadb"},{"title":"Sanitizing databases: PostgreSQL and Django","sidebarTitle":"PostgreSQL and Django","href":"/docs/development/sanitize-db/postgresql"},{"title":"Sanitizing databases: PostgreSQL and Symfony","sidebarTitle":"PostgreSQL and Symfony","href":"/docs/development/sanitize-db/postgresql-symfony"}]}]},{"group":"Manage Projects","icon":"layout-grid","expanded":false,"pages":[{"title":"Manage projects","sidebarTitle":"Overview","href":"/docs/projects/index"},{"group":"Project settings","root":{"title":"Project settings","href":"/docs/projects/settings"},"pages":[{"title":"Change a project's region","sidebarTitle":"Change regions","href":"/docs/projects/region-migration"},{"title":"Change the project timezone","href":"/docs/projects/change-project-timezone"},{"title":"Delete a project","sidebarTitle":"Delete a project","href":"/docs/projects/delete-project"}]},{"group":"Custom domains","root":{"title":"Custom domains","sidebarTitle":"Overview","href":"/docs/domains/index"},"pages":[{"group":"Set up a custom domain","root":{"title":"Set up a custom domain","sidebarTitle":"Set up a custom domain","href":"/docs/domains/steps/index"},"pages":[{"title":"DNS management and apex domains","sidebarTitle":"DNS and apex domains","href":"/docs/domains/steps/dns"},{"title":"Configure a third-party TLS certificate","sidebarTitle":"Custom TLS certificates","href":"/docs/domains/steps/tls"},{"title":"Share subdomains across different projects","sidebarTitle":"Subdomains across projects","href":"/docs/domains/steps/subdomains"},{"title":"DNS challenge for domain ownership","sidebarTitle":"DNS challenge","href":"/docs/domains/steps/dns-challenge"},{"title":"Set up a custom domain on a preview environment","sidebarTitle":"Preview environment domains","href":"/docs/domains/steps/custom-domains-preview-environments"},{"title":"Troubleshoot domain issues","sidebarTitle":"Troubleshoot","href":"/docs/domains/troubleshoot"}]},{"group":"CDN","root":{"title":"Content delivery networks (CDNs)","sidebarTitle":"Overview","href":"/docs/domains/cdn/index"},"pages":[{"title":"Set up your Fastly CDN","sidebarTitle":"Fastly setup","href":"/docs/domains/cdn/fastly"},{"title":"Managed Fastly CDN","sidebarTitle":"Managed Fastly CDN","href":"/docs/domains/cdn/managed-fastly"},{"title":"Set up your Cloudflare CDN","sidebarTitle":"Cloudflare setup","href":"/docs/domains/cdn/cloudflare"}]}]},{"group":"Administration","root":{"title":"Administration","href":"/docs/administration/index"},"pages":[{"group":"Console","root":{"title":"Console","sidebarTitle":"Overview","href":"/docs/administration/web/index"},"pages":[{"title":"Configure a project","href":"/docs/administration/web/configure-project"},{"title":"Configure environments","sidebarTitle":"Configure environments","href":"/docs/administration/web/configure-environment"}]},{"title":"Organizations","href":"/docs/administration/organizations"},{"title":"Administer teams","sidebarTitle":"Teams","href":"/docs/administration/teams"},{"title":"Administer users","sidebarTitle":"Users","href":"/docs/administration/users"},{"title":"Pricing","href":"/docs/administration/pricing"},{"group":"Billing","root":{"title":"Billing","href":"/docs/administration/billing/index"},"pages":[{"title":"Set up a billing account and billing profile","href":"/docs/administration/billing/bp-setup"},{"title":"Add and manage payment methods","href":"/docs/administration/billing/bp-payment-method"},{"title":"View invoices","href":"/docs/administration/billing/bp-invoices"},{"title":"Monitor spending and usage","href":"/docs/administration/billing/bp-monitor-billing"},{"title":"Manage billing members on a billing profile","href":"/docs/administration/billing/bp-users"},{"title":"Edit a billing profile","href":"/docs/administration/billing/bp-edit-billing-profile"},{"title":"View discounts and commitments","href":"/docs/administration/billing/bp-discounts"},{"title":"View vouchers","href":"/docs/administration/billing/bp-vouchers"},{"title":"Transfer an organization to a different billing profile","href":"/docs/administration/billing/bp-transfers"},{"title":"Billing FAQ","href":"/docs/administration/billing/bp-faq"}]},{"title":"Server upgrades","href":"/docs/administration/servers"},{"group":"Security","root":{"title":"Security","sidebarTitle":"Overview","href":"/docs/administration/security/index"},"pages":[{"title":"Multifactor Authentication (MFA)","sidebarTitle":"Multifactor Authentication (MFA)","href":"/docs/administration/security/mfa"},{"title":"Single Sign-On (SSO)","sidebarTitle":"Single Sign-On (SSO)","href":"/docs/administration/security/sso"}]}]},{"group":"Security \u0026 compliance","root":{"title":"Security and compliance","sidebarTitle":"Overview","href":"/docs/security/index"},"pages":[{"title":"Fastly WAF","href":"/docs/security/fastly-waf"},{"title":"Upsun WAF","sidebarTitle":"Upsun WAF","href":"/docs/security/waf"},{"title":"Data retention","href":"/docs/security/data-retention"},{"title":"Project isolation","href":"/docs/security/project-isolation"}]}]},{"group":"Manage Environments","icon":"git-branch","expanded":false,"pages":[{"title":"Manage Upsun Cloud environments","sidebarTitle":"Overview","href":"/docs/environments/index"},{"group":"Backup \u0026 restore","root":{"title":"Backup \u0026 restore","href":"/docs/environments/backup-restore"},"pages":[{"title":"Back up an environment","sidebarTitle":"Back up an environment","href":"/docs/environments/backup"},{"title":"Restore an environment from a backup","sidebarTitle":"Restore an environment","href":"/docs/environments/restore"}]},{"group":"Environment settings","root":{"title":"Environment settings","href":"/docs/environments/settings"},"pages":[{"title":"Change an environment's parent","sidebarTitle":"Change parent","href":"/docs/environments/change-parent"},{"title":"Rename the default environment","sidebarTitle":"Rename the default environment","href":"/docs/environments/default-environment"},{"title":"Configure HTTP access control","sidebarTitle":"Configure HTTP access control","href":"/docs/environments/http-access-control"},{"title":"Manage search indexing for an environment","sidebarTitle":"Manage search indexing","href":"/docs/environments/search-engine-visibility"}]},{"group":"Environment actions","root":{"title":"Environment actions","href":"/docs/environments/actions"},"pages":[{"title":"Cancel an activity","href":"/docs/environments/cancel-activity"},{"title":"Deactivate an environment","sidebarTitle":"Deactivate an environment","href":"/docs/environments/deactivate-environment"}]}]},{"group":"Manage Resources","icon":"gauge","expanded":false,"pages":[{"title":"Manage resources","sidebarTitle":"Overview","href":"/docs/manage-resources/index"},{"title":"How resources work on Upsun Cloud","sidebarTitle":"How resources work","href":"/docs/manage-resources/how-resources-work"},{"group":"Configure resources","root":{"title":"Configure resources","href":"/docs/manage-resources/configure"},"pages":[{"title":"Resource initialization","sidebarTitle":"Resource initialization","href":"/docs/manage-resources/resource-init"},{"title":"Resource configuration","sidebarTitle":"Resource configuration","href":"/docs/manage-resources/adjust-resources"},{"title":"Project build resources","sidebarTitle":"Project build resources","href":"/docs/manage-resources/build-resources"}]},{"group":"Scaling","root":{"title":"Scaling","href":"/docs/manage-resources/scaling"},"pages":[{"title":"Autoscaling","sidebarTitle":"Autoscaling","href":"/docs/manage-resources/autoscaling"},{"title":"Guaranteed resources","sidebarTitle":"Guaranteed resources","href":"/docs/manage-resources/guaranteed-resources"}]},{"title":"Object storage","sidebarTitle":"Object storage","href":"/docs/manage-resources/object-storage"}]},{"group":"Observability \u0026 Metrics","icon":"activity","expanded":false,"pages":[{"title":"Increase observability","sidebarTitle":"Overview","href":"/docs/observability/index"},{"group":"Infrastructure metrics","root":{"title":"Infrastructure metrics","sidebarTitle":"Overview","href":"/docs/observability/metrics/index"},"pages":[{"title":"HTTP metrics","sidebarTitle":"HTTP metrics","href":"/docs/observability/metrics/http-metrics"},{"title":"Understand metrics","sidebarTitle":"Understand metrics","href":"/docs/observability/metrics/understand-metrics"}]},{"group":"Application metrics","root":{"title":"Application metrics","sidebarTitle":"Overview","href":"/docs/observability/application-metrics/index"},"pages":[{"title":"Monitor Cron job executions","sidebarTitle":"Monitor Cron job executions","href":"/docs/observability/application-metrics/cron-metrics"},{"title":"Understanding application observability","sidebarTitle":"Understanding application observability","href":"/docs/observability/application-metrics/understanding"},{"title":"Upsun Blackfire for PHP and Python","sidebarTitle":"Upsun Blackfire for PHP and Python","href":"/docs/observability/application-metrics/blackfire"},{"group":"Continuous profiling","pages":[{"title":"Continuous Profiling dashboard","sidebarTitle":"Dashboard","href":"/docs/observability/application-metrics/cont-prof"},{"title":"Comparing Continuous Profiling Timeframes","sidebarTitle":"Comparing Timeframes","href":"/docs/observability/application-metrics/cont-prof-comparison"},{"title":"Continuous profiling for Go","sidebarTitle":"Go continuous profiler","href":"/docs/observability/application-metrics/go"},{"title":"Continuous profiling for Java","sidebarTitle":"Java continuous profiler","href":"/docs/observability/application-metrics/java"},{"title":"Continuous profiling for Node.js","sidebarTitle":"Node.js continuous profiler","href":"/docs/observability/application-metrics/nodejs"},{"title":"Continuous profiling for PHP","sidebarTitle":"PHP continuous profiler","href":"/docs/observability/application-metrics/php"},{"title":"Continuous profiling for Python","sidebarTitle":"Python continuous profiler","href":"/docs/observability/application-metrics/python"},{"title":"Continuous profiling for Ruby","sidebarTitle":"Ruby continuous profiler","href":"/docs/observability/application-metrics/ruby"},{"title":"Continuous profiling for Rust","sidebarTitle":"Rust continuous profiler","href":"/docs/observability/application-metrics/rust"}]}]},{"group":"Logs","root":{"title":"Consume logs","sidebarTitle":"Overview","href":"/docs/observability/logs/index"},"pages":[{"title":"Log Explorer","sidebarTitle":"Log Explorer","href":"/docs/observability/logs/log-explorer"},{"title":"Access your logs","sidebarTitle":"Access logs","href":"/docs/observability/logs/access-logs"},{"title":"Forward Upsun Cloud and Upsun Blackfire logs","sidebarTitle":"Forward Upsun Cloud and Upsun Blackfire logs","href":"/docs/observability/logs/forward-logs"}]}]},{"group":"Integrations","icon":"link","expanded":false,"pages":[{"sidebarTitle":"Overview","title":"External Integrations","href":"/docs/integrations/overview"},{"group":"Source integrations","root":{"title":"Source integrations","sidebarTitle":"Overview","href":"/docs/integrations/source/index"},"pages":[{"title":"Integrate with Bitbucket","sidebarTitle":"Bitbucket","href":"/docs/integrations/source/bitbucket"},{"title":"Integrate with GitHub","sidebarTitle":"GitHub","href":"/docs/integrations/source/github"},{"title":"Integrate with GitLab","sidebarTitle":"GitLab","href":"/docs/integrations/source/gitlab"},{"title":"Resolve access issues with source integrations","sidebarTitle":"Resolve access issues with source integrations","href":"/docs/integrations/source/troubleshoot"}]},{"group":"Activity scripts","root":{"title":"Activity scripts","sidebarTitle":"Overview","href":"/docs/integrations/activity/index"},"pages":[{"title":"Activity reference","sidebarTitle":"Activity reference","href":"/docs/integrations/activity/reference"},{"title":"Utility routines","sidebarTitle":"Utility routines","href":"/docs/integrations/activity/utility"},{"title":"Webhooks","href":"/docs/integrations/activity/webhooks"},{"group":"Examples","pages":[{"title":"Example: Discord","href":"/docs/integrations/activity/discord"},{"title":"Example: Slack","sidebarTitle":"Example: Slack","href":"/docs/integrations/activity/slack"}]}]},{"title":"Fastly CDN","href":"/docs/integrations/fastly-cdn"},{"title":"Health notifications","href":"/docs/integrations/notifications"}]},{"group":"Troubleshooting","icon":"circle-alert","expanded":false,"pages":[{"title":"502 error resolution guide","sidebarTitle":"502 error resolutions","href":"/docs/troubleshooting/502-errors"},{"title":"Troubleshoot development","sidebarTitle":"Development","href":"/docs/troubleshooting/general"},{"title":"Troubleshoot disks","sidebarTitle":"Disks","href":"/docs/troubleshooting/disks"},{"title":"Troubleshoot mounts","sidebarTitle":"Mounts","href":"/docs/troubleshooting/mounts"}]},{"group":"Resources","icon":"code","expanded":false,"pages":[{"title":"Glossary","sidebarTitle":"Glossary","href":"/docs/glossary/index"},{"title":"Data Register","sidebarTitle":"Data Register","href":"/docs/registry/index"},{"title":"Request features","sidebarTitle":"Request features","href":"/docs/request-features/index"}]}]},{"anchor":"Tutorials","icon":"graduation-cap","pages":[{"title":"Tutorials","href":"/tutorials"}]},{"anchor":"API","icon":"code","pages":[{"title":"API","href":"/api"}]},{"anchor":"CLI","icon":"terminal","pages":[{"title":"CLI","href":"/cli"}]},{"anchor":"Changelog","icon":"scroll-text","pages":[{"title":"Changelog","href":"/changelog"}]}]},{"tab":"Blog","icon":"newspaper","pages":[{"title":"Blog","href":"/posts"}]},{"tab":"AI","icon":"sparkles","pages":[{"title":"AI","href":"/ai"}]}]},"title":"Configure apps - Upsun Developer","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":[],"chunks":[]}