Esse repositório foi criado com base no repo aplicação mern-ecommerce. Trata-se um app MERN (MongoDB, ExpressJS, React e NodeJS). Recomendo ler a documentação original também.
Note
Foram realizadas modificações simples no código-fonte da aplicação. Como, por exemplo, subir o backend na rota /api
.
Criei os arquivos Dockerfile
para o frontend e backend, assim como o docker-compose.
Para acelerar o processo de criação dos manifestos Kubernetes utilizei a ferramenta Kompose.
Para criar um "esqueleto" Helm a partir dos manifestos utilizei o Helmify.
A infraestrutura foi erguida utilizando Terraform.
- O módulo
networking
cria uma VPC contando com 4 subnets, em 2 AZs diferentes. Sendo 2 públicas com máscara/20
e duas privadas com máscara/24
. - O módulo
k8s
cria um cluster EKS com node group simples com 3 instânciast3.medium
. - O módulo
k8s-addons
implementa o aws-load-balancer-controller, além do external-dns para resolução automática do nome do ALB. - A configuração de roteamento do tráfego para o frontend
lexops.xyz
e o backendlexops.xyz/api
é feito através de annotations no kind Ingress e no kind Service do backend. - O deploy da aplicação é feito utilizando Helm via resource
helm_release
do Terraform. - O repositório conta com uma série de
pre-commit
hooks. Eles são utilizados para formatar e gerar automaticament as documentações do Terraform e do Helm. Além de "lintar" os workflows, evitando commits que iriam falhar. - A ferramenta pre-commit pode ser instalada com
pip install -r requirements.txt
. Certifique de também se referir a documentação oficial dos "hooks" que pretende utilizar.
As esteiras obtém a permissão para gerenciar recurso na AWS através de uma role autenticada via OIDC. Por favor, leia a documentação: Github OIDC x AWS
-
Vá para Actions e clique no workflow Deploy Infra
-
Na lado direito, clique em Run workflow. Isso abrir um pop-up.
-
Escolhe um ambiente para subir no menu drop-down.
-
Clique no botão verde Run workflow. ![[Pasted image 20241118131920.png]]
-
Espere a conclusão do workflow. ![[Pasted image 20241118132213.png]]
-
Para destruir o ambiente o processo é muito similar. Porém você deverá rodar o workflow chamado Tear Down Infra
-
Clone o repositório:
git clone https://github.com/lexops/mern-shop.git
-
Navegue até o diretório do ambiente terraform que deseja subir (ex.: dev):
cd terraform/dev
-
Instale as dependências:
terraform init
-
Execute o projeto:
terraform apply
-
Isso irá criar um plano para subir a infraestrutura. Leia o plano gerado no terminal e aprove-o digitando
yes
. -
Para desligar o ambiente basta executar e confirmar digitando
yes
.terraform destroy
Para atualizar a versão da aplicação em desenvolvimento basta abrir um PR para a branch develop
e conseguir aprová-lo.
Important
É obrigatório submeter o PR com exatamente uma das seguintes labels : major
, minor
ou patch
. Isso garante que automação que realiza o semver não quebre.
![[Pasted image 20241118134548.png]]
Isso rodará o workflow chamado Continous Integration
, realizando o build das imagens docker e fará um commit automático mudando o valor da variável mern_shop_version
no arquivo terraform/dev/terraform.tfvars
.
Também é possível fazer o mesmo manualmente, alterando a variável mern_shop_version
no arquivo [terraform/dev/terraform.tfvars
] e rodando os comandos ensinados anteriormente:
terraform init
e terraform apply
.
Em produção é necessário alterar a variável mern_shop_version
no arquivo [terraform/prod/terraform.tfvars
] e submeter um PR a branch main
.
Isso rodará o workflow Create terraform plan for prod
, que gera o plano do terraform e posta um comentário no PR. Caso o PR seja aprovado, o workflow Terraform Apply in prod
realizar a mudança proposta.
Note
Não é possível alterar a versão de produção automaticamente por motivos de segurança.
Para modificar a infraestrutura é necessário realizar alterações no arquivos dos diretório terraform
e realizar um PR para a branch main. O processo é o similar ao da alteração da versão da app em produção. Após feito o PR, a automação criado um comentário com o plan gerado e caso seja mergeado, aplicará as mudanças.
- Criar um banco documentdb via terraform (ao invés de passar diretamente a variável
MONGO_URI
), integrando-o ao módulo secrets. Sugestão: utilizar o módulo terraform-aws-documentdb-cluster - Criar um repositório ECR via terraform (ao invés de simplesmente apontar a URL). Sugestão: utilizar o módulo terraform-aws-ecr
- Remover o usuário root das imagens docker. Ref: https://cloudyuga.guru/blogs/manage-docker-as-non-root-user/
Explicação sobre como contribuir com o projeto.
Informações sobre a licença do projeto.