diff --git a/docs/configuration/agent-tasks/build-deployment-optimizer.mdx b/docs/configuration/agent-tasks/build-deployment-optimizer.mdx new file mode 100644 index 00000000..0939eaa2 --- /dev/null +++ b/docs/configuration/agent-tasks/build-deployment-optimizer.mdx @@ -0,0 +1,49 @@ +--- +title: "Build & Deployment Optimizer" +description: "Ready-made Agent Task that proposes faster, cheaper build and deployment configurations" +--- + +import AgentTasksEarlyPreviewWarning from '/snippets/agent-tasks-early-preview-warning.mdx'; + + + +## Overview + +Identifies build and deployment optimization levers and their expected gain, then opens a PR with the proposed change and/or updates the build configuration in Qovery directly. It never merges a fix on its own. + +## How It Works + +To find concrete ways to make builds and deployments faster and cheaper, the agent: + +1. Inspects the service's build setup: Dockerfile, dependency installation, layer caching, image size, and the build/deploy configuration in Qovery. +2. Identifies optimization levers, for example better layer ordering and caching, multi-stage builds, smaller base images, pruning unused dependencies, or parallelisable steps. +3. For each lever, estimates the expected gain (build time, image size, or cost) and the risk. +4. Opens a PR with the proposed changes to the build configuration, and/or updates the build configuration in Qovery directly. +5. Summarises what it changed, the expected gain, and anything that needs a human decision. It never merges, the human always stays the gate. + +## Setting It Up + + + + From the **Agent use cases** section when creating a new service, pick **Build & deployment optimizer** (see [Creating an Agent](/configuration/agent-tasks/overview#creating-an-agent)), or start from scratch and paste in the instructions above. + + + Add the Git repository of the service to optimize as its Context, so the agent can inspect the Dockerfile and build setup. You can also add the Qovery service itself as Context, alongside its repository. + + + Since you added the service as Context, Qovery's own MCP server is created and selected automatically: organization-scoped, read-only, backed by a Viewer API token. That's enough for the agent to **propose** changes (open a PR). + + To let it **apply** changes to Qovery directly instead, add the MCP server manually with an API Policy Token that has write permissions on that service's build/deploy configuration. See [Add MCP Servers](/configuration/agent-tasks/overview#creating-an-agent). + + + Add a schedule trigger, for example weekly, to periodically review build performance, or a webhook trigger. See [Triggers](/configuration/agent-tasks/overview#triggers) for how they work in general. + + + This agent is typically run on a schedule rather than triggered concurrently, so **In Place** (the default) works well. Use **Clone Environment** instead if you expect overlapping runs. See [Execution Mode](/configuration/agent-tasks/overview#execution-mode). + + + Click **Trigger** on the agent task's overview page to run it on demand. Check the run under its **Deployments** tab, and review the PR it opened (or the build configuration it updated, if you granted write access). + + + +See [Configuration](/configuration/agent-tasks/overview#configuration) for resources and environment variables, general settings shared by every agent task. diff --git a/docs/configuration/agent-tasks/incident-analyser-honeybadger.mdx b/docs/configuration/agent-tasks/incident-analyser-honeybadger.mdx new file mode 100644 index 00000000..3dea474c --- /dev/null +++ b/docs/configuration/agent-tasks/incident-analyser-honeybadger.mdx @@ -0,0 +1,64 @@ +--- +title: "Incident Analyzer with Honeybadger" +description: "Ready-made Agent Task that correlates a firing Honeybadger incident with recent changes, logs, and metrics" +--- + +import AgentTasksEarlyPreviewWarning from '/snippets/agent-tasks-early-preview-warning.mdx'; + + + +## Overview + +Correlate a firing Honeybadger incident with recent changes, logs and metrics, then report and open a PR. When an incident fires, the agent investigates it and hands a clear summary back to the human on-call, it never merges a fix on its own. + +## How It Works + +When an incident fires, the agent: + +1. Reads the incident details (id, title, severity, affected services) from the trigger, fetching any missing details from Honeybadger. +2. Correlates the incident with recent change context: the latest deployments, config changes, and merged PRs for the affected services around the incident start time. +3. Pulls the relevant signals: application logs, metrics, and any runbooks for the affected services. +4. Determines the most likely root cause and the blast radius, and is explicit about its confidence and what it could not verify. +5. Reports its findings to the on-call human in chat: a short summary, the suspected root cause, and a recommended next step. +6. If the fix is small and well-understood, opens a PR with the proposed change and links it in the message. It never merges, the human always stays the gate. + +## Setting It Up + + + + From the **Agent use cases** section when creating a new service, pick **Incident Analyzer with Honeybadger** (see [Creating an Agent](/configuration/agent-tasks/overview#creating-an-agent)), or start from scratch and paste in the instructions above. + + + Add the Git repository of the service(s) this agent should investigate as its Context, so it can read recent commits and merged PRs around the incident. You can also add the Qovery service(s) themselves as Context, in addition to or instead of their repository. + + + Since you added the service(s) as Context, Qovery's own MCP server is created and selected automatically: organization-scoped, read-only, backed by a Viewer API token. That's enough for the agent to get deployment history, logs, and metrics for the affected services, this agent only reads and reports, it never applies a fix directly. + + + Enter your Anthropic API key, the only provider supported today. + + + Add your Honeybadger API key as a secret, referenced by name in the instructions above (for example `HONEYBADGER_API_KEY`), for more context on the incident if needed. In Honeybadger, go to **Settings > API keys** to create one. Add its hostname to the domain allowlist, for example `api.honeybadger.io`. + + + Select **From a webhook**, the default for this template, and copy the generated webhook URL from the agent task's overview page, you'll need it next. + + + In Honeybadger, go to **Alerts & Integrations**, add the **Webhook** integration, and paste the URL from the previous step. Under **Error events**, check **When an error is initially reported or when reported again after being resolved**, then save. + + + Honeybadger webhook integration settings with the webhook URL and the error event set to when an error is initially reported or reported again after being resolved + + + + Same as any other agent task, see [Outputs](/configuration/agent-tasks/overview#outputs). + + + Incidents can fire frequently, so use **Clone Environment** rather than **In Place**: an overlapping trigger would otherwise replace the currently running investigation. See [Execution Mode](/configuration/agent-tasks/overview#execution-mode). + + + Test the agent by clicking **Trigger** on its overview page, or by sending a POST request with a sample incident payload to its webhook URL. Check the run under the agent task's **Deployments** tab, and confirm the summary reaches the Slack channel tied to your webhook URL. + + + +Resources: this agent mainly makes API calls and reads logs and metrics, a small allocation is enough to start. See [Configuration](/configuration/agent-tasks/overview#configuration) for how resources are set, and [Triggers and Outputs](/configuration/agent-tasks/overview#triggers-and-outputs) for how triggers work in general. diff --git a/docs/configuration/agent-tasks/incident-analyser.mdx b/docs/configuration/agent-tasks/incident-analyser.mdx new file mode 100644 index 00000000..4a10c00d --- /dev/null +++ b/docs/configuration/agent-tasks/incident-analyser.mdx @@ -0,0 +1,64 @@ +--- +title: "Incident Analyzer with incident.io" +description: "Ready-made Agent Task that correlates a firing incident.io incident with recent changes, logs, and metrics" +--- + +import AgentTasksEarlyPreviewWarning from '/snippets/agent-tasks-early-preview-warning.mdx'; + + + +## Overview + +Correlate a firing incident.io incident with recent changes, logs and metrics, then report and open a PR. When an incident fires, the agent investigates it and hands a clear summary back to the human on-call, it never merges a fix on its own. + +## How It Works + +When an incident fires, the agent: + +1. Reads the incident details (id, title, severity, affected services) from the trigger, fetching any missing details from incident.io. +2. Correlates the incident with recent change context: the latest deployments, config changes, and merged PRs for the affected services around the incident start time. +3. Pulls the relevant signals: application logs, metrics, and any runbooks for the affected services. +4. Determines the most likely root cause and the blast radius, and is explicit about its confidence and what it could not verify. +5. Reports its findings to the on-call human in chat: a short summary, the suspected root cause, and a recommended next step. +6. If the fix is small and well-understood, opens a PR with the proposed change and links it in the message. It never merges, the human always stays the gate. + +## Setting It Up + + + + From the **Agent use cases** section when creating a new service, pick **Incident Analyzer with incident.io** (see [Creating an Agent](/configuration/agent-tasks/overview#creating-an-agent)), or start from scratch and paste in the instructions above. + + + Add the Git repository of the service(s) this agent should investigate as its Context, so it can read recent commits and merged PRs around the incident. You can also add the Qovery service(s) themselves as Context, in addition to or instead of their repository. + + + Since you added the service(s) as Context, Qovery's own MCP server is created and selected automatically: organization-scoped, read-only, backed by a Viewer API token. That's enough for the agent to get deployment history, logs, and metrics for the affected services, this agent only reads and reports, it never applies a fix directly. + + + Enter your Anthropic API key, the only provider supported today. + + + Add your incident.io API key as a secret, referenced by name in the instructions above (`INCIDENT_IO_API_KEY`). In incident.io, go to **Settings > API keys** to create one. Add its hostname to the domain allowlist, for example `api.incident.io`. + + + Select **From a webhook**, the default for this template, and copy the generated webhook URL from the agent task's overview page, you'll need it next. + + + In incident.io, go to **Settings > Workflows** and create one. Set the trigger to **An incident is created or changed**, optionally scoped further (for example `Incident > Status > Category is one of Active`), then add a **Send a webhook** step with the URL from the previous step as the **Endpoint URL**. Pass the incident data in the request body, that's what gives the agent context on the incident (id, title, severity, affected services) it reads in step 1 of [How It Works](#how-it-works). + + + incident.io Workflow triggered when an incident is created or changed, filtered to active incidents, with a Send a webhook step + + + + Same as any other agent task, see [Outputs](/configuration/agent-tasks/overview#outputs). + + + Incidents can fire frequently, so use **Clone Environment** rather than **In Place**: an overlapping trigger would otherwise replace the currently running investigation. See [Execution Mode](/configuration/agent-tasks/overview#execution-mode). + + + Test the agent by clicking **Trigger** on its overview page, or by sending a POST request with a sample incident payload to its webhook URL. Check the run under the agent task's **Deployments** tab. If you added a Slack output in the optional step above, confirm the summary reached the channel tied to that webhook URL. + + + +Resources: this agent mainly makes API calls and reads logs and metrics, a small allocation is enough to start. See [Configuration](/configuration/agent-tasks/overview#configuration) for how resources are set, and [Triggers and Outputs](/configuration/agent-tasks/overview#triggers-and-outputs) for how triggers work in general. diff --git a/docs/configuration/agent-tasks/jira-coding-agent.mdx b/docs/configuration/agent-tasks/jira-coding-agent.mdx new file mode 100644 index 00000000..eb3b2e42 --- /dev/null +++ b/docs/configuration/agent-tasks/jira-coding-agent.mdx @@ -0,0 +1,44 @@ +--- +title: "Jira Coding Agent" +description: "Ready-made Agent Task that picks up a Jira issue and proposes the corresponding code change" +--- + +import CodingAgentSetupSteps from '/snippets/coding-agent-setup-steps.mdx'; +import CodingAgentOutputStep from '/snippets/coding-agent-output-step.mdx'; +import CodingAgentFooterLinks from '/snippets/coding-agent-footer-links.mdx'; +import AgentTasksEarlyPreviewWarning from '/snippets/agent-tasks-early-preview-warning.mdx'; + + + +## Overview + +Picks up a Jira issue and proposes the corresponding code change as a pull request against the repository (or repositories) you connect. + +## Setting It Up + + + + From the **Agent use cases** section when creating a new service, pick **Jira Coding Agent** (see [Creating an Agent](/configuration/agent-tasks/overview#creating-an-agent)). + + + The template ships with three environment variables for connecting to Jira: a base URL (for example `https://company.atlassian.net`), an email, and an API token. Add `company.atlassian.net` to the domain allowlist so the agent can reach the Jira API. If you don't need Jira access for your workflow, remove these and adapt the instructions accordingly. + + To create the API token: + 1. Click your profile in the top right of Jira, then **Account Settings** + 2. Go to **Security** + 3. Under **Create and manage API tokens**, click **Create API token** + + + + In Jira, go to your project's **Settings > Automation**, then **Create flow > Create from scratch**. For example, to call the agent whenever a label is added: choose the **Field value changed** trigger, select **Labels** as the field, and leave the change type as **Any changes to the field value**. Add a JQL condition to scope it (for example `labels = "go-agent"`), then add a **Send web request** action with the URL from the previous step, method `POST`, and body **Issue data (Automation format)**. + + + Jira automation flow with a Value changes for Labels trigger, a labels condition, and a Send web request action + + + Save the flow, then add the label (for example `go-agent`) to a Jira issue to test it: your environment will be cloned to work on the ticket's request. + + + + + diff --git a/docs/configuration/agent-tasks/linear-coding-agent.mdx b/docs/configuration/agent-tasks/linear-coding-agent.mdx new file mode 100644 index 00000000..18f4918d --- /dev/null +++ b/docs/configuration/agent-tasks/linear-coding-agent.mdx @@ -0,0 +1,42 @@ +--- +title: "Linear Coding Agent" +description: "Ready-made Agent Task that picks up a Linear issue and proposes the corresponding code change" +--- + +import CodingAgentSetupSteps from '/snippets/coding-agent-setup-steps.mdx'; +import CodingAgentOutputStep from '/snippets/coding-agent-output-step.mdx'; +import CodingAgentFooterLinks from '/snippets/coding-agent-footer-links.mdx'; +import AgentTasksEarlyPreviewWarning from '/snippets/agent-tasks-early-preview-warning.mdx'; + + + +## Overview + +Picks up a Linear issue and proposes the corresponding code change as a pull request against the repository (or repositories) you connect. + +## Setting It Up + + + + From the **Agent use cases** section when creating a new service, pick **Linear Coding Agent** (see [Creating an Agent](/configuration/agent-tasks/overview#creating-an-agent)). + + + The template ships with one environment variable for connecting to Linear: an API key. If you don't need Linear access for your workflow, remove it and adapt the instructions accordingly. + + To create the API key: + 1. Click your workspace name in the top left of Linear, then **Settings** + 2. Go to **Security & access** + 3. Under **Personal API keys**, create a new key + + + + In Linear, go to **Settings > API > Webhooks** and create one: add a description, paste the webhook URL from the previous step, and under **Data change events**, select **Issues**. + + + Unlike Jira, Linear's webhook can't filter which change on an issue triggers it, every issue event is sent. Filter by adding a command to the agent's instructions instead, for example: "If the ticket doesn't have the label `execute-agent`, don't start the work." + + + + + + diff --git a/docs/configuration/agent-tasks/overview.mdx b/docs/configuration/agent-tasks/overview.mdx new file mode 100644 index 00000000..8b93950f --- /dev/null +++ b/docs/configuration/agent-tasks/overview.mdx @@ -0,0 +1,159 @@ +--- +title: "Agent Tasks" +description: "Configure AI agents that run as jobs on your Qovery infrastructure" +--- + +import AgentTasksEarlyPreviewWarning from '/snippets/agent-tasks-early-preview-warning.mdx'; + + + +## Overview + +Agent Tasks are one-time or scheduled jobs delegated to AI agents, running on your Qovery-managed infrastructure like any other service. Each agent runs with its own resources, environment variables, and a domain allowlist controlling exactly what it can reach. + +## Creating an Agent + + + + In your environment, click **New Service > Create new service**. Under **Agent use cases**, pick a ready-made template (see [Tutorials](#tutorials) below) or **Start from scratch**. + + + Create new service screen showing the Agent use cases section + + + + Connect a Git repository, a Qovery service, or both, for the agent to load as context. + + + Enter your Anthropic API key, the only provider supported today. + + + If you added a Qovery service as Context in the previous step, Qovery's own MCP server is created and selected automatically: organization-scoped, read-only, backed by a Viewer API token. No URL, header, or token to configure. This is also preconfigured for the Incident Analyzer (incident.io and Honeybadger) and Build & deployment optimizer templates. + + For anything else, connect any remote HTTPS MCP server with its own name, URL, and headers. MCP servers added here are available to every agent task in the organization and can also be managed from **Organization Settings > AI settings > Agents**. + + To add Qovery's own MCP server manually, for example with write access instead of the automatic read-only setup, use an [API Policy Token](/configuration/organization/api-policy-token) (a regular API token works too): + + - **Server URL**: `https://mcp.qovery.com/mcp` + - **HTTP header name**: `Authorization` + - **HTTP header secret value**: `Token ` (`Token` with a capital `T`, then a space, then the token value) + + + Describe the agent's role and the steps it should follow in plain text. Reference credentials by the environment variable names you configure below, for example `INCIDENT_IO_API_KEY`. + + + Run the agent in place, or in a clone of the environment. See [Execution Mode](#execution-mode) below. + + + Required to run the agent automatically. See [Triggers](#triggers) below. + + + Send the agent's result somewhere when it's done. See [Outputs](#outputs) below. + + + + + New agent task form with Context, Provider, MCP, Automations, and Instructions on the left, and Resources, Governance, Environment variables, and Advanced settings on the right + + +## Execution Mode + +Choose where the agent runs when it's triggered: + +- **In Place**: runs directly in the current environment. +- **Clone Environment**: duplicates the entire environment first, then runs the agent in that isolated clone. + + +In **In Place** mode, a new trigger replaces the currently running execution, there's no run history if the agent is triggered multiple times. Use **Clone Environment** for agents that can be triggered frequently or concurrently, and **In Place** for agents on a predictable schedule where overlap isn't a concern. + + +Each ready-made template has a sensible default: Incident Analyzer (both the incident.io and Honeybadger variants), Jira Coding Agent, and Linear Coding Agent default to Clone Environment, since an incident or a labeled ticket can trigger them frequently or concurrently. Build & deployment optimizer, typically run on a schedule, defaults to In Place. + +### Limits + +- **Execution timeout**: each run is capped at 1 hour. +- **Cloned environment TTL**: environments created by Clone Environment mode are deleted 3 days after creation. +- **Iterations per run**: up to 50 agent iterations per run by default. Override this with the `MAX_TURNS` environment variable. +- **Clone rate limit**: up to 60 clones per hour, per organization, to prevent runaway environment creation. + +## Triggers and Outputs + +Add a trigger to run the agent automatically, and optionally an output to send its result somewhere when it's done. You can also trigger any agent task on demand: click the **Trigger** (play) button on its overview page, or from the environment's services list. + + + Agent task overview page with the Trigger play button highlighted in the top right + + +### Triggers + +- **On a schedule**: a cron expression and timezone, for example `0 8 * * 1-5` for 8:00 AM, Monday through Friday. +- **From a webhook**: Qovery generates a unique URL for the agent task, visible later in the environment's **Agent Tasks** list (for example `https://webhook.qovery.com/api/v1/hook/...`). Anything that can send a POST request to that URL starts the agent. + +### Outputs + +Send the automation's result to a webhook: a destination URL, custom headers, and a prompt describing how to shape the result before sending it. + +For example, to post the result to a Slack channel: + + + + In Slack, add the **Incoming Webhooks** app to the channel and copy the generated URL (`https://hooks.slack.com/services/...`). + + + In **Add output**, paste that URL into **Webhook URL**. No custom headers are needed, Slack's incoming webhooks accept a plain JSON POST. + + + In **Prompt**, describe the message you want, for example: "Summarize the result as a short Slack message with the root cause and the recommended next step." + + + + +Some agents use a different, more direct pattern instead: storing a chat webhook URL as a secret (for example `SLACK_WEBHOOK_URL`), adding its hostname to the domain allowlist, and instructing the agent to post to it directly as one of its own steps. Use this pattern when the agent itself, not just the automation's final output, should decide when and what to post. + + +## Configuration + + + + A description of what the agent does. + + + CPU (mCPU), memory (MB), and storage (GB) allocated to the agent, same as any other Qovery service. + + + A domain allowlist controls which external hosts the agent task can reach: comma-separated hostnames, or `*` for all domains. + + + Plain variables or encrypted secrets the agent's instructions can reference by name. Secret values can't be viewed again once set. + + + A Dockerfile fragment lets you install additional CLIs or binaries in the agent's runtime before it starts. + + + +## After You Create It + +Agent Tasks appear in your environment overview under **Agent Tasks**, jobs delegated to AI agents, run once or on a schedule. Each one lists its status, last operation, underlying model, and a dedicated webhook URL you can call to trigger it from outside Qovery. That same webhook URL is also shown on the agent task's own overview page. + +## Tutorials + + + + Ready-made agent that correlates a firing incident.io incident with recent changes, logs, and metrics + + + Ready-made agent that correlates a firing Honeybadger incident with recent changes, logs, and metrics + + + Ready-made agent that proposes faster, cheaper build and deployment configurations + + + Ready-made agent that picks up a Jira issue and proposes the corresponding code change + + + Ready-made agent that picks up a Linear issue and proposes the corresponding code change + + + Use cases and ready-made agent templates + + diff --git a/docs/configuration/organization.mdx b/docs/configuration/organization.mdx index 8b53a3ca..70ae79be 100644 --- a/docs/configuration/organization.mdx +++ b/docs/configuration/organization.mdx @@ -3,6 +3,8 @@ title: "Organization" description: "Configure and manage your Qovery organization" --- +import AgentTasksEarlyPreviewWarning from '/snippets/agent-tasks-early-preview-warning.mdx'; + An organization is a shared account where developers can collaborate across many projects. Organization owners and admins can manage all aspects of the organization, from clusters to member access. ## Prerequisites @@ -113,6 +115,16 @@ Configure basic organization details: Click **Update** to save your changes. +### AI Settings: Agents + + + +Under **AI settings > Agents**, manage the MCP servers shared with every [Agent Task](/configuration/agent-tasks/overview) in the organization. Connect any remote HTTPS MCP server here (name, URL, and headers) to make it available when configuring an individual agent. + + +Qovery's own MCP server is added here automatically, organization-scoped and read-only, as soon as any agent task adds a Qovery service as Context, see [Add MCP Servers](/configuration/agent-tasks/overview#creating-an-agent). To add it yourself instead, for example with write access, use `https://mcp.qovery.com/mcp` and authenticate with an [API Policy Token](/configuration/organization/api-policy-token) (a regular API token works too). + + ### Other Settings diff --git a/docs/custom.css b/docs/custom.css index db03feff..624648ba 100644 --- a/docs/custom.css +++ b/docs/custom.css @@ -417,7 +417,8 @@ html[data-theme="dark"] .badge-icon-scaleway-dark { .badge-container, .badge-cronjob, .badge-job, -.badge-helm { +.badge-helm, +.badge-new { display: inline-block; padding: 3px 8px; border-radius: 4px; @@ -469,6 +470,10 @@ html[data-theme="dark"] .badge-icon-scaleway-dark { background-color: #0f1689; /* Helm Blue */ } +.badge-new { + background-color: #642DFF; /* Qovery Purple */ +} + .badge-terraform { background-color: #4040b2; /* Terraform Purple */ } diff --git a/docs/docs.json b/docs/docs.json index 2e40738a..b4770b07 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -48,639 +48,555 @@ } ], "navigation": { - "products": [ + "tabs": [ { - "product": "Platform", - "description": "Deploy and manage applications on Kubernetes", - "icon": "server", - "tabs": [ - { - "tab": "Getting Started", - "icon": "rocket", - "groups": [ + "tab": "Getting Started", + "icon": "rocket", + "groups": [ + { + "group": "Get Started", + "pages": [ + "getting-started/introduction", + "getting-started/quickstart", + "getting-started/quickstart/ai-agent", + "getting-started/how-it-works", + "getting-started/basic-concepts", { - "group": "Get Started", + "group": "Installation", "pages": [ - "getting-started/introduction", - "getting-started/quickstart", - "getting-started/how-it-works", - "getting-started/basic-concepts", + "getting-started/quickstart/docker", { - "group": "Installation", + "group": "Managed Cluster", "pages": [ - "getting-started/quickstart/docker-desktop", "getting-started/quickstart/cloud", - { - "group": "Managed Cluster", - "pages": [ - "getting-started/installation/aws", - "getting-started/installation/gcp", - "getting-started/installation/azure", - "getting-started/installation/scaleway" - ] - }, - "getting-started/installation/kubernetes" + "getting-started/installation/aws", + "getting-started/installation/gcp", + "getting-started/installation/azure", + "getting-started/installation/scaleway" ] }, - { - "group": "Quickstart", - "pages": [ - "getting-started/guides/getting-started/deploy-your-first-application", - "getting-started/quickstart/ai-agent", - "getting-started/quickstart/remote-dev-environments", - "getting-started/guides/use-cases/ephemeral-environment" - ] - } + "getting-started/installation/kubernetes" ] - }, + } + ] + }, + { + "group": "Platform Capabilities", + "pages": [ { - "group": "Platform Capabilities", + "group": "Core Products", "pages": [ - { - "group": "Core Products", - "pages": [ - "getting-started/guides/qovery-101/provision", - "getting-started/guides/qovery-101/deploy", - "getting-started/guides/qovery-101/observe", - "getting-started/guides/qovery-101/optimize", - "getting-started/guides/qovery-101/secure" - ] - }, - { - "group": "Security & Compliance", - "pages": [ - "getting-started/security-and-compliance/overview", - { - "group": "IAM Permissions Reference", - "pages": [ - "getting-started/security-and-compliance/aws-iam-permissions", - "getting-started/security-and-compliance/gcp-iam-permissions", - "getting-started/security-and-compliance/azure-iam-permissions", - "getting-started/security-and-compliance/scaleway-iam-permissions" - ] - }, - "getting-started/security-and-compliance/audit-logs", - "getting-started/security-and-compliance/soc2", - "getting-started/security-and-compliance/gdpr", - "getting-started/security-and-compliance/dora", - "getting-started/security-and-compliance/hipaa" - ] - }, - "getting-started/configuration/maintenance" + "getting-started/guides/qovery-101/provision", + "getting-started/guides/qovery-101/deploy", + "getting-started/guides/qovery-101/observe", + "getting-started/guides/qovery-101/optimize", + "getting-started/guides/qovery-101/secure", + "getting-started/agent-tasks" ] }, { - "group": "How-to Guides", + "group": "Security & Compliance", "pages": [ - "getting-started/guides/use-cases/production-environment-management", - "getting-started/guides/use-cases/cloud-migration-and-scaling", + "getting-started/security-and-compliance/overview", { - "group": "Ephemeral Environments", + "group": "IAM Permissions Reference", "pages": [ - "getting-started/guides/use-cases/ephemeral-environment", - "getting-started/guides/use-cases/preview-environments", - "getting-started/guides/use-cases/e2e-testing" + "getting-started/security-and-compliance/aws-iam-permissions", + "getting-started/security-and-compliance/gcp-iam-permissions", + "getting-started/security-and-compliance/azure-iam-permissions", + "getting-started/security-and-compliance/scaleway-iam-permissions" ] }, - "getting-started/guides/use-cases/remote-development-environments" - ] - }, - { - "group": "Tutorials", - "pages": [ - "getting-started/guides/getting-started/deploy-your-first-application", - "getting-started/guides/getting-started/connect-database", - "getting-started/guides/others/database-seeding-lifecycle-job", - { - "group": "Advanced Tutorials", - "pages": [ - { - "group": "Infrastructure & Security", - "pages": [ - "getting-started/guides/advanced-tutorials/aws-iam-roles", - "getting-started/guides/advanced-tutorials/certificate-management-multi-tenant", - "getting-started/guides/advanced-tutorials/cloudwatch-integration", - "getting-started/guides/advanced-tutorials/deploy-daemonset-karpenter", - "getting-started/guides/advanced-tutorials/upgrading-rds-instance" - ] - }, - { - "group": "Networking & Access Control", - "pages": [ - "getting-started/guides/advanced-tutorials/cloudflare-custom-domain", - "getting-started/guides/advanced-tutorials/rate-limiting", - "getting-started/guides/advanced-tutorials/ip-header-authorization", - "getting-started/guides/advanced-tutorials/egress-filtering-squid-proxy", - "getting-started/guides/advanced-tutorials/customizing-preview-url-with-qovery-cli" - ] - }, - { - "group": "Development & Deployment", - "pages": [ - "getting-started/guides/advanced-tutorials/write-dockerfile", - "getting-started/guides/advanced-tutorials/import-env-vars-cli", - "getting-started/guides/advanced-tutorials/deploy-jupyterhub", - "getting-started/guides/advanced-tutorials/rust-api-part-1" - ] - } - ] - } - ] - }, - { - "group": "Troubleshooting", - "pages": [ - "getting-started/troubleshoot/overview" + "getting-started/security-and-compliance/audit-logs", + "getting-started/security-and-compliance/soc2", + "getting-started/security-and-compliance/gdpr", + "getting-started/security-and-compliance/dora", + "getting-started/security-and-compliance/hipaa" ] }, + "getting-started/configuration/maintenance" + ] + }, + { + "group": "How-to Guides", + "pages": [ + "getting-started/guides/use-cases/production-environment-management", + "getting-started/guides/use-cases/cloud-migration-and-scaling", { - "group": "Useful Resources", + "group": "Ephemeral Environments", "pages": [ - "getting-started/useful-resources/faq", - "getting-started/useful-resources/help-and-support" + "getting-started/guides/use-cases/ephemeral-environment", + "getting-started/guides/use-cases/preview-environments", + "getting-started/guides/use-cases/e2e-testing" ] } ] }, { - "tab": "Configuration", - "icon": "sliders", - "groups": [ - { - "group": "Overview", - "pages": [ - "configuration/overview" - ] - }, - { - "group": "Account & Organization", - "pages": [ - "configuration/user-account", - "configuration/organization", - { - "group": "Access & Security", - "pages": [ - "configuration/organization/members-rbac", - "configuration/organization/sso", - "configuration/organization/api-token", - "configuration/organization/api-policy-token" - ] - } - ] - }, + "group": "Tutorials", + "pages": [ + "getting-started/guides/getting-started/deploy-your-first-application", + "getting-started/guides/getting-started/connect-database", + "getting-started/guides/others/database-seeding-lifecycle-job", { - "group": "Clusters & Cloud", + "group": "Advanced Tutorials", "pages": [ - "configuration/clusters", - "configuration/cluster-advanced-settings", - "configuration/connect-to-cluster", - "configuration/organization/cloud-credentials", - "configuration/cloud-provider-resource-tags", - { - "group": "AWS EKS", - "pages": [ - "configuration/integrations/kubernetes/eks/overview", - "configuration/integrations/kubernetes/eks/managed", - "configuration/integrations/kubernetes/eks/preflight-checks", - "configuration/integrations/kubernetes/eks/eks-anywhere" - ] - }, - { - "group": "Google GKE", - "pages": [ - "configuration/integrations/kubernetes/gke/overview", - "configuration/integrations/kubernetes/gke/managed" - ] - }, { - "group": "Azure AKS", + "group": "Infrastructure & Security", "pages": [ - "configuration/integrations/kubernetes/aks/overview", - "configuration/integrations/kubernetes/aks/managed" + "getting-started/guides/advanced-tutorials/aws-iam-roles", + "getting-started/guides/advanced-tutorials/certificate-management-multi-tenant", + "getting-started/guides/advanced-tutorials/cloudwatch-integration", + "getting-started/guides/advanced-tutorials/deploy-daemonset-karpenter", + "getting-started/guides/advanced-tutorials/upgrading-rds-instance" ] }, { - "group": "Scaleway Kapsule", + "group": "Networking & Access Control", "pages": [ - "configuration/integrations/kubernetes/scaleway/overview", - "configuration/integrations/kubernetes/scaleway/managed" + "getting-started/guides/advanced-tutorials/cloudflare-custom-domain", + "getting-started/guides/advanced-tutorials/rate-limiting", + "getting-started/guides/advanced-tutorials/ip-header-authorization", + "getting-started/guides/advanced-tutorials/egress-filtering-squid-proxy", + "getting-started/guides/advanced-tutorials/customizing-preview-url-with-qovery-cli" ] }, { - "group": "Other Kubernetes", + "group": "Development & Deployment", "pages": [ - "configuration/integrations/kubernetes/byok", - "configuration/integrations/kubernetes/docker" + "getting-started/guides/advanced-tutorials/write-dockerfile", + "getting-started/guides/advanced-tutorials/import-env-vars-cli", + "getting-started/guides/advanced-tutorials/deploy-jupyterhub", + "getting-started/guides/advanced-tutorials/rust-api-part-1" ] } ] + } + ] + }, + { + "group": "Troubleshooting", + "pages": [ + "getting-started/troubleshoot/overview" + ] + }, + { + "group": "Useful Resources", + "pages": [ + "getting-started/useful-resources/faq", + "getting-started/useful-resources/help-and-support" + ] + } + ] + }, + { + "tab": "Configuration", + "icon": "sliders", + "groups": [ + { + "group": "Overview", + "pages": [ + "configuration/overview" + ] + }, + { + "group": "Account & Organization", + "pages": [ + "configuration/user-account", + "configuration/organization", + { + "group": "Access & Security", + "pages": [ + "configuration/organization/members-rbac", + "configuration/organization/sso", + "configuration/organization/api-token", + "configuration/organization/api-policy-token" + ] + } + ] + }, + { + "group": "Clusters & Cloud", + "pages": [ + "configuration/clusters", + "configuration/cluster-advanced-settings", + "configuration/connect-to-cluster", + "configuration/organization/cloud-credentials", + "configuration/cloud-provider-resource-tags", + { + "group": "AWS EKS", + "pages": [ + "configuration/integrations/kubernetes/eks/overview", + "configuration/integrations/kubernetes/eks/managed", + "configuration/integrations/kubernetes/eks/preflight-checks", + "configuration/integrations/kubernetes/eks/eks-anywhere" + ] }, { - "group": "Source Control", + "group": "Google GKE", "pages": [ - "configuration/organization/git-repository-access", - { - "group": "Container Registries", - "pages": [ - "configuration/organization/container-registry", - "configuration/integrations/container-registries/docker-hub", - { - "group": "Cloud Registries", - "pages": [ - "configuration/integrations/container-registries/aws-ecr", - "configuration/integrations/container-registries/gcp-artifact-registry", - "configuration/integrations/container-registries/azure-acr", - "configuration/integrations/container-registries/scaleway-cr" - ] - }, - { - "group": "Git-based Registries", - "pages": [ - "configuration/integrations/container-registries/github-cr", - "configuration/integrations/container-registries/gitlab-cr" - ] - }, - "configuration/integrations/container-registries/generic" - ] - }, - { - "group": "Helm Repositories", - "pages": [ - "configuration/organization/helm-repository" - ] - } + "configuration/integrations/kubernetes/gke/overview", + "configuration/integrations/kubernetes/gke/managed" ] }, { - "group": "Projects & Environments", + "group": "Azure AKS", "pages": [ - "configuration/project", - "configuration/environment" + "configuration/integrations/kubernetes/aks/overview", + "configuration/integrations/kubernetes/aks/managed" ] }, { - "group": "Services", + "group": "Scaleway Kapsule", "pages": [ - { - "group": "Workloads", - "pages": [ - "configuration/application", - "configuration/helm" - ] - }, - { - "group": "Jobs", - "pages": [ - "configuration/cronjob", - "configuration/lifecycle-job" - ] - }, - { - "group": "Data & Infrastructure", - "pages": [ - "configuration/database", - "configuration/object-storage", - "configuration/terraform" - ] - }, - "configuration/blueprints", - "configuration/service-health-checks", - "configuration/service-advanced-settings" + "configuration/integrations/kubernetes/scaleway/overview", + "configuration/integrations/kubernetes/scaleway/managed" ] }, { - "group": "Deployment & CI/CD", + "group": "Other Kubernetes", + "pages": [ + "configuration/integrations/kubernetes/byok", + "configuration/integrations/kubernetes/docker" + ] + } + ] + }, + { + "group": "Source Control", + "pages": [ + "configuration/organization/git-repository-access", + { + "group": "Container Registries", "pages": [ - "configuration/deployment/overview", - "configuration/deployment/pipeline", - "configuration/deployment/auto-deploy", + "configuration/organization/container-registry", + "configuration/integrations/container-registries/docker-hub", { - "group": "Deployment Configuration", + "group": "Cloud Registries", "pages": [ - "configuration/deployment/actions", - "configuration/deployment/strategies", - "configuration/deployment/image-mirroring", - "configuration/deployment-rule" + "configuration/integrations/container-registries/aws-ecr", + "configuration/integrations/container-registries/gcp-artifact-registry", + "configuration/integrations/container-registries/azure-acr", + "configuration/integrations/container-registries/scaleway-cr" ] }, { - "group": "Monitoring Deployments", + "group": "Git-based Registries", "pages": [ - "configuration/deployment/statuses", - "configuration/deployment/logs", - "configuration/deployment/history" + "configuration/integrations/container-registries/github-cr", + "configuration/integrations/container-registries/gitlab-cr" ] }, - { - "group": "CI/CD Integrations", - "pages": [ - "configuration/integrations/ci-cd/github-actions", - "configuration/integrations/ci-cd/gitlab-ci", - "configuration/integrations/ci-cd/circleci", - "configuration/integrations/ci-cd/jenkins", - "configuration/integrations/argocd" - ] - } + "configuration/integrations/container-registries/generic" ] }, { - "group": "Environment Variables & Secrets", + "group": "Helm Repositories", "pages": [ - "configuration/environment-variables", - "configuration/integrations/secret-managers/doppler", - { - "group": "Secret Manager Integration", - "pages": [ - "configuration/integrations/secret-managers/secret-manager-access", - "configuration/integrations/secret-managers/aws-secrets-manager", - "configuration/integrations/secret-managers/aws-parameter-store", - "configuration/integrations/secret-managers/gcp-secret-manager" - ] - } + "configuration/organization/helm-repository" ] - }, + } + ] + }, + { + "group": "Projects & Environments", + "pages": [ + "configuration/project", + "configuration/environment" + ] + }, + { + "group": "Services", + "pages": [ { - "group": "Observability", + "group": "Workloads", "pages": [ - "configuration/integrations/observability/qovery-observe", - "configuration/integrations/observability/datadog", - "configuration/integrations/observability/kubecost" + "configuration/application", + "configuration/helm" ] }, { - "group": "Notifications", + "group": "Jobs", "pages": [ - "configuration/integrations/webhooks", - "configuration/integrations/slack", - "configuration/integrations/email" + "configuration/cronjob", + "configuration/lifecycle-job" ] }, { - "group": "Networking & Advanced", + "group": "Agent Tasks", + "tag": "NEW", "pages": [ + "configuration/agent-tasks/overview", { - "group": "Networking", - "pages": [ - "configuration/integrations/aws/vpc-peering", - "configuration/integrations/api-gateway-nginx" - ] - }, - { - "group": "Advanced Configuration", + "group": "Examples", "pages": [ - "configuration/organization/labels-annotations", - "configuration/disaster-recovery" - ] - }, - { - "group": "Infrastructure as Code", - "pages": [ - "configuration/integrations/iac/overview", - "configuration/integrations/iac/terraform", - "configuration/integrations/iac/cloudformation" + "configuration/agent-tasks/incident-analyser", + "configuration/agent-tasks/incident-analyser-honeybadger", + "configuration/agent-tasks/build-deployment-optimizer", + "configuration/agent-tasks/jira-coding-agent", + "configuration/agent-tasks/linear-coding-agent" ] } ] - } - ] - }, - { - "tab": "AI", - "icon": "robot", - "groups": [ + }, { - "group": "Overview", + "group": "Data & Infrastructure", "pages": [ - "copilot/ai-overview", - "copilot/overview", - "copilot/what-is-agentic-ai" + "configuration/database", + "configuration/object-storage", + "configuration/terraform" ] }, + "configuration/blueprints", + "configuration/service-health-checks", + "configuration/service-advanced-settings" + ] + }, + { + "group": "Deployment & CI/CD", + "pages": [ + "configuration/deployment/overview", + "configuration/deployment/pipeline", + "configuration/deployment/auto-deploy", { - "group": "Getting Started", + "group": "Deployment Configuration", "pages": [ - "copilot/getting-started", - "copilot/console", - "copilot/slack-bot", - "copilot/mcp-server", - "copilot/securing-ai-access", - "getting-started/quickstart/agent-skills" + "configuration/deployment/actions", + "configuration/deployment/strategies", + "configuration/deployment/image-mirroring", + "configuration/deployment-rule" ] }, { - "group": "Capabilities", + "group": "Monitoring Deployments", "pages": [ - "copilot/capabilities/infrastructure-management", - "copilot/capabilities/deployment-automation", - "copilot/capabilities/optimization", - "copilot/capabilities/troubleshooting" + "configuration/deployment/statuses", + "configuration/deployment/logs", + "configuration/deployment/history" ] }, { - "group": "Examples", + "group": "CI/CD Integrations", "pages": [ - "copilot/examples/common-tasks", - "copilot/examples/advanced-workflows" + "configuration/integrations/ci-cd/github-actions", + "configuration/integrations/ci-cd/gitlab-ci", + "configuration/integrations/ci-cd/circleci", + "configuration/integrations/ci-cd/jenkins", + "configuration/integrations/argocd" ] } ] }, { - "tab": "Terraform Provider", - "icon": "code", - "groups": [ + "group": "Environment Variables & Secrets", + "pages": [ + "configuration/environment-variables", + "configuration/integrations/secret-managers/doppler", { - "group": "Getting Started", + "group": "Secret Manager Integration", "pages": [ - "terraform-provider/overview", - "terraform-provider/exporter" - ] - }, - { - "group": "Examples", - "pages": [ - "terraform-provider/basic-application", - "terraform-provider/application-with-database", - "terraform-provider/linking-services", - "terraform-provider/multi-environment", - "terraform-provider/airbyte-deployment", - "terraform-provider/advanced-patterns" + "configuration/integrations/secret-managers/secret-manager-access", + "configuration/integrations/secret-managers/aws-secrets-manager", + "configuration/integrations/secret-managers/aws-parameter-store", + "configuration/integrations/secret-managers/gcp-secret-manager" ] } ] }, { - "tab": "CLI", - "icon": "terminal", - "groups": [ + "group": "Observability", + "pages": [ + "configuration/integrations/observability/qovery-observe", + "configuration/integrations/observability/datadog", + "configuration/integrations/observability/kubecost" + ] + }, + { + "group": "Notifications", + "pages": [ + "configuration/integrations/webhooks", + "configuration/integrations/slack", + "configuration/integrations/email" + ] + }, + { + "group": "Networking & Advanced", + "pages": [ { - "group": "Getting Started", + "group": "Networking", "pages": [ - "cli/overview" + "configuration/integrations/aws/vpc-peering", + "configuration/integrations/api-gateway-nginx" ] }, { - "group": "Commands", + "group": "Advanced Configuration", "pages": [ - "cli/commands/overview", - "cli/commands/api", - "cli/commands/application", - "cli/commands/audit-log", - "cli/commands/auth", - "cli/commands/cluster", - "cli/commands/completion", - "cli/commands/console", - "cli/commands/container", - "cli/commands/context", - "cli/commands/cronjob", - "cli/commands/database", - "cli/commands/demo", - "cli/commands/enterprise-connection", - "cli/commands/env", - "cli/commands/environment", - "cli/commands/helm", - "cli/commands/help", - "cli/commands/lifecycle", - "cli/commands/list-commands", - "cli/commands/list-pods", - "cli/commands/log", - "cli/commands/port-forward", - "cli/commands/project", - "cli/commands/rde", - "cli/commands/service", - "cli/commands/shell", - "cli/commands/status", - "cli/commands/terraform", - "cli/commands/token", - "cli/commands/upgrade", - "cli/commands/version" + "configuration/organization/labels-annotations", + "configuration/disaster-recovery" ] }, { - "group": "Troubleshooting", + "group": "Infrastructure as Code", "pages": [ - "cli/troubleshoot/overview" + "configuration/integrations/iac/overview", + "configuration/integrations/iac/terraform", + "configuration/integrations/iac/cloudformation" ] } ] + } + ] + }, + { + "tab": "AI", + "icon": "robot", + "groups": [ + { + "group": "Overview", + "pages": [ + "copilot/ai-overview", + "copilot/overview", + "copilot/what-is-agentic-ai" + ] }, { - "tab": "API Reference", - "icon": "brackets-curly", - "groups": [ - { - "group": "Getting Started", - "pages": [ - "api-reference/introduction", - "api-reference/authentication" - ] - }, - { - "group": "Guides", - "pages": [ - "api-reference/overview", - "api-reference/examples" - ] - } - ], - "openapi": "/api-reference/openapi.yaml" + "group": "Getting Started", + "pages": [ + "copilot/getting-started", + "copilot/console", + "copilot/slack-bot", + "copilot/mcp-server", + "copilot/securing-ai-access", + "getting-started/quickstart/agent-skills" + ] + }, + { + "group": "Capabilities", + "pages": [ + "copilot/capabilities/infrastructure-management", + "copilot/capabilities/deployment-automation", + "copilot/capabilities/optimization", + "copilot/capabilities/troubleshooting" + ] + }, + { + "group": "Examples", + "pages": [ + "copilot/examples/common-tasks", + "copilot/examples/advanced-workflows" + ] } ] }, { - "product": "AI Builder Portal", - "description": "Self-service AI builder portal for your team on your infrastructure", - "icon": "laptop-code", - "tabs": [ - { - "tab": "Overview", - "icon": "house", - "groups": [ - { - "group": "Overview", - "pages": [ - "rde/overview" - ] - }, - { - "group": "Getting Started", - "pages": [ - "rde/getting-started/admin-setup", - "rde/getting-started/create-your-first-workspace" - ] - } + "tab": "Terraform Provider", + "icon": "code", + "groups": [ + { + "group": "Getting Started", + "pages": [ + "terraform-provider/overview", + "terraform-provider/exporter" ] }, { - "tab": "For Admins", - "icon": "shield-halved", - "groups": [ - { - "group": "For Admins", - "pages": [ - "rde/admin/blueprint-management", - "rde/admin/access-control", - "rde/admin/workspace-management", - "rde/admin/publish-approvals", - "rde/admin/member-management", - "rde/admin/portal-customization", - "rde/admin/security-center" - ] - } + "group": "Examples", + "pages": [ + "terraform-provider/basic-application", + "terraform-provider/application-with-database", + "terraform-provider/linking-services", + "terraform-provider/multi-environment", + "terraform-provider/airbyte-deployment", + "terraform-provider/advanced-patterns" ] - }, + } + ] + }, + { + "tab": "CLI", + "icon": "terminal", + "groups": [ { - "tab": "Autonomous Agents", - "icon": "robot", - "groups": [ - { - "group": "Autonomous Agents", - "pages": [ - "rde/agents/overview", - "rde/agents/getting-started", - "rde/agents/agent-blueprints", - "rde/agents/managing-runs", - "rde/agents/linear-integration", - "rde/agents/jira-integration", - "rde/agents/agent-template" - ] - } + "group": "Getting Started", + "pages": [ + "cli/overview" ] }, { - "tab": "For Users", - "icon": "user", - "groups": [ - { - "group": "For Users", - "pages": [ - "rde/user/workspace-dashboard", - "rde/user/using-the-editor", - "rde/user/live-preview", - "rde/user/publishing", - "rde/user/git-history" - ] - } + "group": "Commands", + "pages": [ + "cli/commands/overview", + "cli/commands/api", + "cli/commands/application", + "cli/commands/audit-log", + "cli/commands/auth", + "cli/commands/cluster", + "cli/commands/completion", + "cli/commands/console", + "cli/commands/container", + "cli/commands/context", + "cli/commands/cronjob", + "cli/commands/database", + "cli/commands/demo", + "cli/commands/enterprise-connection", + "cli/commands/env", + "cli/commands/environment", + "cli/commands/helm", + "cli/commands/help", + "cli/commands/lifecycle", + "cli/commands/list-commands", + "cli/commands/list-pods", + "cli/commands/log", + "cli/commands/port-forward", + "cli/commands/project", + "cli/commands/rde", + "cli/commands/service", + "cli/commands/shell", + "cli/commands/status", + "cli/commands/terraform", + "cli/commands/token", + "cli/commands/upgrade", + "cli/commands/version" ] }, { - "tab": "Reference", - "icon": "book", - "groups": [ - { - "group": "Reference", - "pages": [ - "rde/reference/security", - "rde/reference/architecture", - "rde/reference/troubleshooting" - ] - } + "group": "Troubleshooting", + "pages": [ + "cli/troubleshoot/overview" ] } ] + }, + { + "tab": "API Reference", + "icon": "brackets-curly", + "groups": [ + { + "group": "Getting Started", + "pages": [ + "api-reference/introduction", + "api-reference/authentication" + ] + }, + { + "group": "Guides", + "pages": [ + "api-reference/overview", + "api-reference/examples" + ] + } + ], + "openapi": "/api-reference/openapi.yaml" } ] }, + "redirects": [ + { + "source": "/getting-started/quickstart/docker-desktop", + "destination": "/getting-started/quickstart/docker" + } + ], "footerSocials": { "github": "https://github.com/Qovery", "x": "https://twitter.com/Qovery_", diff --git a/docs/files/qovery-iam-aws.json b/docs/files/qovery-iam-aws.json index 96a33a4e..f86a5799 100644 --- a/docs/files/qovery-iam-aws.json +++ b/docs/files/qovery-iam-aws.json @@ -25,7 +25,7 @@ "ec2:*", "elasticache:*", "cloudtrail:LookupEvents", - "dynamodb:*", + "servicequotas:GetServiceQuota", "tag:GetResources", "rds:*", "ecs:*", diff --git a/docs/getting-started/agent-tasks.mdx b/docs/getting-started/agent-tasks.mdx new file mode 100644 index 00000000..797b1a54 --- /dev/null +++ b/docs/getting-started/agent-tasks.mdx @@ -0,0 +1,61 @@ +--- +title: "Agent Tasks" +description: "Deploy AI agents directly on your own infrastructure" +tag: "NEW" +--- + + +**Early Preview.** Agent Tasks is available in early preview to a limited set of organizations. Capabilities and setup will change before general availability. Want early access? Reach out to us directly in the product (help button in the console, or your dedicated Slack channel). + + +## Overview + +Agent Tasks let you delegate a job, investigating an incident, optimizing a build, or anything else you describe, to an AI agent running on your own Qovery-managed infrastructure. For how an agent is configured and what settings are available, see the [Configuration Reference](/configuration/agent-tasks/overview). + +## Why Run Agent Tasks in Qovery? + + + + The agent runs as a service on your Qovery-managed cluster, on your own cloud account, not on a third-party SaaS runner you don't control. + + + Scoped access via Policy API tokens, network boundaries from a domain allowlist controlling exactly what it can reach, resource limits, and execution timeouts, the same governance model as any other Qovery service. + + + Every run shows up under the agent task's Deployments tab, with logs, like any other deployment. + + + Clone Environment mode gives a run its own throwaway copy of the environment, so an agent investigating an incident or proposing a code change can't interfere with what's actually running in production. + + + Add Qovery services from your environment as context directly, alongside or instead of a Git repository, so the agent has the same view of your infrastructure you do. + + + Start from a template built for your use case, incident response, build optimization, or picking up tickets, and adjust it instead of starting from a blank prompt. + + + +## Use Cases + +Today there are a few ready-made agent configurations, or you can start from scratch and configure every part yourself. Don't hesitate to reach out to us directly in the product if you have a specific need so we can add it. + + + + Correlates a firing incident.io incident with recent changes, logs, and metrics, then reports back to the on-call human and opens a PR if the fix is small and well-understood. + + + Same behavior, for teams using Honeybadger instead of incident.io. + + + Identifies build and deployment optimization levers and expected gain, opens a PR with the proposed change and/or modifies the build configuration in Qovery. + + + Picks up a Jira issue and proposes the corresponding code change as a pull request. + + + Picks up a Linear issue and proposes the corresponding code change as a pull request. + + + Configure every part of the agent yourself. Also the full configuration reference: creating an agent, execution mode, triggers and outputs, resources, governance, and environment variables. + + diff --git a/docs/getting-started/basic-concepts.mdx b/docs/getting-started/basic-concepts.mdx index 4a11303e..9798bf54 100644 --- a/docs/getting-started/basic-concepts.mdx +++ b/docs/getting-started/basic-concepts.mdx @@ -30,14 +30,14 @@ graph TD D --> E5 style A fill:#642DFF,stroke:#642DFF,color:#fff - style B fill:#8B5CF6,stroke:#8B5CF6,color:#fff - style C fill:#A78BFA,stroke:#A78BFA,color:#fff - style D fill:#C4B5FD,stroke:#C4B5FD,color:#fff - style E1 fill:#DDD6FE,stroke:#DDD6FE,color:#333 - style E2 fill:#DDD6FE,stroke:#DDD6FE,color:#333 - style E3 fill:#DDD6FE,stroke:#DDD6FE,color:#333 - style E4 fill:#DDD6FE,stroke:#DDD6FE,color:#333 - style E5 fill:#DDD6FE,stroke:#DDD6FE,color:#333 + style B fill:#7C3FFF,stroke:#7C3FFF,color:#fff + style C fill:#965FFF,stroke:#965FFF,color:#fff + style D fill:#B080FF,stroke:#B080FF,color:#fff + style E1 fill:#B080FF,stroke:#B080FF,color:#fff + style E2 fill:#B080FF,stroke:#B080FF,color:#fff + style E3 fill:#B080FF,stroke:#B080FF,color:#fff + style E4 fill:#B080FF,stroke:#B080FF,color:#fff + style E5 fill:#B080FF,stroke:#B080FF,color:#fff ``` Let's break down each level. @@ -46,7 +46,7 @@ Let's break down each level. ## Organization -Your **Organization** is your company's workspace—the top-level container for everything in Qovery. +Your **Organization** is your company's workspace: the top-level container for everything in Qovery. **Key features:** - Team collaboration across multiple projects @@ -62,7 +62,7 @@ Most companies have one Organization. Users can belong to multiple Organizations ## Cluster -A **Cluster** is a Kubernetes cluster where your services run—a collection of machines (nodes) that execute containerized applications. +A **Cluster** is a Kubernetes cluster where your services run: a collection of machines (nodes) that execute containerized applications. **Two types of clusters:** @@ -76,7 +76,7 @@ A **Cluster** is a Kubernetes cluster where your services run—a collection of **Supported providers:** AWS (EKS), GCP (GKE), Azure (AKS), Scaleway (Kapsule) - [Create a managed cluster →](/installation/aws) + [Create a managed cluster →](/getting-started/quickstart/cloud) @@ -128,7 +128,7 @@ An **Environment** is a deployment stage containing services at a specific versi - **Preview** - Temporary per-pull-request environments -**Preview Environments** are automatically created for each pull request and deleted when merged. Perfect for testing changes in isolation before production. [Learn more →](/guides/use-cases/ephemeral-environment) +**Preview Environments** are automatically created for each pull request and deleted when merged. Perfect for testing changes in isolation before production. [Learn more →](/getting-started/guides/use-cases/ephemeral-environment) [Learn more about Environments →](/configuration/environment) @@ -137,7 +137,7 @@ An **Environment** is a deployment stage containing services at a specific versi ## Services -**Services** are the building blocks of your environment—applications, databases, jobs, and more. +**Services** are the building blocks of your environment: applications, databases, jobs, and more. diff --git a/docs/getting-started/guides/getting-started/deploy-your-first-application.mdx b/docs/getting-started/guides/getting-started/deploy-your-first-application.mdx index 6d4eebe1..0fd44761 100644 --- a/docs/getting-started/guides/getting-started/deploy-your-first-application.mdx +++ b/docs/getting-started/guides/getting-started/deploy-your-first-application.mdx @@ -10,7 +10,7 @@ Deploy a containerized application on Qovery in minutes. Choose your deployment Before deploying your first application, ensure you have: Qovery account - [Sign up here](https://console.qovery.com/signup) -Kubernetes cluster - [Install a cluster](/installation/aws) or [connect your own](/configuration/integrations/kubernetes/byok) +Kubernetes cluster - [Install a cluster](/getting-started/quickstart/cloud) or [connect your own](/configuration/integrations/kubernetes/byok) **Depending on your deployment source:** - **Git Repository**: GitHub, GitLab, or Bitbucket repository with a Dockerfile diff --git a/docs/getting-started/guides/use-cases/cloud-migration-and-scaling.mdx b/docs/getting-started/guides/use-cases/cloud-migration-and-scaling.mdx index 8e1615b2..e23d56bf 100644 --- a/docs/getting-started/guides/use-cases/cloud-migration-and-scaling.mdx +++ b/docs/getting-started/guides/use-cases/cloud-migration-and-scaling.mdx @@ -1,23 +1,25 @@ --- title: "Migrate to Kubernetes" -description: "Migrate your applications from Heroku, Render, or any platform to Kubernetes on your cloud provider - fully automated by AI" +description: "Leave the PaaS, keep the workflow. Migrate from Heroku, Render, or Railway to Kubernetes on your own cloud, fully automated by AI" --- ## Overview -Migrating to Kubernetes is traditionally the hardest part of modernizing your infrastructure. It means months of planning, rewriting deployment configs, learning Helm charts, and re-architecting your stack. Most teams get stuck halfway. +Move off Heroku, Render, or Railway onto infrastructure you own. The migration runs alongside your current platform and does not require months of planning, rewriting deployment configs, learning Helm charts, or re-architecting your stack. -Qovery removes that complexity entirely. With Qovery AI skills, you can migrate your applications from any platform - Heroku, Render, OpenShift, legacy VMs - to Kubernetes running on **your own cloud account** (AWS, GCP, Azure, or Scaleway). The AI agent analyzes your codebase, generates Dockerfiles, provisions databases, sets up environment variables, and deploys everything. No Kubernetes expertise required. +Qovery removes that complexity entirely. One command: an AI agent reads your repository and deploys it into the cloud account you already own (AWS, GCP, Azure, or Scaleway), after you approve the plan. It analyzes your codebase, generates Dockerfiles, provisions databases, sets up environment variables, and deploys everything as standard Terraform and Kubernetes manifests. No re-architecture, no Kubernetes expertise required. + +The migration is non-destructive: your new environment runs alongside your current platform. Switch your domain over only once you're confident. Stop paying for your old PaaS and everything keeps running, on infrastructure and cloud billing you fully own. -For complex migrations (microservices architectures, stateful workloads, compliance requirements), Qovery provides **cloud architect assistance**. [Book a demo](https://www.qovery.com/book-a-demo) to get a personalized migration plan. +For complex migrations (microservices architectures, stateful workloads, compliance requirements), Qovery provides **cloud architect assistance**. [Talk to a migration engineer](https://www.qovery.com/book-a-demo) to get a personalized migration plan. ## Why Migrate with Qovery? - The `/qovery-deploy` AI skill analyzes your codebase, creates Dockerfiles, provisions databases, and deploys - all from a single prompt + The `/qovery-onboard` AI skill maps your current platform's concepts to Qovery and guides your cluster setup, then `qovery-deploy` analyzes your codebase, creates Dockerfiles, provisions databases, and deploys - all from a single prompt @@ -52,6 +54,10 @@ For complex migrations (microservices architectures, stateful workloads, complia Web services, background workers, cron jobs, managed databases - migrated with full parity + + Services, plugins, and managed databases - mapped to Kubernetes equivalents automatically + + DeploymentConfigs, Routes, BuildConfigs - converted to standard Kubernetes resources @@ -65,7 +71,7 @@ For complex migrations (microservices architectures, stateful workloads, complia - Fly.io, Railway, DigitalOcean App Platform, Google App Engine, Azure App Service, and more + Fly.io, DigitalOcean App Platform, Google App Engine, Azure App Service, and more @@ -109,16 +115,22 @@ The fastest path. The AI agent handles the entire migration end-to-end. ``` - Migrate my project from Heroku to Kubernetes with Qovery + Migrate me from Heroku to AWS ``` Or use the skill command directly: ``` - /qovery-deploy + /qovery-onboard ``` - The agent will guide you through the entire process: + The `qovery-onboard` skill acts as your personal cloud architect: + + - **Understand** your context - platform you're leaving, cloud provider you're moving to, constraints + - **Map** concepts from your current platform (dynos, add-ons, services...) to their Qovery equivalents + - **Guide** you through cluster and environment setup + + From there, `qovery-deploy` takes over to get your code running: - **Analyze** your codebase and detect languages, frameworks, and databases - **Create** optimized multi-stage Dockerfiles if your project doesn't have one diff --git a/docs/getting-started/guides/use-cases/ephemeral-environment.mdx b/docs/getting-started/guides/use-cases/ephemeral-environment.mdx index 62af6b8a..0c634505 100644 --- a/docs/getting-started/guides/use-cases/ephemeral-environment.mdx +++ b/docs/getting-started/guides/use-cases/ephemeral-environment.mdx @@ -9,31 +9,23 @@ Ephemeral environments are temporary, isolated environments that are automatical Ephemeral environments (also called Preview Environments) are automatically created when you open a pull request and deleted when it's merged or closed, giving you on-demand testing environments that mirror your production setup. -## Benefits +## How It Helps - - - Test changes in isolation without affecting other developers - - - - Pay only for environments when they're in use - - - - Test in production-like environments before deployment + + + Each PR gets its own full-stack environment, created automatically and destroyed on merge or close. No shared staging environment to coordinate around. - - Stakeholders can review changes in live environments + + Environments run only for the lifetime of the PR. No idle infrastructure to pay for once it's merged. - - Catch issues early before they reach production + + Same services, same configuration as production, so what you test in preview behaves the same way once deployed. - - Get immediate feedback from team members and stakeholders + + Reviewers and stakeholders get a working URL for the PR, no local setup required to see the change running. @@ -98,7 +90,7 @@ Qovery offers **two approaches** to create and manage ephemeral environments, de

