> ## Documentation Index
> Fetch the complete documentation index at: https://www.qovery.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Deploy Your First Application

> Quick guide to deploying your first application on Qovery

Deploy a containerized application on Qovery in minutes. Choose your deployment source based on your needs: build from Git, deploy pre-built containers, or use Helm charts.

## Prerequisites

Before deploying your first application, ensure you have:

<Check>Qovery account - [Sign up here](https://console.qovery.com/signup)</Check>
<Check>Kubernetes cluster - [Install a cluster](/installation/aws) or [connect your own](/configuration/integrations/kubernetes/byok)</Check>

**Depending on your deployment source:**

* **Git Repository**: GitHub, GitLab, or Bitbucket repository with a Dockerfile
* **Container Registry**: Pre-built Docker image in a registry (Docker Hub, ECR, GCR, etc.)
* **Helm Chart**: Packaged Helm application ([See Helm documentation](/configuration/helm))

<Info>
  This guide covers Git Repository and Container Registry deployments. For Helm charts, see the [Helm Configuration Guide](/configuration/helm).
</Info>

## Step 1: Create a Project

[Projects](/configuration/project) organize your applications and environments.

1. Go to [Qovery Console](https://console.qovery.com) and open your organization overview
2. Click the **New Project** button
3. Enter a project name (e.g., "My First Project")
4. Click **Create**

<Frame>
  <img src="https://mintcdn.com/qovery/ziWdn5St6rf4bcBc/images/configuration/project/project_creation.png?fit=max&auto=format&n=ziWdn5St6rf4bcBc&q=85&s=5fd6ebe4ab2efe49657fbc51855a185c" alt="Create a new project in Qovery" width="2784" height="1830" data-path="images/configuration/project/project_creation.png" />
</Frame>

## Step 2: Create an Environment

[Environments](/configuration/environment) represent deployment stages (production, staging, development).

1. Open your project
2. Click **Create Environment**
3. Enter an environment name (e.g., "production")
4. Select the environment type (PRODUCTION, STAGING, or DEVELOPMENT)
5. Select the cluster where you want to deploy
6. Click **Create**

<Frame>
  <img src="https://mintcdn.com/qovery/ziWdn5St6rf4bcBc/images/configuration/environment/create_environment_1.png?fit=max&auto=format&n=ziWdn5St6rf4bcBc&q=85&s=55761ac584e123af6ea83fd5266c0c8a" alt="Create a new environment" width="3164" height="2070" data-path="images/configuration/environment/create_environment_1.png" />
</Frame>

## Step 3: Choose Your Deployment Source

Qovery supports multiple deployment sources. Choose the one that fits your workflow:

<Tabs>
  <Tab title="Git Repository (Build with Qovery)">
    **Best for:** Building your application from source code

    **Requirements:**

    * Git repository (GitHub, GitLab, or Bitbucket)
    * Dockerfile in your repository

    <Info>
      Qovery will clone your repo, build the Docker image, and deploy it automatically.
    </Info>

    ### Create Your Application

    <Steps>
      <Step title="Start Application Creation">
        In your environment, click **New Service** → **Create application**

        <Frame>
          <img src="https://mintcdn.com/qovery/ziWdn5St6rf4bcBc/images/configuration/environment/create_service.png?fit=max&auto=format&n=ziWdn5St6rf4bcBc&q=85&s=6116a5860bdccdcfc24cd85e34002ea3" alt="Click New Service to create an application" width="3164" height="2070" data-path="images/configuration/environment/create_service.png" />
        </Frame>
      </Step>

      <Step title="Configure Basic Settings">
        * **Application Name**: Enter a name (e.g., "my-api")
        * **Application Source**: Select **Git Repository**
      </Step>

      <Step title="Connect Git Repository">
        * **Git Provider**: Select your provider (GitHub, GitLab, Bitbucket)
        * **Repository**: Choose your repository
        * **Branch**: Select the branch to deploy (e.g., `main`, `develop`)
        * **Root Application Path**: Leave blank if Dockerfile is at root, or specify subfolder

        <Info>
          **First time?** You'll need to authorize Qovery to access your Git provider. See [Git Repository Access](/configuration/organization/git-repository-access).
        </Info>

        <Tip>
          **Dockerfile Required**: Qovery needs a Dockerfile to build your application. Place it at the root or specify the path.
        </Tip>
      </Step>

      <Step title="Allocate Resources">
        Set compute resources:

        * **vCPU**: Default 500m (0.5 core)
        * **RAM**: Default 512 MB
        * **Instances**: Min and max for auto-scaling (default: 1-1)

        <Tip>
          Start with defaults and scale based on actual usage.
        </Tip>
      </Step>

      <Step title="Define Ports">
        If your app serves HTTP/gRPC traffic:

        * **Port**: The port your app listens on (e.g., 8080, 3000)
        * **Protocol**: HTTPS, gRPC, TCP, or UDP
        * **Publicly Accessible**: Enable to expose via internet
        * **External Port**: 443 for HTTPS

        <Warning>
          Your app must listen on `0.0.0.0:$PORT`, not `localhost:$PORT`.
        </Warning>
      </Step>

      <Step title="Configure Health Checks (Optional)">
        Improve reliability with health checks:

        * **Liveness Probe**: Checks if container is alive (restarts container if failing)
        * **Readiness Probe**: Checks if container is ready for traffic (prevents routing traffic until passing)

        These probes ensure Kubernetes only routes traffic to healthy containers and automatically restarts failed ones.

        Recommended: Add `/health` or `/healthz` endpoint to your app.
      </Step>

      <Step title="Set Environment Variables (Optional)">
        Add configuration as needed:

        * API keys (mark as secret)
        * Configuration values
        * Feature flags

        <Info>
          You can add these later in application settings.
        </Info>
      </Step>

      <Step title="Review and Deploy">
        * Click **Create and Deploy** to build and deploy immediately
        * Or **Create** to configure more before deploying
      </Step>
    </Steps>
  </Tab>

  <Tab title="Container Registry (Pre-built Image)">
    **Best for:** Deploying pre-built Docker images

    **Requirements:**

    * Docker image already built and pushed to a registry
    * Registry connected to Qovery (Docker Hub, ECR, GCR, ACR, etc.)

    <Info>
      Use this when you build images in your own CI/CD pipeline or want to deploy third-party images.
    </Info>

    ### Deploy Pre-built Image

    <Steps>
      <Step title="Start Application Creation">
        In your environment, click **New Service** → **Create application**

        <Frame>
          <img src="https://mintcdn.com/qovery/ziWdn5St6rf4bcBc/images/configuration/environment/create_service.png?fit=max&auto=format&n=ziWdn5St6rf4bcBc&q=85&s=6116a5860bdccdcfc24cd85e34002ea3" alt="Click New Service to create an application" width="3164" height="2070" data-path="images/configuration/environment/create_service.png" />
        </Frame>
      </Step>

      <Step title="Configure Basic Settings">
        * **Application Name**: Enter a name (e.g., "my-api")
        * **Application Source**: Select **Container Registry**
      </Step>

      <Step title="Select Container Image">
        * **Registry**: Choose your connected registry
        * **Image Name**: Enter the full image name (e.g., `myapp/api`)
        * **Image Tag**: Enter a specific tag (e.g., `v1.0.0`, `sha-abc123`)

        <Warning>
          **Avoid generic tags like `latest`, `dev`, or `master`**. Use specific version tags or commit SHAs for reliable deployments.
        </Warning>

        <Info>
          **First time?** Connect your registry first: [Container Registry Setup](/configuration/organization/container-registry)
        </Info>
      </Step>

      <Step title="Configure Entrypoint (Optional)">
        Override the image's default entrypoint if needed:

        * Custom command
        * Custom arguments

        <Tip>
          Leave blank to use the image's default CMD/ENTRYPOINT.
        </Tip>
      </Step>

      <Step title="Allocate Resources">
        Set compute resources:

        * **vCPU**: Default 500m (0.5 core)
        * **RAM**: Default 512 MB
        * **Instances**: Min and max for auto-scaling (default: 1-1)
      </Step>

      <Step title="Define Ports">
        If your app serves HTTP/gRPC traffic:

        * **Port**: The port your app listens on
        * **Protocol**: HTTPS, gRPC, TCP, or UDP
        * **Publicly Accessible**: Enable to expose via internet
        * **External Port**: 443 for HTTPS
      </Step>

      <Step title="Configure Health Checks (Optional)">
        Set up health monitoring:

        * **Liveness Probe**: HTTP, TCP, or exec checks (restarts container if failing)
        * **Readiness Probe**: When to route traffic (prevents routing traffic until passing)

        These probes ensure Kubernetes only routes traffic to healthy containers and automatically restarts failed ones.
      </Step>

      <Step title="Set Environment Variables (Optional)">
        Add runtime configuration:

        * API endpoints
        * Feature toggles
        * Secrets (encrypted)
      </Step>

      <Step title="Review and Deploy">
        * Click **Create and Deploy** to deploy immediately
        * Or **Create** to configure more before deploying
      </Step>
    </Steps>
  </Tab>
</Tabs>

<Note>
  **Using Helm?** Qovery also supports deploying Helm charts for packaged applications. See the [Helm Configuration Guide](/configuration/helm) for detailed instructions.
</Note>

## Monitor Your Deployment

Watch your application come to life:

<Steps>
  <Step title="View Deployment Progress">
    Click on your application to see:

    * **Build logs**: Container image creation
    * **Deployment logs**: Kubernetes deployment status
    * **Application logs**: Your app's output

    <Frame>
      <img src="https://mintcdn.com/qovery/ziWdn5St6rf4bcBc/images/deployment/deployment_logs_view.png?fit=max&auto=format&n=ziWdn5St6rf4bcBc&q=85&s=f9c8659a3255e26c356a4b16fe54af75" alt="View deployment logs in real-time" width="3164" height="2070" data-path="images/deployment/deployment_logs_view.png" />
    </Frame>
  </Step>

  <Step title="Wait for Running Status">
    Deployment typically takes 2-5 minutes.

    Status progression: `Building` → `Deploying` → `Running`

    <Frame>
      <img src="https://mintcdn.com/qovery/yDPPPWPKgIjFS10L/images/deployment/deployment_status.png?fit=max&auto=format&n=yDPPPWPKgIjFS10L&q=85&s=d992c95bac8d653773f1d94dc153b124" alt="Application deployment status" width="3164" height="2070" data-path="images/deployment/deployment_status.png" />
    </Frame>
  </Step>

  <Step title="Access Your Application">
    Once running, click the application URL to view your live app!

    The URL format: `https://your-app-xxx.qovery.io`
  </Step>
</Steps>

## What Happened Behind the Scenes

<Tabs>
  <Tab title="Git Repository Deployment">
    When deploying from Git, Qovery automatically:

    1. ✅ Cloned your Git repository
    2. ✅ Built a Docker image using your Dockerfile
    3. ✅ Pushed the image to container registry (ECR, GCR, etc.)
    4. ✅ Created Kubernetes deployment, service, and ingress
    5. ✅ Configured automatic HTTPS with Let's Encrypt
    6. ✅ Started health checks and monitoring
    7. ✅ Made your app accessible via `https://your-app-xxx.qovery.io`

    <Info>
      Qovery handles the entire build and deployment pipeline for you!
    </Info>
  </Tab>

  <Tab title="Container Registry Deployment">
    When deploying from a container registry, Qovery automatically:

    1. ✅ Pulled your pre-built Docker image from the registry
    2. ✅ Created Kubernetes deployment with your specified image
    3. ✅ Configured networking and load balancing
    4. ✅ Set up automatic HTTPS with Let's Encrypt
    5. ✅ Started health checks and monitoring
    6. ✅ Made your app accessible via `https://your-app-xxx.qovery.io`

    <Info>
      No build step needed - your image is deployed directly to Kubernetes!
    </Info>
  </Tab>
</Tabs>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Build Failed (Git Repository)">
    **Common causes**:

    * Missing or invalid Dockerfile
    * Build dependencies not installed
    * Syntax errors in Dockerfile
    * Insufficient build resources

    **Solutions**:

    * Check build logs for specific errors
    * Verify Dockerfile builds locally: `docker build .`
    * Ensure all dependencies are in package files
    * Contact Qovery support to increase build resources if needed
  </Accordion>

  <Accordion title="Image Pull Failed (Container Registry)">
    **Common causes**:

    * Registry not connected to Qovery
    * Image name or tag incorrect
    * Authentication issues
    * Image doesn't exist

    **Solutions**:

    * Verify registry is connected: [Container Registry Setup](/configuration/organization/container-registry)
    * Check image name matches exactly (case-sensitive)
    * Use specific tags, not `latest`
    * Verify image exists in your registry
  </Accordion>

  <Accordion title="Application Crashes">
    **Check**:

    * Application logs for error messages
    * Environment variables are set correctly
    * Port configuration matches your app (Git: check Dockerfile EXPOSE)
    * Resource limits (CPU/memory) are sufficient
    * Health check endpoints are accessible
  </Accordion>

  <Accordion title="Cannot Access Application">
    **Check**:

    * "Publicly Accessible" is enabled
    * App listens on `0.0.0.0:$PORT` not `localhost:$PORT`
    * Health checks are passing (if configured)
    * Wait 2-3 minutes for DNS propagation
    * Check firewall rules if using custom domains
  </Accordion>

  <Accordion title="Dockerfile Not Found (Git Repository)">
    **Solutions**:

    * Ensure Dockerfile exists at repository root
    * If in subdirectory, set "Root Application Path"
    * Check filename is exactly `Dockerfile` (case-sensitive)
    * Verify branch contains the Dockerfile
  </Accordion>
</AccordionGroup>

## Next Steps

<CardGroup cols={2}>
  <Card title="Add a Database" icon="database" href="/getting-started/guides/getting-started/connect-database">
    Connect PostgreSQL, MySQL, Redis, or MongoDB
  </Card>

  <Card title="Deploy Helm Charts" icon="https://mintcdn.com/qovery/Nvnl0g5BHzA0XQmy/images/logos/helm-icon.svg?fit=max&auto=format&n=Nvnl0g5BHzA0XQmy&q=85&s=f6c259d3ee3123f80e74bcb99c9f6f1d" href="/configuration/helm" width="24" height="24" data-path="images/logos/helm-icon.svg">
    Deploy packaged Helm applications
  </Card>

  <Card title="Custom Domain" icon="globe" href="/configuration/application#domains">
    Use your own domain name
  </Card>

  <Card title="Environment Variables" icon="key" href="/configuration/environment-variables">
    Manage secrets and configuration
  </Card>

  <Card title="Auto Deploy" icon="rotate" href="/configuration/deployment/auto-deploy">
    Enable automatic deployments from Git
  </Card>

  <Card title="Container Registry" icon="docker" href="/configuration/organization/container-registry">
    Connect Docker Hub, ECR, GCR, and more
  </Card>
</CardGroup>

## Quick Tips

<Tip>
  **Start Small**: Begin with minimal resources (500m CPU, 512MB RAM) and scale based on actual usage.
</Tip>

<Tip>
  **Use Health Checks**: Configure `/health` or `/healthz` endpoints in your app for better reliability.
</Tip>

<Tip>
  **Enable Auto Deploy**: For development environments, enable auto-deploy to automatically deploy on Git push.
</Tip>

<Tip>
  **Check Logs First**: When troubleshooting, always check application logs - they contain valuable debugging information.
</Tip>
