From feaedd8cc1abfe9e42fe77a84a66f24cc4533c4f Mon Sep 17 00:00:00 2001 From: acarranoqovery Date: Thu, 12 Oct 2023 12:33:54 +0000 Subject: [PATCH] deploy: d1f89742d25a54b6600c14513c78bb52aa6737cd --- 404.html | 4 +-- 8d1c77c1.7129d660.js => 8d1c77c1.93c87a6d.js | 4 +-- ...SE.txt => 8d1c77c1.93c87a6d.js.LICENSE.txt | 0 8d5726d6.48a09cfd.js | 2 ++ ...SE.txt => 8d5726d6.48a09cfd.js.LICENSE.txt | 0 8d5726d6.bee531c2.js | 2 -- community/index.html | 4 +-- components/index.html | 4 +-- contact/index.html | 4 +-- .../getting-started/basic-concepts/index.html | 4 +-- docs/getting-started/deploy-my-app/index.html | 4 +-- .../how-qovery-works/index.html | 4 +-- docs/getting-started/index.html | 4 +-- .../getting-started/install-qovery/index.html | 4 +-- .../getting-started/what-is-qovery/index.html | 4 +-- docs/getting-started/whats-next/index.html | 4 +-- docs/index.html | 4 +-- .../backup-and-restore/index.html | 4 +-- .../encryption/index.html | 4 +-- docs/security-and-compliance/gdpr/index.html | 4 +-- docs/security-and-compliance/index.html | 4 +-- docs/security-and-compliance/soc2/index.html | 4 +-- docs/useful-resources/faq/index.html | 4 +-- .../help-and-support/index.html | 4 +-- docs/using-qovery/audit-logs/index.html | 4 +-- .../advanced-settings/index.html | 4 +-- .../application-health-checks/index.html | 4 +-- .../configuration/application/index.html | 23 ++++++++---------- .../amazon-web-services/index.html | 4 +-- .../digital-ocean/index.html | 4 +-- .../google-cloud-platform/index.html | 4 +-- .../cloud-service-provider/index.html | 4 +-- .../microsoft-azure/index.html | 4 +-- .../scaleway/index.html | 4 +-- .../cluster-advanced-settings/index.html | 4 +-- .../configuration/clusters/index.html | 4 +-- .../configuration/cronjob/index.html | 4 +-- .../configuration/database/index.html | 4 +-- .../configuration/database/mongodb/index.html | 4 +-- .../configuration/database/mysql/index.html | 4 +-- .../database/postgresql/index.html | 4 +-- .../configuration/database/redis/index.html | 4 +-- .../configuration/deployment-rule/index.html | 4 +-- .../environment-variable/index.html | 4 +-- .../configuration/environment/index.html | 4 +-- docs/using-qovery/configuration/index.html | 4 +-- .../configuration/lifecycle-job/index.html | 4 +-- .../configuration/object-storage/index.html | 4 +-- .../organization/api-token/index.html | 4 +-- .../container-registry/index.html | 4 +-- .../git-repository-access/index.html | 4 +-- .../configuration/organization/index.html | 4 +-- .../organization/members-rbac/index.html | 4 +-- .../configuration/project/index.html | 4 +-- .../service-health-checks/index.html | 4 +-- .../configuration/user-account/index.html | 4 +-- .../deploying-with-auto-deploy/index.html | 4 +-- .../deploying-with-ci-cd/index.html | 4 +-- .../deployment/deployment-actions/index.html | 4 +-- .../deployment/deployment-history/index.html | 4 +-- .../deployment/deployment-pipeline/index.html | 4 +-- .../deployment-strategies/index.html | 4 +-- .../deployment/image-mirroring/index.html | 4 +-- docs/using-qovery/deployment/index.html | 4 +-- docs/using-qovery/deployment/logs/index.html | 4 +-- .../index.html | 4 +-- docs/using-qovery/index.html | 4 +-- .../integration/api-integration/index.html | 4 +-- .../integration/container-registry/index.html | 4 +-- .../circle-ci/index.html | 4 +-- .../github-actions/index.html | 4 +-- .../gitlab-ci/index.html | 4 +-- .../continuous-integration/index.html | 4 +-- .../continuous-integration/jenkins/index.html | 4 +-- .../integration/git-repository/index.html | 4 +-- docs/using-qovery/integration/index.html | 8 +++--- .../integration/monitoring/datadog/index.html | 4 +-- .../integration/monitoring/index.html | 4 +-- .../monitoring/new-relic/index.html | 4 +-- .../aws-secrets-manager/index.html | 4 +-- .../secret-manager/doppler/index.html | 4 +-- .../integration/secret-manager/index.html | 4 +-- .../using-qovery/integration/slack/index.html | 4 +-- .../integration/terraform/index.html | 4 +-- .../integration/webhook/index.html | 4 +-- docs/using-qovery/interface/cli/index.html | 4 +-- docs/using-qovery/interface/index.html | 4 +-- .../interface/rest-api/index.html | 4 +-- .../interface/terraform-interface/index.html | 4 +-- .../interface/web-interface/index.html | 4 +-- docs/using-qovery/maintenance/index.html | 4 +-- .../application-troubleshoot/index.html | 4 +-- .../cluster-troubleshoot/index.html | 4 +-- .../database-troubleshoot/index.html | 4 +-- docs/using-qovery/troubleshoot/index.html | 4 +-- .../lifecycle-troubleshoot/index.html | 4 +-- guides/advanced/build-on-top/index.html | 4 +-- .../continuous-integration/index.html | 4 +-- guides/advanced/costs-control/index.html | 4 +-- guides/advanced/deploy-api-gateway/index.html | 4 +-- .../advanced/deploy-aws-services/index.html | 4 +-- .../deploy-external-services/index.html | 4 +-- guides/advanced/deploy-frontend/index.html | 4 +-- guides/advanced/helm-chart/index.html | 4 +-- guides/advanced/index.html | 4 +-- guides/advanced/microservices/index.html | 4 +-- guides/advanced/migration/index.html | 4 +-- guides/advanced/monitoring/index.html | 4 +-- guides/advanced/monorepository/index.html | 4 +-- guides/advanced/production/index.html | 4 +-- guides/advanced/seed-database/index.html | 4 +-- guides/advanced/terraform/index.html | 4 +-- .../use-preview-environments/index.html | 4 +-- .../guide-amazon-web-services/index.html | 4 +-- .../guide-google-cloud-platform/index.html | 4 +-- .../guide-microsoft-azure/index.html | 4 +-- .../cloud-provider/guide-scaleway/index.html | 4 +-- guides/cloud-provider/index.html | 4 +-- .../create-a-database/index.html | 4 +-- guides/getting-started/debugging/index.html | 4 +-- .../deploy-your-first-application/index.html | 4 +-- guides/getting-started/index.html | 4 +-- .../managing-environment-variables/index.html | 4 +-- .../setting-custom-domain/index.html | 4 +-- guides/index.html | 4 +-- guides/tags/cloud-provider-aws/index.html | 4 +-- guides/tags/cloud-provider-azure/index.html | 4 +-- guides/tags/cloud-provider-gcp/index.html | 4 +-- .../tags/cloud-provider-scaleway/index.html | 4 +-- guides/tags/database-postgresql/index.html | 4 +-- guides/tags/framework-rails/index.html | 4 +-- guides/tags/index.html | 4 +-- guides/tags/language-javascript/index.html | 4 +-- guides/tags/language-kotlin/index.html | 4 +-- guides/tags/language-ruby/index.html | 4 +-- guides/tags/language-rust/index.html | 4 +-- guides/tags/technology-docker/index.html | 4 +-- guides/tags/technology-github/index.html | 4 +-- guides/tags/technology-helm/index.html | 4 +-- guides/tags/technology-qovery/index.html | 4 +-- guides/tags/technology-terraform/index.html | 4 +-- guides/tags/type-guide/index.html | 4 +-- guides/tags/type-tutorial/index.html | 4 +-- .../aws-sqs-lambda-with-qovery/index.html | 4 +-- .../aws-vpc-peering-with-qovery/index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../cloudwatch-integration/index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../data-seeding-in-postgres/index.html | 4 +-- .../index.html | 4 +-- .../deploy-temporal-on-kubernetes/index.html | 4 +-- .../generate-qovery-api-client/index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- guides/tutorial/grafana-install/index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../how-to-deploy-helm-charts/index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../how-to-write-a-dockerfile/index.html | 4 +-- .../index.html | 4 +-- guides/tutorial/index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../index.html | 4 +-- .../url-shortener-api-with-kotlin/index.html | 4 +-- .../index.html | 4 +-- .../use-aws-iam-roles-with-qovery/index.html | 4 +-- .../working-with-git-submodules/index.html | 4 +-- img/configuration/application/cdn-proxy.png | Bin 0 -> 91496 bytes .../application/custom-domain.png | Bin 0 -> 78474 bytes index.html | 4 +-- mailing_list/index.html | 4 +-- ...in.f5a62c3c.js => runtime~main.502c4b9e.js | 2 +- server.bundle.js | 17 ++++++------- 190 files changed, 384 insertions(+), 390 deletions(-) rename 8d1c77c1.7129d660.js => 8d1c77c1.93c87a6d.js (98%) rename 8d1c77c1.7129d660.js.LICENSE.txt => 8d1c77c1.93c87a6d.js.LICENSE.txt (100%) create mode 100644 8d5726d6.48a09cfd.js rename 8d5726d6.bee531c2.js.LICENSE.txt => 8d5726d6.48a09cfd.js.LICENSE.txt (100%) delete mode 100644 8d5726d6.bee531c2.js create mode 100644 img/configuration/application/cdn-proxy.png create mode 100644 img/configuration/application/custom-domain.png rename runtime~main.f5a62c3c.js => runtime~main.502c4b9e.js (99%) diff --git a/404.html b/404.html index 09ab3ca696..22da3bc7a7 100644 --- a/404.html +++ b/404.html @@ -26,7 +26,7 @@ - + @@ -39,7 +39,7 @@ - + diff --git a/8d1c77c1.7129d660.js b/8d1c77c1.93c87a6d.js similarity index 98% rename from 8d1c77c1.7129d660.js rename to 8d1c77c1.93c87a6d.js index 9e607fded0..cc5ea161f0 100644 --- a/8d1c77c1.7129d660.js +++ b/8d1c77c1.93c87a6d.js @@ -1,2 +1,2 @@ -/*! For license information please see 8d1c77c1.7129d660.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{287:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return l}));var r=n(1),o=n(9),i=(n(0),n(417)),a=n(424),c={last_modified_on:"2023-05-20",title:"Integrations",description:"Integrate Qovery with your existing tools and workflow",sidebar_label:"hidden",hide_pagination:!0},s={id:"using-qovery/integration",title:"Integrations",description:"Integrate Qovery with your existing tools and workflow",source:"@site/docs/using-qovery/integration.md",permalink:"/docs/using-qovery/integration",sidebar_label:"hidden",sidebar:"docs",previous:{title:"Terraform",permalink:"/docs/using-qovery/interface/terraform-interface"},next:{title:"Git Repository",permalink:"/docs/using-qovery/integration/git-repository"}},u=[],p={rightToc:u};function l(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(i.b)("wrapper",Object(r.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"Qovery integrations improve developers' experience with Qovery and make their lives easier."),Object(i.b)("p",null,"This section shows several Qovery integrations."),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/api-integration/",mdxType:"Jump"},"Api integration"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/container-registry/",mdxType:"Jump"},"Container registry"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/continuous-integration/",mdxType:"Jump"},"Continuous integration"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/git-repository/",mdxType:"Jump"},"Git repository"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/monitoring/",mdxType:"Jump"},"Monitoring"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/secret-manager/",mdxType:"Jump"},"Secret manager"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/slack/",mdxType:"Jump"},"Slack"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/terraform/",mdxType:"Jump"},"Terraform"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/webhook/",mdxType:"Jump"},"Webhook"))}l.isMDXComponent=!0},415:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=o.a.createContext({}),p=function(e){var t=o.a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):c({},t,{},e)),n},l=function(e){var t=p(e.components);return o.a.createElement(u.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),l=p(n),m=r,d=l["".concat(a,".").concat(m)]||l[m]||f[m]||i;return n?o.a.createElement(d,c({ref:t},u,{components:n})):o.a.createElement(d,c({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,a[1]=c;for(var u=2;u0)&&(t.unobserve(n),t.disconnect(),r())}))}))).observe(n))},to:p})):i.a.createElement("a",Object(r.a)({},e,{href:p}))}},424:function(e,t,n){"use strict";var r=n(0),o=n.n(r),i=n(422),a=n(415),c=n.n(a);n(133);t.a=function(e){var t=e.children,n=e.className,r=e.badge,a=e.leftIcon,s=e.rightIcon,u=e.size,p=e.target,l=e.to,f=c()("jump-to","jump-to--"+u,n),m=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},a&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+a})),o.a.createElement("div",{className:"jump-to--main"},r?o.a.createElement("span",{className:"badge badge--primary badge--right"},r):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return p?o.a.createElement("a",{href:l,target:p,className:f},m):o.a.createElement(i.a,{to:l,className:f},m)}},425:function(e,t,n){"use strict";function r(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return r}))}}]); \ No newline at end of file +/*! For license information please see 8d1c77c1.93c87a6d.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{287:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return c})),n.d(t,"metadata",(function(){return s})),n.d(t,"rightToc",(function(){return u})),n.d(t,"default",(function(){return l}));var r=n(1),o=n(9),i=(n(0),n(417)),a=n(424),c={last_modified_on:"2023-10-10",title:"Integrations",description:"Integrate Qovery with your existing tools and workflow",sidebar_label:"hidden",hide_pagination:!0},s={id:"using-qovery/integration",title:"Integrations",description:"Integrate Qovery with your existing tools and workflow",source:"@site/docs/using-qovery/integration.md",permalink:"/docs/using-qovery/integration",sidebar_label:"hidden",sidebar:"docs",previous:{title:"Terraform",permalink:"/docs/using-qovery/interface/terraform-interface"},next:{title:"Git Repository",permalink:"/docs/using-qovery/integration/git-repository"}},u=[],p={rightToc:u};function l(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(i.b)("wrapper",Object(r.a)({},p,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)("p",null,"Qovery integrations improve developers' experience with Qovery and make their lives easier."),Object(i.b)("p",null,"This section shows several Qovery integrations."),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/api-integration/",mdxType:"Jump"},"Api integration"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/container-registry/",mdxType:"Jump"},"Container registry"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/continuous-integration/",mdxType:"Jump"},"Continuous integration"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/git-repository/",mdxType:"Jump"},"Git repository"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/monitoring/",mdxType:"Jump"},"Monitoring"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/secret-manager/",mdxType:"Jump"},"Secret manager"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/slack/",mdxType:"Jump"},"Slack"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/terraform/",mdxType:"Jump"},"Terraform"),Object(i.b)(a.a,{to:"/docs/using-qovery/integration/webhook/",mdxType:"Jump"},"Webhook"))}l.isMDXComponent=!0},415:function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=o.a.createContext({}),p=function(e){var t=o.a.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):c({},t,{},e)),n},l=function(e){var t=p(e.components);return o.a.createElement(u.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=Object(r.forwardRef)((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),l=p(n),m=r,d=l["".concat(a,".").concat(m)]||l[m]||f[m]||i;return n?o.a.createElement(d,c({ref:t},u,{components:n})):o.a.createElement(d,c({ref:t},u))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,a[1]=c;for(var u=2;u0)&&(t.unobserve(n),t.disconnect(),r())}))}))).observe(n))},to:p})):i.a.createElement("a",Object(r.a)({},e,{href:p}))}},424:function(e,t,n){"use strict";var r=n(0),o=n.n(r),i=n(422),a=n(415),c=n.n(a);n(133);t.a=function(e){var t=e.children,n=e.className,r=e.badge,a=e.leftIcon,s=e.rightIcon,u=e.size,p=e.target,l=e.to,f=c()("jump-to","jump-to--"+u,n),m=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},a&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+a})),o.a.createElement("div",{className:"jump-to--main"},r?o.a.createElement("span",{className:"badge badge--primary badge--right"},r):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(s||"chevron-right")+" arrow"}))));return p?o.a.createElement("a",{href:l,target:p,className:f},m):o.a.createElement(i.a,{to:l,className:f},m)}},425:function(e,t,n){"use strict";function r(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return r}))}}]); \ No newline at end of file diff --git a/8d1c77c1.7129d660.js.LICENSE.txt b/8d1c77c1.93c87a6d.js.LICENSE.txt similarity index 100% rename from 8d1c77c1.7129d660.js.LICENSE.txt rename to 8d1c77c1.93c87a6d.js.LICENSE.txt diff --git a/8d5726d6.48a09cfd.js b/8d5726d6.48a09cfd.js new file mode 100644 index 0000000000..fcf57162e0 --- /dev/null +++ b/8d5726d6.48a09cfd.js @@ -0,0 +1,2 @@ +/*! For license information please see 8d5726d6.48a09cfd.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{288:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return p})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),i=(n(0),n(417)),r=n(426),c=(n(424),n(416)),l=n(421),s={last_modified_on:"2023-10-11",title:"Application",description:"Learn how to configure your Application on Qovery"},p={id:"using-qovery/configuration/application",title:"Application",description:"Learn how to configure your Application on Qovery",source:"@site/docs/using-qovery/configuration/application.md",permalink:"/docs/using-qovery/configuration/application",sidebar:"docs",previous:{title:"Environment",permalink:"/docs/using-qovery/configuration/environment"},next:{title:"Databases",permalink:"/docs/using-qovery/configuration/database"}},b=[{value:"Deploying from a Git Repository",id:"deploying-from-a-git-repository",children:[]},{value:"Deploying from a Container Registry",id:"deploying-from-a-container-registry",children:[]},{value:"Create an Application",id:"create-an-application",children:[]},{value:"Deployment Management",id:"deployment-management",children:[]},{value:"Configuration",id:"configuration",children:[{value:"General",id:"general",children:[]},{value:"Resources",id:"resources",children:[]},{value:"Storage",id:"storage",children:[]},{value:"Ports",id:"ports",children:[]},{value:"Health Checks",id:"health-checks",children:[]},{value:"Domains",id:"domains",children:[]}]},{value:"Connecting from the internet",id:"connecting-from-the-internet",children:[{value:"Qovery provided domains",id:"qovery-provided-domains",children:[]},{value:"Custom domains",id:"custom-domains",children:[]}]},{value:"Connecting to a database",id:"connecting-to-a-database",children:[]},{value:"Connecting to another application",id:"connecting-to-another-application",children:[]},{value:"Environment Variable",id:"environment-variable",children:[]},{value:"Secrets",id:"secrets",children:[]},{value:"Logs",id:"logs",children:[]},{value:"SSH",id:"ssh",children:[]},{value:"Clone",id:"clone",children:[]},{value:"Delete an Application",id:"delete-an-application",children:[]}],u={rightToc:b};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)(l.a,{name:"documentation",mdxType:"Assumptions"},Object(i.b)("p",null,"You have created an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"Environment"),".")),Object(i.b)("p",null,"An ",Object(i.b)("strong",{parentName:"p"},"application")," is part of a ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/project/"}),"Project")," within an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"Environment")," and is a container unit. Multiple applications can be part of the same ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"Environment"),", be connected to a set of dependencies (databases and other services), and can communicate with other applications within the same Environment."),Object(i.b)("p",null,"Qovery allows you to create and deploy applications from two different sources: Git Repository or Container Registry"),Object(i.b)("h2",{id:"deploying-from-a-git-repository"},"Deploying from a Git Repository"),Object(i.b)("p",null,"In this configuration, Qovery will pull the code from the chosen repository, build the application and deploy it on your kubernetes cluster."),Object(i.b)("p",null,"The list of Git repositories available during the setup is strictly tied to the permissions of your git account (by default Qovery can access all your repositories). If you want to restrict the Qovery access only to a few repositories, user the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/git-repository-access/"}),"GitHub Qovery Application")," (only for Github)."),Object(i.b)("h2",{id:"deploying-from-a-container-registry"},"Deploying from a Container Registry"),Object(i.b)("p",null,"In this configuration, Qovery will pull the chosen container registry an image you have pre-built and deploy it on your kubernetes cluster."),Object(i.b)("p",null,"To improve security and avoid deploying images from non-authorized registries, we have decided to restrict the list of Container Registry you can use during the setup process. Only an administrator with the right permissions can manage it from the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/container-registry/"}),"Container Registry Management page")),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,'Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see ',Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),"this section")," for more information.")),Object(i.b)("h2",{id:"create-an-application"},"Create an Application"),Object(i.b)(r.a,{headingDepth:3,mdxType:"Steps"},Object(i.b)("ol",null,Object(i.b)("li",null,Object(i.b)("p",null,'Go into the chosen environment and press the "New Service" button and then the "Create application" button'),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/creation_1.png",alt:"Creation"}))),Object(i.b)("li",null,Object(i.b)("p",null,"Select the following fields:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Application Name: give a name to your application"),Object(i.b)("li",{parentName:"ul"},"Application Source: Chose between Git Repository or Container Registry, depending on the source location of your application")),Object(i.b)("p",null,"If you want to deploy an application from a Git Repository you will have to select:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Git Repository: Select the git provider hosting your code (it can be hosted on GitHub, GitLab or Bitbucket)."),Object(i.b)("li",{parentName:"ul"},"Branch: Select branch that Qovery should use to deploy your application"),Object(i.b)("li",{parentName:"ul"},"Root Application Path: base folder in which the application resides in your repository"),Object(i.b)("li",{parentName:"ul"},"Build Mode: choose between Docker or Buildpack. For more information, go to ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#build-mode"}),"this section"))),Object(i.b)("p",null,"If you want to deploy an application from a Container Registry you will have to select:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/container-registry/"}),"Container Registry Management page")," for more information."),Object(i.b)("li",{parentName:"ul"},"Image name: the name of the image to be deployed with this application (example: postgres)"),Object(i.b)("li",{parentName:"ul"},"Image tag: the tag of the image to be deployed with this application (example: 1.0). "),Object(i.b)("li",{parentName:"ul"},"Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)"),Object(i.b)("li",{parentName:"ul"},"CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example ",'["rails", "-h", "0.0.0.0", "-p", "8080", "string"]')),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,'Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see ',Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),"this section")," for more information.")),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"}," Auto Deploy ")),Object(i.b)("p",null,"See the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deploying-with-auto-deploy/"}),"Deploying with auto-deploy feature")," section.")),Object(i.b)("li",null,Object(i.b)("p",null,"Within this section, you will need to define the resources to be assigned to your application at run time."),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"vCPU: the vCPU assigned to each instance of your application. The default is 500m (0.5 vCPU)."),Object(i.b)("li",{parentName:"ul"},"RAM: the amount of RAM assigned to each instance of your application. The default is 512MB."),Object(i.b)("li",{parentName:"ul"},"Number of instances (Application Auto-scaling): select the minimum and the maximum number of instances of your application that can run within your cluster. The number of instances running at an insant t is automatically managed by Kubernetes (Application auto-scaling) and it is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 5 minutes, your app will be auto-scaled and more instances will be added. It is transparent.\nQovery runs your application on Kubernetes and relies on ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/kubernetes-sigs/metrics-server"}),"metrics-server")," service to auto-scale your app.")),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Please note that in this section you configure the CPU/RAM allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU/RAM.")),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/application_creation_resources.png",alt:"Resources"}))),Object(i.b)("li",null,Object(i.b)("p",null,"You can now define one or more ports for your Application. Most of the application needs to be accessed by other services inside or outside your environment over different L7/L4 protocols.\nToday Qovery supports the following protocols:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"HTTPS (Select this protocol if you need to run Websockets)"),Object(i.b)("li",{parentName:"ul"},"gRPC"),Object(i.b)("li",{parentName:"ul"},"TCP"),Object(i.b)("li",{parentName:"ul"},"UDP")),Object(i.b)("p",null,"By default ports are accessible only from inside your environment. You can also expose them publicly, making them accessible over the public network via a dedicated public domain that will be assigned to your application by Qovery during the deployment (See the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"#qovery-provided-domains"}),"Qovery Provided Domains section"),"). Note that HTTPS/gRPC ports are always exposed over the port 443."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/application_creation_port.png",alt:"Application Ports"})),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Important Informations")),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Most of the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/service-health-checks/"}),"Kubernetes Health Checks")," are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly."),Object(i.b)("li",{parentName:"ul"},"Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/advanced-settings/#network-settings"}),"advanced settings section")),Object(i.b)("li",{parentName:"ul"},"Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill."),Object(i.b)("li",{parentName:"ul"},"You can configure your application to use the ",Object(i.b)("strong",{parentName:"li"},"PORT")," environment variable by adding the ",Object(i.b)("strong",{parentName:"li"},"PORT")," on your application env variables page."),Object(i.b)("li",{parentName:"ul"},"A Note on Listening IPs: It's best for your application to listen on ",Object(i.b)("inlineCode",{parentName:"li"},"0.0.0.0:$PORT"),". While most things work with ",Object(i.b)("inlineCode",{parentName:"li"},"127.0.0.1")," and ",Object(i.b)("inlineCode",{parentName:"li"},"localhost"),", some do not (NodeJS for example)"))),Object(i.b)("li",null,Object(i.b)("p",null,"(Optional) If a port has been defined for your application, you can define the health check probes to run in order to verify the state of your application"),Object(i.b)("p",null,"To know more about how to configure your Liveness and Readiness probes, have a look at ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application-health-checks/"}),"the health-checks section"))),Object(i.b)("li",null,Object(i.b)("p",null,"You will find a recap of your application setup and you can now decide to:"),Object(i.b)("h1",{id:"go-back-to-one-of-the-previous-steps-and-change-your-application-settings"},"Go back to one of the previous steps and change your application settings"),Object(i.b)("h1",{id:"create-your-application-without-deploying-it"},"Create your application without deploying it"),Object(i.b)("h1",{id:"create-and-deploy-your-application"},"Create and deploy your application"),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/application_creation_recap.png",alt:"Application"}))))),Object(i.b)("h2",{id:"deployment-management"},"Deployment Management"),Object(i.b)("p",null,"Have a look at the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/"}),"Deployment Management")," section for more information."),Object(i.b)("h2",{id:"configuration"},"Configuration"),Object(i.b)("p",null,"Once created, you can access the configuration of an application at any time via the Settings tab available on the application section"),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/settings.png",alt:"Application Settings"})),Object(i.b)("p",null,"You can find below the description of each of the tabs available in this section"),Object(i.b)("h3",{id:"general"},"General"),Object(i.b)("p",null,"General settings section allows you to set up your application name and the source code location (git repository or image registry) ."),Object(i.b)("h4",{id:"git-repository"},"Git Repository"),Object(i.b)("p",null,"If your application is built and deployed from a git repository, within this section you can:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Modify the git provider where your code is stored (it can be hosted on GitHub, GitLab or Bitbucket)."),Object(i.b)("li",{parentName:"ul"},"Modify the branch that Qovery should use for deploying your application"),Object(i.b)("li",{parentName:"ul"},"Modify ",Object(i.b)("inlineCode",{parentName:"li"},"Root Application Path")," - base folder in which the application resides in your repository")),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-general-git.png",alt:"General Settings Git"})),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Qovery supports mono repositories. ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"See our advanced guide for more details."))),Object(i.b)(c.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"If your repository contains private submodules using SSH protocol, you will need to add a secret beginning with GIT",Object(i.b)("em",{parentName:"p"},"SSH_KEY"),", containing a private SSH key with access rights to your sumbodules repositories."),Object(i.b)("p",null,"Secret names examples:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"GIT_SSH_KEY_GITHUB"),Object(i.b)("li",{parentName:"ul"},"GIT_SSH_KEY_GITLAB"),Object(i.b)("li",{parentName:"ul"},"GIT_SSH_KEY_MYAPP"))),Object(i.b)("h4",{id:"container-registry"},"Container Registry"),Object(i.b)("p",null,"If your application is deployed from an image registry, within this section you can modify:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/container-registry/"}),"Container Registry Management page")," for more information."),Object(i.b)("li",{parentName:"ul"},"Image name: the name of the image to be deployed with this application (example: postgres)"),Object(i.b)("li",{parentName:"ul"},"Image tag: the tag of the image to be deployed with this application (example: 1.0)."),Object(i.b)("li",{parentName:"ul"},"Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)"),Object(i.b)("li",{parentName:"ul"},"CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example ",'["rails", "-h", "0.0.0.0", "-p", "8080", "string"]')),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,'Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see ',Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),"this section")," for more information.")),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-general-registry.png",alt:"General Settings Git"})),Object(i.b)("h4",{id:"build-mode"},"Build Mode"),Object(i.b)("p",null,'This option is available only if you have selected "Git Repository" as source'),Object(i.b)("h4",{id:"option-1-buildpacks"},"Option 1: Buildpacks"),Object(i.b)("p",null,"To simplify the application build for the developer, Qovery supports ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://buildpacks.io"}),"Buildpacks")," out of the box. Buildpacks determine the build process for an app and which assets and runtimes should be made available to your code at runtime. If your complex apps are running multiple languages, you can also use multiple buildpacks within a single app.\nMeaning, as a developer, you don't need to write a ",Object(i.b)("inlineCode",{parentName:"p"},"Dockerfile")," to build and run your app. Qovery Buildpacks takes care of everything for you."),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Supported languages")),Object(i.b)("table",null,Object(i.b)("thead",{parentName:"table"},Object(i.b)("tr",{parentName:"thead"},Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"language"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"version"))),Object(i.b)("tbody",{parentName:"table"},Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Node.JS"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Clojure"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Python"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Java"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Gradle"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"JVM"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Grails"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Scala"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Play"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"PHP"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Go"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")))),Object(i.b)("p",null,"You don't find a cool language? ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://roadmap.qovery.com/"}),"Suggest us to support it")),Object(i.b)("h4",{id:"option-2-dockerfile"},"Option 2: Dockerfile"),Object(i.b)("p",null,"Qovery runs your application within the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.docker.com/resources/what-container"}),"Container technology"),". To build and run your application, you need to provide a valid ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.docker.com/engine/reference/builder"}),"Dockerfile"),"."),Object(i.b)("pre",null,Object(i.b)("code",Object(a.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Valid NodeJS Dockerfile"',title:'"Valid',NodeJS:!0,'Dockerfile"':!0}),"FROM node:13-alpine\nRUN mkdir -p /usr/src/app\nWORKDIR /usr/src/app\nCOPY . .\nRUN npm install\nEXPOSE 3000\nCMD node ./bin/www\n")),Object(i.b)("p",null,"After creating a Dockerfile, specify the location of your Dockerfile in ",Object(i.b)("inlineCode",{parentName:"p"},"Dockefile path")," field."),Object(i.b)("p",null,"Configuration from above will make Qovery look for the Dockerfile in ",Object(i.b)("inlineCode",{parentName:"p"},"/timescale/Dockerfile")," path of your repository (",Object(i.b)("inlineCode",{parentName:"p"},"Root Application Path")," + ",Object(i.b)("inlineCode",{parentName:"p"},"Dockerfile Path"),")."),Object(i.b)("h4",{id:"auto-deploy"},"Auto Deploy"),Object(i.b)("p",null,"See the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deploying-with-auto-deploy/"}),"Deploying with auto-deploy feature")," section."),Object(i.b)("h3",{id:"resources"},"Resources"),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-13.png",alt:"CPU"})),Object(i.b)("h4",{id:"cpu"},"CPU"),Object(i.b)("p",null,"To configure the number of CPUs that your app needs, adjust the setting in the ",Object(i.b)("inlineCode",{parentName:"p"},"Resources")," section of the application configuration."),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Default is 500m (0.5 vCPU). ")),Object(i.b)("p",null,"Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consumes fewer resources, the cluster will still reserve the selected amount of CPU."),Object(i.b)("h4",{id:"ram"},"RAM"),Object(i.b)("p",null,"To configure the amount of RAM that your app needs, adjust the setting in ",Object(i.b)("inlineCode",{parentName:"p"},"Resources")," section of the application configuration."),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Default is 512MB.")),Object(i.b)("p",null,"Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU. If your application requires more RAM than requested, it will be killed by the kubernetes scheduler."),Object(i.b)("h4",{id:"auto-scaling"},"Auto-scaling"),Object(i.b)("p",null,"Application auto-scaling is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 15 seconds, your app will be auto-scaled and more instances will be added. It is transparent. The downscale will happen if the CPU consumption is lower than 60% for at least 5 minutes.\nYou can adjust the minimum and maximum of instances you need in your application settings. Qovery runs your application on Kubernetes and relies on ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/metrics-server"}),"metrics-server")," service to auto-scale your app."),Object(i.b)("h3",{id:"storage"},"Storage"),Object(i.b)("h4",{id:"block-storage"},"Block Storage"),Object(i.b)("p",null,"The default filesystem for applications running on Qovery is ephemeral. Application data isn\u2019t persisted across deploys and restarts, which works just fine for most apps because they use managed databases to persist data."),Object(i.b)("p",null,"However, many applications need persistent disk storage that isn\u2019t ephemeral. These include:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Blogging platforms and CMSs like WordPress, Ghost, and Strapi."),Object(i.b)("li",{parentName:"ul"},"Collaboration apps like Mattermost, GitLab, and Discourse.")),Object(i.b)("p",null,"This is where Qovery block Storage comes in. Qovery applications can use storage to store data that persists across deploys and restarts, making it easy to deploy stateful applications."),Object(i.b)(c.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"For most use cases, it is better to use ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/object-storage/"}),"Object Storage")," instead of Block Storage.")),Object(i.b)("h6",{id:"use-cases"},"Use cases"),Object(i.b)("h6",{id:"-good-use-cases"},"\u2705 Good use cases"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"For I/O intensive applications (E.g. database)"),Object(i.b)("li",{parentName:"ul"},"To store temporary files")),Object(i.b)("h6",{id:"-bad-use-cases"},"\u274c Bad use cases"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"To store file > 1 TB"),Object(i.b)("li",{parentName:"ul"},"To expose files from an application (E.g. images)")),Object(i.b)("h5",{id:"types-of-block-storage"},"Types of Block Storage"),Object(i.b)("p",null,"Qovery Storage supports:"),Object(i.b)("table",null,Object(i.b)("thead",{parentName:"table"},Object(i.b)("tr",{parentName:"thead"},Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Type"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Max IOPS"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Max Throughput"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Min Size"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Max Size"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Use cases"))),Object(i.b)("tbody",{parentName:"table"},Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"fast_ssd"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"64000"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"1GB/s"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"5GB"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"10GB ",Object(i.b)("inlineCode",{parentName:"td"},"Community")," / 1TB paid plans"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Critical business applications that require sustained IOPS like databases")))),Object(i.b)("h5",{id:"configuration-1"},"Configuration"),Object(i.b)("p",null,"You can set up your Block Storage in ",Object(i.b)("inlineCode",{parentName:"p"},"Storage")," section of your application configuration."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-7.png",alt:"Application Storage"})),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Storage can be added only if the application has never been deployed before AND if it runs only with one instance (check the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#resources"}),"Resources section"),")")),Object(i.b)("h3",{id:"ports"},"Ports"),Object(i.b)("p",null,"Within this section you can define the port exposed by your application to the other services or even over the internet.\nYou can edit the existing ports or declare new ones by specifying:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Application port: this is the port exposed internally by your application for the other services. "),Object(i.b)("li",{parentName:"ul"},"Protocol: you can select the protocol used by your application : HTTP (for both standard HTTP or websocket communications), gRPC, TCP, UDP."),Object(i.b)("li",{parentName:"ul"},"Publicly exposed: it allows you to expose over the public network your service. A public domain will be assigned to your application during the deployment (see ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#connecting-from-the-internet"}),"Connectin from the internet section"),")"),Object(i.b)("li",{parentName:"ul"},"If Publicly Exposed is selected:",Object(i.b)("ul",{parentName:"li"},Object(i.b)("li",{parentName:"ul"},"External port: it is the port that can be used to access this service over the internet (when exposed publicly). Note that for HTTP and gRPC the port is set by default to 443."),Object(i.b)("li",{parentName:"ul"},"Port Name: it is the name assigned to the port. When multiple ports are exposed publicly, its value is used to route the traffic to the right port based on the called subdomain (which will contain the port name value). Since each port is exposed on the port 443, having a different subdomain is the only way to have multiple ports exposed over the internet. If not set, the default value is ",Object(i.b)("inlineCode",{parentName:"li"},"p")," (see ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#qovery-provided-domains"}),"Qovery Provided Domain section")," for more information)")))),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-15.png",alt:"Application Ports"})),Object(i.b)("h4",{id:"important-informations"},"Important Informations"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Most of the Kubernetes Health Checks]",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/service-health-checks/"}),"docs.using-qovery.configuration.service-health-checks")," are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly."),Object(i.b)("li",{parentName:"ul"},"Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/advanced-settings/#network-settings"}),"advanced settings section")),Object(i.b)("li",{parentName:"ul"},"Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill."),Object(i.b)("li",{parentName:"ul"},"You can configure your application to use the ",Object(i.b)("strong",{parentName:"li"},"PORT")," environment variable by adding the ",Object(i.b)("strong",{parentName:"li"},"PORT")," on your application env variables page."),Object(i.b)("li",{parentName:"ul"},"A Note on Listening IPs: It's best for your application to listen on ",Object(i.b)("inlineCode",{parentName:"li"},"0.0.0.0:$PORT"),". While most things work with ",Object(i.b)("inlineCode",{parentName:"li"},"127.0.0.1")," and ",Object(i.b)("inlineCode",{parentName:"li"},"localhost"),", some do not (NodeJS for example)")),Object(i.b)("h3",{id:"health-checks"},"Health Checks"),Object(i.b)("p",null,"To know more about how to configure your Liveness and Readiness probes, have a look at ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application-health-checks/"}),"the health-checks section")),Object(i.b)("h3",{id:"domains"},"Domains"),Object(i.b)("p",null,"Within this section you can customize the domain used to reach your application. "),Object(i.b)("p",null,"You can customize the domain of your application in different ways, depending on what you want to achieve:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"You want to use your own domain for this application"),Object(i.b)("li",{parentName:"ul"},"You want to modify the subdomain assigned to your application by Qovery (i.e. change ",Object(i.b)("inlineCode",{parentName:"li"},"p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh")," into ",Object(i.b)("inlineCode",{parentName:"li"},"my-app-domain.za8ad0657.bool.sh"),").")),Object(i.b)("p",null,"In both cases, you can assign the new custom domain to your application press the ",Object(i.b)("inlineCode",{parentName:"p"},"Add Domain")," button. "),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-16.png",alt:"Application Domains"})),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This configuration will be ",Object(i.b)("strong",{parentName:"p"},"automatically removed")," on every cloned environment or preview environment in order to avoid domain collision.")),Object(i.b)("h4",{id:"configuring-your-own-domain"},"Configuring your own domain"),Object(i.b)("p",null,"Once the domain is added within the Qovery console (Example: mydomain.com), you need to configure within your DNS two ",Object(i.b)("inlineCode",{parentName:"p"},"CNAME")," records pointing to the domain provided by Qovery, as shown in the UI (example: mydomain.com CNAME za7cc1b71-z4b8474b3-gtw.zc531a994.rustrocks.cloud and *.mydomain.com CNAME za7cc1b71-z4b8474b3-gtw.zc531a994.rustrocks.cloud). "),Object(i.b)("p",null,"Having a wildcard domain (example: *.mydomain.com) configured on your DNS will avoid you to modify the Qovery setup every time you want to add a new subdomain. If ",Object(i.b)("inlineCode",{parentName:"p"},"wildcard")," is not supported by your DNS provider, you will have to configure each subdomain manually."),Object(i.b)("p",null,"If the service needs to expose more than one port publicly, you can define a dedicated subdomain to redirect the traffic on the right port by setting the \u201cPort Name\u201d value within the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"#ports"}),"port settings"),"."),Object(i.b)("p",null,"From this point, Qovery will automatically handle the TLS/SSL certificate creation and renewal for the configured domain."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/custom-domain.png",alt:"Custom Domain"})),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"}," Special case - CDN in proxy mode ")),Object(i.b)("p",null,"If your service is behind a CDN using a ",Object(i.b)("inlineCode",{parentName:"p"},"proxy mode"),' (i.e. the traffic is routed through the CDN to Qovery), make sure to disable the option "Generate certificate" on the domain setup. Since the certificate of your domain is directly managed by the CDN, Qovery won\'t be able to do that for you and it will raise warnings on your application status.'),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/cdn-proxy.png",alt:"CDN Proxy"})),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"We prepared a guide and video tutorial that explains how to set up your custom domain."))),Object(i.b)("h4",{id:"change-the-auto-assigned-sub-domain"},"Change the auto assigned sub-domain"),Object(i.b)("p",null,"You can specify a different sub-domain for your application as long as it belongs to the assigned cluster domain (see ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"#qovery-provided-domains"}),"Qovery provided domains"),").\nExample: "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"your current domain is zdf72de71-z709e1a85-gtw.za8ad0659.bool.sh (so your assigned cluster domain is ",Object(i.b)("inlineCode",{parentName:"li"},"za8ad0659.bool.sh"),")"),Object(i.b)("li",{parentName:"ul"},"you can enter a new custom domain ",Object(i.b)("inlineCode",{parentName:"li"},"myfrontend.za8ad0659.bool.sh")," (since it is a subdomain of the cluster domain)")),Object(i.b)("p",null,"The application will now be accessible from both the default and the new custom domain."),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Qovery does not check collision in the domain declaration. Make sure you assign a unique subdomain within your cluster.")),Object(i.b)("h2",{id:"connecting-from-the-internet"},"Connecting from the internet"),Object(i.b)("p",null,"Your application can be reached from the internet by publicly exposing at least one of its ports (See the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"#ports"}),"Ports")," section to know more). Once this is done, Qovery will generate for you a domain to reach your application from the internet. You can also customize the domain assigned to your application and manage by yourself this assignment via the ",Object(i.b)("inlineCode",{parentName:"p"},"Domain")," section."),Object(i.b)("h3",{id:"qovery-provided-domains"},"Qovery provided domains"),Object(i.b)("p",null,"For each port publicly exposed, a domain is automatically assigned by Qovery to your application. Qovery will manage for you the networking and the TLS configuration for these domains. "),Object(i.b)("p",null,"Example: ",Object(i.b)("inlineCode",{parentName:"p"},"p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh")),Object(i.b)("p",null,"Note:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"each service deployed on the same cluster will have the same root domain assigned (example: ",Object(i.b)("inlineCode",{parentName:"li"},"za8ad0657.bool.sh"),")"),Object(i.b)("li",{parentName:"ul"},"the first characters of the domain (before the ",Object(i.b)("inlineCode",{parentName:"li"},"-"),") is based on the portName given to the port associated with this domain (See the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#ports"}),"port section"),")"),Object(i.b)("li",{parentName:"ul"},"a default domain (without the portName) is assigned to the ",Object(i.b)("inlineCode",{parentName:"li"},"default port"),"(See the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#ports"}),"port section"),"). Example ",Object(i.b)("inlineCode",{parentName:"li"},"zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh"))),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Special Case - Preview Environment"),"\nFor each port exposed publicly, an additional domain will be created with the following pattern ",Object(i.b)("inlineCode",{parentName:"p"},"portName-prId-srvName-envSourceName.cluster_domain"),":"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"portName: is the port name, as explained above"),Object(i.b)("li",{parentName:"ul"},"prID: is the id of the PR that has generated the preview environment"),Object(i.b)("li",{parentName:"ul"},"srvName: is the name of the service"),Object(i.b)("li",{parentName:"ul"},"envSourceName: is the name of the blueprint environment that has created the current preview environment")),Object(i.b)("p",null,"domain example: ",Object(i.b)("inlineCode",{parentName:"p"},"p80-123-frontend-blueprint.za8ad0657.bool.sh")),Object(i.b)("h3",{id:"custom-domains"},"Custom domains"),Object(i.b)("p",null,"If you prefer to assign your own domain to the application have a look at the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"#domains"}),"Domain section")," to know more."),Object(i.b)("h2",{id:"connecting-to-a-database"},"Connecting to a database"),Object(i.b)("p",null,"To know how to access your database from your application, ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"have a look at the database section"),"."),Object(i.b)("h2",{id:"connecting-to-another-application"},"Connecting to another application"),Object(i.b)("p",null,"To know how to access your database from your application, ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-another-application"}),"have a look at the database section"),"."),Object(i.b)("h2",{id:"environment-variable"},"Environment Variable"),Object(i.b)("p",null,"To learn how to set up environment variables in your projects and applications, navigate to ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"configuring Environment Variables")," section."),Object(i.b)("h2",{id:"secrets"},"Secrets"),Object(i.b)("p",null,"To learn how to set up secrets in your projects and applications, navigate to ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"configuring Secrets")," section."),Object(i.b)("h2",{id:"logs"},"Logs"),Object(i.b)("p",null,"To learn how to display your application logs, navigate to ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/logs/#live-logs"}),"logs section")),Object(i.b)("h2",{id:"ssh"},"SSH"),Object(i.b)("p",null,"To connect to your application via SSH, please use the via the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery SSH command")," available on our CLI."),Object(i.b)("h2",{id:"clone"},"Clone"),Object(i.b)("p",null,"You can create a clone of the service via the clone feature. A new service with the same configuration (see below for exceptions) will be created into the target environment."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/clone_service.png",alt:"Clone Service"})),Object(i.b)("p",null,"The target environment can be the same as the current environment or even another one in a completely different project."),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"}," Important information ")),Object(i.b)("p",null,"Not every configuration parameter will be copied within the new service for consistency reasons. The configuration is fully or partially copied depending on the target environment:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"same environment:",Object(i.b)("ul",{parentName:"li"},Object(i.b)("li",{parentName:"ul"},"custom domain: this setup is not copied into the new service (to avoid collision)"))),Object(i.b)("li",{parentName:"ul"},"another environment:",Object(i.b)("ul",{parentName:"li"},Object(i.b)("li",{parentName:"ul"},"custom domain: this setup is not copied into the new service (to avoid collision)"),Object(i.b)("li",{parentName:"ul"},"environment variable: aliases defined on environment variables are not copied (since the aliased env var might not exist)"),Object(i.b)("li",{parentName:"ul"},"deployment pipeline: stage setup is not copied (since the target stage might not exist)"),Object(i.b)("li",{parentName:"ul"},"number of instances: if the target environment runs on a Qovery EC2 cluster, the max number of instances is set to 1 (Qovery EC2 constraint)")))),Object(i.b)("p",null,"Please check the configuration of the new service before deploying it."),Object(i.b)("h2",{id:"delete-an-application"},"Delete an Application"),Object(i.b)(r.a,{headingDepth:3,mdxType:"Steps"},Object(i.b)("ol",null,Object(i.b)("li",null,Object(i.b)("p",null,"Choose your application")),Object(i.b)("li",null,Object(i.b)("p",null,"In the application overview, click on the ",Object(i.b)("inlineCode",{parentName:"p"},"3 dots")," button and remove the application."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-1.png",alt:"Application"}))))))}d.isMDXComponent=!0},415:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),p=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c({},t,{},e)),n},b=function(e){var t=p(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,r=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),b=p(n),d=a,m=b["".concat(r,".").concat(d)]||b[d]||u[d]||i;return n?o.a.createElement(m,c({ref:t},s,{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,r=new Array(i);r[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,r[1]=c;for(var s=2;s1?arguments[1]:void 0,n),l=r>2?arguments[2]:void 0,s=void 0===l?n:o(l,n);s>c;)t[c++]=e;return t}},420:function(e,t,n){var a=n(28).f,o=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},421:function(e,t,n){"use strict";n(420);var a=n(0),o=n.n(a),i=n(416);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},422:function(e,t,n){"use strict";var a=n(1),o=n(0),i=n.n(o),r=n(39),c=n(425),l=n(20),s=n.n(l);t.a=function(e){var t,n=e.to,l=e.href,p=n||l,b=Object(c.a)(p),u=Object(o.useRef)(!1),d=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!d&&b&&window.docusaurus.prefetch(p),function(){d&&t&&t.disconnect()}}),[p,d,b]),p&&b?i.a.createElement(r.b,Object(a.a)({},e,{onMouseEnter:function(){u.current||(window.docusaurus.preload(p),u.current=!0)},innerRef:function(e){var n,a;d&&e&&b&&(n=e,a=function(){window.docusaurus.prefetch(p)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:p})):i.a.createElement("a",Object(a.a)({},e,{href:p}))}},423:function(e,t,n){"use strict";var a=n(427),o=n(51);function i(e,t){return t.encode?t.strict?a(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,a){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===a[e]&&(a[e]={}),a[e][t[1]]=n):a[e]=n};case"bracket":return function(e,n,a){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==a[e]?a[e]=[].concat(a[e],n):a[e]=[n]:a[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=o({arrayFormat:"none"},t)),a=Object.create(null);return"string"!=typeof e?a:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),o=t.shift(),i=t.length>0?t.join("="):void 0;i=void 0===i?null:decodeURIComponent(i),n(decodeURIComponent(o),i,a)})),Object.keys(a).sort().reduce((function(e,t){var n=a[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):a},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,a){return null===n?[i(t,e),"[",a,"]"].join(""):[i(t,e),"[",i(a,e),"]=",i(n,e)].join("")};case"bracket":return function(t,n){return null===n?i(t,e):[i(t,e),"[]=",i(n,e)].join("")};default:return function(t,n){return null===n?i(t,e):[i(t,e),"=",i(n,e)].join("")}}}(t=o({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(a){var o=e[a];if(void 0===o)return"";if(null===o)return i(a,t);if(Array.isArray(o)){var r=[];return o.slice().forEach((function(e){void 0!==e&&r.push(n(a,e,r.length))})),r.join("&")}return i(a,t)+"="+i(o,t)})).filter((function(e){return e.length>0})).join("&"):""}},424:function(e,t,n){"use strict";var a=n(0),o=n.n(a),i=n(422),r=n(415),c=n.n(r);n(133);t.a=function(e){var t=e.children,n=e.className,a=e.badge,r=e.leftIcon,l=e.rightIcon,s=e.size,p=e.target,b=e.to,u=c()("jump-to","jump-to--"+s,n),d=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},r&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+r})),o.a.createElement("div",{className:"jump-to--main"},a?o.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(l||"chevron-right")+" arrow"}))));return p?o.a.createElement("a",{href:b,target:p,className:u},d):o.a.createElement(i.a,{to:b,className:u},d)}},425:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},426:function(e,t,n){"use strict";var a=n(0),o=n.n(a),i=(n(415),n(423)),r=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,i=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+r.a.stringify(l),p=Object(a.useState)(null),b=p[0],u=p[1];return o.a.createElement("div",{className:"steps steps--h"+n},t,!i&&!b&&o.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",o.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return u("yes")}},"Yes"),"\xa0\xa0",o.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&o.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",o.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},427:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/8d5726d6.bee531c2.js.LICENSE.txt b/8d5726d6.48a09cfd.js.LICENSE.txt similarity index 100% rename from 8d5726d6.bee531c2.js.LICENSE.txt rename to 8d5726d6.48a09cfd.js.LICENSE.txt diff --git a/8d5726d6.bee531c2.js b/8d5726d6.bee531c2.js deleted file mode 100644 index 901a7c3523..0000000000 --- a/8d5726d6.bee531c2.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 8d5726d6.bee531c2.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{288:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return s})),n.d(t,"metadata",(function(){return p})),n.d(t,"rightToc",(function(){return b})),n.d(t,"default",(function(){return d}));var a=n(1),o=n(9),i=(n(0),n(417)),r=n(426),c=(n(424),n(416)),l=n(421),s={last_modified_on:"2023-10-11",title:"Application",description:"Learn how to configure your Application on Qovery"},p={id:"using-qovery/configuration/application",title:"Application",description:"Learn how to configure your Application on Qovery",source:"@site/docs/using-qovery/configuration/application.md",permalink:"/docs/using-qovery/configuration/application",sidebar:"docs",previous:{title:"Environment",permalink:"/docs/using-qovery/configuration/environment"},next:{title:"Databases",permalink:"/docs/using-qovery/configuration/database"}},b=[{value:"Deploying from a Git Repository",id:"deploying-from-a-git-repository",children:[]},{value:"Deploying from a Container Registry",id:"deploying-from-a-container-registry",children:[]},{value:"Create an Application",id:"create-an-application",children:[]},{value:"Deployment Management",id:"deployment-management",children:[]},{value:"Configuration",id:"configuration",children:[{value:"General",id:"general",children:[]},{value:"Resources",id:"resources",children:[]},{value:"Storage",id:"storage",children:[]},{value:"Ports",id:"ports",children:[]},{value:"Health Checks",id:"health-checks",children:[]},{value:"Domains",id:"domains",children:[]}]},{value:"Connecting to a database",id:"connecting-to-a-database",children:[]},{value:"Connecting to another application",id:"connecting-to-another-application",children:[]},{value:"Environment Variable",id:"environment-variable",children:[]},{value:"Secrets",id:"secrets",children:[]},{value:"Logs",id:"logs",children:[]},{value:"SSH",id:"ssh",children:[]},{value:"Clone",id:"clone",children:[]},{value:"Delete an Application",id:"delete-an-application",children:[]}],u={rightToc:b};function d(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(i.b)("wrapper",Object(a.a)({},u,n,{components:t,mdxType:"MDXLayout"}),Object(i.b)(l.a,{name:"documentation",mdxType:"Assumptions"},Object(i.b)("p",null,"You have created an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"Environment"),".")),Object(i.b)("p",null,"An ",Object(i.b)("strong",{parentName:"p"},"application")," is part of a ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/project/"}),"Project")," within an ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"Environment")," and is a container unit. Multiple applications can be part of the same ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment/"}),"Environment"),", be connected to a set of dependencies (databases and other services), and can communicate with other applications within the same Environment."),Object(i.b)("p",null,"Qovery allows you to create and deploy applications from two different sources: Git Repository or Container Registry"),Object(i.b)("h2",{id:"deploying-from-a-git-repository"},"Deploying from a Git Repository"),Object(i.b)("p",null,"In this configuration, Qovery will pull the code from the chosen repository, build the application and deploy it on your kubernetes cluster."),Object(i.b)("p",null,"The list of Git repositories available during the setup is strictly tied to the permissions of your git account (by default Qovery can access all your repositories). If you want to restrict the Qovery access only to a few repositories, user the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/git-repository-access/"}),"GitHub Qovery Application")," (only for Github)."),Object(i.b)("h2",{id:"deploying-from-a-container-registry"},"Deploying from a Container Registry"),Object(i.b)("p",null,"In this configuration, Qovery will pull the chosen container registry an image you have pre-built and deploy it on your kubernetes cluster."),Object(i.b)("p",null,"To improve the security and avoid deploying images from non-authorized registries, we have decided to restrict the list of Container Registry you can use during the setup process. Only an administrator with the right permissions can manage it from the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/organization/container-registry/"}),"Container Registry Management page")),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,'Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see ',Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),"this section")," for more information.")),Object(i.b)("h2",{id:"create-an-application"},"Create an Application"),Object(i.b)(r.a,{headingDepth:3,mdxType:"Steps"},Object(i.b)("ol",null,Object(i.b)("li",null,Object(i.b)("p",null,'Go into the chosen environment and press the "New Service" button and then the "Create application" button'),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/creation_1.png",alt:"Creation"}))),Object(i.b)("li",null,Object(i.b)("p",null,"Select the following fields:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Application Name: give a name to your applicaiton"),Object(i.b)("li",{parentName:"ul"},"Application Source: Chose between Git Repository or Container Registry, depending on the source location of your application")),Object(i.b)("p",null,"If you want to deploy an application from a Git Repository you will have to select:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Git Repository: Select the git provider hosting your code (it can be hosted on GitHub, GitLab or Bitbucket)."),Object(i.b)("li",{parentName:"ul"},"Branch: Select branch that Qovery should use to deploy your application"),Object(i.b)("li",{parentName:"ul"},"Root Application Path: base folder in which the application resides in your repository"),Object(i.b)("li",{parentName:"ul"},"Build Mode: chose between Docker or Buildpack. For more information, go to ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#build-mode"}),"this section"))),Object(i.b)("p",null,"If you want to deploy an application from a Container Registry you will have to select:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/container-registry/"}),"Container Registry Management page")," for more information."),Object(i.b)("li",{parentName:"ul"},"Image name: the name of the image to be deployed with this application (example: postgres)"),Object(i.b)("li",{parentName:"ul"},"Image tag: the tag of the image to be deployed with this application (example: 1.0). "),Object(i.b)("li",{parentName:"ul"},"Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)"),Object(i.b)("li",{parentName:"ul"},"CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example ",'["rails", "-h", "0.0.0.0", "-p", "8080", "string"]')),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,'Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see ',Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),"this section")," for more information.")),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"}," Auto Deploy ")),Object(i.b)("p",null,"See the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deploying-with-auto-deploy/"}),"Deploying with auto-deploy feature")," section.")),Object(i.b)("li",null,Object(i.b)("p",null,"Within this section, you will need to define the resources to be assigned to your applicaiton at run time."),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"vCPU: the vCPU assigned to each instance of your application. The default is 500m (0.5 vCPU)."),Object(i.b)("li",{parentName:"ul"},"RAM: the amount of RAM assigned to each instance of your application. The default is 512MB."),Object(i.b)("li",{parentName:"ul"},"Number of instances (Application Auto-scaling): select the minimum and the maximum number of instances of your application that can run within your cluster. The number of instances running at an insant t is automatically managed by Kubernetes (Application auto-scaling) and it is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 5 minutes, your app will be auto-scaled and more instances will be added. It is transparent.\nQovery runs your application on Kubernetes and relies on ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"https://github.com/kubernetes-sigs/metrics-server"}),"metrics-server")," service to auto-scale your app.")),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Please note that in this section you configure the CPU/RAM allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU/RAM.")),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/application_creation_resources.png",alt:"Resources"}))),Object(i.b)("li",null,Object(i.b)("p",null,"You can now define one or more ports for your Application. Most of the application needs to be accessed by other services inside or outside your environment over different L7/L4 protocols.\nToday Qovery supports the following protocols:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"HTTPS (Select this protocol if you need to run Websockets)"),Object(i.b)("li",{parentName:"ul"},"gRPC"),Object(i.b)("li",{parentName:"ul"},"TCP"),Object(i.b)("li",{parentName:"ul"},"UDP")),Object(i.b)("p",null,"By default ports are accessible only from inside your environment. You can also expose them publicly, making them accessible over the public network via a dedicated public domain that will be assigned to your application by Qovery during the deployment. Note that HTTPS/gRPC ports are alwasy exposed over the port 443."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/application_creation_port.png",alt:"Application Ports"})),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Important Informations")),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Most of the Kubernetes Health Checks]",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/service-health-checks/"}),"docs.using-qovery.configuration.service-health-checks")," are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly."),Object(i.b)("li",{parentName:"ul"},"Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/advanced-settings/#network-settings"}),"advanced settings section")),Object(i.b)("li",{parentName:"ul"},"Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill."),Object(i.b)("li",{parentName:"ul"},"You can configure your application to use the ",Object(i.b)("strong",{parentName:"li"},"PORT")," environment variable by adding the ",Object(i.b)("strong",{parentName:"li"},"PORT")," on your application env variables page."),Object(i.b)("li",{parentName:"ul"},"A Note on Listening IPs: It's best for your application to listen on ",Object(i.b)("inlineCode",{parentName:"li"},"0.0.0.0:$PORT"),". While most things work with ",Object(i.b)("inlineCode",{parentName:"li"},"127.0.0.1")," and ",Object(i.b)("inlineCode",{parentName:"li"},"localhost"),", some do not (NodeJS for example)"))),Object(i.b)("li",null,Object(i.b)("p",null,"(Optional) If a port has been defined for your application, you can define the health check probes to run in order to verify the state of your application"),Object(i.b)("p",null,"To know more about how to configure your Liveness and Readiness probes, have a look at ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application-health-checks/"}),"the health-checks section"))),Object(i.b)("li",null,Object(i.b)("p",null,"You will find a recap of your application setup and you can now decide to:\n1. Go back to one of the previous steps and change your applicaiton settings\n2. Create your application without deploying it\n3. Create and deploy your application"),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/application_creation_recap.png",alt:"Application"}))))),Object(i.b)("h2",{id:"deployment-management"},"Deployment Management"),Object(i.b)("p",null,"Have a look at the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/"}),"Deployment Management")," section for more information."),Object(i.b)("h2",{id:"configuration"},"Configuration"),Object(i.b)("p",null,"Once created, you can access the configuration of an application at any time via the Settings tab available on the application section"),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/settings.png",alt:"Application Settings"})),Object(i.b)("p",null,"You can find below the description of each of the tabs available in this section"),Object(i.b)("h3",{id:"general"},"General"),Object(i.b)("p",null,"General settings section allows you to set up your application name and the source code location (git repository or image registry) ."),Object(i.b)("h4",{id:"git-repository"},"Git Repository"),Object(i.b)("p",null,"If your application is built and deployed from a git repository, within this section you can:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Modify the git provider where your code is stored (it can be hosted on GitHub, GitLab or Bitbucket)."),Object(i.b)("li",{parentName:"ul"},"Modify the branch that Qovery should use for deploying your application"),Object(i.b)("li",{parentName:"ul"},"Modify ",Object(i.b)("inlineCode",{parentName:"li"},"Root Application Path")," - base folder in which the application resides in your repository")),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-general-git.png",alt:"General Settings Git"})),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Qovery supports mono repositories. ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/advanced/monorepository/"}),"See our advanced guide for more details."))),Object(i.b)(c.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"If your repository contains private submodules using SSH protocol, you will need to add a secret beginning with GIT",Object(i.b)("em",{parentName:"p"},"SSH_KEY"),", containing a private SSH key with access rights to your sumbodules repositories."),Object(i.b)("p",null,"Secret names examples:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"GIT_SSH_KEY_GITHUB"),Object(i.b)("li",{parentName:"ul"},"GIT_SSH_KEY_GITLAB"),Object(i.b)("li",{parentName:"ul"},"GIT_SSH_KEY_MYAPP"))),Object(i.b)("h4",{id:"container-registry"},"Container Registry"),Object(i.b)("p",null,"If your application is deployed from an image registry, within this section you can modify:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/organization/container-registry/"}),"Container Registry Management page")," for more information."),Object(i.b)("li",{parentName:"ul"},"Image name: the name of the image to be deployed with this application (example: postgres)"),Object(i.b)("li",{parentName:"ul"},"Image tag: the tag of the image to be deployed with this application (example: 1.0)."),Object(i.b)("li",{parentName:"ul"},"Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)"),Object(i.b)("li",{parentName:"ul"},"CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example ",'["rails", "-h", "0.0.0.0", "-p", "8080", "string"]')),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,'Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see ',Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),"this section")," for more information.")),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-general-registry.png",alt:"General Settings Git"})),Object(i.b)("h4",{id:"build-mode"},"Build Mode"),Object(i.b)("p",null,'This option is available only if you have selected "Git Repository" as source'),Object(i.b)("h4",{id:"option-1-buildpacks"},"Option 1: Buildpacks"),Object(i.b)("p",null,"To simplify the application build for the developer, Qovery supports ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://buildpacks.io"}),"Buildpacks")," out of the box. Buildpacks determine the build process for an app and which assets and runtimes should be made available to your code at runtime. If your complex apps are running multiple languages, you can also use multiple buildpacks within a single app.\nMeaning, as a developer, you don't need to write a ",Object(i.b)("inlineCode",{parentName:"p"},"Dockerfile")," to build and run your app. Qovery Buildpacks takes care of everything for you."),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Supported languages")),Object(i.b)("table",null,Object(i.b)("thead",{parentName:"table"},Object(i.b)("tr",{parentName:"thead"},Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"language"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"version"))),Object(i.b)("tbody",{parentName:"table"},Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Node.JS"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Clojure"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Python"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Java"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Gradle"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"JVM"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Grails"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Scala"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Play"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"PHP"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")),Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Go"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"any")))),Object(i.b)("p",null,"You don't find a cool language? ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://roadmap.qovery.com/"}),"Suggest us to support it")),Object(i.b)("h4",{id:"option-2-dockerfile"},"Option 2: Dockerfile"),Object(i.b)("p",null,"Qovery runs your application within the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://www.docker.com/resources/what-container"}),"Container technology"),". To build and run your application, you need to provide a valid ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://docs.docker.com/engine/reference/builder"}),"Dockerfile"),"."),Object(i.b)("pre",null,Object(i.b)("code",Object(a.a)({parentName:"pre"},{className:"language-Dockerfile",metastring:'title="Valid NodeJS Dockerfile"',title:'"Valid',NodeJS:!0,'Dockerfile"':!0}),"FROM node:13-alpine\nRUN mkdir -p /usr/src/app\nWORKDIR /usr/src/app\nCOPY . .\nRUN npm install\nEXPOSE 3000\nCMD node ./bin/www\n")),Object(i.b)("p",null,"After creating a Dockerfile, specify the location of your Dockerfile in ",Object(i.b)("inlineCode",{parentName:"p"},"Dockefile path")," field."),Object(i.b)("p",null,"Configuration from above will make Qovery look for the Dockerfile in ",Object(i.b)("inlineCode",{parentName:"p"},"/timescale/Dockerfile")," path of your repository (",Object(i.b)("inlineCode",{parentName:"p"},"Root Application Path")," + ",Object(i.b)("inlineCode",{parentName:"p"},"Dockerfile Path"),")."),Object(i.b)("h4",{id:"auto-deploy"},"Auto Deploy"),Object(i.b)("p",null,"See the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/deploying-with-auto-deploy/"}),"Deploying with auto-deploy feature")," section."),Object(i.b)("h3",{id:"resources"},"Resources"),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-13.png",alt:"CPU"})),Object(i.b)("h4",{id:"cpu"},"CPU"),Object(i.b)("p",null,"To configure the number of CPUs that your app needs, adjust the setting in the ",Object(i.b)("inlineCode",{parentName:"p"},"Resources")," section of the application configuration."),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Default is 500m (0.5 vCPU). ")),Object(i.b)("p",null,"Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU."),Object(i.b)("h4",{id:"ram"},"RAM"),Object(i.b)("p",null,"To configure the amount of RAM that your app needs, adjust the setting in ",Object(i.b)("inlineCode",{parentName:"p"},"Resources")," section of the application configuration."),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Default is 512MB.")),Object(i.b)("p",null,"Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU. If your application requires more RAM than requested, it will be killed by the kubernetes scheduler."),Object(i.b)("h4",{id:"auto-scaling"},"Auto-scaling"),Object(i.b)("p",null,"Application auto-scaling is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 15 seconds, your app will be auto-scaled and more instances will be added. It is transparent. The downscale will happen if the CPU consumption is lower than 60% for at least 5 minutes.\nYou can adjust the minimum and maximum of instances you need in your application settings. Qovery runs your application on Kubernetes and relies on ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/kubernetes-sigs/metrics-server"}),"metrics-server")," service to auto-scale your app."),Object(i.b)("h3",{id:"storage"},"Storage"),Object(i.b)("h4",{id:"block-storage"},"Block Storage"),Object(i.b)("p",null,"The default filesystem for applications running on Qovery is ephemeral. Application data isn\u2019t persisted across deploys and restarts, which works just fine for most apps because they use managed databases to persist data."),Object(i.b)("p",null,"However, many applications need persistent disk storage that isn\u2019t ephemeral. These include:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Blogging platforms and CMSs like WordPress, Ghost, and Strapi."),Object(i.b)("li",{parentName:"ul"},"Collaboration apps like Mattermost, GitLab, and Discourse.")),Object(i.b)("p",null,"This is where Qovery block Storage comes in. Qovery applications can use storage to store data that persists across deploys and restarts, making it easy to deploy stateful applications."),Object(i.b)(c.a,{type:"warning",mdxType:"Alert"},Object(i.b)("p",null,"For most use cases, it is better to use ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/object-storage/"}),"Object Storage")," instead of Block Storage.")),Object(i.b)("h6",{id:"use-cases"},"Use cases"),Object(i.b)("h6",{id:"-good-use-cases"},"\u2705 Good use cases"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"For I/O intensive applications (E.g. database)"),Object(i.b)("li",{parentName:"ul"},"To store temporary files")),Object(i.b)("h6",{id:"-bad-use-cases"},"\u274c Bad use cases"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"To store file > 1 TB"),Object(i.b)("li",{parentName:"ul"},"To expose files from an application (E.g. images)")),Object(i.b)("h5",{id:"types-of-block-storage"},"Types of Block Storage"),Object(i.b)("p",null,"Qovery Storage supports:"),Object(i.b)("table",null,Object(i.b)("thead",{parentName:"table"},Object(i.b)("tr",{parentName:"thead"},Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Type"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Max IOPS"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Max Throughput"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Min Size"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Max Size"),Object(i.b)("th",Object(a.a)({parentName:"tr"},{align:null}),"Use cases"))),Object(i.b)("tbody",{parentName:"table"},Object(i.b)("tr",{parentName:"tbody"},Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"fast_ssd"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"64000"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"1GB/s"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"5GB"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"10GB ",Object(i.b)("inlineCode",{parentName:"td"},"Community")," / 1TB paid plans"),Object(i.b)("td",Object(a.a)({parentName:"tr"},{align:null}),"Critical business applications that require sustained IOPS like databases")))),Object(i.b)("h5",{id:"configuration-1"},"Configuration"),Object(i.b)("p",null,"You can set up your Block Storage in ",Object(i.b)("inlineCode",{parentName:"p"},"Storage")," section of your application configuration."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-7.png",alt:"Application Storage"})),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Storage can be added only if the application has never been deployed before AND if it runs only with one instance (check the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application/#resources"}),"Resources section"),")")),Object(i.b)("h3",{id:"ports"},"Ports"),Object(i.b)("p",null,"Within this section you can define the port exposed by your application to the other services or even over the internet.\nYou can edit the existing ports or declare new ones by specifying:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Application port: this is the port exposed internally by your application for the other services. "),Object(i.b)("li",{parentName:"ul"},"Protocol: you can select the protocol used by your application : HTTP (for both standard HTTP or websocket communications), gRPC, TCP, UDP."),Object(i.b)("li",{parentName:"ul"},"Publicly exposed: it allows you to expose over the public network your service. A public domain will be assigned to your application during the deployment (see ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#domains"}),"Domain section"),")"),Object(i.b)("li",{parentName:"ul"},"If Publicly Exposed is selected:",Object(i.b)("ul",{parentName:"li"},Object(i.b)("li",{parentName:"ul"},"External port: it is the port that can be used to access this service over the internet (when exposed publicly). Note that for HTTP and gRPC the port is set by default to 443."),Object(i.b)("li",{parentName:"ul"},"Port Name: it is the name assigned to the port. When multiple ports are exposed publicly, its value is used to route the traffic to the right port based on the called subdomain (which will contain the port name value). Since each port is exposed on the port 443, having a different subdomain is the only way to have multiple ports exposed over the internet. If not set, the default value is ",Object(i.b)("inlineCode",{parentName:"li"},"p")," (see ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/application/#domains"}),"Domain section")," for more information)")))),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-15.png",alt:"Application Ports"})),Object(i.b)("h4",{id:"important-informations"},"Important Informations"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Most of the Kubernetes Health Checks]",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/service-health-checks/"}),"docs.using-qovery.configuration.service-health-checks")," are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly."),Object(i.b)("li",{parentName:"ul"},"Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"/docs/using-qovery/configuration/advanced-settings/#network-settings"}),"advanced settings section")),Object(i.b)("li",{parentName:"ul"},"Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill."),Object(i.b)("li",{parentName:"ul"},"You can configure your application to use the ",Object(i.b)("strong",{parentName:"li"},"PORT")," environment variable by adding the ",Object(i.b)("strong",{parentName:"li"},"PORT")," on your application env variables page."),Object(i.b)("li",{parentName:"ul"},"A Note on Listening IPs: It's best for your application to listen on ",Object(i.b)("inlineCode",{parentName:"li"},"0.0.0.0:$PORT"),". While most things work with ",Object(i.b)("inlineCode",{parentName:"li"},"127.0.0.1")," and ",Object(i.b)("inlineCode",{parentName:"li"},"localhost"),", some do not (NodeJS for example)")),Object(i.b)("h3",{id:"health-checks"},"Health Checks"),Object(i.b)("p",null,"To know more about how to configure your Liveness and Readiness probes, have a look at ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/application-health-checks/"}),"the health-checks section")),Object(i.b)("h3",{id:"domains"},"Domains"),Object(i.b)("p",null,"The ",Object(i.b)("inlineCode",{parentName:"p"},"Domain")," section allows you to define a custom domain for your application. "),Object(i.b)("p",null,"For each port publicly exposed, a domain is automatically assigned by Qovery to your application. Qovery will manage for you the networking and the TLS configuration for these domains. "),Object(i.b)("p",null,"domain example: ",Object(i.b)("inlineCode",{parentName:"p"},"p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh")),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"},"Special Case - Preview Environment"),"\nFor each port exposed publicly, an additional domain will be created with the following pattern ",Object(i.b)("inlineCode",{parentName:"p"},"portName-prId-srvName-envSourceName.cluster_domain"),":"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"portName: is the port name, as explained above"),Object(i.b)("li",{parentName:"ul"},"prID: is the id of the PR that has generated the preview environment"),Object(i.b)("li",{parentName:"ul"},"srvName: is the name of the service"),Object(i.b)("li",{parentName:"ul"},"envSourceName: is the name of the blueprint environment that has created the current preview environment")),Object(i.b)("p",null,"domain example: ",Object(i.b)("inlineCode",{parentName:"p"},"p80-123-frontend-blueprint.za8ad0657.bool.sh")),Object(i.b)("p",null,"Note:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"each service deployed on the same cluster will have the same root domain assigned (example: ",Object(i.b)("inlineCode",{parentName:"li"},"za8ad0657.bool.sh"),")"),Object(i.b)("li",{parentName:"ul"},"the first characters of the domain assigned to the application is based on the portName given to the port (See the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#ports"}),"port section")),Object(i.b)("li",{parentName:"ul"},"a default domain (without the portName) is assigned to the ",Object(i.b)("inlineCode",{parentName:"li"},"default port"),"(See the ",Object(i.b)("a",Object(a.a)({parentName:"li"},{href:"#ports"}),"port section"),"). Example ",Object(i.b)("inlineCode",{parentName:"li"},"zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh"))),Object(i.b)("p",null,"If you want to customize the domain assigned to your application press the ",Object(i.b)("inlineCode",{parentName:"p"},"Add Domain")," button. "),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-16.png",alt:"Application Domains"})),Object(i.b)("p",null,"In this section, you can assign your custom domain via CNAME or just change the sub-domain assigned to your service."),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"This configuration will be ",Object(i.b)("strong",{parentName:"p"},"automatically removed")," on every cloned environment or preview environment in order to avoid domain collision.")),Object(i.b)("h4",{id:"configuring-a-domain-via-cname"},"Configuring a domain via CNAME"),Object(i.b)("p",null,"You can configure your DNS by adding a ",Object(i.b)("inlineCode",{parentName:"p"},"CNAME")," record so that your app will be accessible through your custom domain. Qovery will handle for you the network configuration and the TLS certificate."),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/guides/getting-started/setting-custom-domain/"}),"We prepared a guide and video tutorial that explains how to set up your custom domain."))),Object(i.b)("h4",{id:"change-the-assigned-sub-domain"},"Change the assigned sub-domain"),Object(i.b)("p",null,"You can specify a different sub-domain for your application as long as it belongs to the assigned cluster domain (see above).\nExample: "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"your current domain is zdf72de71-z709e1a85-gtw.za8ad0659.bool.sh (so your assigned cluster domain is ",Object(i.b)("inlineCode",{parentName:"li"},"za8ad0659.bool.sh"),")"),Object(i.b)("li",{parentName:"ul"},"you can enter a new custom domain ",Object(i.b)("inlineCode",{parentName:"li"},"myfrontend.za8ad0659.bool.sh")," (since it is a subdomain of the cluster domain)")),Object(i.b)("p",null,"The application will now be accessible from both the default and the new custom domain."),Object(i.b)(c.a,{type:"info",mdxType:"Alert"},Object(i.b)("p",null,"Qovery does not check collision in the domain declaration. Make sure you assign a unique subdomain within your cluster.")),Object(i.b)("h2",{id:"connecting-to-a-database"},"Connecting to a database"),Object(i.b)("p",null,"To know how to access your database from your application, ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),"have a look at the database section"),"."),Object(i.b)("h2",{id:"connecting-to-another-application"},"Connecting to another application"),Object(i.b)("p",null,"To know how to access your database from your application, ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/#connecting-to-another-application"}),"have a look at the database section"),"."),Object(i.b)("h2",{id:"environment-variable"},"Environment Variable"),Object(i.b)("p",null,"To learn how to set up environment variables in your projects and applications, navigate to ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"configuring Environment Variables")," section."),Object(i.b)("h2",{id:"secrets"},"Secrets"),Object(i.b)("p",null,"To learn how to set up secrets in your projects and applications, navigate to ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/configuration/environment-variable/"}),"configuring Secrets")," section."),Object(i.b)("h2",{id:"logs"},"Logs"),Object(i.b)("p",null,"To learn how to display your application logs, navigate to ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/deployment/logs/#live-logs"}),"logs section")),Object(i.b)("h2",{id:"ssh"},"SSH"),Object(i.b)("p",null,"To connect to your application via SSH, please use the via the ",Object(i.b)("a",Object(a.a)({parentName:"p"},{href:"/docs/using-qovery/interface/cli/"}),"Qovery SSH command")," available on our CLI."),Object(i.b)("h2",{id:"clone"},"Clone"),Object(i.b)("p",null,"You can create a clone of the service via the clone feature. A new service with the same configuration (see below for exceptions) will be created into the target environment."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/clone_service.png",alt:"Clone Service"})),Object(i.b)("p",null,"The target environment can be the same as the current environment or even another one in a completely different project."),Object(i.b)("p",null,Object(i.b)("strong",{parentName:"p"}," Important information ")),Object(i.b)("p",null,"Not every configuration parameter will be copied within the new service for consistency reasons. The configuration is fully or partially copied depending on the target environment:"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"same environment:",Object(i.b)("ul",{parentName:"li"},Object(i.b)("li",{parentName:"ul"},"custom domain: this setup is not copied into the new service (to avoid collision)"))),Object(i.b)("li",{parentName:"ul"},"another environment:",Object(i.b)("ul",{parentName:"li"},Object(i.b)("li",{parentName:"ul"},"custom domain: this setup is not copied into the new service (to avoid collision)"),Object(i.b)("li",{parentName:"ul"},"environment variable: aliases defined on environment variables are not copied (since the aliased env var might not exist)"),Object(i.b)("li",{parentName:"ul"},"deployment pipeline: stage setup is not copied (since the target stage might not exist)"),Object(i.b)("li",{parentName:"ul"},"number of instances: if the target environment runs on a Qovery EC2 cluster, the max number of instances is set to 1 (Qovery EC2 constraint)")))),Object(i.b)("p",null,"Please check the configuration of the new service before deploying it."),Object(i.b)("h2",{id:"delete-an-application"},"Delete an Application"),Object(i.b)(r.a,{headingDepth:3,mdxType:"Steps"},Object(i.b)("ol",null,Object(i.b)("li",null,Object(i.b)("p",null,"Choose your application")),Object(i.b)("li",null,Object(i.b)("p",null,"In the application overview, click on the ",Object(i.b)("inlineCode",{parentName:"p"},"3 dots")," button and remove the application."),Object(i.b)("p",{align:"center"},Object(i.b)("img",{src:"/img/configuration/application/app-1.png",alt:"Application"}))))))}d.isMDXComponent=!0},415:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),p=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c({},t,{},e)),n},b=function(e){var t=p(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=Object(a.forwardRef)((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,r=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),b=p(n),d=a,m=b["".concat(r,".").concat(d)]||b[d]||u[d]||i;return n?o.a.createElement(m,c({ref:t},s,{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,r=new Array(i);r[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,r[1]=c;for(var s=2;s1?arguments[1]:void 0,n),l=r>2?arguments[2]:void 0,s=void 0===l?n:o(l,n);s>c;)t[c++]=e;return t}},420:function(e,t,n){var a=n(28).f,o=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in o||n(10)&&a(o,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},421:function(e,t,n){"use strict";n(420);var a=n(0),o=n.n(a),i=n(416);t.a=function(e){var t=e.children,n=e.name;return o.a.createElement(i.a,{type:"info",fill:!0,icon:!1,rounded:!0,className:"list--icons list--icons--arrow list--tight list--indent margin-bottom--lg"},o.a.createElement("p",{class:"text--lg margin-bottom--sm",style:{marginTop:"-0.25em"}},"Before you begin, this ",n||"page"," assumes the following:"),t)}},422:function(e,t,n){"use strict";var a=n(1),o=n(0),i=n.n(o),r=n(39),c=n(425),l=n(20),s=n.n(l);t.a=function(e){var t,n=e.to,l=e.href,p=n||l,b=Object(c.a)(p),u=Object(o.useRef)(!1),d=s.a.canUseIntersectionObserver;return Object(o.useEffect)((function(){return!d&&b&&window.docusaurus.prefetch(p),function(){d&&t&&t.disconnect()}}),[p,d,b]),p&&b?i.a.createElement(r.b,Object(a.a)({},e,{onMouseEnter:function(){u.current||(window.docusaurus.preload(p),u.current=!0)},innerRef:function(e){var n,a;d&&e&&b&&(n=e,a=function(){window.docusaurus.prefetch(p)},(t=new window.IntersectionObserver((function(e){e.forEach((function(e){n===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(t.unobserve(n),t.disconnect(),a())}))}))).observe(n))},to:p})):i.a.createElement("a",Object(a.a)({},e,{href:p}))}},423:function(e,t,n){"use strict";var a=n(427),o=n(51);function i(e,t){return t.encode?t.strict?a(e):encodeURIComponent(e):e}t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){var n=function(e){var t;switch(e.arrayFormat){case"index":return function(e,n,a){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===a[e]&&(a[e]={}),a[e][t[1]]=n):a[e]=n};case"bracket":return function(e,n,a){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==a[e]?a[e]=[].concat(a[e],n):a[e]=[n]:a[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}(t=o({arrayFormat:"none"},t)),a=Object.create(null);return"string"!=typeof e?a:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var t=e.replace(/\+/g," ").split("="),o=t.shift(),i=t.length>0?t.join("="):void 0;i=void 0===i?null:decodeURIComponent(i),n(decodeURIComponent(o),i,a)})),Object.keys(a).sort().reduce((function(e,t){var n=a[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((function(e,t){return Number(e)-Number(t)})).map((function(e){return t[e]})):t}(n):e[t]=n,e}),Object.create(null))):a},t.stringify=function(e,t){var n=function(e){switch(e.arrayFormat){case"index":return function(t,n,a){return null===n?[i(t,e),"[",a,"]"].join(""):[i(t,e),"[",i(a,e),"]=",i(n,e)].join("")};case"bracket":return function(t,n){return null===n?i(t,e):[i(t,e),"[]=",i(n,e)].join("")};default:return function(t,n){return null===n?i(t,e):[i(t,e),"=",i(n,e)].join("")}}}(t=o({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map((function(a){var o=e[a];if(void 0===o)return"";if(null===o)return i(a,t);if(Array.isArray(o)){var r=[];return o.slice().forEach((function(e){void 0!==e&&r.push(n(a,e,r.length))})),r.join("&")}return i(a,t)+"="+i(o,t)})).filter((function(e){return e.length>0})).join("&"):""}},424:function(e,t,n){"use strict";var a=n(0),o=n.n(a),i=n(422),r=n(415),c=n.n(r);n(133);t.a=function(e){var t=e.children,n=e.className,a=e.badge,r=e.leftIcon,l=e.rightIcon,s=e.size,p=e.target,b=e.to,u=c()("jump-to","jump-to--"+s,n),d=o.a.createElement("div",{className:"jump-to--inner"},o.a.createElement("div",{className:"jump-to--inner-2"},r&&o.a.createElement("div",{className:"jump-to--left"},o.a.createElement("i",{className:"feather icon-"+r})),o.a.createElement("div",{className:"jump-to--main"},a?o.a.createElement("span",{className:"badge badge--primary badge--right"},a):"",t),o.a.createElement("div",{className:"jump-to--right"},o.a.createElement("i",{className:"feather icon-"+(l||"chevron-right")+" arrow"}))));return p?o.a.createElement("a",{href:b,target:p,className:u},d):o.a.createElement(i.a,{to:b,className:u},d)}},425:function(e,t,n){"use strict";function a(e){return!1===/^(https?:|\/\/)/.test(e)}n.d(t,"a",(function(){return a}))},426:function(e,t,n){"use strict";var a=n(0),o=n.n(a),i=(n(415),n(423)),r=n.n(i);n(134);t.a=function(e){var t=e.children,n=e.headingDepth,i=e.hideFeedbackQuestion,c="undefined"!=typeof window?window.location:null,l={title:"Tutorial on "+c+" failed",body:"The tutorial on:\n\n"+c+"\n\nHere's what went wrong:\n\n\x3c!-- Insert command output and details. Thank you for reporting! :) --\x3e"},s="https://github.com/qovery/documentation/issues/new?"+r.a.stringify(l),p=Object(a.useState)(null),b=p[0],u=p[1];return o.a.createElement("div",{className:"steps steps--h"+n},t,!i&&!b&&o.a.createElement("div",{className:"steps--feedback"},"How was it? Did this tutorial work?\xa0\xa0",o.a.createElement("span",{className:"button button--sm button--primary",onClick:function(){return u("yes")}},"Yes"),"\xa0\xa0",o.a.createElement("a",{href:s,target:"_blank",className:"button button--sm button--primary"},"No")),"yes"==b&&o.a.createElement("div",{className:"steps--feedback steps--feedback--success"},"Thanks! If you're enjoying Qovery please consider ",o.a.createElement("a",{href:"https://github.com/qovery/documentation/",target:"_blank"},"starring our Github repo"),"."))}},427:function(e,t,n){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}}}]); \ No newline at end of file diff --git a/community/index.html b/community/index.html index 4293dd9641..5abf767b5e 100644 --- a/community/index.html +++ b/community/index.html @@ -26,7 +26,7 @@ - + @@ -47,7 +47,7 @@ - + diff --git a/components/index.html b/components/index.html index e8f641398e..342725cb13 100644 --- a/components/index.html +++ b/components/index.html @@ -26,7 +26,7 @@ - + @@ -47,7 +47,7 @@ - + diff --git a/contact/index.html b/contact/index.html index 435356cee2..b5bcca6376 100644 --- a/contact/index.html +++ b/contact/index.html @@ -26,7 +26,7 @@ - + @@ -47,7 +47,7 @@ - + diff --git a/docs/getting-started/basic-concepts/index.html b/docs/getting-started/basic-concepts/index.html index a7ec83cbe1..ada8b4520f 100644 --- a/docs/getting-started/basic-concepts/index.html +++ b/docs/getting-started/basic-concepts/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/getting-started/deploy-my-app/index.html b/docs/getting-started/deploy-my-app/index.html index e4c0a4e215..72f6bd4f59 100644 --- a/docs/getting-started/deploy-my-app/index.html +++ b/docs/getting-started/deploy-my-app/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/getting-started/how-qovery-works/index.html b/docs/getting-started/how-qovery-works/index.html index 77d446ea34..b5451b1c1d 100644 --- a/docs/getting-started/how-qovery-works/index.html +++ b/docs/getting-started/how-qovery-works/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/getting-started/index.html b/docs/getting-started/index.html index f8e454f6ba..df58e604f0 100644 --- a/docs/getting-started/index.html +++ b/docs/getting-started/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/getting-started/install-qovery/index.html b/docs/getting-started/install-qovery/index.html index 3348c28f58..4655e1acbb 100644 --- a/docs/getting-started/install-qovery/index.html +++ b/docs/getting-started/install-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/getting-started/what-is-qovery/index.html b/docs/getting-started/what-is-qovery/index.html index 70dbb528a7..b170953688 100644 --- a/docs/getting-started/what-is-qovery/index.html +++ b/docs/getting-started/what-is-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/getting-started/whats-next/index.html b/docs/getting-started/whats-next/index.html index 080240eced..2769afa9c1 100644 --- a/docs/getting-started/whats-next/index.html +++ b/docs/getting-started/whats-next/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/docs/index.html b/docs/index.html index 1ed591ca36..107e0adf05 100644 --- a/docs/index.html +++ b/docs/index.html @@ -22,7 +22,7 @@ - + @@ -37,7 +37,7 @@ - + diff --git a/docs/security-and-compliance/backup-and-restore/index.html b/docs/security-and-compliance/backup-and-restore/index.html index 7b5c847078..cd652a4cfd 100644 --- a/docs/security-and-compliance/backup-and-restore/index.html +++ b/docs/security-and-compliance/backup-and-restore/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/security-and-compliance/encryption/index.html b/docs/security-and-compliance/encryption/index.html index f6ab65d598..f2cf3a6a2d 100644 --- a/docs/security-and-compliance/encryption/index.html +++ b/docs/security-and-compliance/encryption/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/security-and-compliance/gdpr/index.html b/docs/security-and-compliance/gdpr/index.html index d20546e7b7..ffc57e4190 100644 --- a/docs/security-and-compliance/gdpr/index.html +++ b/docs/security-and-compliance/gdpr/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/security-and-compliance/index.html b/docs/security-and-compliance/index.html index 97ee18350e..848d74247e 100644 --- a/docs/security-and-compliance/index.html +++ b/docs/security-and-compliance/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/security-and-compliance/soc2/index.html b/docs/security-and-compliance/soc2/index.html index 394c83ab70..6b6f1a5ad7 100644 --- a/docs/security-and-compliance/soc2/index.html +++ b/docs/security-and-compliance/soc2/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/docs/useful-resources/faq/index.html b/docs/useful-resources/faq/index.html index 423cd71aad..72964ca8be 100644 --- a/docs/useful-resources/faq/index.html +++ b/docs/useful-resources/faq/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/docs/useful-resources/help-and-support/index.html b/docs/useful-resources/help-and-support/index.html index a8a5c91934..97aca9dbbc 100644 --- a/docs/useful-resources/help-and-support/index.html +++ b/docs/useful-resources/help-and-support/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/audit-logs/index.html b/docs/using-qovery/audit-logs/index.html index 4a2a6831ee..a150243bcc 100644 --- a/docs/using-qovery/audit-logs/index.html +++ b/docs/using-qovery/audit-logs/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/advanced-settings/index.html b/docs/using-qovery/configuration/advanced-settings/index.html index 3481c74166..9371ff5f95 100644 --- a/docs/using-qovery/configuration/advanced-settings/index.html +++ b/docs/using-qovery/configuration/advanced-settings/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/application-health-checks/index.html b/docs/using-qovery/configuration/application-health-checks/index.html index d11733ef88..9936f32048 100644 --- a/docs/using-qovery/configuration/application-health-checks/index.html +++ b/docs/using-qovery/configuration/application-health-checks/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/docs/using-qovery/configuration/application/index.html b/docs/using-qovery/configuration/application/index.html index 230923c27b..b1f1a5760f 100644 --- a/docs/using-qovery/configuration/application/index.html +++ b/docs/using-qovery/configuration/application/index.html @@ -26,7 +26,7 @@ - + @@ -44,28 +44,25 @@ - +
-

Application

An application is part of a Project within an Environment and is a container unit. Multiple applications can be part of the same Environment, be connected to a set of dependencies (databases and other services), and can communicate with other applications within the same Environment.

Qovery allows you to create and deploy applications from two different sources: Git Repository or Container Registry

Deploying from a Git Repository

In this configuration, Qovery will pull the code from the chosen repository, build the application and deploy it on your kubernetes cluster.

The list of Git repositories available during the setup is strictly tied to the permissions of your git account (by default Qovery can access all your repositories). If you want to restrict the Qovery access only to a few repositories, user the GitHub Qovery Application (only for Github).

Deploying from a Container Registry

In this configuration, Qovery will pull the chosen container registry an image you have pre-built and deploy it on your kubernetes cluster.

To improve the security and avoid deploying images from non-authorized registries, we have decided to restrict the list of Container Registry you can use during the setup process. Only an administrator with the right permissions can manage it from the Container Registry Management page

Create an Application

  1. Go into the chosen environment and press the "New Service" button and then the "Create application" button

    Creation

  2. Select the following fields:

    • Application Name: give a name to your applicaiton
    • Application Source: Chose between Git Repository or Container Registry, depending on the source location of your application

    If you want to deploy an application from a Git Repository you will have to select:

    • Git Repository: Select the git provider hosting your code (it can be hosted on GitHub, GitLab or Bitbucket).
    • Branch: Select branch that Qovery should use to deploy your application
    • Root Application Path: base folder in which the application resides in your repository
    • Build Mode: chose between Docker or Buildpack. For more information, go to this section

    If you want to deploy an application from a Container Registry you will have to select:

    • Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the Container Registry Management page for more information.
    • Image name: the name of the image to be deployed with this application (example: postgres)
    • Image tag: the tag of the image to be deployed with this application (example: 1.0).
    • Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)
    • CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example ["rails", "-h", "0.0.0.0", "-p", "8080", "string"]

    Auto Deploy

    See the Deploying with auto-deploy feature section.

  3. Within this section, you will need to define the resources to be assigned to your applicaiton at run time.

    • vCPU: the vCPU assigned to each instance of your application. The default is 500m (0.5 vCPU).
    • RAM: the amount of RAM assigned to each instance of your application. The default is 512MB.
    • Number of instances (Application Auto-scaling): select the minimum and the maximum number of instances of your application that can run within your cluster. The number of instances running at an insant t is automatically managed by Kubernetes (Application auto-scaling) and it is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 5 minutes, your app will be auto-scaled and more instances will be added. It is transparent. +

      Application

      An application is part of a Project within an Environment and is a container unit. Multiple applications can be part of the same Environment, be connected to a set of dependencies (databases and other services), and can communicate with other applications within the same Environment.

      Qovery allows you to create and deploy applications from two different sources: Git Repository or Container Registry

      Deploying from a Git Repository

      In this configuration, Qovery will pull the code from the chosen repository, build the application and deploy it on your kubernetes cluster.

      The list of Git repositories available during the setup is strictly tied to the permissions of your git account (by default Qovery can access all your repositories). If you want to restrict the Qovery access only to a few repositories, user the GitHub Qovery Application (only for Github).

      Deploying from a Container Registry

      In this configuration, Qovery will pull the chosen container registry an image you have pre-built and deploy it on your kubernetes cluster.

      To improve security and avoid deploying images from non-authorized registries, we have decided to restrict the list of Container Registry you can use during the setup process. Only an administrator with the right permissions can manage it from the Container Registry Management page

      Create an Application

      1. Go into the chosen environment and press the "New Service" button and then the "Create application" button

        Creation

      2. Select the following fields:

        • Application Name: give a name to your application
        • Application Source: Chose between Git Repository or Container Registry, depending on the source location of your application

        If you want to deploy an application from a Git Repository you will have to select:

        • Git Repository: Select the git provider hosting your code (it can be hosted on GitHub, GitLab or Bitbucket).
        • Branch: Select branch that Qovery should use to deploy your application
        • Root Application Path: base folder in which the application resides in your repository
        • Build Mode: choose between Docker or Buildpack. For more information, go to this section

        If you want to deploy an application from a Container Registry you will have to select:

        • Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the Container Registry Management page for more information.
        • Image name: the name of the image to be deployed with this application (example: postgres)
        • Image tag: the tag of the image to be deployed with this application (example: 1.0).
        • Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)
        • CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example ["rails", "-h", "0.0.0.0", "-p", "8080", "string"]

        Auto Deploy

        See the Deploying with auto-deploy feature section.

      3. Within this section, you will need to define the resources to be assigned to your application at run time.

        • vCPU: the vCPU assigned to each instance of your application. The default is 500m (0.5 vCPU).
        • RAM: the amount of RAM assigned to each instance of your application. The default is 512MB.
        • Number of instances (Application Auto-scaling): select the minimum and the maximum number of instances of your application that can run within your cluster. The number of instances running at an insant t is automatically managed by Kubernetes (Application auto-scaling) and it is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 5 minutes, your app will be auto-scaled and more instances will be added. It is transparent. Qovery runs your application on Kubernetes and relies on metrics-server service to auto-scale your app.

        Resources

      4. You can now define one or more ports for your Application. Most of the application needs to be accessed by other services inside or outside your environment over different L7/L4 protocols. -Today Qovery supports the following protocols:

        • HTTPS (Select this protocol if you need to run Websockets)
        • gRPC
        • TCP
        • UDP

        By default ports are accessible only from inside your environment. You can also expose them publicly, making them accessible over the public network via a dedicated public domain that will be assigned to your application by Qovery during the deployment. Note that HTTPS/gRPC ports are alwasy exposed over the port 443.

        Application Ports

        Important Informations

        • Most of the Kubernetes Health Checks]docs.using-qovery.configuration.service-health-checks are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly.
        • Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the advanced settings section
        • Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill.
        • You can configure your application to use the PORT environment variable by adding the PORT on your application env variables page.
        • A Note on Listening IPs: It's best for your application to listen on 0.0.0.0:$PORT. While most things work with 127.0.0.1 and localhost, some do not (NodeJS for example)
      5. (Optional) If a port has been defined for your application, you can define the health check probes to run in order to verify the state of your application

        To know more about how to configure your Liveness and Readiness probes, have a look at the health-checks section

      6. You will find a recap of your application setup and you can now decide to: -1. Go back to one of the previous steps and change your applicaiton settings -2. Create your application without deploying it -3. Create and deploy your application

        Application

      Deployment Management

      Have a look at the Deployment Management section for more information.

      Configuration

      Once created, you can access the configuration of an application at any time via the Settings tab available on the application section

      Application Settings

      You can find below the description of each of the tabs available in this section

      General

      General settings section allows you to set up your application name and the source code location (git repository or image registry) .

      Git Repository

      If your application is built and deployed from a git repository, within this section you can:

      • Modify the git provider where your code is stored (it can be hosted on GitHub, GitLab or Bitbucket).
      • Modify the branch that Qovery should use for deploying your application
      • Modify Root Application Path - base folder in which the application resides in your repository

      General Settings Git

      Container Registry

      If your application is deployed from an image registry, within this section you can modify:

      • Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the Container Registry Management page for more information.
      • Image name: the name of the image to be deployed with this application (example: postgres)
      • Image tag: the tag of the image to be deployed with this application (example: 1.0).
      • Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)
      • CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example ["rails", "-h", "0.0.0.0", "-p", "8080", "string"]

      General Settings Git

      Build Mode

      This option is available only if you have selected "Git Repository" as source

      Option 1: Buildpacks

      To simplify the application build for the developer, Qovery supports Buildpacks out of the box. Buildpacks determine the build process for an app and which assets and runtimes should be made available to your code at runtime. If your complex apps are running multiple languages, you can also use multiple buildpacks within a single app. -Meaning, as a developer, you don't need to write a Dockerfile to build and run your app. Qovery Buildpacks takes care of everything for you.

      Supported languages

      languageversion
      Node.JSany
      Clojureany
      Pythonany
      Javaany
      Gradleany
      JVMany
      Grailsany
      Scalaany
      Playany
      PHPany
      Goany

      You don't find a cool language? Suggest us to support it

      Option 2: Dockerfile

      Qovery runs your application within the Container technology. To build and run your application, you need to provide a valid Dockerfile.

      Valid NodeJS Dockerfile
      FROM node:13-alpine
      RUN mkdir -p /usr/src/app
      WORKDIR /usr/src/app
      COPY . .
      RUN npm install
      EXPOSE 3000
      CMD node ./bin/www

      After creating a Dockerfile, specify the location of your Dockerfile in Dockefile path field.

      Configuration from above will make Qovery look for the Dockerfile in /timescale/Dockerfile path of your repository (Root Application Path + Dockerfile Path).

      Auto Deploy

      See the Deploying with auto-deploy feature section.

      Resources

      CPU

      CPU

      To configure the number of CPUs that your app needs, adjust the setting in the Resources section of the application configuration.

      Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU.

      RAM

      To configure the amount of RAM that your app needs, adjust the setting in Resources section of the application configuration.

      Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU. If your application requires more RAM than requested, it will be killed by the kubernetes scheduler.

      Auto-scaling

      Application auto-scaling is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 15 seconds, your app will be auto-scaled and more instances will be added. It is transparent. The downscale will happen if the CPU consumption is lower than 60% for at least 5 minutes. +Today Qovery supports the following protocols:

      • HTTPS (Select this protocol if you need to run Websockets)
      • gRPC
      • TCP
      • UDP

      By default ports are accessible only from inside your environment. You can also expose them publicly, making them accessible over the public network via a dedicated public domain that will be assigned to your application by Qovery during the deployment (See the Qovery Provided Domains section). Note that HTTPS/gRPC ports are always exposed over the port 443.

      Application Ports

      Important Informations

      • Most of the Kubernetes Health Checks are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly.
      • Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the advanced settings section
      • Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill.
      • You can configure your application to use the PORT environment variable by adding the PORT on your application env variables page.
      • A Note on Listening IPs: It's best for your application to listen on 0.0.0.0:$PORT. While most things work with 127.0.0.1 and localhost, some do not (NodeJS for example)
    • (Optional) If a port has been defined for your application, you can define the health check probes to run in order to verify the state of your application

      To know more about how to configure your Liveness and Readiness probes, have a look at the health-checks section

    • You will find a recap of your application setup and you can now decide to:

      Go back to one of the previous steps and change your application settings

      Create your application without deploying it

      Create and deploy your application

      Application

Deployment Management

Have a look at the Deployment Management section for more information.

Configuration

Once created, you can access the configuration of an application at any time via the Settings tab available on the application section

Application Settings

You can find below the description of each of the tabs available in this section

General

General settings section allows you to set up your application name and the source code location (git repository or image registry) .

Git Repository

If your application is built and deployed from a git repository, within this section you can:

  • Modify the git provider where your code is stored (it can be hosted on GitHub, GitLab or Bitbucket).
  • Modify the branch that Qovery should use for deploying your application
  • Modify Root Application Path - base folder in which the application resides in your repository

General Settings Git

Container Registry

If your application is deployed from an image registry, within this section you can modify:

  • Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the Container Registry Management page for more information.
  • Image name: the name of the image to be deployed with this application (example: postgres)
  • Image tag: the tag of the image to be deployed with this application (example: 1.0).
  • Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)
  • CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example ["rails", "-h", "0.0.0.0", "-p", "8080", "string"]

General Settings Git

Build Mode

This option is available only if you have selected "Git Repository" as source

Option 1: Buildpacks

To simplify the application build for the developer, Qovery supports Buildpacks out of the box. Buildpacks determine the build process for an app and which assets and runtimes should be made available to your code at runtime. If your complex apps are running multiple languages, you can also use multiple buildpacks within a single app. +Meaning, as a developer, you don't need to write a Dockerfile to build and run your app. Qovery Buildpacks takes care of everything for you.

Supported languages

languageversion
Node.JSany
Clojureany
Pythonany
Javaany
Gradleany
JVMany
Grailsany
Scalaany
Playany
PHPany
Goany

You don't find a cool language? Suggest us to support it

Option 2: Dockerfile

Qovery runs your application within the Container technology. To build and run your application, you need to provide a valid Dockerfile.

Valid NodeJS Dockerfile
FROM node:13-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN npm install
EXPOSE 3000
CMD node ./bin/www

After creating a Dockerfile, specify the location of your Dockerfile in Dockefile path field.

Configuration from above will make Qovery look for the Dockerfile in /timescale/Dockerfile path of your repository (Root Application Path + Dockerfile Path).

Auto Deploy

See the Deploying with auto-deploy feature section.

Resources

CPU

CPU

To configure the number of CPUs that your app needs, adjust the setting in the Resources section of the application configuration.

Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consumes fewer resources, the cluster will still reserve the selected amount of CPU.

RAM

To configure the amount of RAM that your app needs, adjust the setting in Resources section of the application configuration.

Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU. If your application requires more RAM than requested, it will be killed by the kubernetes scheduler.

Auto-scaling

Application auto-scaling is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 15 seconds, your app will be auto-scaled and more instances will be added. It is transparent. The downscale will happen if the CPU consumption is lower than 60% for at least 5 minutes. You can adjust the minimum and maximum of instances you need in your application settings. Qovery runs your application on Kubernetes and relies on metrics-server service to auto-scale your app.

Storage

Block Storage

The default filesystem for applications running on Qovery is ephemeral. Application data isn’t persisted across deploys and restarts, which works just fine for most apps because they use managed databases to persist data.

However, many applications need persistent disk storage that isn’t ephemeral. These include:

  • Blogging platforms and CMSs like WordPress, Ghost, and Strapi.
  • Collaboration apps like Mattermost, GitLab, and Discourse.

This is where Qovery block Storage comes in. Qovery applications can use storage to store data that persists across deploys and restarts, making it easy to deploy stateful applications.

Use cases
✅ Good use cases
  • For I/O intensive applications (E.g. database)
  • To store temporary files
❌ Bad use cases
  • To store file > 1 TB
  • To expose files from an application (E.g. images)
Types of Block Storage

Qovery Storage supports:

TypeMax IOPSMax ThroughputMin SizeMax SizeUse cases
fast_ssd640001GB/s5GB10GB Community / 1TB paid plansCritical business applications that require sustained IOPS like databases
Configuration

You can set up your Block Storage in Storage section of your application configuration.

Application Storage

Ports

Within this section you can define the port exposed by your application to the other services or even over the internet. -You can edit the existing ports or declare new ones by specifying:

  • Application port: this is the port exposed internally by your application for the other services.
  • Protocol: you can select the protocol used by your application : HTTP (for both standard HTTP or websocket communications), gRPC, TCP, UDP.
  • Publicly exposed: it allows you to expose over the public network your service. A public domain will be assigned to your application during the deployment (see Domain section)
  • If Publicly Exposed is selected:
    • External port: it is the port that can be used to access this service over the internet (when exposed publicly). Note that for HTTP and gRPC the port is set by default to 443.
    • Port Name: it is the name assigned to the port. When multiple ports are exposed publicly, its value is used to route the traffic to the right port based on the called subdomain (which will contain the port name value). Since each port is exposed on the port 443, having a different subdomain is the only way to have multiple ports exposed over the internet. If not set, the default value is p<portNumber> (see Domain section for more information)

Application Ports

Important Informations

  • Most of the Kubernetes Health Checks]docs.using-qovery.configuration.service-health-checks are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly.
  • Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the advanced settings section
  • Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill.
  • You can configure your application to use the PORT environment variable by adding the PORT on your application env variables page.
  • A Note on Listening IPs: It's best for your application to listen on 0.0.0.0:$PORT. While most things work with 127.0.0.1 and localhost, some do not (NodeJS for example)

Health Checks

To know more about how to configure your Liveness and Readiness probes, have a look at the health-checks section

Domains

The Domain section allows you to define a custom domain for your application.

For each port publicly exposed, a domain is automatically assigned by Qovery to your application. Qovery will manage for you the networking and the TLS configuration for these domains.

domain example: p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh

Special Case - Preview Environment -For each port exposed publicly, an additional domain will be created with the following pattern portName-prId-srvName-envSourceName.cluster_domain:

  • portName: is the port name, as explained above
  • prID: is the id of the PR that has generated the preview environment
  • srvName: is the name of the service
  • envSourceName: is the name of the blueprint environment that has created the current preview environment

domain example: p80-123-frontend-blueprint.za8ad0657.bool.sh

Note:

  • each service deployed on the same cluster will have the same root domain assigned (example: za8ad0657.bool.sh)
  • the first characters of the domain assigned to the application is based on the portName given to the port (See the port section
  • a default domain (without the portName) is assigned to the default port(See the port section). Example zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh

If you want to customize the domain assigned to your application press the Add Domain button.

Application Domains

In this section, you can assign your custom domain via CNAME or just change the sub-domain assigned to your service.

Configuring a domain via CNAME

You can configure your DNS by adding a CNAME record so that your app will be accessible through your custom domain. Qovery will handle for you the network configuration and the TLS certificate.

Change the assigned sub-domain

You can specify a different sub-domain for your application as long as it belongs to the assigned cluster domain (see above). -Example:

  • your current domain is zdf72de71-z709e1a85-gtw.za8ad0659.bool.sh (so your assigned cluster domain is za8ad0659.bool.sh)
  • you can enter a new custom domain myfrontend.za8ad0659.bool.sh (since it is a subdomain of the cluster domain)

The application will now be accessible from both the default and the new custom domain.

Connecting to a database

To know how to access your database from your application, have a look at the database section.

Connecting to another application

To know how to access your database from your application, have a look at the database section.

Environment Variable

To learn how to set up environment variables in your projects and applications, navigate to configuring Environment Variables section.

Secrets

To learn how to set up secrets in your projects and applications, navigate to configuring Secrets section.

Logs

To learn how to display your application logs, navigate to logs section

SSH

To connect to your application via SSH, please use the via the Qovery SSH command available on our CLI.

Clone

You can create a clone of the service via the clone feature. A new service with the same configuration (see below for exceptions) will be created into the target environment.

Clone Service

The target environment can be the same as the current environment or even another one in a completely different project.

Important information

Not every configuration parameter will be copied within the new service for consistency reasons. The configuration is fully or partially copied depending on the target environment:

  • same environment:
    • custom domain: this setup is not copied into the new service (to avoid collision)
  • another environment:
    • custom domain: this setup is not copied into the new service (to avoid collision)
    • environment variable: aliases defined on environment variables are not copied (since the aliased env var might not exist)
    • deployment pipeline: stage setup is not copied (since the target stage might not exist)
    • number of instances: if the target environment runs on a Qovery EC2 cluster, the max number of instances is set to 1 (Qovery EC2 constraint)

Please check the configuration of the new service before deploying it.

Delete an Application

  1. Choose your application

  2. In the application overview, click on the 3 dots button and remove the application.

    Application

+You can edit the existing ports or declare new ones by specifying:

  • Application port: this is the port exposed internally by your application for the other services.
  • Protocol: you can select the protocol used by your application : HTTP (for both standard HTTP or websocket communications), gRPC, TCP, UDP.
  • Publicly exposed: it allows you to expose over the public network your service. A public domain will be assigned to your application during the deployment (see Connectin from the internet section)
  • If Publicly Exposed is selected:
    • External port: it is the port that can be used to access this service over the internet (when exposed publicly). Note that for HTTP and gRPC the port is set by default to 443.
    • Port Name: it is the name assigned to the port. When multiple ports are exposed publicly, its value is used to route the traffic to the right port based on the called subdomain (which will contain the port name value). Since each port is exposed on the port 443, having a different subdomain is the only way to have multiple ports exposed over the internet. If not set, the default value is p<portNumber> (see Qovery Provided Domain section for more information)

Application Ports

Important Informations

  • Most of the Kubernetes Health Checks]docs.using-qovery.configuration.service-health-checks are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly.
  • Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the advanced settings section
  • Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill.
  • You can configure your application to use the PORT environment variable by adding the PORT on your application env variables page.
  • A Note on Listening IPs: It's best for your application to listen on 0.0.0.0:$PORT. While most things work with 127.0.0.1 and localhost, some do not (NodeJS for example)

Health Checks

To know more about how to configure your Liveness and Readiness probes, have a look at the health-checks section

Domains

Within this section you can customize the domain used to reach your application.

You can customize the domain of your application in different ways, depending on what you want to achieve:

  • You want to use your own domain for this application
  • You want to modify the subdomain assigned to your application by Qovery (i.e. change p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh into my-app-domain.za8ad0657.bool.sh).

In both cases, you can assign the new custom domain to your application press the Add Domain button.

Application Domains

Configuring your own domain

Once the domain is added within the Qovery console (Example: mydomain.com), you need to configure within your DNS two CNAME records pointing to the domain provided by Qovery, as shown in the UI (example: mydomain.com CNAME za7cc1b71-z4b8474b3-gtw.zc531a994.rustrocks.cloud and *.mydomain.com CNAME za7cc1b71-z4b8474b3-gtw.zc531a994.rustrocks.cloud).

Having a wildcard domain (example: *.mydomain.com) configured on your DNS will avoid you to modify the Qovery setup every time you want to add a new subdomain. If wildcard is not supported by your DNS provider, you will have to configure each subdomain manually.

If the service needs to expose more than one port publicly, you can define a dedicated subdomain to redirect the traffic on the right port by setting the “Port Name” value within the port settings.

From this point, Qovery will automatically handle the TLS/SSL certificate creation and renewal for the configured domain.

Custom Domain

Special case - CDN in proxy mode

If your service is behind a CDN using a proxy mode (i.e. the traffic is routed through the CDN to Qovery), make sure to disable the option "Generate certificate" on the domain setup. Since the certificate of your domain is directly managed by the CDN, Qovery won't be able to do that for you and it will raise warnings on your application status.

CDN Proxy

Change the auto assigned sub-domain

You can specify a different sub-domain for your application as long as it belongs to the assigned cluster domain (see Qovery provided domains). +Example:

  • your current domain is zdf72de71-z709e1a85-gtw.za8ad0659.bool.sh (so your assigned cluster domain is za8ad0659.bool.sh)
  • you can enter a new custom domain myfrontend.za8ad0659.bool.sh (since it is a subdomain of the cluster domain)

The application will now be accessible from both the default and the new custom domain.

Connecting from the internet

Your application can be reached from the internet by publicly exposing at least one of its ports (See the Ports section to know more). Once this is done, Qovery will generate for you a domain to reach your application from the internet. You can also customize the domain assigned to your application and manage by yourself this assignment via the Domain section.

Qovery provided domains

For each port publicly exposed, a domain is automatically assigned by Qovery to your application. Qovery will manage for you the networking and the TLS configuration for these domains.

Example: p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh

Note:

  • each service deployed on the same cluster will have the same root domain assigned (example: za8ad0657.bool.sh)
  • the first characters of the domain (before the -) is based on the portName given to the port associated with this domain (See the port section)
  • a default domain (without the portName) is assigned to the default port(See the port section). Example zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh

Special Case - Preview Environment +For each port exposed publicly, an additional domain will be created with the following pattern portName-prId-srvName-envSourceName.cluster_domain:

  • portName: is the port name, as explained above
  • prID: is the id of the PR that has generated the preview environment
  • srvName: is the name of the service
  • envSourceName: is the name of the blueprint environment that has created the current preview environment

domain example: p80-123-frontend-blueprint.za8ad0657.bool.sh

Custom domains

If you prefer to assign your own domain to the application have a look at the Domain section to know more.

Connecting to a database

To know how to access your database from your application, have a look at the database section.

Connecting to another application

To know how to access your database from your application, have a look at the database section.

Environment Variable

To learn how to set up environment variables in your projects and applications, navigate to configuring Environment Variables section.

Secrets

To learn how to set up secrets in your projects and applications, navigate to configuring Secrets section.

Logs

To learn how to display your application logs, navigate to logs section

SSH

To connect to your application via SSH, please use the via the Qovery SSH command available on our CLI.

Clone

You can create a clone of the service via the clone feature. A new service with the same configuration (see below for exceptions) will be created into the target environment.

Clone Service

The target environment can be the same as the current environment or even another one in a completely different project.

Important information

Not every configuration parameter will be copied within the new service for consistency reasons. The configuration is fully or partially copied depending on the target environment:

  • same environment:
    • custom domain: this setup is not copied into the new service (to avoid collision)
  • another environment:
    • custom domain: this setup is not copied into the new service (to avoid collision)
    • environment variable: aliases defined on environment variables are not copied (since the aliased env var might not exist)
    • deployment pipeline: stage setup is not copied (since the target stage might not exist)
    • number of instances: if the target environment runs on a Qovery EC2 cluster, the max number of instances is set to 1 (Qovery EC2 constraint)

Please check the configuration of the new service before deploying it.

Delete an Application

  1. Choose your application

  2. In the application overview, click on the 3 dots button and remove the application.

    Application

- + @@ -83,7 +80,7 @@ - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/index.html b/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/index.html index b5ee566f33..3daa0ef9f0 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/amazon-web-services/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/digital-ocean/index.html b/docs/using-qovery/configuration/cloud-service-provider/digital-ocean/index.html index 7c9302396e..a822f39fb6 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/digital-ocean/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/digital-ocean/index.html @@ -26,7 +26,7 @@ - + @@ -58,7 +58,7 @@ - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/index.html b/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/index.html index 8515fc3e2c..8e75ba69c8 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/google-cloud-platform/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/index.html b/docs/using-qovery/configuration/cloud-service-provider/index.html index 533c2ccd15..282c90697f 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/index.html b/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/index.html index f0b92d172c..2b20d135ae 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/microsoft-azure/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/cloud-service-provider/scaleway/index.html b/docs/using-qovery/configuration/cloud-service-provider/scaleway/index.html index f9e623cebb..cf8127aabe 100644 --- a/docs/using-qovery/configuration/cloud-service-provider/scaleway/index.html +++ b/docs/using-qovery/configuration/cloud-service-provider/scaleway/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/docs/using-qovery/configuration/cluster-advanced-settings/index.html b/docs/using-qovery/configuration/cluster-advanced-settings/index.html index 3ac6c6d586..373c00ddda 100644 --- a/docs/using-qovery/configuration/cluster-advanced-settings/index.html +++ b/docs/using-qovery/configuration/cluster-advanced-settings/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/clusters/index.html b/docs/using-qovery/configuration/clusters/index.html index 8cc12d45cb..d487cf7ee6 100644 --- a/docs/using-qovery/configuration/clusters/index.html +++ b/docs/using-qovery/configuration/clusters/index.html @@ -26,7 +26,7 @@ - + @@ -61,7 +61,7 @@ - + diff --git a/docs/using-qovery/configuration/cronjob/index.html b/docs/using-qovery/configuration/cronjob/index.html index 447dc67706..6b84a6b2ed 100644 --- a/docs/using-qovery/configuration/cronjob/index.html +++ b/docs/using-qovery/configuration/cronjob/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/docs/using-qovery/configuration/database/index.html b/docs/using-qovery/configuration/database/index.html index c55910b4ff..1dbbc9faed 100644 --- a/docs/using-qovery/configuration/database/index.html +++ b/docs/using-qovery/configuration/database/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/docs/using-qovery/configuration/database/mongodb/index.html b/docs/using-qovery/configuration/database/mongodb/index.html index 14ac0ea385..91fdaf143c 100644 --- a/docs/using-qovery/configuration/database/mongodb/index.html +++ b/docs/using-qovery/configuration/database/mongodb/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/database/mysql/index.html b/docs/using-qovery/configuration/database/mysql/index.html index cfcfe267cd..c00e8dd8c6 100644 --- a/docs/using-qovery/configuration/database/mysql/index.html +++ b/docs/using-qovery/configuration/database/mysql/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/database/postgresql/index.html b/docs/using-qovery/configuration/database/postgresql/index.html index a3b2847232..95eac73372 100644 --- a/docs/using-qovery/configuration/database/postgresql/index.html +++ b/docs/using-qovery/configuration/database/postgresql/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/database/redis/index.html b/docs/using-qovery/configuration/database/redis/index.html index 93fe17b97e..98ee205e13 100644 --- a/docs/using-qovery/configuration/database/redis/index.html +++ b/docs/using-qovery/configuration/database/redis/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/deployment-rule/index.html b/docs/using-qovery/configuration/deployment-rule/index.html index 8e6492e58c..ddd1c844f2 100644 --- a/docs/using-qovery/configuration/deployment-rule/index.html +++ b/docs/using-qovery/configuration/deployment-rule/index.html @@ -26,7 +26,7 @@ - + @@ -63,7 +63,7 @@ - + diff --git a/docs/using-qovery/configuration/environment-variable/index.html b/docs/using-qovery/configuration/environment-variable/index.html index 031c7529b1..a988a51d3a 100644 --- a/docs/using-qovery/configuration/environment-variable/index.html +++ b/docs/using-qovery/configuration/environment-variable/index.html @@ -26,7 +26,7 @@ - + @@ -67,7 +67,7 @@ - + diff --git a/docs/using-qovery/configuration/environment/index.html b/docs/using-qovery/configuration/environment/index.html index 86288104f9..c2867e107a 100644 --- a/docs/using-qovery/configuration/environment/index.html +++ b/docs/using-qovery/configuration/environment/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/docs/using-qovery/configuration/index.html b/docs/using-qovery/configuration/index.html index cbccce7064..034df06405 100644 --- a/docs/using-qovery/configuration/index.html +++ b/docs/using-qovery/configuration/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/lifecycle-job/index.html b/docs/using-qovery/configuration/lifecycle-job/index.html index 3aca7c38f0..6f76b34fde 100644 --- a/docs/using-qovery/configuration/lifecycle-job/index.html +++ b/docs/using-qovery/configuration/lifecycle-job/index.html @@ -26,7 +26,7 @@ - + @@ -61,7 +61,7 @@ - + diff --git a/docs/using-qovery/configuration/object-storage/index.html b/docs/using-qovery/configuration/object-storage/index.html index 3aa0b32154..8dde58fc9e 100644 --- a/docs/using-qovery/configuration/object-storage/index.html +++ b/docs/using-qovery/configuration/object-storage/index.html @@ -26,7 +26,7 @@ - + @@ -66,7 +66,7 @@ - + diff --git a/docs/using-qovery/configuration/organization/api-token/index.html b/docs/using-qovery/configuration/organization/api-token/index.html index a89b962c71..5b2976798b 100644 --- a/docs/using-qovery/configuration/organization/api-token/index.html +++ b/docs/using-qovery/configuration/organization/api-token/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/organization/container-registry/index.html b/docs/using-qovery/configuration/organization/container-registry/index.html index 3457e6c851..1618c7e670 100644 --- a/docs/using-qovery/configuration/organization/container-registry/index.html +++ b/docs/using-qovery/configuration/organization/container-registry/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/docs/using-qovery/configuration/organization/git-repository-access/index.html b/docs/using-qovery/configuration/organization/git-repository-access/index.html index 8214847558..9958b826c6 100644 --- a/docs/using-qovery/configuration/organization/git-repository-access/index.html +++ b/docs/using-qovery/configuration/organization/git-repository-access/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/docs/using-qovery/configuration/organization/index.html b/docs/using-qovery/configuration/organization/index.html index cb9db5feef..e76f6e827f 100644 --- a/docs/using-qovery/configuration/organization/index.html +++ b/docs/using-qovery/configuration/organization/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/docs/using-qovery/configuration/organization/members-rbac/index.html b/docs/using-qovery/configuration/organization/members-rbac/index.html index 4fa485352f..021ec3a061 100644 --- a/docs/using-qovery/configuration/organization/members-rbac/index.html +++ b/docs/using-qovery/configuration/organization/members-rbac/index.html @@ -26,7 +26,7 @@ - + @@ -58,7 +58,7 @@ - + diff --git a/docs/using-qovery/configuration/project/index.html b/docs/using-qovery/configuration/project/index.html index f672ae3fe6..47a6253925 100644 --- a/docs/using-qovery/configuration/project/index.html +++ b/docs/using-qovery/configuration/project/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/configuration/service-health-checks/index.html b/docs/using-qovery/configuration/service-health-checks/index.html index 95c89b9fbb..92430f9a9b 100644 --- a/docs/using-qovery/configuration/service-health-checks/index.html +++ b/docs/using-qovery/configuration/service-health-checks/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/docs/using-qovery/configuration/user-account/index.html b/docs/using-qovery/configuration/user-account/index.html index 28b00eff71..48891e0303 100644 --- a/docs/using-qovery/configuration/user-account/index.html +++ b/docs/using-qovery/configuration/user-account/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html b/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html index 83f25589f6..d74f0a02de 100644 --- a/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html +++ b/docs/using-qovery/deployment/deploying-with-auto-deploy/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/deployment/deploying-with-ci-cd/index.html b/docs/using-qovery/deployment/deploying-with-ci-cd/index.html index 5c91415a4d..24d1a3623b 100644 --- a/docs/using-qovery/deployment/deploying-with-ci-cd/index.html +++ b/docs/using-qovery/deployment/deploying-with-ci-cd/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/deployment/deployment-actions/index.html b/docs/using-qovery/deployment/deployment-actions/index.html index bb2421bc5a..b39ae1f9cf 100644 --- a/docs/using-qovery/deployment/deployment-actions/index.html +++ b/docs/using-qovery/deployment/deployment-actions/index.html @@ -26,7 +26,7 @@ - + @@ -58,7 +58,7 @@ - + diff --git a/docs/using-qovery/deployment/deployment-history/index.html b/docs/using-qovery/deployment/deployment-history/index.html index 15e53d0f74..d5a76a7c3e 100644 --- a/docs/using-qovery/deployment/deployment-history/index.html +++ b/docs/using-qovery/deployment/deployment-history/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/deployment/deployment-pipeline/index.html b/docs/using-qovery/deployment/deployment-pipeline/index.html index e3818cf00a..c3299e2959 100644 --- a/docs/using-qovery/deployment/deployment-pipeline/index.html +++ b/docs/using-qovery/deployment/deployment-pipeline/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/docs/using-qovery/deployment/deployment-strategies/index.html b/docs/using-qovery/deployment/deployment-strategies/index.html index 7458f53484..d05cb45cd7 100644 --- a/docs/using-qovery/deployment/deployment-strategies/index.html +++ b/docs/using-qovery/deployment/deployment-strategies/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/deployment/image-mirroring/index.html b/docs/using-qovery/deployment/image-mirroring/index.html index 6e748a0120..ab2905ed06 100644 --- a/docs/using-qovery/deployment/image-mirroring/index.html +++ b/docs/using-qovery/deployment/image-mirroring/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/deployment/index.html b/docs/using-qovery/deployment/index.html index 489a91bac1..59cda156be 100644 --- a/docs/using-qovery/deployment/index.html +++ b/docs/using-qovery/deployment/index.html @@ -26,7 +26,7 @@ - + @@ -58,7 +58,7 @@ - + diff --git a/docs/using-qovery/deployment/logs/index.html b/docs/using-qovery/deployment/logs/index.html index 410f59ea61..47544966b5 100644 --- a/docs/using-qovery/deployment/logs/index.html +++ b/docs/using-qovery/deployment/logs/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/deployment/running-and-deployment-statuses/index.html b/docs/using-qovery/deployment/running-and-deployment-statuses/index.html index c0888e67c8..b39cb2ca67 100644 --- a/docs/using-qovery/deployment/running-and-deployment-statuses/index.html +++ b/docs/using-qovery/deployment/running-and-deployment-statuses/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/index.html b/docs/using-qovery/index.html index 65a4da861a..90b3851d94 100644 --- a/docs/using-qovery/index.html +++ b/docs/using-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/api-integration/index.html b/docs/using-qovery/integration/api-integration/index.html index 6812551b22..f8c784166c 100644 --- a/docs/using-qovery/integration/api-integration/index.html +++ b/docs/using-qovery/integration/api-integration/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/container-registry/index.html b/docs/using-qovery/integration/container-registry/index.html index 5abc6877ca..33b5241db8 100644 --- a/docs/using-qovery/integration/container-registry/index.html +++ b/docs/using-qovery/integration/container-registry/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/continuous-integration/circle-ci/index.html b/docs/using-qovery/integration/continuous-integration/circle-ci/index.html index 2c06f21895..1fcc8026f5 100644 --- a/docs/using-qovery/integration/continuous-integration/circle-ci/index.html +++ b/docs/using-qovery/integration/continuous-integration/circle-ci/index.html @@ -26,7 +26,7 @@ - + @@ -58,7 +58,7 @@ - + diff --git a/docs/using-qovery/integration/continuous-integration/github-actions/index.html b/docs/using-qovery/integration/continuous-integration/github-actions/index.html index b53cdfd0ab..3bb655e6b6 100644 --- a/docs/using-qovery/integration/continuous-integration/github-actions/index.html +++ b/docs/using-qovery/integration/continuous-integration/github-actions/index.html @@ -26,7 +26,7 @@ - + @@ -66,7 +66,7 @@ - + diff --git a/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html b/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html index 4d93e1f64f..dc4bfb3ced 100644 --- a/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html +++ b/docs/using-qovery/integration/continuous-integration/gitlab-ci/index.html @@ -26,7 +26,7 @@ - + @@ -61,7 +61,7 @@ - + diff --git a/docs/using-qovery/integration/continuous-integration/index.html b/docs/using-qovery/integration/continuous-integration/index.html index 054cf5514a..88653f83f2 100644 --- a/docs/using-qovery/integration/continuous-integration/index.html +++ b/docs/using-qovery/integration/continuous-integration/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/continuous-integration/jenkins/index.html b/docs/using-qovery/integration/continuous-integration/jenkins/index.html index 941c358b3f..ab1e9f485e 100644 --- a/docs/using-qovery/integration/continuous-integration/jenkins/index.html +++ b/docs/using-qovery/integration/continuous-integration/jenkins/index.html @@ -26,7 +26,7 @@ - + @@ -58,7 +58,7 @@ - + diff --git a/docs/using-qovery/integration/git-repository/index.html b/docs/using-qovery/integration/git-repository/index.html index ab89d264c3..343d550198 100644 --- a/docs/using-qovery/integration/git-repository/index.html +++ b/docs/using-qovery/integration/git-repository/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/index.html b/docs/using-qovery/integration/index.html index fbbfdaea9b..0523211d80 100644 --- a/docs/using-qovery/integration/index.html +++ b/docs/using-qovery/integration/index.html @@ -26,7 +26,7 @@ - + @@ -44,7 +44,7 @@ - + @@ -55,7 +55,7 @@ - + @@ -73,7 +73,7 @@ - + diff --git a/docs/using-qovery/integration/monitoring/datadog/index.html b/docs/using-qovery/integration/monitoring/datadog/index.html index b9a9de5bf2..e8a7fe4c16 100644 --- a/docs/using-qovery/integration/monitoring/datadog/index.html +++ b/docs/using-qovery/integration/monitoring/datadog/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/docs/using-qovery/integration/monitoring/index.html b/docs/using-qovery/integration/monitoring/index.html index 221cec68d2..c012089e0e 100644 --- a/docs/using-qovery/integration/monitoring/index.html +++ b/docs/using-qovery/integration/monitoring/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/monitoring/new-relic/index.html b/docs/using-qovery/integration/monitoring/new-relic/index.html index ee9e5ddf89..405c295ff5 100644 --- a/docs/using-qovery/integration/monitoring/new-relic/index.html +++ b/docs/using-qovery/integration/monitoring/new-relic/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html b/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html index 24f294f43a..bdaf5abe5e 100644 --- a/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html +++ b/docs/using-qovery/integration/secret-manager/aws-secrets-manager/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/secret-manager/doppler/index.html b/docs/using-qovery/integration/secret-manager/doppler/index.html index eb54eac2d4..748d100ae8 100644 --- a/docs/using-qovery/integration/secret-manager/doppler/index.html +++ b/docs/using-qovery/integration/secret-manager/doppler/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/secret-manager/index.html b/docs/using-qovery/integration/secret-manager/index.html index 96355304e2..110ca99d53 100644 --- a/docs/using-qovery/integration/secret-manager/index.html +++ b/docs/using-qovery/integration/secret-manager/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/slack/index.html b/docs/using-qovery/integration/slack/index.html index 66146a7160..16afd9e800 100644 --- a/docs/using-qovery/integration/slack/index.html +++ b/docs/using-qovery/integration/slack/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/integration/terraform/index.html b/docs/using-qovery/integration/terraform/index.html index 8ea9639167..c54ce5895c 100644 --- a/docs/using-qovery/integration/terraform/index.html +++ b/docs/using-qovery/integration/terraform/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/docs/using-qovery/integration/webhook/index.html b/docs/using-qovery/integration/webhook/index.html index bb7b500880..bcc334c8ec 100644 --- a/docs/using-qovery/integration/webhook/index.html +++ b/docs/using-qovery/integration/webhook/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/interface/cli/index.html b/docs/using-qovery/interface/cli/index.html index 9094a50505..5ecf32895d 100644 --- a/docs/using-qovery/interface/cli/index.html +++ b/docs/using-qovery/interface/cli/index.html @@ -26,7 +26,7 @@ - + @@ -82,7 +82,7 @@ - + diff --git a/docs/using-qovery/interface/index.html b/docs/using-qovery/interface/index.html index e54460d5ff..5d0e47c482 100644 --- a/docs/using-qovery/interface/index.html +++ b/docs/using-qovery/interface/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/interface/rest-api/index.html b/docs/using-qovery/interface/rest-api/index.html index ec0e67fc38..b960d1ae02 100644 --- a/docs/using-qovery/interface/rest-api/index.html +++ b/docs/using-qovery/interface/rest-api/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/interface/terraform-interface/index.html b/docs/using-qovery/interface/terraform-interface/index.html index 23ced29981..2b5fe70a62 100644 --- a/docs/using-qovery/interface/terraform-interface/index.html +++ b/docs/using-qovery/interface/terraform-interface/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/interface/web-interface/index.html b/docs/using-qovery/interface/web-interface/index.html index 638be13f95..5c1662aaa2 100644 --- a/docs/using-qovery/interface/web-interface/index.html +++ b/docs/using-qovery/interface/web-interface/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/maintenance/index.html b/docs/using-qovery/maintenance/index.html index 0366bb8531..3953642f41 100644 --- a/docs/using-qovery/maintenance/index.html +++ b/docs/using-qovery/maintenance/index.html @@ -26,7 +26,7 @@ - + @@ -71,7 +71,7 @@ - + diff --git a/docs/using-qovery/troubleshoot/application-troubleshoot/index.html b/docs/using-qovery/troubleshoot/application-troubleshoot/index.html index a880b386bd..bf0f669192 100644 --- a/docs/using-qovery/troubleshoot/application-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/application-troubleshoot/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html b/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html index 143ec363c4..e635ad9562 100644 --- a/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/cluster-troubleshoot/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/troubleshoot/database-troubleshoot/index.html b/docs/using-qovery/troubleshoot/database-troubleshoot/index.html index d47003b1e9..68cd0739fb 100644 --- a/docs/using-qovery/troubleshoot/database-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/database-troubleshoot/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/troubleshoot/index.html b/docs/using-qovery/troubleshoot/index.html index ccd80cf8c1..3dcc19cee0 100644 --- a/docs/using-qovery/troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/index.html b/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/index.html index 69a7f3fd0d..a0dd3d3c8c 100644 --- a/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/index.html +++ b/docs/using-qovery/troubleshoot/lifecycle-troubleshoot/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/guides/advanced/build-on-top/index.html b/guides/advanced/build-on-top/index.html index 688e3f686e..a29cb9704d 100644 --- a/guides/advanced/build-on-top/index.html +++ b/guides/advanced/build-on-top/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/continuous-integration/index.html b/guides/advanced/continuous-integration/index.html index 9601029c9e..373d9e996e 100644 --- a/guides/advanced/continuous-integration/index.html +++ b/guides/advanced/continuous-integration/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/costs-control/index.html b/guides/advanced/costs-control/index.html index 2b196a3376..b12e2ab4a5 100644 --- a/guides/advanced/costs-control/index.html +++ b/guides/advanced/costs-control/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/deploy-api-gateway/index.html b/guides/advanced/deploy-api-gateway/index.html index 5586a1d57b..db8be8dec2 100644 --- a/guides/advanced/deploy-api-gateway/index.html +++ b/guides/advanced/deploy-api-gateway/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/deploy-aws-services/index.html b/guides/advanced/deploy-aws-services/index.html index e31f6bc4e6..9255b6e641 100644 --- a/guides/advanced/deploy-aws-services/index.html +++ b/guides/advanced/deploy-aws-services/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/deploy-external-services/index.html b/guides/advanced/deploy-external-services/index.html index 917482cd65..02bd4bd31a 100644 --- a/guides/advanced/deploy-external-services/index.html +++ b/guides/advanced/deploy-external-services/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/deploy-frontend/index.html b/guides/advanced/deploy-frontend/index.html index fecdbe1812..e616ead1cc 100644 --- a/guides/advanced/deploy-frontend/index.html +++ b/guides/advanced/deploy-frontend/index.html @@ -26,7 +26,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/guides/advanced/helm-chart/index.html b/guides/advanced/helm-chart/index.html index 8e47711f13..dabeb4b7e9 100644 --- a/guides/advanced/helm-chart/index.html +++ b/guides/advanced/helm-chart/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/index.html b/guides/advanced/index.html index f369b886db..7cd1164a79 100644 --- a/guides/advanced/index.html +++ b/guides/advanced/index.html @@ -26,7 +26,7 @@ - + @@ -81,7 +81,7 @@ - + diff --git a/guides/advanced/microservices/index.html b/guides/advanced/microservices/index.html index 47e6c29b8b..2ba0aae557 100644 --- a/guides/advanced/microservices/index.html +++ b/guides/advanced/microservices/index.html @@ -26,7 +26,7 @@ - + @@ -58,7 +58,7 @@ - + diff --git a/guides/advanced/migration/index.html b/guides/advanced/migration/index.html index 12fbbcdbb6..316be4b0af 100644 --- a/guides/advanced/migration/index.html +++ b/guides/advanced/migration/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/monitoring/index.html b/guides/advanced/monitoring/index.html index cf64f91c8a..42f5c95bd9 100644 --- a/guides/advanced/monitoring/index.html +++ b/guides/advanced/monitoring/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/monorepository/index.html b/guides/advanced/monorepository/index.html index 9e0f6d9d5d..4f4635e66a 100644 --- a/guides/advanced/monorepository/index.html +++ b/guides/advanced/monorepository/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/advanced/production/index.html b/guides/advanced/production/index.html index 670337f873..30e103102a 100644 --- a/guides/advanced/production/index.html +++ b/guides/advanced/production/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/seed-database/index.html b/guides/advanced/seed-database/index.html index 488f478979..2747981104 100644 --- a/guides/advanced/seed-database/index.html +++ b/guides/advanced/seed-database/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/advanced/terraform/index.html b/guides/advanced/terraform/index.html index 9983a0f8a9..6cfb4e8934 100644 --- a/guides/advanced/terraform/index.html +++ b/guides/advanced/terraform/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/advanced/use-preview-environments/index.html b/guides/advanced/use-preview-environments/index.html index 347eac11d7..c8f66718d5 100644 --- a/guides/advanced/use-preview-environments/index.html +++ b/guides/advanced/use-preview-environments/index.html @@ -26,7 +26,7 @@ - + @@ -52,7 +52,7 @@ - + diff --git a/guides/cloud-provider/guide-amazon-web-services/index.html b/guides/cloud-provider/guide-amazon-web-services/index.html index 6bd5107526..12f468d6a5 100644 --- a/guides/cloud-provider/guide-amazon-web-services/index.html +++ b/guides/cloud-provider/guide-amazon-web-services/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/cloud-provider/guide-google-cloud-platform/index.html b/guides/cloud-provider/guide-google-cloud-platform/index.html index 283b236465..998f12fc4e 100644 --- a/guides/cloud-provider/guide-google-cloud-platform/index.html +++ b/guides/cloud-provider/guide-google-cloud-platform/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/cloud-provider/guide-microsoft-azure/index.html b/guides/cloud-provider/guide-microsoft-azure/index.html index 1c9f56aa7b..ab6b617578 100644 --- a/guides/cloud-provider/guide-microsoft-azure/index.html +++ b/guides/cloud-provider/guide-microsoft-azure/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/cloud-provider/guide-scaleway/index.html b/guides/cloud-provider/guide-scaleway/index.html index 08a4744382..3ca68fc215 100644 --- a/guides/cloud-provider/guide-scaleway/index.html +++ b/guides/cloud-provider/guide-scaleway/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/cloud-provider/index.html b/guides/cloud-provider/index.html index 06722ff030..78da2d81ff 100644 --- a/guides/cloud-provider/index.html +++ b/guides/cloud-provider/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/guides/getting-started/create-a-database/index.html b/guides/getting-started/create-a-database/index.html index 3ef200a188..c7e336b900 100644 --- a/guides/getting-started/create-a-database/index.html +++ b/guides/getting-started/create-a-database/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/guides/getting-started/debugging/index.html b/guides/getting-started/debugging/index.html index 01103c3f39..0d1c9ef811 100644 --- a/guides/getting-started/debugging/index.html +++ b/guides/getting-started/debugging/index.html @@ -26,7 +26,7 @@ - + @@ -52,7 +52,7 @@ - + diff --git a/guides/getting-started/deploy-your-first-application/index.html b/guides/getting-started/deploy-your-first-application/index.html index 14d3e4aefd..1ca24f2e38 100644 --- a/guides/getting-started/deploy-your-first-application/index.html +++ b/guides/getting-started/deploy-your-first-application/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/getting-started/index.html b/guides/getting-started/index.html index 447b72df11..35d59c4f8c 100644 --- a/guides/getting-started/index.html +++ b/guides/getting-started/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/guides/getting-started/managing-environment-variables/index.html b/guides/getting-started/managing-environment-variables/index.html index 7f9bc06877..e40089ffa0 100644 --- a/guides/getting-started/managing-environment-variables/index.html +++ b/guides/getting-started/managing-environment-variables/index.html @@ -26,7 +26,7 @@ - + @@ -60,7 +60,7 @@ - + diff --git a/guides/getting-started/setting-custom-domain/index.html b/guides/getting-started/setting-custom-domain/index.html index deb1e1954a..0554bb80c5 100644 --- a/guides/getting-started/setting-custom-domain/index.html +++ b/guides/getting-started/setting-custom-domain/index.html @@ -26,7 +26,7 @@ - + @@ -52,7 +52,7 @@ - + diff --git a/guides/index.html b/guides/index.html index 875c3733b0..d74e3f62dc 100644 --- a/guides/index.html +++ b/guides/index.html @@ -26,7 +26,7 @@ - + @@ -181,7 +181,7 @@ - + diff --git a/guides/tags/cloud-provider-aws/index.html b/guides/tags/cloud-provider-aws/index.html index 81671601fa..71dc29ce50 100644 --- a/guides/tags/cloud-provider-aws/index.html +++ b/guides/tags/cloud-provider-aws/index.html @@ -26,7 +26,7 @@ - + @@ -75,7 +75,7 @@ - + diff --git a/guides/tags/cloud-provider-azure/index.html b/guides/tags/cloud-provider-azure/index.html index 0ac303ba65..3720d621c3 100644 --- a/guides/tags/cloud-provider-azure/index.html +++ b/guides/tags/cloud-provider-azure/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/cloud-provider-gcp/index.html b/guides/tags/cloud-provider-gcp/index.html index a8d34526b1..5a8f79ead3 100644 --- a/guides/tags/cloud-provider-gcp/index.html +++ b/guides/tags/cloud-provider-gcp/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/cloud-provider-scaleway/index.html b/guides/tags/cloud-provider-scaleway/index.html index a6a45e47ef..22fac9bc4c 100644 --- a/guides/tags/cloud-provider-scaleway/index.html +++ b/guides/tags/cloud-provider-scaleway/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/database-postgresql/index.html b/guides/tags/database-postgresql/index.html index 01d4e8310c..c89f5474af 100644 --- a/guides/tags/database-postgresql/index.html +++ b/guides/tags/database-postgresql/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/guides/tags/framework-rails/index.html b/guides/tags/framework-rails/index.html index 49346e3103..185cf1cc20 100644 --- a/guides/tags/framework-rails/index.html +++ b/guides/tags/framework-rails/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/index.html b/guides/tags/index.html index f5f321bf3a..1408ade4ba 100644 --- a/guides/tags/index.html +++ b/guides/tags/index.html @@ -26,7 +26,7 @@ - + @@ -49,7 +49,7 @@ - + diff --git a/guides/tags/language-javascript/index.html b/guides/tags/language-javascript/index.html index b425625a81..04560f7c2b 100644 --- a/guides/tags/language-javascript/index.html +++ b/guides/tags/language-javascript/index.html @@ -26,7 +26,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/guides/tags/language-kotlin/index.html b/guides/tags/language-kotlin/index.html index e02c9de0f8..2286914152 100644 --- a/guides/tags/language-kotlin/index.html +++ b/guides/tags/language-kotlin/index.html @@ -26,7 +26,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/guides/tags/language-ruby/index.html b/guides/tags/language-ruby/index.html index 4c69b8232b..0675b1f651 100644 --- a/guides/tags/language-ruby/index.html +++ b/guides/tags/language-ruby/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/language-rust/index.html b/guides/tags/language-rust/index.html index 7b9b3c60f6..20a6c0b9e8 100644 --- a/guides/tags/language-rust/index.html +++ b/guides/tags/language-rust/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/guides/tags/technology-docker/index.html b/guides/tags/technology-docker/index.html index 69b943a15d..78d735a2ee 100644 --- a/guides/tags/technology-docker/index.html +++ b/guides/tags/technology-docker/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/technology-github/index.html b/guides/tags/technology-github/index.html index 08c9fb585a..c681692bdf 100644 --- a/guides/tags/technology-github/index.html +++ b/guides/tags/technology-github/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/technology-helm/index.html b/guides/tags/technology-helm/index.html index 26d17ecd9a..6bcd8edf3f 100644 --- a/guides/tags/technology-helm/index.html +++ b/guides/tags/technology-helm/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/technology-qovery/index.html b/guides/tags/technology-qovery/index.html index 48971f49c9..0c07805517 100644 --- a/guides/tags/technology-qovery/index.html +++ b/guides/tags/technology-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -131,7 +131,7 @@ - + diff --git a/guides/tags/technology-terraform/index.html b/guides/tags/technology-terraform/index.html index 1c695c783b..5420bfd733 100644 --- a/guides/tags/technology-terraform/index.html +++ b/guides/tags/technology-terraform/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tags/type-guide/index.html b/guides/tags/type-guide/index.html index aa7db5a440..7661a1332d 100644 --- a/guides/tags/type-guide/index.html +++ b/guides/tags/type-guide/index.html @@ -26,7 +26,7 @@ - + @@ -99,7 +99,7 @@ - + diff --git a/guides/tags/type-tutorial/index.html b/guides/tags/type-tutorial/index.html index 553528ec23..32b4e2ea3a 100644 --- a/guides/tags/type-tutorial/index.html +++ b/guides/tags/type-tutorial/index.html @@ -26,7 +26,7 @@ - + @@ -131,7 +131,7 @@ - + diff --git a/guides/tutorial/aws-sqs-lambda-with-qovery/index.html b/guides/tutorial/aws-sqs-lambda-with-qovery/index.html index c87ea758c4..81f7c6485f 100644 --- a/guides/tutorial/aws-sqs-lambda-with-qovery/index.html +++ b/guides/tutorial/aws-sqs-lambda-with-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/tutorial/aws-vpc-peering-with-qovery/index.html b/guides/tutorial/aws-vpc-peering-with-qovery/index.html index 5cf4787c90..43202e955f 100644 --- a/guides/tutorial/aws-vpc-peering-with-qovery/index.html +++ b/guides/tutorial/aws-vpc-peering-with-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html b/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html index 4292a56c2d..03d874c34d 100644 --- a/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html +++ b/guides/tutorial/blazingly-fast-preview-environments-for-nextjs-nodejs-and-mongodb-on-aws/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html b/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html index 537ddbefea..8db3d8a958 100644 --- a/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html +++ b/guides/tutorial/build-e2e-testing-ephemeral-environments/index.html @@ -26,7 +26,7 @@ - + @@ -81,7 +81,7 @@ - + diff --git a/guides/tutorial/cloudwatch-integration/index.html b/guides/tutorial/cloudwatch-integration/index.html index 4cc12b858e..28e262e02f 100644 --- a/guides/tutorial/cloudwatch-integration/index.html +++ b/guides/tutorial/cloudwatch-integration/index.html @@ -26,7 +26,7 @@ - + @@ -54,7 +54,7 @@ - + diff --git a/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html b/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html index e7282f658c..155f9c7820 100644 --- a/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html +++ b/guides/tutorial/create-a-blazingly-fast-api-in-rust-part-1/index.html @@ -26,7 +26,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/guides/tutorial/create-a-playground-environment-on-aws/index.html b/guides/tutorial/create-a-playground-environment-on-aws/index.html index 5dc1aa89c2..9b2871d2ab 100644 --- a/guides/tutorial/create-a-playground-environment-on-aws/index.html +++ b/guides/tutorial/create-a-playground-environment-on-aws/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html b/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html index c3a9a6d800..16ed115e1f 100644 --- a/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html +++ b/guides/tutorial/create-your-staging-environment-from-your-production-environment-on-aws/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html b/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html index 3490e629d5..ee1bd5a53d 100644 --- a/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html +++ b/guides/tutorial/customizing-preview-url-with-qovery-cli/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tutorial/data-seeding-in-postgres/index.html b/guides/tutorial/data-seeding-in-postgres/index.html index f473ad5f80..68d8f5d9e9 100644 --- a/guides/tutorial/data-seeding-in-postgres/index.html +++ b/guides/tutorial/data-seeding-in-postgres/index.html @@ -26,7 +26,7 @@ - + @@ -64,7 +64,7 @@ - + diff --git a/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html b/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html index 0c676f4876..5c3b901593 100644 --- a/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html +++ b/guides/tutorial/deploy-rails-with-postgresql-and-sidekiq/index.html @@ -26,7 +26,7 @@ - + @@ -104,7 +104,7 @@ - + diff --git a/guides/tutorial/deploy-temporal-on-kubernetes/index.html b/guides/tutorial/deploy-temporal-on-kubernetes/index.html index 99ebaa0063..65fde2a683 100644 --- a/guides/tutorial/deploy-temporal-on-kubernetes/index.html +++ b/guides/tutorial/deploy-temporal-on-kubernetes/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/guides/tutorial/generate-qovery-api-client/index.html b/guides/tutorial/generate-qovery-api-client/index.html index b0f6517b3f..a54a8dca2d 100644 --- a/guides/tutorial/generate-qovery-api-client/index.html +++ b/guides/tutorial/generate-qovery-api-client/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html b/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html index 78ca35fa9d..dfc31164b2 100644 --- a/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html +++ b/guides/tutorial/getting-started-with-preview-environments-on-aws-for-beginners/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/tutorial/github-organization-repository-access/index.html b/guides/tutorial/github-organization-repository-access/index.html index 89a9ce9176..13a66e9847 100644 --- a/guides/tutorial/github-organization-repository-access/index.html +++ b/guides/tutorial/github-organization-repository-access/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tutorial/grafana-install/index.html b/guides/tutorial/grafana-install/index.html index 73b15c9e28..c486386e1f 100644 --- a/guides/tutorial/grafana-install/index.html +++ b/guides/tutorial/grafana-install/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html b/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html index 942535248f..fdf084bd15 100644 --- a/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html +++ b/guides/tutorial/how-to-activate-sso-to-connect-to-your-eks-cluster/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html index 97aacd8437..c0c3a02530 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-1/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html index 335c783a3c..fca6c78602 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-2/index.html @@ -26,7 +26,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html index a593fa0f1e..1b432f0dc7 100644 --- a/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html +++ b/guides/tutorial/how-to-build-a-cloud-version-of-your-open-source-software-part-3/index.html @@ -26,7 +26,7 @@ - + @@ -67,7 +67,7 @@ - + diff --git a/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html b/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html index e1440d6c4a..491ae11b3d 100644 --- a/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html +++ b/guides/tutorial/how-to-connect-to-a-managed-mongodb-instance-on-aws/index.html @@ -26,7 +26,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html b/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html index bb07294f3e..0159e57da7 100644 --- a/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html +++ b/guides/tutorial/how-to-connect-to-your-eks-cluster-with-kubectl/index.html @@ -26,7 +26,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html b/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html index d9606645fe..071f7f7287 100644 --- a/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html +++ b/guides/tutorial/how-to-create-an-rds-instance-through-aws-console/index.html @@ -26,7 +26,7 @@ - + @@ -52,7 +52,7 @@ - + diff --git a/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html b/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html index 17d25bf69f..7aa8e5d169 100644 --- a/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html +++ b/guides/tutorial/how-to-deploy-a-rust-rest-api-application-on-aws-with-ease/index.html @@ -26,7 +26,7 @@ - + @@ -75,7 +75,7 @@ - + diff --git a/guides/tutorial/how-to-deploy-helm-charts/index.html b/guides/tutorial/how-to-deploy-helm-charts/index.html index e2d6abacd2..b62394fdaa 100644 --- a/guides/tutorial/how-to-deploy-helm-charts/index.html +++ b/guides/tutorial/how-to-deploy-helm-charts/index.html @@ -26,7 +26,7 @@ - + @@ -54,7 +54,7 @@ - + diff --git a/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html b/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html index 1a12952850..50fa486325 100644 --- a/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html +++ b/guides/tutorial/how-to-deploy-your-application-on-aws-in-30-minutes/index.html @@ -26,7 +26,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html b/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html index 1700c683a3..aefa362742 100644 --- a/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html +++ b/guides/tutorial/how-to-integrate-qovery-with-github-actions/index.html @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/guides/tutorial/how-to-run-commands-at-application-startup/index.html b/guides/tutorial/how-to-run-commands-at-application-startup/index.html index 35b1d9619e..9bac43efc5 100644 --- a/guides/tutorial/how-to-run-commands-at-application-startup/index.html +++ b/guides/tutorial/how-to-run-commands-at-application-startup/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html b/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html index 984cdcc8f5..615fc3af71 100644 --- a/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html +++ b/guides/tutorial/how-to-use-cloudfront-with-react-frontend-application-on-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -52,7 +52,7 @@ - + diff --git a/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html b/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html index 0c79dc5af6..78eae7c405 100644 --- a/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html +++ b/guides/tutorial/how-to-use-lifecycle-job-to-deploy-any-kind-of-resources/index.html @@ -26,7 +26,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/guides/tutorial/how-to-write-a-dockerfile/index.html b/guides/tutorial/how-to-write-a-dockerfile/index.html index e4ef622d80..313f1211e1 100644 --- a/guides/tutorial/how-to-write-a-dockerfile/index.html +++ b/guides/tutorial/how-to-write-a-dockerfile/index.html @@ -26,7 +26,7 @@ - + @@ -49,7 +49,7 @@ - + diff --git a/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html b/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html index 234105c988..f2faf10db2 100644 --- a/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html +++ b/guides/tutorial/import-your-environment-variables-with-the-qovery-cli/index.html @@ -26,7 +26,7 @@ - + @@ -54,7 +54,7 @@ - + diff --git a/guides/tutorial/index.html b/guides/tutorial/index.html index 9c97a539c8..6da5023fc8 100644 --- a/guides/tutorial/index.html +++ b/guides/tutorial/index.html @@ -26,7 +26,7 @@ - + @@ -131,7 +131,7 @@ - + diff --git a/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html b/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html index e206223458..bf21763862 100644 --- a/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html +++ b/guides/tutorial/kubernetes-observability-and-monitoring-with-datadog/index.html @@ -26,7 +26,7 @@ - + @@ -57,7 +57,7 @@ - + diff --git a/guides/tutorial/managing-env-variables-in-create-react-app/index.html b/guides/tutorial/managing-env-variables-in-create-react-app/index.html index a42dc932db..b35be4945e 100644 --- a/guides/tutorial/managing-env-variables-in-create-react-app/index.html +++ b/guides/tutorial/managing-env-variables-in-create-react-app/index.html @@ -26,7 +26,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html b/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html index 5d247cb486..83ee13d8cf 100644 --- a/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html +++ b/guides/tutorial/migrate-your-application-from-heroku-to-aws/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html b/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html index 589a5a07f2..a387558022 100644 --- a/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html +++ b/guides/tutorial/setting-up-cloudflare-and-custom-domain-on-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -49,7 +49,7 @@ - + diff --git a/guides/tutorial/url-shortener-api-with-kotlin/index.html b/guides/tutorial/url-shortener-api-with-kotlin/index.html index d990bb142d..dd9c2e21e7 100644 --- a/guides/tutorial/url-shortener-api-with-kotlin/index.html +++ b/guides/tutorial/url-shortener-api-with-kotlin/index.html @@ -26,7 +26,7 @@ - + @@ -82,7 +82,7 @@ - + diff --git a/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html b/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html index dae342ec8d..1f91236f32 100644 --- a/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html +++ b/guides/tutorial/use-an-api-gateway-in-front-of-multiple-services/index.html @@ -26,7 +26,7 @@ - + @@ -55,7 +55,7 @@ - + diff --git a/guides/tutorial/use-aws-iam-roles-with-qovery/index.html b/guides/tutorial/use-aws-iam-roles-with-qovery/index.html index b45bf980b7..8a3d9db858 100644 --- a/guides/tutorial/use-aws-iam-roles-with-qovery/index.html +++ b/guides/tutorial/use-aws-iam-roles-with-qovery/index.html @@ -26,7 +26,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/guides/tutorial/working-with-git-submodules/index.html b/guides/tutorial/working-with-git-submodules/index.html index 7d03cff760..7cf6654834 100644 --- a/guides/tutorial/working-with-git-submodules/index.html +++ b/guides/tutorial/working-with-git-submodules/index.html @@ -26,7 +26,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/img/configuration/application/cdn-proxy.png b/img/configuration/application/cdn-proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..d385875ba1f40448067e37b18a9a7e5c919976b9 GIT binary patch literal 91496 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 P_$M!|B2^|~{P_O>@@e_g literal 0 HcmV?d00001 diff --git a/img/configuration/application/custom-domain.png b/img/configuration/application/custom-domain.png new file mode 100644 index 0000000000000000000000000000000000000000..1a646676b531264fdde0c246b6f5d223943e054f GIT binary patch literal 78474 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

j)bNQX#1$RvG5rPa;{ptM+WV`+NbI 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

VIyDZ=;3WW2}7#1EO8F3 z`!VeBvQyIBW)JcV)!Mj$?(Xgb)w(FI-w^@_u{QEA7sUOyCp*9CsX^HJnmbQX1ATIM zxXXa+u~lXkg{#9BxJ*alnGF-xQ^f)>R_u1F<33@&*IFTjY(u&*K9S<$D%N#+o35*l%)M{X-E>?7}eGdP1Fyo)2;<${o7=7lBOE9Io_ ztmr%>L=o9JPdn6O^|^u52g%1qSM2u%4dIXzdpkpDIVP}1{-tdkPmqt7aoHexOh?p3 zd6?v5Uh-12Nkv7+v&VM=b2@jBD_!%H>8`G>3F!l+QRY5%_O~Cm?~jPhotb(8Qm-OC zc1g^51Qlhsw=CMNdpTR9jHBEH5OY;x?^&YkDUL?)bHA#%7DF-7hQWbbsy!#BsSlg) z$6}vs*+Hw%2lUF5btA`^_-XC=AI}Nge*N^u41>&+NBotJ6E_RS%n88jie*@>q+HbE zd?;q;r>#dn{3pn)#OCr?Sb%v#EB%EZKXK<_Zw%3sv=vO7mTF3;k{xiqB^(kH5ICd|V)6XtgbrRXR3lGu{D`ux#%(j&4< zooe{=FIoYa_%s=dI8F)C3ZPb5QWcv$8MvS)2DI9XJ}0L+LxzA#KHIX1dWMu&i`=(s zO)vTbB|?cvJ9K|#U_%d zy!hrSx=TIH)~pTElbx#tZ7V5gaU($XY3-TJ&#C4eT10QwhJkU~#iuaBEY1As zdKryu5281BN%{>GwQ$;Z&4Ii7t5W{NYE5XXyw}(8M&p7SlA$mRxu56^FLPp7gzDms z(@1!Eql+R=J}`|tc~IZjzAwgTTbQUk_cup@wWoa_!T5DvN;}1&02g1`aAS!+F#Hyx z{8e}KloOeVI2_8KIqmKj!HB{iny*aj5Yh|ATa!Gq?Sz4O0fr0S`j3vUCxTwi$YiVj zK`Yl682*kBnLKrD&Zo>sv*GBT6(5er(lU_%<_}xDU(sU{Hs*)i|2=T+11g5vVK5EW zh$h&fgY9E#to69N_>5iPkf%H3szx-d3S#;7;hI%sooc+VYbP^`i(-Ukm9jOOvC<)2 zP;h0)7eexu`NshZOX$VWv*LGjNm0WYT(ou&pZfiUy( zz39J9bCez-&aEh-)s5i|<5;=#`V{j#VKDzyk+d-0L{>?LK6#~CTrU1REQa;R7kiM# z@e~s2fP<|zQ6nGJG-*@C0#YlM@ zJZ<*3d(t@!jfa|E%wDmIdPrOre045iM=u?A1H#_4>Rf3!6?Wn8A(==0H<~Gz$ajH2 zlm5#)tiEPf5UD)G(uU|s7ZpRU%jIaaTUK(D^^aODP4aYz3~kV-0p=M5-B^0rdRn4+ z>1=_HZ%skNqVs?1_?64jIiRgzYa&_;XEn#={c zuX9ZhrgLDm>n_C%Mj4u6N#T^Ph6}AF-kC&qOk_#>#u-q~YYTr6(ZUCgA@||){V3r@ vBXfH#55aM$Tw6pZ6niz4^M3*Q(SK$fo#~UE_B7z`4E%)#%hsM)6Sw=n+~9s$ literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 32e4fba0a7..1e7fa4ba8d 100644 --- a/index.html +++ b/index.html @@ -26,7 +26,7 @@ - + @@ -47,7 +47,7 @@ - + diff --git a/mailing_list/index.html b/mailing_list/index.html index 319b9e42de..16054e23ff 100644 --- a/mailing_list/index.html +++ b/mailing_list/index.html @@ -22,7 +22,7 @@ - + @@ -37,7 +37,7 @@ - + diff --git a/runtime~main.f5a62c3c.js b/runtime~main.502c4b9e.js similarity index 99% rename from runtime~main.f5a62c3c.js rename to runtime~main.502c4b9e.js index d404f4499e..3b5691be00 100644 --- a/runtime~main.f5a62c3c.js +++ b/runtime~main.502c4b9e.js @@ -1 +1 @@ -!function(e){function c(c){for(var f,a,r=c[0],n=c[1],o=c[2],u=0,i=[];ufunction MDXDefaultShortcode(props){console.warn("Component "+name+" was not imported, exported, or provided by MDXProvider as global scope");return Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("div",props);};const layoutProps={rightToc};const MDXLayout="wrapper";function MDXContent({components,...props}){return Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(MDXLayout,Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({},layoutProps,props,{components:components,mdxType:"MDXLayout"}),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery integrations improve developers' experience with Qovery and make their lives easier.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`This section shows several Qovery integrations.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/api-integration/",mdxType:"Jump"},"Api integration"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/container-registry/",mdxType:"Jump"},"Container registry"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/continuous-integration/",mdxType:"Jump"},"Continuous integration"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/git-repository/",mdxType:"Jump"},"Git repository"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/monitoring/",mdxType:"Jump"},"Monitoring"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/secret-manager/",mdxType:"Jump"},"Secret manager"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/slack/",mdxType:"Jump"},"Slack"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/terraform/",mdxType:"Jump"},"Terraform"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/webhook/",mdxType:"Jump"},"Webhook"));};MDXContent.isMDXComponent=true; +const frontMatter={last_modified_on:'2023-10-10',title:'Integrations',description:'Integrate Qovery with your existing tools and workflow',sidebar_label:'hidden',hide_pagination:true};const metadata={"id":"using-qovery/integration","title":"Integrations","description":"Integrate Qovery with your existing tools and workflow","source":"@site/docs/using-qovery/integration.md","permalink":"/docs/using-qovery/integration","sidebar_label":"hidden","sidebar":"docs","previous":{"title":"Terraform","permalink":"/docs/using-qovery/interface/terraform-interface"},"next":{"title":"Git Repository","permalink":"/docs/using-qovery/integration/git-repository"}};/* @jsx mdx */const rightToc=[];const makeShortcode=name=>function MDXDefaultShortcode(props){console.warn("Component "+name+" was not imported, exported, or provided by MDXProvider as global scope");return Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("div",props);};const layoutProps={rightToc};const MDXLayout="wrapper";function MDXContent({components,...props}){return Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(MDXLayout,Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({},layoutProps,props,{components:components,mdxType:"MDXLayout"}),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery integrations improve developers' experience with Qovery and make their lives easier.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`This section shows several Qovery integrations.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/api-integration/",mdxType:"Jump"},"Api integration"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/container-registry/",mdxType:"Jump"},"Container registry"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/continuous-integration/",mdxType:"Jump"},"Continuous integration"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/git-repository/",mdxType:"Jump"},"Git repository"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/monitoring/",mdxType:"Jump"},"Monitoring"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/secret-manager/",mdxType:"Jump"},"Secret manager"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/slack/",mdxType:"Jump"},"Slack"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/terraform/",mdxType:"Jump"},"Terraform"),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Jump__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{to:"/docs/using-qovery/integration/webhook/",mdxType:"Jump"},"Webhook"));};MDXContent.isMDXComponent=true; /***/ }), /* 326 */ @@ -52544,12 +52544,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _site_src_components_Jump__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6); /* harmony import */ var _site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3); /* harmony import */ var _site_src_components_Assumptions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(5); -const frontMatter={last_modified_on:'2023-10-11',title:'Application',description:'Learn how to configure your Application on Qovery'};const metadata={"id":"using-qovery/configuration/application","title":"Application","description":"Learn how to configure your Application on Qovery","source":"@site/docs/using-qovery/configuration/application.md","permalink":"/docs/using-qovery/configuration/application","sidebar":"docs","previous":{"title":"Environment","permalink":"/docs/using-qovery/configuration/environment"},"next":{"title":"Databases","permalink":"/docs/using-qovery/configuration/database"}};/* @jsx mdx */const rightToc=[{value:'Deploying from a Git Repository',id:'deploying-from-a-git-repository',children:[]},{value:'Deploying from a Container Registry',id:'deploying-from-a-container-registry',children:[]},{value:'Create an Application',id:'create-an-application',children:[]},{value:'Deployment Management',id:'deployment-management',children:[]},{value:'Configuration',id:'configuration',children:[{value:'General',id:'general',children:[]},{value:'Resources',id:'resources',children:[]},{value:'Storage',id:'storage',children:[]},{value:'Ports',id:'ports',children:[]},{value:'Health Checks',id:'health-checks',children:[]},{value:'Domains',id:'domains',children:[]}]},{value:'Connecting to a database',id:'connecting-to-a-database',children:[]},{value:'Connecting to another application',id:'connecting-to-another-application',children:[]},{value:'Environment Variable',id:'environment-variable',children:[]},{value:'Secrets',id:'secrets',children:[]},{value:'Logs',id:'logs',children:[]},{value:'SSH',id:'ssh',children:[]},{value:'Clone',id:'clone',children:[]},{value:'Delete an Application',id:'delete-an-application',children:[]}];const makeShortcode=name=>function MDXDefaultShortcode(props){console.warn("Component "+name+" was not imported, exported, or provided by MDXProvider as global scope");return Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("div",props);};const layoutProps={rightToc};const MDXLayout="wrapper";function MDXContent({components,...props}){return Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(MDXLayout,Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({},layoutProps,props,{components:components,mdxType:"MDXLayout"}),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Assumptions__WEBPACK_IMPORTED_MODULE_6__[/* default */ "a"],{name:"documentation",mdxType:"Assumptions"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You have created an `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment/"}),`Environment`),`.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`An `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`application`),` is part of a `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/project/"}),`Project`),` within an `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment/"}),`Environment`),` and is a container unit. Multiple applications can be part of the same `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment/"}),`Environment`),`, be connected to a set of dependencies (databases and other services), and can communicate with other applications within the same Environment.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery allows you to create and deploy applications from two different sources: Git Repository or Container Registry`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"deploying-from-a-git-repository"},`Deploying from a Git Repository`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`In this configuration, Qovery will pull the code from the chosen repository, build the application and deploy it on your kubernetes cluster.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`The list of Git repositories available during the setup is strictly tied to the permissions of your git account (by default Qovery can access all your repositories). If you want to restrict the Qovery access only to a few repositories, user the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/organization/git-repository-access/"}),`GitHub Qovery Application`),` (only for Github).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"deploying-from-a-container-registry"},`Deploying from a Container Registry`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`In this configuration, Qovery will pull the chosen container registry an image you have pre-built and deploy it on your kubernetes cluster.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To improve the security and avoid deploying images from non-authorized registries, we have decided to restrict the list of Container Registry you can use during the setup process. Only an administrator with the right permissions can manage it from the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/organization/container-registry/"}),`Container Registry Management page`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),`this section`),` for more information.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"create-an-application"},`Create an Application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Steps__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{headingDepth:3,mdxType:"Steps"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ol",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Go into the chosen environment and press the "New Service" button and then the "Create application" button`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/creation_1.png",alt:"Creation"}))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Select the following fields:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Application Name: give a name to your applicaiton`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Application Source: Chose between Git Repository or Container Registry, depending on the source location of your application`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If you want to deploy an application from a Git Repository you will have to select:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Git Repository: Select the git provider hosting your code (it can be hosted on GitHub, GitLab or Bitbucket).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Branch: Select branch that Qovery should use to deploy your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Root Application Path: base folder in which the application resides in your repository`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Build Mode: chose between Docker or Buildpack. For more information, go to `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/application/#build-mode"}),`this section`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If you want to deploy an application from a Container Registry you will have to select:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/organization/container-registry/"}),`Container Registry Management page`),` for more information.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image name: the name of the image to be deployed with this application (example: postgres)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image tag: the tag of the image to be deployed with this application (example: 1.0). `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example `,`["rails", "-h", "0.0.0.0", "-p", "8080", "string"]`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),`this section`),` for more information.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},` Auto Deploy `)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/deploying-with-auto-deploy/"}),`Deploying with auto-deploy feature`),` section.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Within this section, you will need to define the resources to be assigned to your applicaiton at run time.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`vCPU: the vCPU assigned to each instance of your application. The default is 500m (0.5 vCPU).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`RAM: the amount of RAM assigned to each instance of your application. The default is 512MB.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Number of instances (Application Auto-scaling): select the minimum and the maximum number of instances of your application that can run within your cluster. The number of instances running at an insant t is automatically managed by Kubernetes (Application auto-scaling) and it is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 5 minutes, your app will be auto-scaled and more instances will be added. It is transparent. +const frontMatter={last_modified_on:'2023-10-11',title:'Application',description:'Learn how to configure your Application on Qovery'};const metadata={"id":"using-qovery/configuration/application","title":"Application","description":"Learn how to configure your Application on Qovery","source":"@site/docs/using-qovery/configuration/application.md","permalink":"/docs/using-qovery/configuration/application","sidebar":"docs","previous":{"title":"Environment","permalink":"/docs/using-qovery/configuration/environment"},"next":{"title":"Databases","permalink":"/docs/using-qovery/configuration/database"}};/* @jsx mdx */const rightToc=[{value:'Deploying from a Git Repository',id:'deploying-from-a-git-repository',children:[]},{value:'Deploying from a Container Registry',id:'deploying-from-a-container-registry',children:[]},{value:'Create an Application',id:'create-an-application',children:[]},{value:'Deployment Management',id:'deployment-management',children:[]},{value:'Configuration',id:'configuration',children:[{value:'General',id:'general',children:[]},{value:'Resources',id:'resources',children:[]},{value:'Storage',id:'storage',children:[]},{value:'Ports',id:'ports',children:[]},{value:'Health Checks',id:'health-checks',children:[]},{value:'Domains',id:'domains',children:[]}]},{value:'Connecting from the internet',id:'connecting-from-the-internet',children:[{value:'Qovery provided domains',id:'qovery-provided-domains',children:[]},{value:'Custom domains',id:'custom-domains',children:[]}]},{value:'Connecting to a database',id:'connecting-to-a-database',children:[]},{value:'Connecting to another application',id:'connecting-to-another-application',children:[]},{value:'Environment Variable',id:'environment-variable',children:[]},{value:'Secrets',id:'secrets',children:[]},{value:'Logs',id:'logs',children:[]},{value:'SSH',id:'ssh',children:[]},{value:'Clone',id:'clone',children:[]},{value:'Delete an Application',id:'delete-an-application',children:[]}];const makeShortcode=name=>function MDXDefaultShortcode(props){console.warn("Component "+name+" was not imported, exported, or provided by MDXProvider as global scope");return Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("div",props);};const layoutProps={rightToc};const MDXLayout="wrapper";function MDXContent({components,...props}){return Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(MDXLayout,Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({},layoutProps,props,{components:components,mdxType:"MDXLayout"}),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Assumptions__WEBPACK_IMPORTED_MODULE_6__[/* default */ "a"],{name:"documentation",mdxType:"Assumptions"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You have created an `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment/"}),`Environment`),`.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`An `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`application`),` is part of a `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/project/"}),`Project`),` within an `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment/"}),`Environment`),` and is a container unit. Multiple applications can be part of the same `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment/"}),`Environment`),`, be connected to a set of dependencies (databases and other services), and can communicate with other applications within the same Environment.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery allows you to create and deploy applications from two different sources: Git Repository or Container Registry`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"deploying-from-a-git-repository"},`Deploying from a Git Repository`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`In this configuration, Qovery will pull the code from the chosen repository, build the application and deploy it on your kubernetes cluster.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`The list of Git repositories available during the setup is strictly tied to the permissions of your git account (by default Qovery can access all your repositories). If you want to restrict the Qovery access only to a few repositories, user the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/organization/git-repository-access/"}),`GitHub Qovery Application`),` (only for Github).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"deploying-from-a-container-registry"},`Deploying from a Container Registry`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`In this configuration, Qovery will pull the chosen container registry an image you have pre-built and deploy it on your kubernetes cluster.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To improve security and avoid deploying images from non-authorized registries, we have decided to restrict the list of Container Registry you can use during the setup process. Only an administrator with the right permissions can manage it from the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/organization/container-registry/"}),`Container Registry Management page`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),`this section`),` for more information.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"create-an-application"},`Create an Application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Steps__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{headingDepth:3,mdxType:"Steps"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ol",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Go into the chosen environment and press the "New Service" button and then the "Create application" button`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/creation_1.png",alt:"Creation"}))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Select the following fields:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Application Name: give a name to your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Application Source: Chose between Git Repository or Container Registry, depending on the source location of your application`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If you want to deploy an application from a Git Repository you will have to select:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Git Repository: Select the git provider hosting your code (it can be hosted on GitHub, GitLab or Bitbucket).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Branch: Select branch that Qovery should use to deploy your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Root Application Path: base folder in which the application resides in your repository`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Build Mode: choose between Docker or Buildpack. For more information, go to `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/application/#build-mode"}),`this section`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If you want to deploy an application from a Container Registry you will have to select:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/organization/container-registry/"}),`Container Registry Management page`),` for more information.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image name: the name of the image to be deployed with this application (example: postgres)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image tag: the tag of the image to be deployed with this application (example: 1.0). `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example `,`["rails", "-h", "0.0.0.0", "-p", "8080", "string"]`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),`this section`),` for more information.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},` Auto Deploy `)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/deploying-with-auto-deploy/"}),`Deploying with auto-deploy feature`),` section.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Within this section, you will need to define the resources to be assigned to your application at run time.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`vCPU: the vCPU assigned to each instance of your application. The default is 500m (0.5 vCPU).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`RAM: the amount of RAM assigned to each instance of your application. The default is 512MB.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Number of instances (Application Auto-scaling): select the minimum and the maximum number of instances of your application that can run within your cluster. The number of instances running at an insant t is automatically managed by Kubernetes (Application auto-scaling) and it is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 5 minutes, your app will be auto-scaled and more instances will be added. It is transparent. Qovery runs your application on Kubernetes and relies on `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"https://github.com/kubernetes-sigs/metrics-server"}),`metrics-server`),` service to auto-scale your app.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Please note that in this section you configure the CPU/RAM allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU/RAM.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/application_creation_resources.png",alt:"Resources"}))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can now define one or more ports for your Application. Most of the application needs to be accessed by other services inside or outside your environment over different L7/L4 protocols. -Today Qovery supports the following protocols:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`HTTPS (Select this protocol if you need to run Websockets)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`gRPC`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`TCP`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`UDP`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`By default ports are accessible only from inside your environment. You can also expose them publicly, making them accessible over the public network via a dedicated public domain that will be assigned to your application by Qovery during the deployment. Note that HTTPS/gRPC ports are alwasy exposed over the port 443.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/application_creation_port.png",alt:"Application Ports"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`Important Informations`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Most of the Kubernetes Health Checks]`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/service-health-checks/"}),`docs.using-qovery.configuration.service-health-checks`),` are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/advanced-settings/#network-settings"}),`advanced settings section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`You can configure your application to use the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"li"},`PORT`),` environment variable by adding the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"li"},`PORT`),` on your application env variables page.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`A Note on Listening IPs: It's best for your application to listen on `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`0.0.0.0:$PORT`),`. While most things work with `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`127.0.0.1`),` and `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`localhost`),`, some do not (NodeJS for example)`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`(Optional) If a port has been defined for your application, you can define the health check probes to run in order to verify the state of your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To know more about how to configure your Liveness and Readiness probes, have a look at `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/application-health-checks/"}),`the health-checks section`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You will find a recap of your application setup and you can now decide to: -1. Go back to one of the previous steps and change your applicaiton settings -2. Create your application without deploying it -3. Create and deploy your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/application_creation_recap.png",alt:"Application"}))))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"deployment-management"},`Deployment Management`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Have a look at the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/"}),`Deployment Management`),` section for more information.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"configuration"},`Configuration`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Once created, you can access the configuration of an application at any time via the Settings tab available on the application section`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/settings.png",alt:"Application Settings"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can find below the description of each of the tabs available in this section`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"general"},`General`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`General settings section allows you to set up your application name and the source code location (git repository or image registry) .`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"git-repository"},`Git Repository`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If your application is built and deployed from a git repository, within this section you can:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Modify the git provider where your code is stored (it can be hosted on GitHub, GitLab or Bitbucket).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Modify the branch that Qovery should use for deploying your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Modify `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`Root Application Path`),` - base folder in which the application resides in your repository`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-general-git.png",alt:"General Settings Git"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery supports mono repositories. `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/guides/advanced/monorepository/"}),`See our advanced guide for more details.`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"warning",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If your repository contains private submodules using SSH protocol, you will need to add a secret beginning with GIT`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("em",{parentName:"p"},`SSH_KEY`),`, containing a private SSH key with access rights to your sumbodules repositories.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Secret names examples:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`GIT_SSH_KEY_GITHUB`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`GIT_SSH_KEY_GITLAB`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`GIT_SSH_KEY_MYAPP`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"container-registry"},`Container Registry`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If your application is deployed from an image registry, within this section you can modify:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/organization/container-registry/"}),`Container Registry Management page`),` for more information.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image name: the name of the image to be deployed with this application (example: postgres)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image tag: the tag of the image to be deployed with this application (example: 1.0).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example `,`["rails", "-h", "0.0.0.0", "-p", "8080", "string"]`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),`this section`),` for more information.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-general-registry.png",alt:"General Settings Git"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"build-mode"},`Build Mode`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`This option is available only if you have selected "Git Repository" as source`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"option-1-buildpacks"},`Option 1: Buildpacks`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To simplify the application build for the developer, Qovery supports `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"https://buildpacks.io"}),`Buildpacks`),` out of the box. Buildpacks determine the build process for an app and which assets and runtimes should be made available to your code at runtime. If your complex apps are running multiple languages, you can also use multiple buildpacks within a single app. +Today Qovery supports the following protocols:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`HTTPS (Select this protocol if you need to run Websockets)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`gRPC`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`TCP`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`UDP`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`By default ports are accessible only from inside your environment. You can also expose them publicly, making them accessible over the public network via a dedicated public domain that will be assigned to your application by Qovery during the deployment (See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"#qovery-provided-domains"}),`Qovery Provided Domains section`),`). Note that HTTPS/gRPC ports are always exposed over the port 443.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/application_creation_port.png",alt:"Application Ports"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`Important Informations`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Most of the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/service-health-checks/"}),`Kubernetes Health Checks`),` are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/advanced-settings/#network-settings"}),`advanced settings section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`You can configure your application to use the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"li"},`PORT`),` environment variable by adding the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"li"},`PORT`),` on your application env variables page.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`A Note on Listening IPs: It's best for your application to listen on `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`0.0.0.0:$PORT`),`. While most things work with `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`127.0.0.1`),` and `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`localhost`),`, some do not (NodeJS for example)`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`(Optional) If a port has been defined for your application, you can define the health check probes to run in order to verify the state of your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To know more about how to configure your Liveness and Readiness probes, have a look at `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/application-health-checks/"}),`the health-checks section`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You will find a recap of your application setup and you can now decide to:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h1",{"id":"go-back-to-one-of-the-previous-steps-and-change-your-application-settings"},`Go back to one of the previous steps and change your application settings`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h1",{"id":"create-your-application-without-deploying-it"},`Create your application without deploying it`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h1",{"id":"create-and-deploy-your-application"},`Create and deploy your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/application_creation_recap.png",alt:"Application"}))))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"deployment-management"},`Deployment Management`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Have a look at the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/"}),`Deployment Management`),` section for more information.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"configuration"},`Configuration`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Once created, you can access the configuration of an application at any time via the Settings tab available on the application section`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/settings.png",alt:"Application Settings"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can find below the description of each of the tabs available in this section`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"general"},`General`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`General settings section allows you to set up your application name and the source code location (git repository or image registry) .`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"git-repository"},`Git Repository`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If your application is built and deployed from a git repository, within this section you can:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Modify the git provider where your code is stored (it can be hosted on GitHub, GitLab or Bitbucket).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Modify the branch that Qovery should use for deploying your application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Modify `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`Root Application Path`),` - base folder in which the application resides in your repository`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-general-git.png",alt:"General Settings Git"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery supports mono repositories. `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/guides/advanced/monorepository/"}),`See our advanced guide for more details.`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"warning",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If your repository contains private submodules using SSH protocol, you will need to add a secret beginning with GIT`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("em",{parentName:"p"},`SSH_KEY`),`, containing a private SSH key with access rights to your sumbodules repositories.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Secret names examples:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`GIT_SSH_KEY_GITHUB`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`GIT_SSH_KEY_GITLAB`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`GIT_SSH_KEY_MYAPP`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"container-registry"},`Container Registry`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If your application is deployed from an image registry, within this section you can modify:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Registry: select the container registry storing the image of your application. Note: only pre-configured registry are available in this list, check the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/organization/container-registry/"}),`Container Registry Management page`),` for more information.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image name: the name of the image to be deployed with this application (example: postgres)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image tag: the tag of the image to be deployed with this application (example: 1.0).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Image Entrypoint: the entrypoint to be used to launch your applicaiton (not mandatory)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`CMD Arguments: the arguments to be passed to launch your applicaiton (not mandatory). We expect the format to be an array. Example `,`["rails", "-h", "0.0.0.0", "-p", "8080", "string"]`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Make sure that the image tag used are unique (do not use "latest", "dev", "master" etc..), see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/image-mirroring/#why-unique-image-tags-are-necessary"}),`this section`),` for more information.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-general-registry.png",alt:"General Settings Git"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"build-mode"},`Build Mode`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`This option is available only if you have selected "Git Repository" as source`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"option-1-buildpacks"},`Option 1: Buildpacks`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To simplify the application build for the developer, Qovery supports `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"https://buildpacks.io"}),`Buildpacks`),` out of the box. Buildpacks determine the build process for an app and which assets and runtimes should be made available to your code at runtime. If your complex apps are running multiple languages, you can also use multiple buildpacks within a single app. Meaning, as a developer, you don't need to write a `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Dockerfile`),` to build and run your app. Qovery Buildpacks takes care of everything for you.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`Supported languages`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("table",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("thead",{parentName:"table"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"thead"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("th",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`language`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("th",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`version`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tbody",{parentName:"table"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Node.JS`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Clojure`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Python`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Java`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Gradle`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`JVM`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Grails`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Scala`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Play`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`PHP`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Go`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`any`)))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You don't find a cool language? `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"https://roadmap.qovery.com/"}),`Suggest us to support it`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"option-2-dockerfile"},`Option 2: Dockerfile`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery runs your application within the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"https://www.docker.com/resources/what-container"}),`Container technology`),`. To build and run your application, you need to provide a valid `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"https://docs.docker.com/engine/reference/builder"}),`Dockerfile`),`.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("pre",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("code",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"pre"},{"className":"language-Dockerfile","metastring":"title=\"Valid NodeJS Dockerfile\"","title":"\"Valid","NodeJS":true,"Dockerfile\"":true}),`FROM node:13-alpine RUN mkdir -p /usr/src/app WORKDIR /usr/src/app @@ -52557,11 +52554,11 @@ COPY . . RUN npm install EXPOSE 3000 CMD node ./bin/www -`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`After creating a Dockerfile, specify the location of your Dockerfile in `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Dockefile path`),` field.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Configuration from above will make Qovery look for the Dockerfile in `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`/timescale/Dockerfile`),` path of your repository (`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Root Application Path`),` + `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Dockerfile Path`),`).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"auto-deploy"},`Auto Deploy`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/deploying-with-auto-deploy/"}),`Deploying with auto-deploy feature`),` section.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"resources"},`Resources`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-13.png",alt:"CPU"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"cpu"},`CPU`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To configure the number of CPUs that your app needs, adjust the setting in the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Resources`),` section of the application configuration.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Default is 500m (0.5 vCPU). `)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"ram"},`RAM`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To configure the amount of RAM that your app needs, adjust the setting in `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Resources`),` section of the application configuration.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Default is 512MB.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU. If your application requires more RAM than requested, it will be killed by the kubernetes scheduler.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"auto-scaling"},`Auto-scaling`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Application auto-scaling is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 15 seconds, your app will be auto-scaled and more instances will be added. It is transparent. The downscale will happen if the CPU consumption is lower than 60% for at least 5 minutes. +`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`After creating a Dockerfile, specify the location of your Dockerfile in `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Dockefile path`),` field.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Configuration from above will make Qovery look for the Dockerfile in `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`/timescale/Dockerfile`),` path of your repository (`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Root Application Path`),` + `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Dockerfile Path`),`).`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"auto-deploy"},`Auto Deploy`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/deploying-with-auto-deploy/"}),`Deploying with auto-deploy feature`),` section.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"resources"},`Resources`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-13.png",alt:"CPU"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"cpu"},`CPU`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To configure the number of CPUs that your app needs, adjust the setting in the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Resources`),` section of the application configuration.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Default is 500m (0.5 vCPU). `)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consumes fewer resources, the cluster will still reserve the selected amount of CPU.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"ram"},`RAM`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To configure the amount of RAM that your app needs, adjust the setting in `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Resources`),` section of the application configuration.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Default is 512MB.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Please note that in this section you configure the CPU allocated by the cluster for your application and that cannot consume more than this value. Even if the application is underused and consume less resources, the cluster will still reserve the selected amount of CPU. If your application requires more RAM than requested, it will be killed by the kubernetes scheduler.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"auto-scaling"},`Auto-scaling`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Application auto-scaling is based on real-time CPU consumption. When your app goes above 60% of CPU consumption for 15 seconds, your app will be auto-scaled and more instances will be added. It is transparent. The downscale will happen if the CPU consumption is lower than 60% for at least 5 minutes. You can adjust the minimum and maximum of instances you need in your application settings. Qovery runs your application on Kubernetes and relies on `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"https://github.com/kubernetes-sigs/metrics-server"}),`metrics-server`),` service to auto-scale your app.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"storage"},`Storage`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"block-storage"},`Block Storage`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`The default filesystem for applications running on Qovery is ephemeral. Application data isn’t persisted across deploys and restarts, which works just fine for most apps because they use managed databases to persist data.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`However, many applications need persistent disk storage that isn’t ephemeral. These include:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Blogging platforms and CMSs like WordPress, Ghost, and Strapi.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Collaboration apps like Mattermost, GitLab, and Discourse.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`This is where Qovery block Storage comes in. Qovery applications can use storage to store data that persists across deploys and restarts, making it easy to deploy stateful applications.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"warning",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`For most use cases, it is better to use `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/object-storage/"}),`Object Storage`),` instead of Block Storage.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h6",{"id":"use-cases"},`Use cases`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h6",{"id":"-good-use-cases"},`✅ Good use cases`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`For I/O intensive applications (E.g. database)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`To store temporary files`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h6",{"id":"-bad-use-cases"},`❌ Bad use cases`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`To store file > 1 TB`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`To expose files from an application (E.g. images)`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h5",{"id":"types-of-block-storage"},`Types of Block Storage`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery Storage supports:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("table",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("thead",{parentName:"table"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"thead"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("th",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Type`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("th",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Max IOPS`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("th",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Max Throughput`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("th",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Min Size`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("th",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Max Size`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("th",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Use cases`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tbody",{parentName:"table"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("tr",{parentName:"tbody"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`fast_ssd`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`64000`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`1GB/s`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`5GB`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`10GB `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"td"},`Community`),` / 1TB paid plans`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("td",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"tr"},{"align":null}),`Critical business applications that require sustained IOPS like databases`)))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h5",{"id":"configuration-1"},`Configuration`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can set up your Block Storage in `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Storage`),` section of your application configuration.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-7.png",alt:"Application Storage"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Storage can be added only if the application has never been deployed before AND if it runs only with one instance (check the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/application/#resources"}),`Resources section`),`)`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"ports"},`Ports`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Within this section you can define the port exposed by your application to the other services or even over the internet. -You can edit the existing ports or declare new ones by specifying:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Application port: this is the port exposed internally by your application for the other services. `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Protocol: you can select the protocol used by your application : HTTP (for both standard HTTP or websocket communications), gRPC, TCP, UDP.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Publicly exposed: it allows you to expose over the public network your service. A public domain will be assigned to your application during the deployment (see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/application/#domains"}),`Domain section`),`)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`If Publicly Exposed is selected:`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",{parentName:"li"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`External port: it is the port that can be used to access this service over the internet (when exposed publicly). Note that for HTTP and gRPC the port is set by default to 443.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Port Name: it is the name assigned to the port. When multiple ports are exposed publicly, its value is used to route the traffic to the right port based on the called subdomain (which will contain the port name value). Since each port is exposed on the port 443, having a different subdomain is the only way to have multiple ports exposed over the internet. If not set, the default value is `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`p`),` (see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/application/#domains"}),`Domain section`),` for more information)`)))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-15.png",alt:"Application Ports"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"important-informations"},`Important Informations`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Most of the Kubernetes Health Checks]`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/service-health-checks/"}),`docs.using-qovery.configuration.service-health-checks`),` are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/advanced-settings/#network-settings"}),`advanced settings section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`You can configure your application to use the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"li"},`PORT`),` environment variable by adding the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"li"},`PORT`),` on your application env variables page.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`A Note on Listening IPs: It's best for your application to listen on `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`0.0.0.0:$PORT`),`. While most things work with `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`127.0.0.1`),` and `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`localhost`),`, some do not (NodeJS for example)`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"health-checks"},`Health Checks`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To know more about how to configure your Liveness and Readiness probes, have a look at `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/application-health-checks/"}),`the health-checks section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"domains"},`Domains`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`The `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Domain`),` section allows you to define a custom domain for your application. `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`For each port publicly exposed, a domain is automatically assigned by Qovery to your application. Qovery will manage for you the networking and the TLS configuration for these domains. `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`domain example: `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`Special Case - Preview Environment`),` -For each port exposed publicly, an additional domain will be created with the following pattern `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`portName-prId-srvName-envSourceName.cluster_domain`),`:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`portName: is the port name, as explained above`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`prID: is the id of the PR that has generated the preview environment`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`srvName: is the name of the service`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`envSourceName: is the name of the blueprint environment that has created the current preview environment`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`domain example: `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`p80-123-frontend-blueprint.za8ad0657.bool.sh`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Note:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`each service deployed on the same cluster will have the same root domain assigned (example: `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`za8ad0657.bool.sh`),`)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`the first characters of the domain assigned to the application is based on the portName given to the port (See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"#ports"}),`port section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`a default domain (without the portName) is assigned to the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`default port`),`(See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"#ports"}),`port section`),`). Example `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If you want to customize the domain assigned to your application press the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Add Domain`),` button. `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-16.png",alt:"Application Domains"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`In this section, you can assign your custom domain via CNAME or just change the sub-domain assigned to your service.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`This configuration will be `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`automatically removed`),` on every cloned environment or preview environment in order to avoid domain collision.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"configuring-a-domain-via-cname"},`Configuring a domain via CNAME`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can configure your DNS by adding a `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`CNAME`),` record so that your app will be accessible through your custom domain. Qovery will handle for you the network configuration and the TLS certificate.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/guides/getting-started/setting-custom-domain/"}),`We prepared a guide and video tutorial that explains how to set up your custom domain.`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"change-the-assigned-sub-domain"},`Change the assigned sub-domain`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can specify a different sub-domain for your application as long as it belongs to the assigned cluster domain (see above). -Example: `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`your current domain is zdf72de71-z709e1a85-gtw.za8ad0659.bool.sh (so your assigned cluster domain is `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`za8ad0659.bool.sh`),`)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`you can enter a new custom domain `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`myfrontend.za8ad0659.bool.sh`),` (since it is a subdomain of the cluster domain)`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`The application will now be accessible from both the default and the new custom domain.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery does not check collision in the domain declaration. Make sure you assign a unique subdomain within your cluster.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"connecting-to-a-database"},`Connecting to a database`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To know how to access your database from your application, `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),`have a look at the database section`),`.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"connecting-to-another-application"},`Connecting to another application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To know how to access your database from your application, `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment-variable/#connecting-to-another-application"}),`have a look at the database section`),`.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"environment-variable"},`Environment Variable`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To learn how to set up environment variables in your projects and applications, navigate to `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment-variable/"}),`configuring Environment Variables`),` section.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"secrets"},`Secrets`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To learn how to set up secrets in your projects and applications, navigate to `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment-variable/"}),`configuring Secrets`),` section.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"logs"},`Logs`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To learn how to display your application logs, navigate to `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/logs/#live-logs"}),`logs section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"ssh"},`SSH`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To connect to your application via SSH, please use the via the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/interface/cli/"}),`Qovery SSH command`),` available on our CLI.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"clone"},`Clone`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can create a clone of the service via the clone feature. A new service with the same configuration (see below for exceptions) will be created into the target environment.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/clone_service.png",alt:"Clone Service"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`The target environment can be the same as the current environment or even another one in a completely different project.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},` Important information `)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Not every configuration parameter will be copied within the new service for consistency reasons. The configuration is fully or partially copied depending on the target environment:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`same environment:`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",{parentName:"li"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`custom domain: this setup is not copied into the new service (to avoid collision)`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`another environment:`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",{parentName:"li"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`custom domain: this setup is not copied into the new service (to avoid collision)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`environment variable: aliases defined on environment variables are not copied (since the aliased env var might not exist)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`deployment pipeline: stage setup is not copied (since the target stage might not exist)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`number of instances: if the target environment runs on a Qovery EC2 cluster, the max number of instances is set to 1 (Qovery EC2 constraint)`)))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Please check the configuration of the new service before deploying it.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"delete-an-application"},`Delete an Application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Steps__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{headingDepth:3,mdxType:"Steps"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ol",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Choose your application`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`In the application overview, click on the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`3 dots`),` button and remove the application.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-1.png",alt:"Application"}))))));};MDXContent.isMDXComponent=true; +You can edit the existing ports or declare new ones by specifying:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Application port: this is the port exposed internally by your application for the other services. `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Protocol: you can select the protocol used by your application : HTTP (for both standard HTTP or websocket communications), gRPC, TCP, UDP.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Publicly exposed: it allows you to expose over the public network your service. A public domain will be assigned to your application during the deployment (see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"#connecting-from-the-internet"}),`Connectin from the internet section`),`)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`If Publicly Exposed is selected:`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",{parentName:"li"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`External port: it is the port that can be used to access this service over the internet (when exposed publicly). Note that for HTTP and gRPC the port is set by default to 443.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Port Name: it is the name assigned to the port. When multiple ports are exposed publicly, its value is used to route the traffic to the right port based on the called subdomain (which will contain the port name value). Since each port is exposed on the port 443, having a different subdomain is the only way to have multiple ports exposed over the internet. If not set, the default value is `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`p`),` (see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"#qovery-provided-domains"}),`Qovery Provided Domain section`),` for more information)`)))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-15.png",alt:"Application Ports"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"important-informations"},`Important Informations`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Most of the Kubernetes Health Checks]`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/service-health-checks/"}),`docs.using-qovery.configuration.service-health-checks`),` are based on the port declared in this section. Make sure you declare the right port and that you configure the health checks properly.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Connections on public ports are automatically closed after 60 seconds. If you want to implement long living connection (like for websockets) please make sure to use the rigth ingress timeouts in the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"/docs/using-qovery/configuration/advanced-settings/#network-settings"}),`advanced settings section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`Exposing publicly TCP/UDP ports requires to create a dedicated load balancer and it takes a few minutes before having it ready (~15 minutes). Note also that this has a direct impact on your cloud provider bill.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`You can configure your application to use the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"li"},`PORT`),` environment variable by adding the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"li"},`PORT`),` on your application env variables page.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`A Note on Listening IPs: It's best for your application to listen on `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`0.0.0.0:$PORT`),`. While most things work with `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`127.0.0.1`),` and `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`localhost`),`, some do not (NodeJS for example)`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"health-checks"},`Health Checks`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To know more about how to configure your Liveness and Readiness probes, have a look at `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/application-health-checks/"}),`the health-checks section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"domains"},`Domains`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Within this section you can customize the domain used to reach your application. `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can customize the domain of your application in different ways, depending on what you want to achieve:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`You want to use your own domain for this application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`You want to modify the subdomain assigned to your application by Qovery (i.e. change `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh`),` into `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`my-app-domain.za8ad0657.bool.sh`),`).`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`In both cases, you can assign the new custom domain to your application press the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Add Domain`),` button. `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-16.png",alt:"Application Domains"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`This configuration will be `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`automatically removed`),` on every cloned environment or preview environment in order to avoid domain collision.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"configuring-your-own-domain"},`Configuring your own domain`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Once the domain is added within the Qovery console (Example: mydomain.com), you need to configure within your DNS two `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`CNAME`),` records pointing to the domain provided by Qovery, as shown in the UI (example: mydomain.com CNAME za7cc1b71-z4b8474b3-gtw.zc531a994.rustrocks.cloud and *.mydomain.com CNAME za7cc1b71-z4b8474b3-gtw.zc531a994.rustrocks.cloud). `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Having a wildcard domain (example: *.mydomain.com) configured on your DNS will avoid you to modify the Qovery setup every time you want to add a new subdomain. If `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`wildcard`),` is not supported by your DNS provider, you will have to configure each subdomain manually.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If the service needs to expose more than one port publicly, you can define a dedicated subdomain to redirect the traffic on the right port by setting the “Port Name” value within the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"#ports"}),`port settings`),`.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`From this point, Qovery will automatically handle the TLS/SSL certificate creation and renewal for the configured domain.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/custom-domain.png",alt:"Custom Domain"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},` Special case - CDN in proxy mode `)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If your service is behind a CDN using a `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`proxy mode`),` (i.e. the traffic is routed through the CDN to Qovery), make sure to disable the option "Generate certificate" on the domain setup. Since the certificate of your domain is directly managed by the CDN, Qovery won't be able to do that for you and it will raise warnings on your application status.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/cdn-proxy.png",alt:"CDN Proxy"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/guides/getting-started/setting-custom-domain/"}),`We prepared a guide and video tutorial that explains how to set up your custom domain.`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h4",{"id":"change-the-auto-assigned-sub-domain"},`Change the auto assigned sub-domain`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can specify a different sub-domain for your application as long as it belongs to the assigned cluster domain (see `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"#qovery-provided-domains"}),`Qovery provided domains`),`). +Example: `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`your current domain is zdf72de71-z709e1a85-gtw.za8ad0659.bool.sh (so your assigned cluster domain is `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`za8ad0659.bool.sh`),`)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`you can enter a new custom domain `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`myfrontend.za8ad0659.bool.sh`),` (since it is a subdomain of the cluster domain)`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`The application will now be accessible from both the default and the new custom domain.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Alert__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"],{type:"info",mdxType:"Alert"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Qovery does not check collision in the domain declaration. Make sure you assign a unique subdomain within your cluster.`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"connecting-from-the-internet"},`Connecting from the internet`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Your application can be reached from the internet by publicly exposing at least one of its ports (See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"#ports"}),`Ports`),` section to know more). Once this is done, Qovery will generate for you a domain to reach your application from the internet. You can also customize the domain assigned to your application and manage by yourself this assignment via the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`Domain`),` section.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"qovery-provided-domains"},`Qovery provided domains`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`For each port publicly exposed, a domain is automatically assigned by Qovery to your application. Qovery will manage for you the networking and the TLS configuration for these domains. `),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Example: `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`p80-zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Note:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`each service deployed on the same cluster will have the same root domain assigned (example: `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`za8ad0657.bool.sh`),`)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`the first characters of the domain (before the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`-`),`) is based on the portName given to the port associated with this domain (See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"#ports"}),`port section`),`)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`a default domain (without the portName) is assigned to the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`default port`),`(See the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"li"},{"href":"#ports"}),`port section`),`). Example `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"li"},`zdf72de72-z709e1a88-gtw.za8ad0657.bool.sh`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},`Special Case - Preview Environment`),` +For each port exposed publicly, an additional domain will be created with the following pattern `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`portName-prId-srvName-envSourceName.cluster_domain`),`:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`portName: is the port name, as explained above`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`prID: is the id of the PR that has generated the preview environment`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`srvName: is the name of the service`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`envSourceName: is the name of the blueprint environment that has created the current preview environment`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`domain example: `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`p80-123-frontend-blueprint.za8ad0657.bool.sh`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h3",{"id":"custom-domains"},`Custom domains`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`If you prefer to assign your own domain to the application have a look at the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"#domains"}),`Domain section`),` to know more.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"connecting-to-a-database"},`Connecting to a database`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To know how to access your database from your application, `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment-variable/#connecting-to-a-database"}),`have a look at the database section`),`.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"connecting-to-another-application"},`Connecting to another application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To know how to access your database from your application, `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment-variable/#connecting-to-another-application"}),`have a look at the database section`),`.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"environment-variable"},`Environment Variable`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To learn how to set up environment variables in your projects and applications, navigate to `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment-variable/"}),`configuring Environment Variables`),` section.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"secrets"},`Secrets`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To learn how to set up secrets in your projects and applications, navigate to `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/configuration/environment-variable/"}),`configuring Secrets`),` section.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"logs"},`Logs`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To learn how to display your application logs, navigate to `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/deployment/logs/#live-logs"}),`logs section`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"ssh"},`SSH`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`To connect to your application via SSH, please use the via the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("a",Object(_home_runner_work_documentation_documentation_website_node_modules_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])({parentName:"p"},{"href":"/docs/using-qovery/interface/cli/"}),`Qovery SSH command`),` available on our CLI.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"clone"},`Clone`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`You can create a clone of the service via the clone feature. A new service with the same configuration (see below for exceptions) will be created into the target environment.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/clone_service.png",alt:"Clone Service"})),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`The target environment can be the same as the current environment or even another one in a completely different project.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("strong",{parentName:"p"},` Important information `)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Not every configuration parameter will be copied within the new service for consistency reasons. The configuration is fully or partially copied depending on the target environment:`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`same environment:`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",{parentName:"li"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`custom domain: this setup is not copied into the new service (to avoid collision)`))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`another environment:`,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ul",{parentName:"li"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`custom domain: this setup is not copied into the new service (to avoid collision)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`environment variable: aliases defined on environment variables are not copied (since the aliased env var might not exist)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`deployment pipeline: stage setup is not copied (since the target stage might not exist)`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",{parentName:"ul"},`number of instances: if the target environment runs on a Qovery EC2 cluster, the max number of instances is set to 1 (Qovery EC2 constraint)`)))),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Please check the configuration of the new service before deploying it.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("h2",{"id":"delete-an-application"},`Delete an Application`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])(_site_src_components_Steps__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"],{headingDepth:3,mdxType:"Steps"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("ol",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`Choose your application`)),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("li",null,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",null,`In the application overview, click on the `,Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("inlineCode",{parentName:"p"},`3 dots`),` button and remove the application.`),Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("p",{align:"center"},Object(_mdx_js_react__WEBPACK_IMPORTED_MODULE_2__[/* mdx */ "b"])("img",{src:"/img/configuration/application/app-1.png",alt:"Application"}))))));};MDXContent.isMDXComponent=true; /***/ }), /* 327 */