Stop configuring ephemeral environments manually

-

Qovery auto-creates a full-stack preview environment for every pull request and destroys it on merge. Setup in 15 minutes.

+

Qovery auto-creates a full-stack preview environment for every pull request and destroys it on merge. Enable it in 10-15 minutes, no CI/CD changes required.

- Try Qovery free → + Start for free →
diff --git a/docs/getting-started/how-it-works.mdx b/docs/getting-started/how-it-works.mdx index 14ab0136..0f3acf51 100644 --- a/docs/getting-started/how-it-works.mdx +++ b/docs/getting-started/how-it-works.mdx @@ -1,37 +1,37 @@ --- title: "How Qovery Works" -description: "Understand the architecture behind Qovery — the Kubernetes control plane for humans and AI agents" +description: "Understand the architecture behind Qovery: the Kubernetes control plane for humans and AI agents" --- ## The Big Picture -Qovery is **the Kubernetes control plane for humans and AI agents** — running entirely on your own cloud infrastructure. +Qovery is **the Kubernetes control plane for humans and AI agents**, running entirely on your own cloud infrastructure. Whether a developer deploys via the console, an AI agent deploys via the Agent Skill, or a platform engineer manages clusters via Terraform, they all drive the same control plane. One consistent model, every interface. -Qovery Architecture - Five products running on Kubernetes across multiple cloud providers -Qovery Architecture - Five products running on Kubernetes across multiple cloud providers +Qovery Architecture diagram: Provision, Deploy, Observe, Optimize, and Secure running on Kubernetes across multiple cloud providers +Qovery Architecture diagram: Provision, Deploy, Observe, Optimize, and Secure running on Kubernetes across multiple cloud providers ## How AI Agents Interact with Qovery AI coding agents (Claude Code, Cursor, OpenCode, and 30+ others) interact with Qovery through two complementary interfaces: - + **Takes your source code → deploys it on Qovery** - The AI agent analyzes your project, generates a Dockerfile, provisions databases, configures environment variables, and deploys — all autonomously. No Kubernetes knowledge required from the developer. + The AI agent analyzes your project, generates a Dockerfile, provisions databases, configures environment variables, and deploys, all autonomously. No Kubernetes knowledge required from the developer. - + **Manages existing infrastructure via natural language** - Once deployed, use the Qovery MCP Server to query environments, troubleshoot deployments, scale services, and manage infrastructure — all through conversation. + Once deployed, use the Qovery MCP Server to query environments, troubleshoot deployments, scale services, and manage infrastructure, all through conversation. ## Why Kubernetes? -Kubernetes was designed for infrastructure operators — not developers, and certainly not AI agents. Qovery bridges this gap by adding: +Kubernetes was designed for infrastructure operators, not developers, and certainly not AI agents. Qovery bridges this gap by adding: - **Developer Experience** - Deploy without Kubernetes expertise - **AI Agent Interface** - Agent Skill and MCP Server for autonomous operations @@ -39,9 +39,9 @@ Kubernetes was designed for infrastructure operators — not developers, and cer - **Multi-Cloud** - Works on AWS, GCP, Azure, Scaleway, on-premise - **Universal Orchestration** - Manages containers, databases, Terraform, and more -## The Five Products +## The Six Products -Qovery's architecture consists of five integrated products: +Qovery's architecture consists of six integrated products: @@ -52,6 +52,12 @@ Qovery's architecture consists of five integrated products: GitOps-based deployment for applications, databases, and services. Automatic builds and rollbacks. + + New + + Deploy AI agents directly on your own infrastructure. + + Unified observability with correlated metrics, logs, and events across your stack. @@ -78,14 +84,14 @@ Unlike traditional PaaS (Heroku, Platform.sh), Qovery runs on **your own cloud a ### 1. Multiple Interfaces -Work with Qovery through your preferred method — all driving the same control plane: +Work with Qovery through your preferred method, all driving the same control plane: - **[AI Agent Skill](/getting-started/quickstart/ai-agent)** - Deploy from Claude Code, Cursor, or any AI coding tool - **[MCP Server](/copilot/mcp-server)** - Manage infrastructure via natural language - **Web Console** - Visual interface for teams - **[CLI](/cli/overview)** - Command-line for developers -- **[Terraform](/terraform/overview)** - Infrastructure as Code -- **[API](/api/overview)** - Programmatic control +- **[Terraform](/terraform-provider/overview)** - Infrastructure as Code +- **[API](/api-reference/overview)** - Programmatic control ### 2. Production-Ready Features @@ -127,7 +133,7 @@ This means **one control plane** for your entire cloud infrastructure.
- Say "Deploy my application with Qovery" — the agent handles everything from Dockerfile to running deployment + Say "Deploy my application with Qovery": the agent handles everything from Dockerfile to running deployment @@ -151,7 +157,7 @@ This means **one control plane** for your entire cloud infrastructure. - Track metrics, scale, optimize — all from one interface + Track metrics, scale, optimize, all from one interface @@ -168,6 +174,6 @@ This means **one control plane** for your entire cloud infrastructure. Learn essential terminology - Deep dive into all five products + Deep dive into all six products
diff --git a/docs/getting-started/installation/aws.mdx b/docs/getting-started/installation/aws.mdx index ea5c4833..af40cf64 100644 --- a/docs/getting-started/installation/aws.mdx +++ b/docs/getting-started/installation/aws.mdx @@ -3,20 +3,38 @@ title: "Install Qovery on AWS" description: "Create your first Kubernetes cluster on AWS in under 30 minutes" --- +import AwsCredentialsSts from "/snippets/aws-credentials-sts.mdx"; +import AwsCredentialsStatic from "/snippets/aws-credentials-static.mdx"; + Get your first production-ready Kubernetes cluster running on AWS. This guide walks you through the entire setup from connecting AWS to deploying your cluster. Already have a Kubernetes cluster? See the [BYOK guide](/getting-started/installation/kubernetes) instead. -## What You'll Get +## Overview + +Qovery simplifies Amazon EKS management by: +- Automating EKS cluster creation and configuration +- Managing networking, load balancers, and DNS +- Providing built-in monitoring and logging +- Handling rolling updates and scaling via Karpenter +- Securing your infrastructure with best practices -- ✅ Production-ready EKS cluster in ~30 minutes -- ✅ **Karpenter auto-scaling** - Save up to 60% on AWS costs -- ✅ Automatic load balancing with SSL certificates -- ✅ Spot instance support for cost optimization -- ✅ Monitoring and logging built-in -- ✅ Ready to deploy your applications + + + Qovery creates and manages your EKS cluster automatically + + + Best practices for security, networking, and reliability + + + Intelligent, cost-optimized node provisioning built in + + + From connecting your AWS account to a running cluster + + ### About Karpenter @@ -52,8 +70,6 @@ Qovery uses [Karpenter](https://karpenter.sh/) for intelligent node provisioning You can access the AWS Console -No AWS expertise required - we'll guide you through everything! - --- ## Quick Demo @@ -64,7 +80,7 @@ Watch this walkthrough to see the entire cluster creation process: --- -## Create Your Cluster +## AWS Cluster Setup Follow these steps to create your first Qovery cluster on AWS: @@ -87,268 +103,10 @@ Follow these steps to create your first Qovery cluster on AWS: - **Most secure method** - Uses temporary credentials that auto-rotate. No access keys to manage. - - **What gets created**: A CloudFormation stack creates an IAM role with this policy: - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "application-autoscaling:*", - "autoscaling:*", - "cloudtrail:LookupEvents", - "cloudwatch:*", - "dynamodb:*", - "ec2:*", - "ecr:*", - "ecs:*", - "eks:*", - "elasticache:*", - "elasticloadbalancing:*", - "es:AddTags", - "es:CreateElasticsearchDomain", - "es:DeleteElasticsearchDomain", - "es:DescribeElasticsearchDomain", - "es:ListTags", - "es:RemoveTags", - "events:DeleteRule", - "events:DescribeRule", - "events:ListRuleNamesByTarget", - "events:ListTagsForResource", - "events:ListTargetsByRule", - "events:PutRule", - "events:PutTargets", - "events:RemoveTargets", - "events:TagResource", - "events:UntagResource", - "iam:*", - "kms:*", - "logs:*", - "organizations:DescribeAccount", - "organizations:DescribeOrganization", - "organizations:DescribeOrganizationalUnit", - "organizations:DescribePolicy", - "organizations:ListChildren", - "organizations:ListParents", - "organizations:ListPolicies", - "organizations:ListPoliciesForTarget", - "organizations:ListRoots", - "organizations:ListTargetsForPolicy", - "rds:*", - "s3:ListAllMyBuckets", - "servicequotas:GetServiceQuota", - "tag:GetResources" - ], - "Resource": "*" - }, - { - "Action": [ - "s3:*", - "sqs:*" - ], - "Effect": "Allow", - "Resource": [ - "arn:aws:s3:::qovery*", - "arn:aws:s3:::qovery*/*", - "arn:aws:sqs:*:*:qovery*", - "arn:aws:sqs:*:*:qovery*/*" - ] - } - ] - } - ``` - - **Setup Steps**: - - 1. **Open CloudFormation**: Click this link to create the IAM role - - [Launch CloudFormation Stack](https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https%3A%2F%2Fcloudformation-qovery-role-creation.s3.amazonaws.com%2Ftemplate.json&stackName=qovery-role-creation) - - This opens AWS CloudFormation in a new tab (login to AWS if needed) - 2. **In AWS CloudFormation Console**: - - Click **Next** (template is pre-filled with Qovery's requirements) - - Stack name: Keep default `qovery-iam-role` or customize - - Click **Next** (skip stack options) - - Click **Next** again (skip tags) - - ✅ **Important**: Check **"I acknowledge that AWS CloudFormation might create IAM resources"** - - Click **Create stack** - 3. **Wait for completion** (~1 minute): - - Status changes: `CREATE_IN_PROGRESS` → `CREATE_COMPLETE` - - Refresh page if needed - 4. **Get the Role ARN**: - - Click on the **Outputs** tab - - Find **RoleArn** key - - Copy the value (looks like: `arn:aws:iam::123456789012:role/qovery-role`) - - ![CloudFormation stack output with Role ARN](/images/aws-credentials/stack-output.png) - - 5. **Complete in Qovery**: - - Back in Qovery, paste the **Role ARN** - - Give it a name like `AWS Production` - - Click **Save** - - ![Enter Role ARN in Qovery Console](/images/install-qovery/aws/create-credentials.png) - - - - **Why this is recommended**: The IAM role uses AWS STS (Security Token Service) to generate temporary credentials that automatically rotate. Qovery never has access to long-lived credentials, and you can revoke access instantly by deleting the CloudFormation stack. - - - - - Qovery requires these AWS permissions to manage your infrastructure: - - - **EC2**: Create VPCs, subnets, security groups, and instances - - **EKS**: Create and manage Kubernetes clusters - - **IAM**: Create service roles for EKS and EC2 - - **ELB**: Create load balancers for your applications - - **S3**: Store Terraform state and logs - - **CloudWatch**: Collect logs and metrics - - For a detailed breakdown of every permission and why it's needed, see the [AWS IAM Permissions Reference](/getting-started/security-and-compliance/aws-iam-permissions). - - - - Yes! For production environments, you can create a custom IAM policy with minimum required permissions. Contact support for the minimal policy template. - - + - **Alternative method** - Uses AWS Access Keys (requires manual rotation every 90 days). - - - **Security Note**: Static credentials are long-lived and more exposed to leaks. For production, we strongly recommend STS Assume Role which provides short-lived, automatically refreshed credentials with granular access control. - - - **Setup Steps**: - - 1. **Connect to AWS Console**: - - Go to [AWS Console](https://console.aws.amazon.com) - 2. **Navigate to IAM**: - - Go to **IAM** service - - ![Navigate to IAM](/images/aws-credentials/aws-my-security-credentials.png) - - 3. **Create IAM User**: - - Create one IAM user called `qovery` - - ![Create user - step 1](/images/aws-credentials/create-user-1.png) - - - ![Create user - step 2](/images/aws-credentials/create-user-2.png) - - - ![Create user - step 3](/images/aws-credentials/create-user-3.png) - - 4. **Setup IAM Permissions**: - - Apply the required [IAM permissions](https://www.qovery.com/docs/files/qovery-iam-aws.json) to the `qovery` user - - **Download**: [IAM permissions JSON](https://www.qovery.com/docs/files/qovery-iam-aws.json) - Or copy the policy from below: - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "application-autoscaling:*", - "autoscaling:*", - "cloudtrail:LookupEvents", - "cloudwatch:*", - "dynamodb:*", - "ec2:*", - "ecr:*", - "ecs:*", - "eks:*", - "elasticache:*", - "elasticloadbalancing:*", - "es:AddTags", - "es:CreateElasticsearchDomain", - "es:DeleteElasticsearchDomain", - "es:DescribeElasticsearchDomain", - "es:ListTags", - "es:RemoveTags", - "events:DeleteRule", - "events:DescribeRule", - "events:ListRuleNamesByTarget", - "events:ListTagsForResource", - "events:ListTargetsByRule", - "events:PutRule", - "events:PutTargets", - "events:RemoveTargets", - "events:TagResource", - "events:UntagResource", - "iam:*", - "kms:*", - "logs:*", - "organizations:DescribeAccount", - "organizations:DescribeOrganization", - "organizations:DescribeOrganizationalUnit", - "organizations:DescribePolicy", - "organizations:ListChildren", - "organizations:ListParents", - "organizations:ListPolicies", - "organizations:ListPoliciesForTarget", - "organizations:ListRoots", - "organizations:ListTargetsForPolicy", - "rds:*", - "s3:ListAllMyBuckets", - "servicequotas:GetServiceQuota", - "tag:GetResources" - ], - "Resource": "*" - }, - { - "Action": [ - "s3:*", - "sqs:*" - ], - "Effect": "Allow", - "Resource": [ - "arn:aws:s3:::qovery*", - "arn:aws:s3:::qovery*/*", - "arn:aws:sqs:*:*:qovery*", - "arn:aws:sqs:*:*:qovery*/*" - ] - } - ] - } - ``` - - **Follow the steps in AWS console to create AWS credentials with required IAM permissions:** - - ![Add policy - step 1](/images/aws-credentials/aws-add-policy-1.jpg) - - - ![Add policy - step 2](/images/aws-credentials/aws-add-policy-2.png) - - - ![Add policy - step 3](/images/aws-credentials/aws-add-policy-3.jpg) - - - ![Add policy - step 4](/images/aws-credentials/aws-add-policy-4.jpg) - - 5. **Create Access Keys**: - - Go to the **Security Credentials** tab of the `qovery` user - - Click **Create access key** - - ![Create access key - step 1](/images/aws-credentials/aws-create-credentials-1.png) - - - ![Create access key - step 2](/images/aws-credentials/aws-create-credentials-2.png) - - - ![Create access key - step 3](/images/aws-credentials/aws-create-credentials-3.png) - - - Save the **Access Key ID** and **Secret Access Key** - - ![Save credentials](/images/aws-credentials/aws-create-credentials-4.png) - - - **Well done!** You now have your AWS `access key id` and `secret access key` and your permissions are set up. + @@ -462,28 +220,30 @@ Follow these steps to create your first Qovery cluster on AWS: --- +## What Gets Created + When you create a cluster, Qovery automatically provisions a complete, production-ready infrastructure: ### Network Architecture - - ✅ **Dedicated VPC** - Multi-AZ VPC isolating your infrastructure - - ✅ **Subnets & Routing** - Public/private subnets across 3 availability zones with routing tables - - ✅ **Internet Gateway** - For outbound container connectivity - - ✅ **Network Load Balancer** - Redirects HTTPS traffic to Nginx Ingress - - ✅ **NAT Gateways (Optional)** - With Elastic IPs for static outbound addresses - - ✅ **Database Networks** - Dedicated security groups and subnets for: + - **Dedicated VPC** - Multi-AZ VPC isolating your infrastructure + - **Subnets & Routing** - Public/private subnets across 3 availability zones with routing tables + - **Internet Gateway** - For outbound container connectivity + - **Network Load Balancer** - Redirects HTTPS traffic to Nginx Ingress + - **NAT Gateways (Optional)** - With Elastic IPs for static outbound addresses + - **Database Networks** - Dedicated security groups and subnets for: - RDS (relational databases) - DocumentDB (document storage) - ElastiCache (cache layers) ### Kubernetes Infrastructure - - ✅ **EKS Cluster** - Multi-AZ, latest stable Kubernetes version - - ✅ **Managed Worker Nodes** - AWS-managed EC2 instances with Karpenter - - ✅ **Security Groups** - Dual authentication for EKS remote access (TLS \+ IAM authenticator) - - ✅ **IAM Components**: + - **EKS Cluster** - Multi-AZ, latest stable Kubernetes version + - **Managed Worker Nodes** - AWS-managed EC2 instances with Karpenter + - **Security Groups** - Dual authentication for EKS remote access (TLS \+ IAM authenticator) + - **IAM Components**: - EBS CSI driver access for persistent volumes - IAM User Sync for Kubernetes authentication - Cluster Autoscaler permissions @@ -491,22 +251,22 @@ Follow these steps to create your first Qovery cluster on AWS: ### Installed Components - - ✅ **Karpenter** - Intelligent auto-scaling for cost optimization - - ✅ **AWS Load Balancer Controller** - Automatic ingress management - - ✅ **EBS CSI Driver** - Persistent volume support - - ✅ **Metrics Server** - Resource monitoring - - ✅ **Qovery Agent** - Observability and management + - **Karpenter** - Intelligent auto-scaling for cost optimization + - **AWS Load Balancer Controller** - Automatic ingress management + - **EBS CSI Driver** - Persistent volume support + - **Metrics Server** - Resource monitoring + - **Qovery Agent** - Observability and management ### Storage & Logging - - ✅ **KMS-Encrypted S3 Buckets** - For: + - **KMS-Encrypted S3 Buckets** - For: - Application logs - Kubeconfig storage (versioned, private) - - ✅ **CloudWatch Log Groups** - Cluster diagnostics and logging + - **CloudWatch Log Groups** - Cluster diagnostics and logging ### Karpenter Auto-Scaling - Qovery uses [Karpenter](https://karpenter.sh/) for intelligent node provisioning, which can **save up to 60% on AWS costs**: + Qovery uses [Karpenter](https://karpenter.sh/) for intelligent node provisioning, which reduces AWS compute costs through spot instances and workload consolidation: **How Karpenter Works**: @@ -542,7 +302,9 @@ Follow these steps to create your first Qovery cluster on AWS: --- -## Wait for Cluster to Be Ready +## Post-Installation Steps + +### Wait for Cluster to Be Ready **Cluster creation takes 20-30 minutes.** Here's what's happening: @@ -559,14 +321,13 @@ Follow these steps to create your first Qovery cluster on AWS: **While you wait:** -- ☕ Grab a coffee -- 📖 Learn about [deploying your first app](/guides/getting-started/deploy-your-first-application) -- 👥 [Invite your team](/configuration/organization/members-rbac) -- 🔗 [Connect Git](/integrations/git-providers/overview) +- Learn about [deploying your first app](/getting-started/guides/getting-started/deploy-your-first-application) +- [Invite your team](/configuration/organization/members-rbac) +- [Connect Git](/configuration/organization/git-repository-access) --- -## Next: Deploy Your First Application +### Deploy Your First Application Once your cluster shows **Ready** status: @@ -632,6 +393,23 @@ Once your cluster shows **Ready** status: +## Best Practices + + + + Aim for 10-20 instance types across multiple families and sizes (t3, m5, m6i, and Graviton where possible) so Karpenter has room to optimize for cost and availability. + + + Karpenter handles spot interruptions gracefully and falls back to on-demand automatically, so spot is safe to enable for most non-stateful workloads. + + + Connect to resources on your existing AWS VPC (databases, internal services) via [VPC peering](/configuration/integrations/aws/vpc-peering) instead of exposing them publicly. + + + If you use Static Credentials instead of STS Assume Role, rotate the access key every 90 days. + + + ## Additional Resources - [AWS EKS Documentation](https://docs.aws.amazon.com/eks/latest/userguide/) diff --git a/docs/getting-started/installation/azure.mdx b/docs/getting-started/installation/azure.mdx index 8a437a3c..cbae2dea 100644 --- a/docs/getting-started/installation/azure.mdx +++ b/docs/getting-started/installation/azure.mdx @@ -3,8 +3,14 @@ title: "Install Qovery on Azure" description: "Complete guide to installing Qovery on Microsoft Azure with AKS" --- +import AzureCredentials from "/snippets/azure-credentials.mdx"; + Install Qovery on your Azure account and deploy a fully managed Kubernetes cluster (AKS) in less than 20 minutes. + + Already have a Kubernetes cluster? See the [BYOK guide](/getting-started/installation/kubernetes) instead. + + ## Overview Qovery simplifies Azure Kubernetes Service (AKS) management by: @@ -56,116 +62,7 @@ Your Azure account needs these permissions: ## Step 1: Create Azure Credentials -Qovery needs credentials to manage resources in your Azure subscription. We use a secure service principal approach that avoids storing long-lived credentials. - -### Get Your Azure IDs - - - - 1. Go to [Azure Portal](https://portal.azure.com) - 2. Navigate to **Azure Active Directory** - 3. Click **Overview** in the left sidebar - 4. Copy your **Tenant ID** (also called Directory ID) - - You can also find it directly at: [portal.azure.com/#view/Microsoft_AAD_IAM/TenantProperties.ReactView](https://portal.azure.com/#view/Microsoft_AAD_IAM/TenantProperties.ReactView) - - - The Tenant ID is a GUID that looks like: `12345678-1234-1234-1234-123456789abc` - - - - - - 1. In Azure Portal, go to **Subscriptions** - 2. Click on the subscription you want to use - 3. Copy the **Subscription ID** from the overview page - - You can also find it at: [portal.azure.com/#view/Microsoft_Azure_Billing/SubscriptionsBlade](https://portal.azure.com/#view/Microsoft_Azure_Billing/SubscriptionsBlade) - - - Make sure the subscription is **active** and has billing enabled. Qovery cannot create resources in disabled subscriptions. - - - - - -### Generate Installation Command - - - - 1. Go to [Qovery Console](https://console.qovery.com) - 2. Go to your organization overview and click on the **Clusters** tab - 3. Click **Create Cluster** - 4. Select **Azure** as the cloud provider - - - - 1. Enter your **Tenant ID** - 2. Enter your **Subscription ID** - 3. Click **Next** - - Qovery will generate a secure installation command for you. - - - - - Copy the generated command to your clipboard. - - - This command creates a service principal using Azure's app registration. - - - - - -### Run Installation Script - - - - 1. In Azure Portal, click the **Cloud Shell** icon (>_) in the top navigation bar - 2. **Important**: Select **Bash** mode (not PowerShell) - - ![Azure Cloud Shell](/images/azure-credentials/azure_shell_1.png) - - - The script must run in **Bash mode**. If you're in PowerShell, click the dropdown and switch to Bash. - - - - - - 1. Paste the command from Qovery into Azure Cloud Shell - 2. Press **Enter** - 3. Review the subscription details displayed - 4. The script will create a service principal and assign necessary permissions. For a detailed breakdown of every permission and why it's needed, see the [Azure IAM Permissions Reference](/getting-started/security-and-compliance/azure-iam-permissions) - - **Example output:** - ```bash - Creating service principal for Qovery... - Service principal created successfully! - Assigning Contributor role... - ✓ Credentials configured successfully - - Subscription ID: 12345678-1234-1234-1234-123456789abc - Tenant ID: 87654321-4321-4321-4321-cba987654321 - ``` - - - - - The credentials are automatically linked to your Qovery organization. - - - If you have multiple subscriptions, you can specify which one to use by passing it as a parameter to the script. - - - - - - - **Source**: Content above is maintained in `/snippets/azure-credentials.mdx`. - Update snippet first, then copy to all usage locations. - + ## Step 2: Configure Your Cluster @@ -236,13 +133,13 @@ Configure the VM sizes for your AKS node pools: - `Standard_D2s_v3` (2 vCPU, 8GB RAM) - `Standard_D4s_v3` (4 vCPU, 16GB RAM) -**General Purpose Production (v5 — recommended):** +**General Purpose Production (v5, recommended):** - `Standard_D2ads_v5` (2 vCPU, 8GB RAM) - `Standard_D4ads_v5` (4 vCPU, 16GB RAM) - `Standard_D8ads_v5` (8 vCPU, 32GB RAM) -**General Purpose Production (v6 — latest generation):** +**General Purpose Production (v6, latest generation):** - `Standard_D2ads_v6` (2 vCPU, 8GB RAM) - `Standard_D4ads_v6` (4 vCPU, 16GB RAM) @@ -269,11 +166,11 @@ Configure the VM sizes for your AKS node pools: Qovery automatically spreads node groups across all available zones for high availability: -- **Zone 1, Zone 2, Zone 3** — each gets a dedicated node group +- **Zone 1, Zone 2, Zone 3**: each gets a dedicated node group - Nodes are evenly distributed across zones with any remainder assigned to Zone 1 - This provides **zone-level redundancy** and automatic failover at no extra cost -No manual zone configuration is required — Qovery handles this automatically during cluster creation. +No manual zone configuration is required: Qovery handles this automatically during cluster creation. @@ -342,9 +239,9 @@ Enable private cluster mode to remove public API endpoints (requires VPN or Expr - **15-20 min**: Installing Qovery components (ingress, monitoring, etc.) **Status indicators:** - - 🟡 **Creating**: Infrastructure provisioning in progress - - 🟢 **Running**: Cluster is ready to use - - 🔴 **Error**: Check logs for troubleshooting + - **Creating**: Infrastructure provisioning in progress + - **Running**: Cluster is ready to use + - **Error**: Check logs for troubleshooting @@ -399,16 +296,16 @@ Once your cluster is running: - Follow the [Deploy Your First App](/guides/getting-started/deploy-your-first-application) guide + Follow the [Deploy Your First App](/getting-started/guides/getting-started/deploy-your-first-application) guide - Set up your own domain instead of the default Qovery domain + [Set up your own domain](/getting-started/guides/advanced-tutorials/cloudflare-custom-domain) instead of the default Qovery domain - Configure [Azure Monitor](/integrations/observability/overview) or - [Datadog](/integrations/observability/datadog) + Configure [Azure Monitor](/configuration/integrations/observability/qovery-observe) or + [Datadog](/configuration/integrations/observability/datadog) diff --git a/docs/getting-started/installation/gcp.mdx b/docs/getting-started/installation/gcp.mdx index 524ea54e..49ea24ca 100644 --- a/docs/getting-started/installation/gcp.mdx +++ b/docs/getting-started/installation/gcp.mdx @@ -7,6 +7,10 @@ import GcpCredentials from "/snippets/gcp-credentials.mdx"; Install Qovery on your GCP account and deploy a fully managed Kubernetes cluster (GKE Autopilot) in less than 20 minutes. + + Already have a Kubernetes cluster? See the [BYOK guide](/getting-started/installation/kubernetes) instead. + + ## Overview Qovery simplifies Google Kubernetes Engine (GKE) management by: @@ -57,6 +61,8 @@ If you don't have enough quota, request an increase through the GCP Console. Quo +For a detailed breakdown of every permission and why it's needed, see the [GCP IAM Permissions Reference](/getting-started/security-and-compliance/gcp-iam-permissions). + ## Step 2: Configure Your Cluster Now configure your GKE Autopilot cluster settings in the Qovery console. @@ -198,9 +204,9 @@ Qovery automatically configures GCP networking: - **15-20 min**: Installing Qovery components (ingress, monitoring, etc.) **Status indicators:** - - 🟡 **Creating**: Infrastructure provisioning in progress - - 🟢 **Running**: Cluster is ready to use - - 🔴 **Error**: Check logs for troubleshooting + - **Creating**: Infrastructure provisioning in progress + - **Running**: Cluster is ready to use + - **Error**: Check logs for troubleshooting @@ -251,15 +257,15 @@ Once your cluster is running: - Follow the [Deploy Your First App](/guides/getting-started/deploy-your-first-application) guide + Follow the [Deploy Your First App](/getting-started/guides/getting-started/deploy-your-first-application) guide - Set up your own domain instead of the default Qovery domain + [Set up your own domain](/getting-started/guides/advanced-tutorials/cloudflare-custom-domain) instead of the default Qovery domain - Configure [Cloud Monitoring](/integrations/observability/overview) or [Datadog](/integrations/observability/datadog) + Configure [Cloud Monitoring](/configuration/integrations/observability/qovery-observe) or [Datadog](/configuration/integrations/observability/datadog) @@ -360,7 +366,7 @@ You can also enable **Private nodes** during cluster creation to remove public I ### Spot Pods (Preemptible VMs) -Save up to 91% on compute costs: +Google discounts Spot VMs up to 91% versus on-demand pricing: 1. Add node selector to your deployments: ```yaml @@ -378,7 +384,7 @@ Spot Pods can be terminated with 30 seconds notice. Not recommended for producti - Enable Spot Pods for dev/staging and fault-tolerant workloads to save up to 91% + Enable Spot Pods for dev/staging and fault-tolerant workloads to cut compute costs diff --git a/docs/getting-started/installation/kubernetes.mdx b/docs/getting-started/installation/kubernetes.mdx index ebfd60a0..f2db0d59 100644 --- a/docs/getting-started/installation/kubernetes.mdx +++ b/docs/getting-started/installation/kubernetes.mdx @@ -4,8 +4,13 @@ description: "Install Qovery on your own Kubernetes cluster" --- import InstallQoveryCLI from '/snippets/install-qovery-cli.mdx'; +import QoveryCliAuth from '/snippets/qovery-cli-auth.mdx'; -Qovery Self-Managed (also known as BYOK: Bring Your Own Kubernetes) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster. +Qovery Self-Managed (BYOK) is a self-hosted version of Qovery. It allows you to install Qovery on your own Kubernetes cluster. + + +Want Qovery to provision and manage the cluster for you instead? See [Create Your Cluster](/getting-started/quickstart/cloud) for the managed path (AWS, GCP, Azure, Scaleway). + **For Kubernetes Experts Only**: Qovery BYOK is for Kubernetes experts who @@ -38,19 +43,7 @@ Install the Qovery CLI on your local machine: ### Step 2: Authenticate -Authenticate with your Qovery account: - -```bash -qovery auth -``` - -This will open a browser window for authentication. - - - For headless environments (CI/CD, remote servers) without a graphical - interface, use `qovery auth --headless` and follow the instructions to - authenticate manually. - + ### Step 3: Deploy to Kubernetes diff --git a/docs/getting-started/installation/scaleway.mdx b/docs/getting-started/installation/scaleway.mdx index cd5b4276..c3d9203f 100644 --- a/docs/getting-started/installation/scaleway.mdx +++ b/docs/getting-started/installation/scaleway.mdx @@ -3,8 +3,14 @@ title: "Install Qovery on Scaleway" description: "Complete guide to installing Qovery on Scaleway with Kapsule Kubernetes" --- +import ScalewayCredentials from "/snippets/scaleway-credentials.mdx"; + Install Qovery on your Scaleway account and deploy a fully managed Kubernetes cluster (Kapsule) in less than 20 minutes. + + Already have a Kubernetes cluster? See the [BYOK guide](/getting-started/installation/kubernetes) instead. + + ## Overview Qovery simplifies Scaleway Kapsule management by: @@ -38,151 +44,9 @@ Before you begin, ensure you have: **Qovery Account**: Free account at [console.qovery.com](https://console.qovery.com/signup) **IAM Access**: Ability to create applications and API keys -### Why Choose Scaleway? - - - - - All data centers located in Europe (Paris, Amsterdam, Warsaw) - - GDPR compliant by design - - No data transfer outside EU - - Sovereignty for sensitive workloads - - - - - Free Kubernetes control plane (mutualized option) - - Transparent, predictable pricing - - No egress fees within regions - - - - - Easy-to-use console and APIs - - Fast provisioning times - - Good performance-to-price ratio - - European-based support team - - - ## Step 1: Create Scaleway Credentials -Qovery needs API credentials to manage resources in your Scaleway account. We use a secure API key approach with granular permissions. - -### Generate API Key - - - - 1. Log into [Scaleway Console](https://console.scaleway.com) - 2. Click your profile/organization name in the top-right - 3. Select **Identity and Access Management (IAM)** - - ![Scaleway IAM](/images/scaleway-credentials/iam-menu.png) - - - - 1. Navigate to **Applications** tab - 2. Click **+ Create application** - 3. Name it: `qovery-manager` or similar - 4. Description: "Qovery cluster management" - 5. Click **Create application** - - - Applications help organize API keys by purpose. You can reuse this application for multiple clusters. - - - - - 1. Click on your newly created application - 2. Go to **API keys** tab - 3. Click **+ Generate API key** - 4. Description: "Qovery cluster access" - 5. Select **Object Storage preferred Project** (your main project) - 6. Click **Generate API key** - - - **Save these credentials immediately!** The secret key is only shown once and cannot be retrieved later. - - - You'll see: - - **Access key ID**: `SCWxxxxxxxxxxxxxxxxx` - - **Secret access key**: `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` - - Copy both to a secure location. - - - - 1. Go to **Policies** tab in IAM - 2. Click **+ Create policy** - 3. Name it: `qovery-permissions` - 4. Click **Add rule** for each of these permission sets: - - **Required Permissions:** - - ✅ **Containers** - Full access (for Kapsule management) - - ✅ **Network Services** - Full access (for VPC, Load Balancers) - - ✅ **Compute** - Full access (for instances) - - ✅ **Storage** - Full access (for persistent volumes) - - ✅ **VPC** - Full access (for networking) - - 5. Under **Principal**, attach this policy to your application - 6. Click **Create policy** - - - These permissions allow Qovery to fully manage your Kubernetes infrastructure, including creating instances, configuring networking, and managing storage. For a detailed breakdown of every permission and why it's needed, see the [Scaleway IAM Permissions Reference](/getting-started/security-and-compliance/scaleway-iam-permissions). - - - - - You'll need these identifiers: - - **Organization ID:** - 1. Go to **Organization Settings** - 2. Copy the **Organization ID** (format: `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`) - - **Project ID:** - 1. Go to your **Project Dashboard** - 2. Click **Project settings** - 3. Copy the **Project ID** (format: `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`) - - - Keep these IDs handy - you'll need them when configuring Qovery. - - - - -### Add Credentials to Qovery - - - - 1. Go to [Qovery Console](https://console.qovery.com) - 2. Go to your organization overview and click on the **Clusters** tab - 3. Click **Create Cluster** - 4. Select **Scaleway** as the cloud provider - - - - Provide the information you gathered: - - **Access Key ID**: Your Scaleway access key - - **Secret Access Key**: Your Scaleway secret key - - **Organization ID**: Your Scaleway organization ID - - **Project ID**: Your Scaleway project ID - - - Enter Scaleway credentials in Qovery Console - - - Click **Next** to validate the credentials. - - - - Qovery will test the credentials and verify it can access your Scaleway account. - - - If validation fails, double-check your API key has all required permissions attached via the policy. - - - - - -**Source**: Content above is maintained in `/snippets/scaleway-credentials.mdx`. Update snippet first, then copy to all usage locations. - + ## Step 2: Configure Your Cluster @@ -353,9 +217,9 @@ Node Pool Settings: - **15-20 min**: Installing Qovery components (ingress, monitoring, etc.) **Status indicators:** - - 🟡 **Creating**: Infrastructure provisioning in progress - - 🟢 **Running**: Cluster is ready to use - - 🔴 **Error**: Check logs for troubleshooting + - **Creating**: Infrastructure provisioning in progress + - **Running**: Cluster is ready to use + - **Error**: Check logs for troubleshooting @@ -406,15 +270,15 @@ Once your cluster is running: - Follow the [Deploy Your First App](/guides/getting-started/deploy-your-first-application) guide + Follow the [Deploy Your First App](/getting-started/guides/getting-started/deploy-your-first-application) guide - Set up your own domain instead of the default Qovery domain + [Set up your own domain](/getting-started/guides/advanced-tutorials/cloudflare-custom-domain) instead of the default Qovery domain - Configure [monitoring and observability](/integrations/observability/overview) + Configure [monitoring and observability](/configuration/integrations/observability/qovery-observe) diff --git a/docs/getting-started/introduction.mdx b/docs/getting-started/introduction.mdx index c6d7898e..b594a4fb 100644 --- a/docs/getting-started/introduction.mdx +++ b/docs/getting-started/introduction.mdx @@ -1,43 +1,48 @@ --- title: "Introduction" -description: "The Kubernetes control plane for humans and AI agents — on your own infrastructure, cloud or on-premise." +description: "The Kubernetes control plane for humans and AI agents, on your own infrastructure, cloud or on-premise." mode: "wide" --- ## Welcome to Qovery -Qovery is the **Kubernetes control plane for humans and AI agents** — running on your own infrastructure, whether on a public cloud (AWS, GCP, Azure, Scaleway…) or on-premise. +Qovery is **self-service infrastructure for any cloud and any agent**: the Kubernetes control plane for humans and AI agents, running on your own infrastructure, whether on a public cloud (AWS, GCP, Azure, Scaleway…) or on-premise. -Describe what you want to deploy and an AI agent handles the rest — or use the console, CLI, Terraform, API, or MCP directly. Either way, operational best practices and guardrails are built in, so every action stays within boundaries regardless of who or what is making the request. +Deploy on Kubernetes, AWS, GCP, Scaleway, or Azure without picking a lane. Describe what you want to deploy and an AI agent handles the rest, or use the console, CLI, Terraform, API, or MCP directly. Either way, operational best practices and guardrails are built in, so every deploy stays within boundaries, whether it's triggered by your team or an AI agent. ## What Qovery Covers - - Managed Kubernetes on AWS, GCP, Azure, Scaleway. Ready in 30 min. BYOK supported. - Any language, any framework. GitOps, preview environments, zero-downtime rollouts. + + New + + Deploy AI agents directly on your own infrastructure. + + + Managed Kubernetes on AWS, GCP, Azure, Scaleway. Ready in 30 min. BYOK supported. + Real-time logs, metrics, Kubernetes events. No setup required. - - Spot instances, sleep mode, right-sizing. Up to 60% cost savings. - SOC2, GDPR, HIPAA, DORA. RBAC, SSO, secrets management, audit logs. - - Automated version upgrades and node patching. No manual intervention. + + Spot instances, sleep mode, right-sizing. Up to 60% cost savings. -BYOK = Bring Your Own Kubernetes — connect your existing cluster to Qovery +BYOK = Bring Your Own Kubernetes: connect your existing cluster to Qovery ## Get Started + + Leave Heroku, Render, or Railway. No re-architecture required. + From code to deployed in ~10 minutes @@ -54,8 +59,8 @@ Describe what you want to deploy and an AI agent handles the rest — or use the
-

