Este diretório contém toda a configuração de infraestrutura como código (IaC) para deploy automatizado da aplicação CS Skin GO na AWS.
- Visão Geral
- Arquitetura
- Requisitos
- Custos
- Instalação
- Deploy
- Domínios e DNS
- Chaves SSH do Projeto
- Workflow de Git da Infra
- Gerenciamento
- Troubleshooting
Stack de deploy totalmente automatizado usando:
- Terraform: Provisionamento de infraestrutura na AWS
- Ansible: Configuração de servidores e deploy de aplicação
- Docker: Containerização das aplicações
- Nginx: Proxy reverso e servidor web
┌─────────────────────────────────────────────────┐
│ AWS EC2 (t2.micro) │
│ ┌───────────────────────────────────────────┐ │
│ │ Nginx (porta 80) │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │ Frontend │ │ Backend API │ │ │
│ │ │ Next.js │ │ NestJS │ │ │
│ │ │ (porta 3000)│ │ (porta 3001) │ │ │
│ │ └─────────────┘ └──────────────────┘ │ │
│ │ │ │ │ │
│ │ └──────────┬───────┘ │ │
│ │ │ │ │
│ │ ┌───────▼────────┐ │ │
│ │ │ MySQL 8.0 │ │ │
│ │ │ (porta 3306) │ │ │
│ │ └────────────────┘ │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
│
│ HTTP/HTTPS
▼
Usuários
- Usuário →
http://IP_PUBLICO/→ Nginx → Frontend (Next.js) - Usuário →
http://IP_PUBLICO/api→ Nginx → Backend (NestJS) - Backend → MySQL (localhost:3306)
-
Terraform >= 1.0
brew install terraform # macOS -
Ansible >= 2.10
brew install ansible # macOS # ou pip3 install ansible
-
AWS CLI (configurado)
brew install awscli aws configure
-
SSH Key Pair
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
Configure suas credenciais AWS:
export AWS_ACCESS_KEY_ID="sua_access_key"
export AWS_SECRET_ACCESS_KEY="sua_secret_key"
export AWS_DEFAULT_REGION="us-east-1"Ou use aws configure.
| Recurso | Tipo | Custo Mensal |
|---|---|---|
| EC2 | t2.micro | $8.50 |
| EBS | 20 GB gp3 | $1.60 |
| Elastic IP | 1 IP | $0.00* |
| TOTAL | ~$10.10/mês |
🎉 FREE TIER: Se sua conta AWS for elegível para o Free Tier (primeiro ano), o custo é $0.00/mês!
- 750 horas/mês de t2.micro (equivale a 1 instância rodando 24/7)
- 30 GB de EBS
- 1 Elastic IP (quando associado a instância rodando)
cd cs-skin-go-desafio/inframake check-depsIsso verificará se você tem instalado:
- Terraform
- Ansible
- AWS CLI (opcional)
- Chave SSH (✅ já incluída em
.ssh/)
make setupEste comando irá:
- Criar
terraform.tfvarsse não existir - Inicializar o Terraform
- Verificar configuração
Edite terraform/terraform.tfvars e ajuste os valores:
# terraform.tfvars
aws_region = "us-east-1"
instance_type = "t2.micro"
# IMPORTANTE: Mude para seu IP para maior segurança!
allowed_ssh_cidr = ["SEU_IP_AQUI/32"]
# Secrets - MUDE ESTES VALORES!
jwt_secret = "seu-secret-jwt-super-seguro-min-32-caracteres"
mysql_root_password = "SenhaRootMySQL@123"
mysql_password = "SenhaUserMySQL@456"cd infra
# Ver todos os comandos disponíveis
make help
# Deploy completo
make deployO comando make deploy irá:
- Verificar dependências
- Provisionar infraestrutura (Terraform)
- Aguardar servidor ficar pronto
- Configurar servidor (Ansible)
- Fazer deploy da aplicação
- Mostrar URLs de acesso
cd infra
./scripts/deploy.shmake tf-init # Inicializar
make tf-plan # Ver o que será criado
make tf-apply # Criar infraestrutura
make tf-output # Ver outputsOu manualmente:
cd terraform
terraform init
terraform plan
terraform applymake ansible-ping # Testar conectividade
make ansible-playbook # Executar playbook completoOu manualmente:
cd ansible
ansible all -m ping
ansible-playbook playbook.ymlSe você já provisionou a infraestrutura e quer apenas atualizar a aplicação:
make updateOu:
cd infra/ansible
ansible-playbook playbook.yml --tags applicationEste projeto já está preparado para usar domínios customizados:
- Frontend:
ia.daniloaparecido.com.br - Backend/API:
api-ia.daniloaparecido.com.br
Depois do deploy (quando você já tiver o IP público da EC2), configure dois registros A no seu provedor de DNS (Registro.br, Cloudflare, etc):
ia.daniloaparecido.com.br→<IP_PUBLICO_DA_EC2>api-ia.daniloaparecido.com.br→<IP_PUBLICO_DA_EC2>
Você pode obter o IP público com:
cd infra/terraform
terraform output instance_public_ipApós a propagação DNS:
- Frontend:
http://ia.daniloaparecido.com.br - Backend (API):
http://api-ia.daniloaparecido.com.br/api
Para HTTPS, use Certbot/Let's Encrypt diretamente no servidor (instalação padrão com
certbot --nginx).
O diretório infra/.ssh/ contém um par de chaves exclusivo deste projeto:
infra/
.ssh/
id_rsa # chave privada (gitignored)
id_rsa.pub # chave pública (gitignored)
- Essas chaves são usadas automaticamente pelo Terraform/Ansible.
- Elas não são commitadas (estão protegidas pelo
.gitignore).
Se quiser usar suas chaves pessoais:
- Edite
terraform/terraform.tfvars:
ssh_public_key_path = "~/.ssh/id_rsa.pub"
ssh_private_key_path = "~/.ssh/id_rsa"- Ou exporte variáveis de ambiente
TF_VAR_ssh_public_key_patheTF_VAR_ssh_private_key_path.
Para regenerar as chaves do projeto:
cd infra/.ssh
ssh-keygen -t rsa -b 4096 -f id_rsa -N "" -C "cs-skin-go-deploy"
chmod 600 id_rsa
chmod 644 id_rsa.pubA infra está em um repositório separado:
https://github.com/torneseumprogramador/cs-skin-go-desafio-infra
Fluxo recomendado:
cd infra
# Criar branch de feature
git checkout -b feature/minha-mudanca
# Fazer alterações (Terraform / Ansible)
git add .
git commit -m "feat: descrição da mudança"
git push origin feature/minha-mudancaDepois, abra um Pull Request nesse repositório, revise e faça merge em main.
Para atualizar o ambiente após o merge:
cd infra
git checkout main
git pull origin main
make deploy # ou make update, se for só aplicação# Ver informações
make info # URLs e IPs
make status # Status dos containers
make health # Verificar saúde
# Acessar
make ssh # Conectar via SSH
# Logs
make logs # Ver logs (últimas 100 linhas)
make logs-follow # Acompanhar em tempo real
make logs-backend # Apenas backend
make logs-frontend # Apenas frontend
make logs-nginx # Apenas Nginx
# Gerenciamento
make restart # Reiniciar tudo
make restart-backend # Reiniciar backend
make restart-frontend # Reiniciar frontend
make rebuild # Rebuild completo
# Banco de Dados
make db-migrate # Executar migrações
make db-seed # Executar seeds
make db-backup # Fazer backup
# Atualização
make update # Atualizar aplicaçãoSe preferir acessar diretamente:
# Acessar servidor
make ssh
# ou
ssh -i ~/.ssh/id_rsa ubuntu@<IP_PUBLICO>
# Verificar containers
cd /opt/cs-skin-go
docker compose ps
docker compose logs -f
# Ver logs
sudo tail -f /var/log/nginx/cs-skin-go_error.log
docker compose logs -f backend
# Restart
docker compose restart
docker compose restart backend
# Migrações
docker compose exec backend npm run migration:run
docker compose exec backend npm run seedmake destroyOu manualmente:
cd infra/terraform
terraform destroySolução:
-
Verifique se o Security Group permite seu IP:
# Pegar seu IP curl ifconfig.me # Atualizar terraform.tfvars allowed_ssh_cidr = ["SEU_IP/32"] terraform apply
-
Verifique permissões da chave:
chmod 600 ~/.ssh/id_rsa
Solução:
ssh ubuntu@<IP_PUBLICO>
cd /opt/cs-skin-go
# Ver logs detalhados
docker compose logs backend
docker compose logs frontend
# Recriar containers
docker compose down
docker compose up -d --buildSolução:
ssh ubuntu@<IP_PUBLICO>
# Verificar se MySQL está rodando
docker compose ps mysql
# Ver logs do MySQL
docker compose logs mysql
# Restart do MySQL
docker compose restart mysql
# Aguardar ele ficar saudável
docker compose psSolução:
-
Verifique se o backend está respondendo:
curl http://<IP_PUBLICO>/api/cases
-
Verifique configuração do Nginx:
sudo nginx -t sudo systemctl status nginx
-
Verifique logs:
sudo tail -f /var/log/nginx/cs-skin-go_error.log
Solução:
# Aguarde a instância estar 100% pronta
sleep 60
# Tente novamente
ansible-playbook playbook.ymlinfra/
├── terraform/
│ ├── main.tf # Configuração principal
│ ├── variables.tf # Variáveis
│ ├── outputs.tf # Outputs
│ ├── security-groups.tf # Security Groups
│ ├── terraform.tfvars # Valores das variáveis (não versionado)
│ └── templates/
│ └── inventory.tpl # Template do inventário Ansible
├── ansible/
│ ├── playbook.yml # Playbook principal
│ ├── ansible.cfg # Configuração do Ansible
│ ├── inventory.ini # Inventário (gerado pelo Terraform)
│ ├── vars/
│ │ └── main.yml # Variáveis da aplicação
│ └── roles/
│ ├── common/ # Setup comum do servidor
│ ├── docker/ # Instalação do Docker
│ ├── nginx/ # Configuração do Nginx
│ └── application/ # Deploy da aplicação
├── scripts/
│ ├── deploy.sh # Script de deploy completo
│ └── update.sh # Script de atualização
└── README.md # Este arquivo
-
Mude todos os secrets em produção!
- JWT_SECRET
- MySQL passwords
- SSH keys
-
Restrinja acesso SSH:
allowed_ssh_cidr = ["SEU_IP/32"] # Apenas seu IP
-
Use HTTPS em produção:
- Configure um domínio
- Use Certbot para Let's Encrypt
- Atualize configuração do Nginx
-
Habilite firewall:
sudo ufw enable sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 22/tcp -
Backups regulares:
- Configure snapshots EBS
- Backup do banco de dados
- Configurar domínio próprio
- Adicionar HTTPS (Let's Encrypt)
- Configurar CI/CD
- Implementar monitoramento (CloudWatch)
- Configurar backups automáticos
- Adicionar auto-scaling (quando necessário)
Em caso de dúvidas ou problemas:
- Consulte a seção Troubleshooting
- Verifique os logs
- Revise a configuração
Bom deploy! 🚀