> ## Documentation Index
> Fetch the complete documentation index at: https://ravion-b90c0359-mintlify-710044b6.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# How to deploy Strapi to AWS

> Deploy Strapi headless CMS on ECS Fargate behind an Application Load Balancer with PostgreSQL on Amazon RDS in your AWS account through Ravion, plus HTTPS.

Run Strapi on ECS Fargate behind an Application Load Balancer and keep its relational database in Amazon RDS.

## Prerequisites

* A Git repository containing your application and its production build command.
* A Ravion account with your AWS account connected. Start free at [Ravion signup](https://app.ravion.com/signup).
* The Ravion CLI installed and authenticated. See [CLI installation](/cli/installation).

The examples use `my-org/my-app` as a placeholder. Replace it with your repository before applying the config.

<Prompt description="Set up this Strapi app for Ravion ECS hosting." icon="sparkles" actions={["copy", "cursor"]}>
  1. Before any other action, read and follow [https://www.ravion.com/docs/start-here#agent-workflow](https://www.ravion.com/docs/start-here#agent-workflow) as the mandatory agent workflow.
  2. Use [https://www.ravion.com/docs/deploy/aws/strapi](https://www.ravion.com/docs/deploy/aws/strapi) as the framework-specific source of truth.
  3. Confirm this repository contains Strapi and locate its app root in a monorepo.
  4. Inspect `package.json`, `config/database.*`, server config, Docker files, and scripts to detect the real build/start commands, port, health endpoint, and upload storage needs.
  5. Generate `ravion.yaml` with `rvn-aws-network` + `rvn-ecs-cluster` + `rvn-ecs-web` + `rvn-rds`, using Secrets Manager for database credentials rather than inventing RDS references.
  6. Ask the user for AWS account IDs, repository slugs, project IDs, ports, or database credentials before proceeding; do not guess.
</Prompt>

## Configure the deployment

Ravion provisions the network, ECS service, and RDS database in your AWS account.

This example uses [Railpack](https://railpack.com) for the build. Use `build_source: dockerfile` instead when you need a custom Dockerfile.

Strapi builds with `npm run build` and starts with `npm run start`. The example includes PostgreSQL RDS. After the first apply, put the RDS endpoint and credentials into the service's runtime variables or a Secrets Manager secret.

```yaml ravion.yaml theme={null}
project:
  givenId: strapi-app
  name: Strapi app
environments:
  - givenId: production
    name: Production
    moduleInstances:
      - givenId: network
        name: Network
        type: rvn-aws-network
        version: 1.0.0
        input:
          aws_account_id: ravion-prod
          aws_region: us-east-1
          name: strapi-production
      - givenId: database
        name: PostgreSQL
        type: rvn-rds
        version: 1.0.0
        input:
          network:
            moduleGivenIdRef: network
          name: strapi-production
          db_name: strapi
          username: strapiadmin
          engine_major_version: "15"
      - givenId: cluster
        name: ECS cluster
        type: rvn-ecs-cluster
        version: 1.0.0
        input:
          network:
            moduleGivenIdRef: network
          name: strapi-production
      - givenId: web
        name: Strapi web service
        type: rvn-ecs-web
        version: 1.0.0
        input:
          cluster:
            moduleGivenIdRef: cluster
          name: strapi-production-web
          build_source: railpack
          source_repo: my-org/my-strapi-app
          railpack_build_cmd: npm run build
          railpack_start_cmd: npm run start
          container_port: 1337
          health_check_path: /_health
          fargate_size:
            vcpu: 1
            memory_gb: 2
```

Use a Secrets Manager secret for `DATABASE_CLIENT`, `DATABASE_HOST`, `DATABASE_PORT`, `DATABASE_NAME`, `DATABASE_USERNAME`, and `DATABASE_PASSWORD`. The current module schema accepts runtime `secrets`, but does not expose a typed RDS output-to-secret wiring field; create the secret from the RDS outputs before applying the service.

## Apply and connect your domain

```bash theme={null}
ravion project create --given-id strapi-app --name "Strapi app"
ravion project config apply strapi-app --file ravion.yaml --dry-run
ravion project config apply strapi-app --file ravion.yaml
```

Use [custom domains](/guides/custom-domains) for the ALB hostname and certificate.

## Next steps

<CardGroup cols={2}>
  <Card title="Custom domains" icon="globe" href="/guides/custom-domains">
    Point a domain at your deployed service and manage its certificate.
  </Card>

  <Card title="Project config" icon="file-code" href="/config-as-code/project-config-file">
    Preview and apply Ravion configuration from source control.
  </Card>

  <Card title="Pipelines" icon="arrow-progress" href="/config-as-code/pipeline-config-file">
    Add approvals, migrations, and deployment automation.
  </Card>

  <Card title="Logs and metrics" icon="chart-line" href="/modules/logs">
    Inspect deploy output and production health in Ravion.
  </Card>
</CardGroup>