Ready to deploy on your own cloud?

-

Kubernetes on AWS, GCP, Azure, or Scaleway. Managed by Qovery. No expertise required. Free to start.

+

Ready to build the future of your infrastructure?

+

Kubernetes on AWS, GCP, Azure, or Scaleway. Managed by Qovery. No expertise required. 14-day free trial, no credit card required.

- Create free account → + Start for free →
diff --git a/docs/getting-started/quickstart.mdx b/docs/getting-started/quickstart.mdx index 56ddf605..c49abb32 100644 --- a/docs/getting-started/quickstart.mdx +++ b/docs/getting-started/quickstart.mdx @@ -3,7 +3,7 @@ title: "Get Started with Qovery" mode: "wide" --- -Qovery runs on your own cloud — AWS, GCP, Azure, or Scaleway. Tell your AI agent to deploy, or use the console, CLI, and Terraform. Everything drives the same Kubernetes control plane. +Qovery runs on your own cloud: AWS, GCP, Azure, or Scaleway. Tell your AI agent to deploy, or use the console, CLI, and Terraform. Everything drives the same Kubernetes control plane. Choose your deployment path. @@ -12,15 +12,15 @@ Choose your deployment path.
- - Tell your agent to deploy. It handles Dockerfile, database, env vars, and Kubernetes — automatically. + + Leave Heroku, Render, or Railway. An AI agent migrates your apps to Kubernetes on your own cloud. - **~10 min** · Claude Code, Cursor, OpenCode, 30+ tools + **~1 day** · No re-architecture required - - Each developer or AI agent gets their own isolated environment. Clone, use, destroy. + + Tell your agent to deploy. It handles Dockerfile, database, env vars, and Kubernetes automatically. - **~10 min** · Pay only while active + **~10 min** · Claude Code, Cursor, OpenCode, 30+ tools @@ -39,7 +39,7 @@ Choose your deployment path. **~45 min** · AWS, GCP, Azure, Scaleway - + Free local k3s cluster on your laptop. Full Qovery features, no cloud account needed. **~15 min** · Free @@ -73,5 +73,5 @@ Choose your deployment path.

