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

# Guia de implantação do AirysChat na AWS

> Implante o AirysChat na AWS com uma arquitetura HA de referência

A seguir está um guia de arquitetura HA de referência para implantar o AirysChat na AWS. Para uma implantação nativa em nuvem, use nossos [helm charts](https://github.com/airyschat/charts) com AWS Elastic Kubernetes Service(EKS).

## Introdução

Usaremos o script de instalação do Linux para ter uma instância do AirysChat rodando. Além disso, em vez de
depender de Redis, Postgres e Nginx instalados na mesma ec2; nós prosseguiremos usando
serviços gerenciados da AWS para o mesmo, viz Elasticache, RDS e ALB.

### Pré-requisitos

1. Conta na AWS
2. Domínio para usar com o AirysChat

### Arquitetura

Este guia seguirá uma arquitetura padrão de 3 camadas na AWS.

<img src="https://mintcdn.com/airys/1FWn-RJM-8Ky_sbQ/self-hosted/images/aws-01-architecture.png?fit=max&auto=format&n=1FWn-RJM-8Ky_sbQ&q=85&s=3c95a60879f75e589c8245bfacc68374" alt="aws-architecture" width="2332" height="1438" data-path="self-hosted/images/aws-01-architecture.png" />

## Rede

### Criar VPC

1. Faça login no console da AWS e escolha a região onde você fará a implantação.
2. Navegue até o console VPC e crie uma nova vpc para o airyschat. Na tag `name`, insira
   `airyschat-vpc` e use o bloco CIDR `10.0.0.0/16`.
3. Deixe o restante das opções como padrão e clique em `Create VPC`.

<img src="https://mintcdn.com/airys/1FWn-RJM-8Ky_sbQ/self-hosted/images/aws-02-create-vpc.png?fit=max&auto=format&n=1FWn-RJM-8Ky_sbQ&q=85&s=d3d5615eb10479790a8cb5bb3546ee2c" alt="aws-create-vpc" width="891" height="1145" data-path="self-hosted/images/aws-02-create-vpc.png" />

### Sub-redes

Crie duas sub-redes públicas e privadas na vpc que criamos. Certifique-se de tê-las em diferentes AZs e com intervalos CIDR que não se sobreponham.

1. Navegue até VPC > Subnets.
2. Clique em `Create Subnet`. Selecione a `airyschat-vpc` que criamos antes, nomeie-a como `airyschat-public-1`, selecione uma zona de disponibilidade (por exemplo, ap-south-1a) e o bloco CIDR como
   `10.0.0.0/24`.

<img src="https://mintcdn.com/airys/1FWn-RJM-8Ky_sbQ/self-hosted/images/aws-03-create-subnet.png?fit=max&auto=format&n=1FWn-RJM-8Ky_sbQ&q=85&s=016e9d057e9f1aa3b08587d9b69bb083" alt="aws-create-subnet" width="1265" height="1330" data-path="self-hosted/images/aws-03-create-subnet.png" />

3. Siga o mesmo procedimento para criar as sub-redes restantes.

| Nome                  | Tipo    | Zona de Disponibilidade | Bloco CIDR    |
| --------------------- | ------- | ----------------------- | ------------- |
| `airyschat-public-1`  | public  | `ap-south-1a`           | `10.0.0.0/24` |
| `airyschat-public-2`  | public  | `ap-south-1b`           | `10.0.1.0/24` |
| `airyschat-private-1` | private | `ap-south-1a`           | `10.0.2.0/24` |
| `airyschat-private-2` | private | `ap-south-1b`           | `10.0.3.0/24` |

4. Após criar todas as sub-redes, habilite `auto assign public ipv4 address` para as sub-redes públicas em `Actions` > `Subnet Settings`.

### Internet Gateway

1. Selecione `Create Internet Gateway`, nomeie-o `airyschat-igw` e clique em create.
2. Selecione-o na lista de internet gateways, escolha actions e, em seguida, selecione `Attach to VPC`.
3. Escolha `airyschat-vpc` e clique em attach.

<img src="https://mintcdn.com/airys/1FWn-RJM-8Ky_sbQ/self-hosted/images/aws-04-create-igw.png?fit=max&auto=format&n=1FWn-RJM-8Ky_sbQ&q=85&s=435bcade3ab180dc7caaf8afca6af678" alt="aws-create-igw" width="887" height="442" data-path="self-hosted/images/aws-04-create-igw.png" />

### NAT Gateway

Os servidores de aplicativos do AirysChat precisam ser implantados na sub-rede privada. Para que eles acessem a internet, precisamos adicionar gateways NAT à nossa sub-rede pública e adicionar uma rota a partir das sub-redes privadas.

1. Navegue no painel VPC e selecione `NAT gateways`.
2. Clique em `Create NAT Gateway`.

   1. Nomeie-o `airyschat-nat-1`.
   2. Selecione a sub-rede `airyschat-public-1`.
   3. Clique em `Allocate Elastic IP`.
   4. Adicione tags adicionais de acordo com sua necessidade.
   5. Clique em `Create NAT gateway`.

<img src="https://mintcdn.com/airys/1FWn-RJM-8Ky_sbQ/self-hosted/images/aws-05-create-nat.png?fit=max&auto=format&n=1FWn-RJM-8Ky_sbQ&q=85&s=6d717a771589a11e35493468b9deee1f" alt="aws-create-nat" width="892" height="981" data-path="self-hosted/images/aws-05-create-nat.png" />

3. Siga o mesmo procedimento para criar um segundo gateway NAT (`airyschat-nat-2`) e escolha a sub-rede `airyschat-public-2`.

### Tabelas de Roteamento

A tabela de roteamento controla o acesso de entrada e saída para uma sub-rede.

#### Tabela de Roteamento Pública

Criaremos tabelas de roteamento para que nossas sub-redes públicas possam acessar a internet por meio do Internet gateway.

Navegue até o painel VPC e selecione `Route Tables`.

1. Clique em `Create route table`.
2. Use o nome `airyschat-public-rt` e escolha `airyschat-vpc` em VPC.
3. Clique em `Create`.

<img src="https://mintcdn.com/airys/1FWn-RJM-8Ky_sbQ/self-hosted/images/aws-06-create-rt.png?fit=max&auto=format&n=1FWn-RJM-8Ky_sbQ&q=85&s=2e1448f42a9557f93915401e8d9f8684" alt="aws-create-rt" width="942" height="768" data-path="self-hosted/images/aws-06-create-rt.png" />

A seguir, precisamos adicionar uma rota ao internet gateway que criamos anteriormente(`airyschat-igw`).

1. Selecione a tabela de roteamento `airyschat-public-rt` na lista e clique em `Edit routes` > `Add Route`.
2. Defina o destino como `0.0.0.0/0` e escolha o alvo como `airyschat-igw`. Clique em `Save Changes`.

Além disso,

1. Selecione a tabela de roteamento `airyschat-public-rt` na lista e clique em `Subnet Associations` > `Edit subnet associations`.
2. Selecione ambas as sub-redes públicas(`airyschat-public-1`,`airyschat-public-2`) e clique em `save`.

#### Tabela de Roteamento Privada

Também criaremos tabelas de roteamento privadas para que nossas sub-redes privadas possam acessar a internet através dos gateways NAT.

1. Siga o guia acima e crie duas tabelas de roteamento privadas, a saber, `airyschat-private-a` e `airyschat-private-b`.
2. Selecione as tabelas de roteamento e adicione uma rota ao gateway NAT em sua respectiva zona de disponibilidade.
   1. Para `airyschat-private-a`, adicione uma rota para `0.0.0.0/0` e o alvo como `airyschat-nat-1`.
   2. Para `airyschat-private-b`, adicione uma rota para `0.0.0.0/0` e o alvo como `airyschat-nat-2`.

Além disso,

1. Associe as tabelas de roteamento privadas com as sub-redes privadas correspondentes.
   1. Para `airyschat-private-a`, associe a sub-rede `airyschat-private-1`.
   2. Para `airyschat-private-b`, associe a sub-rede `airyschat-private-2`.

## Application Load Balancer (ALB)

Crie um application load balancer para receber tráfego nas portas 80 e 443 e distribuí-lo através das instâncias do AirysChat.

1. Navegue até a seção EC2 e escolha a seção Load Balancer.
2. Clique em `Create Load Balancer`.
   1. Escolha `Application Load Balancer`.
   2. Para o nome do load balancer, use `airyschat-loadbalancer`.
   3. Selecione o scheme como `internet-facing` e IP address type como `IPv4`.
   4. Para a seção de mapeamento de rede,
      1. Selecione `airyschat-vpc`.
      2. Selecione as sub-redes públicas `airyschat-public-1` e `airyschat-public-2` na seção de mapeamento.
   5. Para a seção de Security group,
      1. Crie um novo security group, `airyschat-loadbalancer-sg`.
      2. Adicione regras para permitir o tráfego HTTP e HTTPS de qualquer lugar(`0.0.0.0/0`, `::/0`).
      3. Além disso, adicione uma regra para permitir TCP na porta 3000. Esta regra permite que as verificações de integridade do load balancer passem, já que o AirysChat roda na porta 3000.
      4. Adicione uma regra para permitir tráfego SSH a partir do security group do bastion que criaremos em uma etapa posterior do guia. Revisite esta seção após concluir a etapa do bastion.
   6. Para a seção de Listeners and routing, crie dois listeners para 80 e 443. Defina a regra de encaminhamento no listener 80 para redirecionar `http` para `https`.
      1. Além disso, crie um target group, `airyschat-tg`, que encaminhará as requisições para a porta `3000`(o AirysChat ouve nesta porta).
      2. Adicione uma verificação de integridade no endpoint `/api`. Este endpoint não é autenticado e deve retornar a versão da aplicação.

```
{
  "version": "1.22.1",
  "timestamp": "2021-12-06 16:07:39"
}
```

7. Adicione quaisquer tags necessárias e clique em create.

Além disso, adicione se você tiver seu domínio no Route53 e use o ACM para gerar um certificado para usar com o ALB.

## Postgresql usando AWS RDS

O AirysChat usa o Postgres como camada de DB, e usaremos o Amazon RDS com uma opção multi-AZ para confiabilidade.

### Security group do RDS

1. Navegue até EC2 > Security groups e crie um novo sg.
2. Nomeie-o `airyschat-rds-sg`.
3. Selecione a `airyschat-vpc` e adicione uma regra de entrada para a porta do postgres com origem `airyschat-loadbalancer-sg`.

### Grupo de sub-redes do RDS

1. Navegue até a seção RDS e selecione subnet groups.
2. Crie `airyschat-rds-group` e escolha `airyschat-vpc`.
3. Selecione ambas as AZs e as sub-redes privadas.

### RDS

1. Selecione create a database.
2. Use a criação padrão e escolha a engine do Postgres.
3. Use o template de produção e crie um usuário master e senha do Postgres.
4. Habilite a implantação Multi-AZ.
5. Selecione `airyschat-vpc` e selecione o security group do rds que criamos anteriormente.
6. Habilite a autenticação por senha.
7. Clique em create.
8. Após concluir a criação, anote o hostname, username e senha. Precisaremos disso para configurar o AirysChat.

## Redis usando AWS Elasticache

1. Siga passos semelhantes como os do rds para criar os grupos de segurança e de sub-rede do Redis.
2. Crie o cluster Redis com a opção multi-AZ.

## Criando servidores Bastion

Crie servidores bastion em ambas as sub-redes públicas. Esses servidores serão usados para fazer ssh nas instâncias do AirysChat nas sub-redes privadas.

1. Navegue até o painel EC2 e clique em launch instance.
2. Use uma imagem `Ubuntu 20.04 image` com o tipo `t3.micro`.
3. Escolha `airyschat-vpc` e a sub-rede `airyschat-public-1`.
4. Nomeie-o `airyschat-bastion-a`.
5. Adicione um novo sg, `airyschat-bastion-sg` e habilite o acesso ssh de qualquer lugar.
6. Deixe o restante como padrões e clique em launch.
7. Assim que a instância estiver ativa, tente fazer SSH na instância.

Repita e crie outro bastion, `airyschat-bastion-b` na outra AZ.

## Instalar AirysChat

1. Navegue até a seção EC2 e clique em launch instance.
2. Use uma imagem `Ubuntu 20.04 image` com o tipo de instância `c5.xlarge`.
3. Escolha a airyschat-vpc e selecione a sub-rede privada `airyschat-private-1`.
4. Desative a atribuição automática de IP público e aumente o armazenamento do root volume para 60 GB.
5. Adicione as tags necessárias. Defina a tag `Name` para `airyschat`.
6. Selecione o security group do load balancer e clique em launch.
7. Faça SSH no servidor bastion e, a partir de lá, faça ssh na instância do airyschat que criamos.
8. Mude para o usuário `root`.
9. Baixe o script de instalação do airyschat para Linux.

```bash theme={null}
wget https://get.airyschat.app/linux/install.sh
chmod 755 install.sh
```

10. Execute o script.

```bash theme={null}
./install.sh --install
```

## Configurar AirysChat

11. Assim que a instalação for concluída, mude para o usuário airyschat e navegue até a pasta airyschat. Edite o arquivo .env e substitua as credenciais do Postgres e Redis pelos valores do RDS e elasticache.

```bash theme={null}
sudo -i -u airyschat
cd airyschat
vi .env
```

12. Execute a migração do db.

```bash theme={null}
RAILS_ENV=production bundle exec rake db:prepare
```

13. Modifique também as outras variáveis de ambiente necessárias para a configuração do seu airyschat. Consulte [https://www.airyschat.com/docs/self-hosted/deployment/linux-vm#configure-the-required-environment-variables](https://www.airyschat.com/docs/self-hosted/deployment/linux-vm#configure-the-required-environment-variables)

14. Reinicie o serviço `airyschat`.

```bash theme={null}
sudo cwctl --restart
```

## Verificar o login

15. Adicione esta instância ao target group anexado ao alb.
16. Navegue até o seu domínio do airyschat para ver se tudo está funcionando.

## Criar uma AMI personalizada

1. Se você estiver recebendo a página de integração, conclua a inscrição e verifique a instalação.
2. Voila !! Sua instância do airyschat está no ar.
3. Se tudo estiver correto, prossiga para criar uma ami a partir desta instância e nomeie-a `airyschat-base-ami`.

## Grupos de Auto Scaling (ASG)

1. Crie uma launch configuration usando a imagem base acima.
2. Prossiga para criar um auto-scaling group a partir dessa launch config.
3. Defina a capacidade mínima e desejada para 2 e a máxima para 4. Modifique isso de acordo com sua necessidade.
4. Crie uma política de escalonamento baseada na utilização da CPU.
5. Neste ponto, estamos prontos para encerrar a instância que criamos anteriormente.
6. Verifique o load balancer ou target group para verificar se duas novas instâncias do airyschat surgiram.
7. É isso.

## Monitoramento

1. Consulte [https://www.airyschat.com/docs/self-hosted/monitoring/apm-and-error-monitoring](https://www.airyschat.com/docs/self-hosted/monitoring/apm-and-error-monitoring)

## Atualizando o AirysChat

1. Faça login em um dos servidores de aplicativo e conclua as instruções de atualização. Execute migrações se necessário. Consulte [https://www.airyschat.com/docs/self-hosted/deployment/linux-vm#upgrading-to-a-newer-version-of-airyschat](https://www.airyschat.com/docs/self-hosted/deployment/linux-vm#upgrading-to-a-newer-version-of-airyschat)
2. Crie uma nova ami e atualize a launch config.

## Conclusão

Este documento é uma diretriz de referência para uma arquitetura HA do AirysChat na AWS. Modifique ou construa sobre isso para atender às suas necessidades.
