# N8N na AWS: instalar na EC2 com Docker Compose e HTTPS

> Instale o n8n numa EC2 com Docker Compose, domínio no Route 53 e HTTPS. No fim, veja como ele roda em produção num cluster ECS.

- Autor: Henrylle Maia, consultor AWS
- Publicado em: 2026-10-15
- Assuntos: Containers
- URL: https://pages.formacaoaws.com.br/blog/n8n-na-aws-ec2-docker-compose/
- Aula de origem: "Como instalar o N8N na sua conta na AWS, PARTINDO DO ZERO." (https://www.youtube.com/watch?v=-gyIdyy3X0Y)

O n8n é uma ferramenta low-code que liga serviços sem programar: Google Sheets, PostgreSQL, Gmail, OpenAI e outros. Aqui eu subo o n8n numa EC2 com Docker Compose, aponto um domínio no Route 53, abro com HTTPS e crio um workflow que recebe uma chamada de API. No fim, mostro por que esse modelo serve só para teste e como é o meu n8n em produção, num cluster ECS.

> **Importante:** versões mudam. Gravei isso em 27/09/2024. A documentação do n8n foi reorganizada desde então, e o `compose.yml` e o script de instalação do Docker que usei são daquela data. Confira o passo a passo atual na [documentação oficial do n8n para Docker Compose](https://docs.n8n.io/deploy/host-n8n/install-options/use-a-cloud-provider/use-docker-compose).

## Para que eu uso o n8n

Tenho três workflows. No primeiro, o n8n lê uma planilha do Google Sheets com 1.226 respostas de pesquisa dos meus treinamentos gratuitos, trata os dados com um pouco de JavaScript e grava campo a campo numa tabela do PostgreSQL.

O segundo busca no Meta Ads quanto gastei por dia em anúncios e guarda num banco relacional. O terceiro é uma API que diz se um inscrito entrou num grupo de WhatsApp, sem eu escrever código.

Para quem paga ferramentas que cobram por operação, como o Make, rodar o n8n na própria conta tira esse custo e deixa a comunicação com o banco dentro da mesma rede.

## O que você precisa ter antes

O n8n sobe em container, então Docker e Docker Compose são pré-requisito. Se ainda não mexeu com eles, comece por [Docker na EC2](https://pages.formacaoaws.com.br/blog/docker-na-ec2/) e [Docker Compose na prática](https://pages.formacaoaws.com.br/blog/docker-compose-na-pratica/).

Uso uma EC2 na região da Virgínia e na VPC default, para não entrar em complexidade de rede. A documentação do n8n oferece EC2 e EKS (Kubernetes), mas no EKS você já começa pagando o control plane, caro para uma ferramenta simples.

## Passo 1: criar o security group com a porta 443

O n8n atende por HTTPS, então preciso da porta 443. No console da EC2, crie um security group (aqui, `bia-dev-aula-youtube`, com a descrição "acesso do n8n para aula do youtube") e adicione uma regra de entrada do tipo HTTPS, porta 443. Na aula deixei a origem em "Anywhere", ou seja, 0.0.0.0/0.

![A regra de entrada do security group: HTTPS, porta 443, origem Anywhere (0.0.0.0/0), com o nome bia-dev-aula-youtube e a descrição acesso do n8n para aula do youtube](https://pages.formacaoaws.com.br/blog/assets/posts/n8n-na-aws-ec2-docker-compose/sg.webp)

> **Importante:** 0.0.0.0/0 deixa a tela de login do n8n aberta para a internet inteira. Na aula foi só para demonstração; para saber como limitar a origem, veja [security groups na documentação da AWS](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html).

## Passo 2: lançar a EC2 com Docker pelo user data

Lance a instância com estas escolhas:

- **Nome:** `n8n-aula-youtube`.
- **Imagem:** Amazon Linux 2023, 64 bits.
- **Tipo:** t3.micro, da Free Tier.
- **Par de chaves:** nenhum. Eu entro pelo Session Manager (SSM), que é mais seguro e simples. Veja [Conectar na EC2 pelo navegador](https://pages.formacaoaws.com.br/blog/conectar-na-ec2-pelo-navegador/).
- **Rede:** a VPC default e o security group do passo 1.
- **Armazenamento:** 15 GB. Pode ser mais.
- **Perfil de instância (IAM instance profile):** uma role com a policy `AmazonSSMManagedInstanceCore` e relação de confiança com a EC2. A minha se chama `acesso-ssm`. Para criar, vá em IAM, Create role, AWS service, EC2 e anexe essa policy.

No campo **user data**, no fim das configurações avançadas, uso o `user_data_ec2_zona_a.sh` da pasta `scripts` do projeto BIA (`github.com/henrylle/bia`). Ele instala o Docker e o Git, coloca os usuários no grupo `docker`, ativa o serviço e instala o Docker Compose. Cole o conteúdo no campo e lance a instância.

![O começo do script de user data do projeto BIA: atualiza a máquina, instala Git e Docker, coloca ec2-user e ssm-user no grupo docker e ativa o serviço](https://pages.formacaoaws.com.br/blog/assets/posts/n8n-na-aws-ec2-docker-compose/userdata.webp)

## Passo 3: preparar o compose.yml e o .env

Com a instância no ar, abra o Session Manager (aba "Session Manager" na tela de conexão, botão Connect). Troque para o `ec2-user`, o usuário padrão do Amazon Linux, entre na pasta home dele e crie a pasta do projeto:

```bash
mkdir n8n
cd n8n
```

Copie o `compose.yml` da documentação do n8n e cole num arquivo novo:

```bash
nano compose.yml
```

Ele já traz o roteamento do serviço, as portas, as variáveis de ambiente e dois volumes, um para o Traefik e outro para o n8n. Salve com Ctrl+X, Y e Enter.

O `.env` também vem da documentação:

```bash
nano .env
```

São quatro valores:

- **Domínio:** o meu, da Formação AWS.
- **Subdomínio:** `yt`.
- **Timezone:** `America/Sao_Paulo`.
- **E-mail:** o meu, usado para o certificado SSL.

## Passo 4: subir o n8n

```bash
docker compose up -d
```

Na primeira tentativa o Compose reclamou de volumes externos, o do Traefik. Eu queria os volumes na própria instância, então tirei a opção de volume externo dos dois volumes no `compose.yml` e rodei o comando de novo. Aí subiu.

## Passo 5: apontar o domínio no Route 53

Pegue o IPv4 público da instância. Na zona hospedada do domínio no Route 53, crie um registro do tipo A, com o nome igual ao subdomínio do `.env` (`yt`) e o IP da instância como valor.

Abra `yt.` seguido do seu domínio no navegador. No meu primeiro acesso, o firewall do meu computador reclamou. Liberei, e a página carregou.

## Passo 6: criar a conta e o primeiro workflow

A tela inicial pede a conta de dono: e-mail, nome e senha. Depois você cria um workflow do zero ou parte de um template pronto.

Como exemplo, montei uma entrada de API com um nó de **Webhook**:

1. Escolha quando o webhook responde. "Quando o último nó terminar" dá uma API síncrona, que devolve o resultado. "Imediatamente" dá uma API assíncrona, que só confirma o recebimento e processa depois (útil para carregar uma planilha no banco).
2. Clique em escutar. O n8n mostra a URL de teste.
3. Peça ao ChatGPT o comando `curl` para essa URL, do tipo POST, enviando nome e e-mail, e troque o método do webhook para POST.
4. Rode o `curl` no terminal. O nó mostra o nome e o e-mail recebidos.

Dali você mapeia cada campo. Com um PostgreSQL conectado, arrasta a coluna de cada campo, e um nó de código em JavaScript formata o que precisar.

## Por que isso não vai para produção

O que subi é uma demonstração, boa para uma prova de conceito. Se a instância morrer, você perde a aplicação, e os dados do n8n ficam na própria máquina. Num serviço que recebe webhooks é pior: se ele estiver fora, o dado que chegou não tem para onde ir.

O n8n que uso de verdade roda num cluster ECS. No CloudWatch, em Container Insights, o mapa mostra o cluster, os services e as task definitions do n8n e do Metabase.

![O mapa do Container Insights: o cluster cluster-seattle, com os services e as task definitions do n8n e do Metabase](https://pages.formacaoaws.com.br/blog/assets/posts/n8n-na-aws-ec2-docker-compose/mapa.webp)

O n8n roda com uma task. Se ela cair, o ECS lança outra. Para alta disponibilidade, basta trocar para duas tasks. O cluster não tem custo. O meu tem duas instâncias, uma delas Spot, e na frente um load balancer com regras que mandam cada requisição para o target group do n8n, do Metabase ou do WordPress, em HTTP e HTTPS. O banco não fica na instância: uso um RDS.

É uma arquitetura sem Kubernetes, bem mais barata que um EKS. Veja [Amazon ECS na prática](https://pages.formacaoaws.com.br/blog/ecs-na-pratica-cluster-service-asg/) e [Docker com alta disponibilidade na AWS](https://pages.formacaoaws.com.br/blog/docker-alta-disponibilidade-na-aws/).

**Fluxo:** Security group (porta 443) → EC2 (Docker e Compose pelo user data) → n8n e Traefik (compose.yml e .env) → Route 53 (registro A para o IP)

## Checklist

- Security group criado só com a porta 443.
- EC2 Amazon Linux 2023 t3.micro, sem par de chaves, com a role de SSM e o user data que instala Docker e Compose.
- Conexão pelo Session Manager e pasta `n8n` com `compose.yml` e `.env` da documentação.
- Volumes sem a opção de externo e `docker compose up -d` rodando.
- Registro A no Route 53 apontando o subdomínio para o IP da instância.
- Conta de dono criada.
- Instância terminada ao fim do teste, para não gerar custo.