Your own Kubernetes cluster, ready in 30 minutes

No cloud expertise needed. Qovery handles provisioning, upgrades, and guardrails. Free to start, no credit card required.

- Start free → + Start for free → diff --git a/docs/getting-started/quickstart/cloud.mdx b/docs/getting-started/quickstart/cloud.mdx index 004349b2..362af32a 100644 --- a/docs/getting-started/quickstart/cloud.mdx +++ b/docs/getting-started/quickstart/cloud.mdx @@ -9,7 +9,7 @@ description: "Set up a managed Kubernetes cluster as the foundation for your Qov ## Why Create a Cluster First? -Your Kubernetes cluster is the foundation where all your applications, databases, and services will run. Qovery handles all the complexity: +Your Kubernetes cluster is the foundation where all your applications, databases, and services will run. Qovery provisions and manages: @@ -26,93 +26,33 @@ Your Kubernetes cluster is the foundation where all your applications, databases - -**After creating your cluster**, return to your use case guide: -- [Production Applications](/getting-started/guides/use-cases/production-environment-management) -- [Ephemeral Environments](/getting-started/guides/use-cases/ephemeral-environment) - - --- ## Choose Your Cloud Provider -Select where you want Qovery to create your managed Kubernetes cluster: +Select where you want Qovery to create your managed Kubernetes cluster. Each guide details exactly what gets created (networking, IAM, node pools) for that provider: - + Elastic Kubernetes Service (EKS) - + Google Kubernetes Engine (GKE Autopilot) - + Azure Kubernetes Service (AKS) - + Kapsule Kubernetes ---- - -## What You'll Get - - - - Your cluster will be created using your cloud provider's managed Kubernetes service: - - **AWS**: Elastic Kubernetes Service (EKS) - - **GCP**: Google Kubernetes Engine (GKE) - - **Azure**: Azure Kubernetes Service (AKS) - - **Scaleway**: Kapsule Kubernetes - - Qovery automatically configures: - - Latest stable Kubernetes version - - Multi-node setup for high availability - - Automatic updates and patches - - Optimized configurations for production - - - - Complete networking infrastructure: - - **VPC/VNet**: Isolated network for your resources - - **Load Balancers**: Automatic traffic distribution - - **NAT Gateways**: Secure outbound connectivity - - **Security Groups**: Firewall rules and access control - - **SSL/TLS Certificates**: Automatic HTTPS encryption - - **Custom Domains**: Support for your own domains - - - - Built-in scalability and reliability: - - **Node Auto-Scaling**: Automatically add/remove cluster nodes based on demand - - **Multi-Availability Zones**: Resources distributed across multiple data centers - - **Pod Auto-Scaling**: Scale applications based on CPU/memory usage - - **Health Checks**: Automatic failure detection and recovery - - **Zero-Downtime Updates**: Deploy without service interruption - - - - Enterprise-grade security: - - **Private Container Registry**: Secure image storage - - **Secrets Management**: Encrypted environment variables - - **Network Isolation**: Private subnets and security groups - - **Role-Based Access Control (RBAC)**: Team permissions management - - **Audit Logs**: Track all infrastructure changes - - **Encryption**: Data encrypted at rest and in transit - - - - Complete observability: - - **Real-Time Logs**: Application and infrastructure logs - - **Metrics & Dashboards**: CPU, memory, network usage - - **Deployment History**: Track all changes and rollbacks - - **Build Logs**: Complete CI/CD pipeline visibility - - **Alerting**: Optional integration with Datadog, Grafana - - + +Already have a Kubernetes cluster? [Connect it instead (BYOK)](/getting-started/installation/kubernetes) rather than provisioning a new one. + --- diff --git a/docs/getting-started/quickstart/docker-desktop.mdx b/docs/getting-started/quickstart/docker.mdx similarity index 90% rename from docs/getting-started/quickstart/docker-desktop.mdx rename to docs/getting-started/quickstart/docker.mdx index fcc31cfa..e0b4ade5 100644 --- a/docs/getting-started/quickstart/docker-desktop.mdx +++ b/docs/getting-started/quickstart/docker.mdx @@ -1,9 +1,10 @@ --- -title: "Local Demo" +title: "Test & Learn Locally" description: "Install Qovery locally for demonstration and testing purposes" --- import InstallQoveryCLI from '/snippets/install-qovery-cli.mdx'; +import QoveryCliAuth from '/snippets/qovery-cli-auth.mdx'; **Demo Environment Only**: This local installation is designed for demonstration and testing purposes only. It is **not intended for production use**. @@ -36,17 +37,7 @@ Before starting, ensure you have:
- Sign in to your Qovery account (or create one if you haven't already): - - ```bash - qovery auth - ``` - - This will open your browser to complete the authentication process. - - - **Running in a terminal without browser access?** Use `qovery auth --headless` instead. - + @@ -116,7 +107,7 @@ This command removes the local k3s cluster and all Qovery components from your m Explore Qovery CLI commands for local development - + Ready to deploy on AWS, GCP, Azure, or Scaleway? diff --git a/docs/images/configuration/agent-tasks/agent-task-creation-flow.png b/docs/images/configuration/agent-tasks/agent-task-creation-flow.png new file mode 100644 index 00000000..9f9b3084 Binary files /dev/null and b/docs/images/configuration/agent-tasks/agent-task-creation-flow.png differ diff --git a/docs/images/configuration/agent-tasks/agent-task-services-list.png b/docs/images/configuration/agent-tasks/agent-task-services-list.png new file mode 100644 index 00000000..5139b47e Binary files /dev/null and b/docs/images/configuration/agent-tasks/agent-task-services-list.png differ diff --git a/docs/images/configuration/agent-tasks/honeybadger-workflow.png b/docs/images/configuration/agent-tasks/honeybadger-workflow.png new file mode 100644 index 00000000..200ff162 Binary files /dev/null and b/docs/images/configuration/agent-tasks/honeybadger-workflow.png differ diff --git a/docs/images/configuration/agent-tasks/incidentio-workflow.png b/docs/images/configuration/agent-tasks/incidentio-workflow.png new file mode 100644 index 00000000..ad16aeee Binary files /dev/null and b/docs/images/configuration/agent-tasks/incidentio-workflow.png differ diff --git a/docs/images/configuration/agent-tasks/jira-automation.png b/docs/images/configuration/agent-tasks/jira-automation.png new file mode 100644 index 00000000..40be35fc Binary files /dev/null and b/docs/images/configuration/agent-tasks/jira-automation.png differ diff --git a/docs/images/configuration/agent-tasks/trigger-agent-task.png b/docs/images/configuration/agent-tasks/trigger-agent-task.png new file mode 100644 index 00000000..f41469b4 Binary files /dev/null and b/docs/images/configuration/agent-tasks/trigger-agent-task.png differ diff --git a/docs/images/logos/honeybadger-icon.svg b/docs/images/logos/honeybadger-icon.svg new file mode 100644 index 00000000..09624561 --- /dev/null +++ b/docs/images/logos/honeybadger-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/images/logos/incident-io-icon.svg b/docs/images/logos/incident-io-icon.svg new file mode 100644 index 00000000..59854b44 --- /dev/null +++ b/docs/images/logos/incident-io-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/images/logos/jira-icon.svg b/docs/images/logos/jira-icon.svg new file mode 100644 index 00000000..d84dd06a --- /dev/null +++ b/docs/images/logos/jira-icon.svg @@ -0,0 +1 @@ +Jira \ No newline at end of file diff --git a/docs/images/logos/linear-icon.svg b/docs/images/logos/linear-icon.svg new file mode 100644 index 00000000..bb830fd5 --- /dev/null +++ b/docs/images/logos/linear-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/snippets/README.md b/docs/snippets/README.md index f2f8cf02..c4a2cb18 100644 --- a/docs/snippets/README.md +++ b/docs/snippets/README.md @@ -36,7 +36,7 @@ When updating CLI installation instructions: Contains the AWS STS Assume Role credentials setup instructions with CloudFormation stack creation and IAM role configuration. **Used in:** -- `/installation/aws.mdx` - Step 3: Connect AWS Account → STS Assume Role tab +- `/getting-started/installation/aws.mdx` - Step "Connect AWS Account" → STS Assume Role tab (imported via ``) - `/configuration/organization/cloud-credentials.mdx` - AWS section → STS Assume Role tab **Update Instructions:** @@ -58,7 +58,7 @@ When updating AWS STS credentials instructions: Contains the AWS Static Credentials (Access Keys) setup instructions with IAM user creation and access key generation. **Used in:** -- `/installation/aws.mdx` - Step 3: Connect AWS Account → Static Credentials tab +- `/getting-started/installation/aws.mdx` - Step "Connect AWS Account" → Static Credentials tab (imported via ``) - `/configuration/organization/cloud-credentials.mdx` - AWS section → Static Credentials tab **Update Instructions:** @@ -118,7 +118,7 @@ When updating GCP credentials instructions: Contains the Scaleway credentials setup instructions using IAM applications, API keys, and granular permission policies. **Used in:** -- `/installation/scaleway.mdx` - Step 1: Create Scaleway Credentials +- `/getting-started/installation/scaleway.mdx` - Step 1: Create Scaleway Credentials (imported via ``) - `/configuration/organization/cloud-credentials.mdx` - Scaleway section **Update Instructions:** @@ -148,7 +148,7 @@ When updating Scaleway credentials instructions: Contains the Azure credentials setup instructions using service principals, Tenant ID, Subscription ID, and automated script execution via Azure Cloud Shell. **Used in:** -- `/installation/azure.mdx` - Step 1: Create Azure Credentials +- `/getting-started/installation/azure.mdx` - Step 1: Create Azure Credentials (imported via ``) - `/configuration/organization/cloud-credentials.mdx` - Azure section **Update Instructions:** @@ -173,7 +173,7 @@ When updating Azure credentials instructions: ## Note on Reusability -Currently, Mintlify doesn't support dynamic includes/imports for MDX snippets. Therefore: -- Content must be manually copied to each location -- This directory serves as the **single source of truth** -- Always update the snippet file first, then propagate changes to usage locations +Mintlify supports importing snippets as MDX components (`import Foo from "/snippets/foo.mdx"; `), and every credentials snippet listed above is now consumed this way. Therefore: +- Update the snippet file, and every page that imports it picks up the change automatically. No manual copying. +- This directory is the **single source of truth**: never hand-duplicate its content into a page. +- The `configuration/organization/cloud-credentials.mdx` usages listed above are inline (not yet converted to imports) — converting them is a good follow-up to fully retire manual copying for this content. diff --git a/docs/snippets/agent-tasks-early-preview-warning.mdx b/docs/snippets/agent-tasks-early-preview-warning.mdx new file mode 100644 index 00000000..b3599fda --- /dev/null +++ b/docs/snippets/agent-tasks-early-preview-warning.mdx @@ -0,0 +1,3 @@ + +**Early Preview.** Agent Tasks is available in early preview to a limited set of organizations. Capabilities and setup will change before general availability. + diff --git a/docs/snippets/aws-credentials-static.mdx b/docs/snippets/aws-credentials-static.mdx index aac3d239..5c04def5 100644 --- a/docs/snippets/aws-credentials-static.mdx +++ b/docs/snippets/aws-credentials-static.mdx @@ -1,4 +1,4 @@ -**Alternative method** - Uses AWS Access Keys (requires manual rotation every 90 days). +**Alternative method** - Uses AWS Access Keys (we recommend rotating them every 90 days). **Security Note**: Static credentials are long-lived and more exposed to leaks. For production, we strongly recommend STS Assume Role which provides short-lived, automatically refreshed credentials with granular access control. @@ -69,7 +69,7 @@ "ec2:*", "elasticache:*", "cloudtrail:LookupEvents", - "dynamodb:*", + "servicequotas:GetServiceQuota", "tag:GetResources", "rds:*", "ecs:*", @@ -153,4 +153,4 @@ Save credentials -**Well done!** You now have your AWS `access key id` and `secret access key` and your permissions are set up. +You now have your AWS `access key id` and `secret access key`, and your permissions are set up. diff --git a/docs/snippets/aws-credentials-sts.mdx b/docs/snippets/aws-credentials-sts.mdx index 7416b1d8..c3b36a9e 100644 --- a/docs/snippets/aws-credentials-sts.mdx +++ b/docs/snippets/aws-credentials-sts.mdx @@ -30,7 +30,7 @@ "ec2:*", "elasticache:*", "cloudtrail:LookupEvents", - "dynamodb:*", + "servicequotas:GetServiceQuota", "tag:GetResources", "rds:*", "ecs:*", @@ -84,7 +84,7 @@ - Stack name: Keep default `qovery-iam-role` or customize - Click **Next** (skip stack options) - Click **Next** again (skip tags) - - ✅ **Important**: Check **"I acknowledge that AWS CloudFormation might create IAM resources"** + - **Important**: Check **"I acknowledge that AWS CloudFormation might create IAM resources"** - Click **Create stack** 3. **Wait for completion** (~1 minute): diff --git a/docs/snippets/coding-agent-footer-links.mdx b/docs/snippets/coding-agent-footer-links.mdx new file mode 100644 index 00000000..db05fc48 --- /dev/null +++ b/docs/snippets/coding-agent-footer-links.mdx @@ -0,0 +1 @@ +See [Configuration](/configuration/agent-tasks/overview#configuration) for resources, governance, and environment variables shared by every agent task, and [Execution Mode](/configuration/agent-tasks/overview#execution-mode) for choosing how it runs. diff --git a/docs/snippets/coding-agent-output-step.mdx b/docs/snippets/coding-agent-output-step.mdx new file mode 100644 index 00000000..dc2d7613 --- /dev/null +++ b/docs/snippets/coding-agent-output-step.mdx @@ -0,0 +1,3 @@ + + To have the agent post to Slack when it's done, add a webhook output pointing to a [Slack Incoming Webhook](https://api.slack.com/messaging/webhooks) URL. See [Outputs](/configuration/agent-tasks/overview#outputs) for the setup steps. + diff --git a/docs/snippets/coding-agent-setup-steps.mdx b/docs/snippets/coding-agent-setup-steps.mdx new file mode 100644 index 00000000..1e1bd6ab --- /dev/null +++ b/docs/snippets/coding-agent-setup-steps.mdx @@ -0,0 +1,12 @@ + + Add the Git repository, or repositories, this agent should code against as its Context. You can also add a Qovery service as Context, alongside its repository. + + + Enter your Anthropic API key, the only provider supported today. + + + Not required for this use case by default, add any if your workflow needs them. See [Creating an Agent](/configuration/agent-tasks/overview#creating-an-agent). + + + Select **From a webhook**, and copy the generated webhook URL from the agent task's overview page, you'll need it next. + diff --git a/docs/snippets/qovery-cli-auth.mdx b/docs/snippets/qovery-cli-auth.mdx new file mode 100644 index 00000000..5a8b4bb5 --- /dev/null +++ b/docs/snippets/qovery-cli-auth.mdx @@ -0,0 +1,11 @@ +Sign in to your Qovery account (or create one if you haven't already): + +```bash +qovery auth +``` + +This will open your browser to complete the authentication process. + + +**Running in a terminal without browser access?** Use `qovery auth --headless` instead. + diff --git a/docs/snippets/scaleway-credentials.mdx b/docs/snippets/scaleway-credentials.mdx index 6732c273..7992eaaf 100644 --- a/docs/snippets/scaleway-credentials.mdx +++ b/docs/snippets/scaleway-credentials.mdx @@ -51,14 +51,14 @@ Qovery needs API credentials to manage resources in your Scaleway account. We us 4. Click **Add rule** for each of these permission sets: **Required Permissions:** - - ✅ **Containers** - Full access (for Kapsule management) - - ✅ **Network Services** - Full access (for VPC, Load Balancers) - - ✅ **Compute** - Full access (for instances) - - ✅ **Storage** - Full access (for persistent volumes) - - ✅ **VPC** - Full access (for networking) + - **Containers** - Full access (for Kapsule management) + - **Network Services** - Full access (for VPC, Load Balancers) + - **Compute** - Full access (for instances) + - **Storage** - Full access (for persistent volumes) + - **VPC** - Full access (for networking) **Optional Permissions:** - - ☑️ **VPC Gateway** - Full access (required if you want to use the [Static IP for egress traffic](/configuration/integrations/kubernetes/scaleway/managed#static-ip-for-egress-traffic) feature) + - **VPC Gateway** - Full access (required if you want to use the [Static IP for egress traffic](/configuration/integrations/kubernetes/scaleway/managed#static-ip-for-egress-traffic) feature) 5. Under **Principal**, attach this policy to your application 6. Click **Create policy**