Note
Orientações:
- Explicar os comandos usados na documentação.
- Compartilhar prints dos testes
Note
Os prints das notificações do Telegram e de logs foram tirados antes da alteração do script para ajustar os horários. Por isso, nos prints, tanto o Brasil quanto Virginia aparecem com horários iguais. Após a alteração, o script agora está configurado para mostrar corretamente o horário de Virginia (com o fuso horário America/New_York), levando em consideração o horário de verão.
- 🌐 Criar VPC
- 🔑 Criar Chave (Key Pairs)
- 🔐 Criar Security Group
- 🌐 Criar Instância EC2
- 🌐 Acessar a Instância via SSH para Configurações Futuras
- 🌐 Instalando o Servidor Nginx na EC2
- 🌐 Criar uma Página HTML Simples
- 🌐 Configurar o Nginx para Servir a Página
- 🤖 Criando o Bot no Telegram
- 🌐 1. Criação de um script em Bash para monitorar a disponibilidade do site.
- 🌐 2.1. O script deve verificar se o site responde corretamente a uma requisição HTTP.
- ❗Explicação do Script
- 2.2. Dando Permissões de Execução ao Script
- 🌐 3. Configurar o script para rodar automaticamente a cada 1 minuto usando cron.
Para capturar telas com anotações, utilizei o ZoomIt da Microsoft.
- Documentação e instalação do ZoomIt: ZoomIt - Sysinternals | Microsoft Learn
Antes de iniciar a configuração, certifique-se de que possui os seguintes requisitos atendidos:
- Conta ativa na AWS
Note
O que é AWS? Amazon Web Services (AWS) é uma plataforma de computação em nuvem que fornece infraestrutura sob demanda, como servidores, armazenamento e bancos de dados, permitindo que desenvolvedores criem e escalem aplicações rapidamente.
- WSL instalado no PC (caso esteja utilizando Windows)
Note
O que é WSL? O Windows Subsystem for Linux (WSL) permite rodar um ambiente Linux diretamente no Windows sem precisar de uma máquina virtual, facilitando o desenvolvimento e administração de servidores remotos.
- Guia de instalação do Ubuntu no Windows: How to install Ubuntu on Windows 10 from Microsoft Store
- Documentação do WSL: Documentação do Subsistema Windows para Linux | Microsoft Learn
Important
Observação: Minha console está em inglês. Caso os nomes dos menus estejam diferentes na sua, pode ser devido ao idioma configurado.
Tudo que aparecer borrado foi para priorizar a segurança
A Virtual Private Cloud (VPC) é uma rede virtual isolada dentro da AWS onde serão configurados os recursos do projeto.
-
No console da tela inicial da AWS, vá até a lupa e pesquise por "VPC" e clique em "Your VPCs".
-
Irá abrir a página de gerenciamento de VPCs. Clique em "Create VPC".
-
Nas configurações:
- Selecione "VPC and more".
Note
Essa opção permite criar não apenas uma VPC, mas também configurar automaticamente subnets, tabelas de roteamento e gateways necessários para a comunicação da rede. Ao escolher essa opção, a AWS ajuda a configurar um ambiente de rede mais completo sem precisar definir manualmente cada componente.
- Marque "Auto-generate"
Note
Quando essa opção está ativada, a AWS gera automaticamente os CIDR blocks e distribui as subnets nas Availability Zones da região escolhida. Isso simplifica a configuração inicial, garantindo que os endereços IP fiquem organizados corretamente dentro da VPC.
- Defina um nome para sua VPC (exemplo: "project")
- Defina o IPv4 CIDR block como 10.0.0.0/16
Note
O que é IPv4 CIDR block?
CIDR (Classless Inter-Domain Routing) é um método para definir intervalos de endereços IP. O bloco 10.0.0.0/16 significa que a VPC pode ter até 65.536 endereços IP disponíveis dentro deste intervalo.
-
Nas configurações:
- Selecione No IPv6 CIDR block
Note
O que é IPv6 CIDR block?
Diferente do IPv4, o IPv6 usa um esquema de endereçamento maior e mais complexo. No projeto, optei não utilizar IPv6.
- Tenancy: "Default"
Note
O que é Tenancy?
Define como os recursos da AWS são alocados. A opção "Default" significa que a VPC compartilhará a infraestrutura física da AWS com outros usuários, reduzindo custos.
- Número de AZs (Availability Zones): 2
- Customizei para "us-east-1a" (Virgínia) e "us-east-1b" (Ohio)
Note
O que são Availability Zones (AZs)?
Availability Zones são localizações distintas dentro de uma região AWS. Cada região possui múltiplas AZs, que são centros de dados isolados fisicamente, garantindo maior disponibilidade e tolerância a falhas.
- Como o projeto exige, configurei duas subnets públicas e duas privadas.
Note
Subnets públicas: Permitem comunicação direta com a internet através de um Internet Gateway.
Subnets privadas: Ficam isoladas da internet e precisam de um NAT Gateway para acessar recursos externos.
- Configure o CIDR block das subnets como 10.0.0.0/20.
Note
O que significa CIDR block das subnets como 10.0.0.0/20?
Cada subnet recebe uma parte do bloco de endereços da VPC. /20 significa que cada subnet pode ter até 4.096 endereços IP disponíveis.
-
Configure as opções adicionais:
- NAT Gateways ($): "None"
Note
O que é NAT Gateway?
Um NAT Gateway permite que instâncias em subnets privadas acessem a internet sem serem diretamente acessíveis por ela.
- VPC Endpoints: Selecione "S3 Gateway"
Note
O que são VPC Endpoints e S3 Gateway?
Um VPC Endpoint permite que recursos dentro da VPC se comuniquem com serviços da AWS sem passar pela internet. O S3 Gateway é um tipo de endpoint usado para acessar o Amazon S3 de forma segura e eficiente.
- Habilitar DNS: Marque as opções "Enable DNS hostnames" e "Enable DNS resolution"
Note
O que é DNS e por que habilitá-lo?
O DNS (Domain Name System) traduz endereços IP em nomes legíveis. Habilitá-lo permite que instâncias dentro da VPC se comuniquem mais facilmente usando nomes ao invés de IPs.
- Tags: Não adicionei tags extras
Note
O que são Tags?
Tags são rótulos personalizáveis usados para organizar e identificar recursos dentro da AWS, facilitando a administração.
As Key Pairs (pares de chaves) são utilizadas para acessar a instância EC2 com segurança via SSH. Elas consistem em:
- Chave pública: Fica armazenada na AWS e é associada à instância.
- Chave privada: Deve ser baixada e armazenada localmente pelo usuário. Ela é necessária para autenticação SSH.
Warning
-
No menu da AWS, clique no ícone de pesquisa e digite "Key Pairs". Em seguida, clique na opção correspondente.
-
Clique em "Create key pair".
-
Configure a chave com as seguintes opções:
- Nome: Escolha um nome para a chave. No exemplo, usei
"key-project". - Tipo de chave: Selecione "RSA", pois é um dos algoritmos de criptografia mais utilizados para SSH.
- Formato da chave privada: Escolha ".pem". Esse formato é necessário para conexões SSH no Linux e Mac.
- Nome: Escolha um nome para a chave. No exemplo, usei
-
Clique em "Create key pair".
-
O download da chave privada será feito automaticamente.
Warning
- Não adicionei nenhuma tag
Os Security Groups atuam como firewalls virtuais para as instâncias EC2. Eles controlam o tráfego de entrada e saída, permitindo apenas conexões autorizadas.
-
No menu da AWS, clique no ícone de pesquisa e digite "Security Groups". Em seguida, clique na opção correspondente.
-
Clique em "Create security group".
-
Configure os seguintes campos:
- Nome: Escolha um nome para o grupo. No exemplo, utilizei
"security-group-project". - Descrição: Insira uma breve descrição. No meu exemplo utilizei
"teste". - VPC: Selecione a VPC criada anteriormente. No exemplo,
"project-vpc".
- Nome: Escolha um nome para o grupo. No exemplo, utilizei
As Inbound Rules determinam quais conexões externas podem acessar a instância.
-
Clique em "Add Rule" para adicionar regras de entrada.
-
Adicione as seguintes regras:
-
SSH (porta 22)
- Tipo: SSH
- Protocolo: TCP
- Port Range: 22
- Source (Origem): My IP (recomendado por causa da seguraça)
-
Note
Permite que apenas o seu IP atual acesse a instância via SSH. Isso evita acessos indesejados.
- HTTP (porta 80)
- Tipo: HTTP
- Protocolo: TCP
- Port Range: 80
- Source (Origem): My IP (inicialmente por causa da segurança, após todas as configurações, deixaremos como 0.0.0.0/0)
Note
Permite apenas o seu IP acessar o servidor web (por enquanto).
Após todas as configurações será necessário mudar a origem do HTTP para 0.0.0.0/0, permitindo que qualquer usuário da internet acesse a página hospedada na instância.
As Outbound Rules definem quais conexões a instância pode iniciar para outros servidores.
-
Em Outbound Rules, configure:
- Tipo:
"All traffic" - Protocolo:
"All" - Port Range:
"All" - Destination:
"Anywhere - IPv4 (0.0.0.0/0)"
- Tipo:
Note
Isso permite que a instância acesse qualquer serviço na internet, como atualizações de pacotes e APIs externas.
-
Tags (Opcional)
Não adicionei nenhuma tag.- Se desejar, adicione tags para melhor organização.
[!NOTE]
As tags são úteis para identificar recursos, especialmente em ambientes grandes com várias instâncias.
- Se desejar, adicione tags para melhor organização.
-
Clique em "Create security group".
A instância EC2 (Elastic Compute Cloud) é um servidor virtual na nuvem que executará o Nginx e o script de monitoramento. Nesta seção, vamos criar uma instância utilizando o Ubuntu Server e configurá-la corretamente para rodar o ambiente de monitoramento.
1.1. No menu da AWS, clique no ícone de pesquisa e digite EC2.
1.2. Clique na opção "Instances" para acessar a lista de instâncias existentes.
2.1. Na tela que abrir, clique em "Launch Instances" para iniciar o processo de criação de uma nova instância EC2.
Warning
No entanto, é altamente recomendado que você adicione suas próprias tags para facilitar a identificação dos recursos na AWS, especialmente em ambientes de produção.
4.1. Selecionar a AMI (Amazon Machine Image):
- Escolha a imagem Ubuntu Server 24.04 LTS.
Note
A AMI (Amazon Machine Image) é uma imagem pré-configurada que contém o sistema operacional e, opcionalmente, aplicativos necessários para iniciar a instância EC2. O Ubuntu Server foi escolhido devido à sua popularidade, leveza, segurança e suporte comunitário robusto. Além disso, a distribuição Ubuntu é amplamente utilizada em ambientes de produção, o que a torna uma escolha sólida para este projeto.
5.1. Selecionar o Tipo de Instância:
- Escolha t2.micro.
Note
A instância t2.micro é parte do Free Tier da AWS, permitindo que novos usuários utilizem esta instância gratuitamente por até 750 horas mensais. Com 1 vCPU e 1 GiB de memória RAM, essa instância é adequada para rodar um servidor web simples com Nginx e o script de monitoramento. A família T2 também oferece créditos de CPU burstável, permitindo que a instância lide com picos de uso sem impactar o desempenho.
6.1. Selecionar a Key Pair:
- Escolha a Key Pair que foi criada anteriormente.
- No meu caso, escolhi a chave "key-project".
Note
A Key Pair é necessária para acessar a instância via SSH. Sem essa chave, você não conseguirá realizar o login na instância.
7.1. Em Networking settings, clique em "Edit".
7.2. Configure os seguintes parâmetros:
-
VPC: Escolha a VPC criada anteriormente.
- No meu caso, a VPC criada foi "project-vpc".
-
Subnet: Selecione a sub-rede pública correspondente à sua região principal.
Note
A sub-rede pública é fundamental, pois ela garante que sua instância EC2 tenha conectividade externa, o que é essencial para disponibilizar serviços como um servidor web acessível pela internet.
No meu caso, a VPC foi criada nas regiões Virgínia (us-east-1) e Ohio (us-east-2), então escolhi a sub-rede pública de Virgínia: "public1-us-east-1a".
- Auto-assign Public IP: Marque Enable.
Note
Isso atribui um IP público à instância, permitindo que você a acesse via SSH e também a torne acessível externamente (essencial para um servidor web).
7.3. Em Firewall (Security Groups):
- Escolha a opção "Select existing security group".
- Selecione o Security Group criado anteriormente, no meu caso, "security-group-project".
Note
O Security Group age como um firewall virtual, controlando o tráfego de entrada e saída da instância EC2. Ele garante que apenas o tráfego autorizado, como acesso SSH, seja permitido.
7.4. Em Advanced networking configuration, não alterei nada (deixei os valores padrão).
8.1. Em Configure Storage, defina o armazenamento para 1x8 GiB gp3.
Note
A gp3 é uma opção de armazenamento sólido (SSD) com bom custo-benefício, adequada para a maioria dos casos de uso, incluindo servidores web simples.
8.2. Clique em "Launch Instance" para finalizar o processo de criação da instância.
8.3. Aguarde alguns instantes até que a instância esteja ativa.
1.1. Abra o seu WSL e navegue até o diretório onde a chave de acesso (Key Pair) foi armazenada:
Important
Lembre-se de onde você armazenou a chave no começo
No meu caso, foi:
cd /mnt/c/Users/andra/OneDrive/Documentos/Project1-AWS1.2. Liste o conteúdo da pasta para confirmar que a chave está presente:
ls1.3. Copie a chave para o diretório home (usei esse diretório por ser mais fácil localizar, mas pode copiá-la para onde preferir):
cp key-project.pem ~1.4. Volte para o diretório home:
cdOu:
cd ~Note
Prefiro e utilizo o cd por ser mais rápido e dar mais agilidade
1.5. Liste os arquivos para confirmar se a chave foi copiada corretamente:
ls1.6. Verifique as permissões da chave:
ls -lh key-project.pemA saída inicial pode ser algo como:
-rwxr-xr-x 1 root root ...Note
O primeiro caractere indica o tipo: - (arquivo), d (diretório), l (link simbólico).
Os próximos nove caracteres representam permissões em três grupos:
r (read), w (write) e x (execute).
Usuário (dono): rwx (leitura, escrita e execução).
Grupo: r-x (leitura e execução, sem escrita).
Outros: r-x (leitura e execução, sem escrita).
Exemplo: -rwxr-xr-x → É um arquivo onde: O dono pode tudo, o grupo e outros podem ler e executar.
1.7. Ajuste as permissões da chave para garantir segurança na conexão:
chmod 400 key-project.pemNote
Modo numérico (octal):
r = 4, w = 2, x = 1
400 = r
Isso restringe as permissões para que apenas o usuário dono da chave possa lê-la, garantindo maior segurança.
1.8. Verifique novamente as permissões:
ls -lh key-project.pemSaída esperada:
-r-------- 1 root root ...2.1. Acesse o console da AWS e abra o painel de EC2.
2.2. No menu lateral, clique em Instances.
2.3. Selecione a instância criada.
2.4. Na aba Details, copie o Public IPv4 address.
3.1. No WSL, teste a conexão com a porta 22 (SSH) usando telnet:
telnet SEU_IP_AQUI 223.2. Se a conexão for bem-sucedida, aparecerá uma mensagem do tipo:
Connected to SEU_IP_AQUI
3.3. Digite q e pressione Enter para sair.
4.1. Utilize o seguinte comando para conectar-se à instância:
ssh -i key-project.pem ubuntu@SEU_IP_AQUI4.2. Ao conectar pela primeira vez, digite yes para aceitar a chave do servidor.
4.3. Se a conexão for bem-sucedida, a saída incluirá uma mensagem similar a:
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-1021-aws x86_64)
Note
Orientações:
- Personalizar a página com informações sobre o projeto.
- Criar um serviço systemd para garantir que o Nginx reinicie automaticamente se parar
Nesta etapa, vamos configurar um servidor web Nginx para exibir uma página HTML personalizada em nossa instância EC2, com todas as configurações adequadas para servir o conteúdo do site.
1.1. Primeiro, vamos atualizar os pacotes do sistema e instalar o servidor Nginx:
sudo apt update && sudo apt upgrade -yNote
Obs: isso talvez demore um pouco
sudo apt install nginx -y2.1. Após a atualização, verifique se o Nginx foi instalado corretamente:
Important
Resultado esperado: A versão do Nginx instalada será exibida, confirmando que a instalação foi bem-sucedida.
nginx -v2.3. Agora, vamos iniciar o Nginx e verificar se está funcionando corretamente:
sudo systemctl start nginx2.4. Verifique o status do Nginx para garantir que ele está ativo:
sudo systemctl status nginx2.5. Pressione CTRL + C para sair.
Important
Resultado esperado: O Nginx deve estar ativo e em execução.
Eu deixei minha pasta com os arquivos do site na pasta:
/mnt/c/Users/andra/OneDrive/Documentos/Project1-AWS/site-projeto1-compassuol/
Note
Você pode criar o seu site como preferir, mas lembre-se do local onde o guardou.
Important
Também disponibilizei nessa documentação os arquivos que criei na pasta chamada meu-site, que contém o mesmo conteúdo dos resultados apresentados a seguir.
2.1. Abra seu WSL (não é o que tem a instância, é o da sua máquina mesmo.)
scp -i "~/key-project.pem" -r "/mnt/c/Users/andra/OneDrive/Documentos/Project1-AWS/site-projeto1-compassuol/" ubuntu@SEU_IP:/home/ubuntu/Note
Preencha com o caminho onde você guardou a sua chave e onde está o seu site.
Tamém não se esqueça de preencher com o endereço IP da sua instância.
2.2. Volte para o terminal conectado à instância e execute os comando:
Vai mover sua pasta com o site que está na sua máquina para a sua instância:
sudo mv /home/ubuntu/site-projeto1-compassuol/* /var/www/html/Caminhe até a pasta onde você enviou a pasta com os arquivos do site:
cd /var/www/htmlListe para conferir se está lá:
ls3.1. Edite o arquivo de configuração padrão do Nginx para apontar para sua página:
sudo nano /etc/nginx/sites-available/default3.2. Apague o conteúdo existente e substitua pelo seguinte:
server {
listen 80;
server_name localhost; # Nome do servidor (pode ser um domínio ou IP)
root /var/www/html; # Caminho onde os arquivos do site estão armazenados
index index.html;
location / {
try_files $uri $uri/ =404;
}
}3.3. Para salvar e sair do editor nano, pressione CTRL + X, depois Y e ENTER.
3.4. Agora, teste se a configuração do Nginx está correta:
sudo nginx -t3.5. Se não houver erros, reinicie o Nginx para aplicar as alterações:
sudo systemctl restart nginx3.6. Também é possível verificar se a página HTML está sendo servida corretamente utilizando o curl:
curl http://localhost4.1. Agora, você pode acessar sua página web digitando o IP público da sua instância EC2 no navegador,
ou utilizando localhost caso esteja testando localmente.
Se o servidor Nginx estiver em execução corretamente, você verá a página com as informações sobre o projeto.
5.1. Para garantir que o Nginx sempre inicie ao ligar a instância, execute o seguinte comando:
sudo systemctl enable nginxIsso assegura que o serviço seja inicializado automaticamente no boot do sistema.
5.3. Configuração para Reinício Automático do Nginx em Caso de Falha:
- Edite o arquivo de serviço do Nginx:
sudo nano /etc/systemd/system/multi-user.target.wants/nginx.service- Adicione as seguintes linhas à seção
[Service]:
Restart=always
RestartSec=5Note
Restart=always: Garante que o Nginx reinicie sempre que ele falhar.
RestartSec=5: Define o tempo de espera (em segundos) antes de tentar reiniciar o Nginx.
Recarregue o sistema para aplicar as alterações:
sudo systemctl daemon-reload5.4. Teste se a reinicialização automática funcionou simulando uma falha da seguinte maneira:
- Obtenha o ID do processo (PID) do Nginx com o comando:
ps aux | grep nginx- O PID do processo mestre do Nginx será o número exibido antes de
nginx: master process.
Mate o processo do Nginx (simulando uma falha) com o comando:
sudo kill -9 <PID>Note
O comando kill -9 é usado em sistemas Unix/Linux para forçar o encerramento de um processo.
kill: É um comando utilizado para enviar sinais a processos. Por padrão, o comando envia o sinal SIGTERM (sinal 15), que solicita que o processo termine de maneira graciosa, permitindo que ele faça a limpeza de recursos e finalize suas atividades.
-9: Representa o sinal SIGKILL (sinal 9), que é um sinal mais forte e imediato. Ele força a finalização do processo sem dar a chance de o processo realizar qualquer tipo de limpeza. Isso significa que o processo será encerrado imediatamente, sem aviso ou chance de salvar dados.
- Substitua
<PID>pelo ID do processo mestre do Nginx. - Verifique o status do Nginx:
sudo systemctl status nginxEnquanto isso, a página HTML ficará fora do ar. Assim que a reinicialização estiver completa, o Nginx voltará a ficar ativo e a página HTML será exibida novamente.
Note
Usar curl no Bash ou requests no Python para testar a resposta do site
Configurar um bot do Telegram ou webhook do Discord/Slack para receber alertas
Abra o Telegram e pesquise por BotFather e clique nele:
- Dê um
/newbotpara criar um novo bot - Escolha um nome para o bot, no meu caso
teste - Escolha um username pro seu bot (tem que terminar com
_bot).- No meu caso
exemploTestePB2503_bot
- No meu caso
- Ele vai te mandar uma mensagem e você vai clicar nesse link com a setinha:
Warning
to access the HTTP API, no meu caso, está borrado por
segurança.
Clique em Start:
Instale o utilitário jq (para manipular JSON):
sudo apt install jq -yFaz uma requisição à API do Telegram para obter atualizações do bot e formata a resposta JSON usando jq:
curl https://api.telegram.org/botSEU_TOKEN/getUpdates | jqSua mensagem pode sair algo tipo:
{ "ok":true, "result":[] }
Mande uma mensagem de teste para iniciar o chat do seu bot:
Volte para o terminal e execute novamente o comando:
curl https://api.telegram.org/botSEU_TOKEN/getUpdates | jq
Agora nessa saída aparecerá o chat_id (apontado com a setinha):
Warning
no meu caso está borrado por segurança.
Criando a pasta monitoramento dentro de /var/log
sudo mkdir -p /var/log/monitoramentoCriando os três arquivos de log:
- Arquivo
servico_online.log: - Arquivo
servico_offline.log: - Arquivo
geral.log:
sudo touch /var/log/monitoramento/servico_online.log /var/log/monitoramento/servico_offline.log /var/log/monitoramento/geral.logListando os arquivos dentro do diretório /var/log/monitoramento para verificar se eles existem.
ls -l /var/log/monitoramento/Mudando a propriedade dos arquivos e pastas para o usuário atual.
sudo chmod -R 755 /var/log/monitoramentoNote
Altera as permissões para garantir que você tenha permissão para ler, escrever e executar arquivos nessa pasta, enquanto outros usuários podem apenas ler e executar.
r = 4, w = 2, x = 1
7 = 4 + 2 + 1 = rwx
5 = 4 + 1 = r-x
Permissão de leitura e escrita e execução para propritário
Permissão de leitura e execução para grupo e outros
Verifique novamente os arquivos e permissões:
ls -l /var/log/monitoramento/Mude também a permissão dos arquivos:
sudo chmod 666 /var/log/monitoramento/geral.log /var/log/monitoramento/servico_online.log /var/log/monitoramento/servico_offline.logNote
r = 4, w = 2, x = 1
6 = 4 + 2 = rw-
Permissão de leitura e escrita para propritário, grupo e outros
Criando a pasta onde você armazenará os scripts de monitoramento: /usr/local/bin/monitoramento/scripts
sudo mkdir -p /usr/local/bin/monitoramento/scriptsCriando o arquivo de script monitorar_site.sh.
sudo nano /usr/local/bin/monitoramento/scripts/monitorar_site.sh🦘 Pular para o fim da Explicação
Script que verifica se o serviço está online ou offline e grava a informação no log:
Abra com Ctrl + Clique: 📎 Arquivo Script
Important
O código completo está nesse link, eu vou colocar todo o código abaixo, mas explicando cada detalhe. Então se quiser copiar ou baixar, abra o link.
#!/usr/bin/env bash
# Defina as variáveis de configuração
BOT_TOKEN="" # PREENCHA AQUI O TOKEN GERADO PELO BOT
CHAT_ID="" # PREENCHA SEU CHAT_ID
LOGS="/var/log/monitoramento/geral.log"
LOG_ONLINE="/var/log/monitoramento/servico_online.log"
LOG_OFFLINE="/var/log/monitoramento/servico_offline.log"- Shebang
#!/usr/bin/env bash
- Isso define qual interpretador será usado para executar o script.
- Neste caso, ele usa
bash, e o comandoenvgarante que o shell correto seja encontrado no ambiente, independentemente do caminho exato dobashno sistema.
- Definição das
variáveis de configuração. O script define algumas variáveis importantes que serão usadas mais tarde.
BOT_TOKEN: Token de autenticação do bot no Telegram (fornecido pelo BotFather).CHAT_ID: ID do chat ou grupo onde os alertas serão enviados. (obtido pelo arquivo json utilizando jq)
Se esses valores não forem preenchidos corretamente, o script não conseguirá enviar mensagens para o Telegram.
LOGS: Arquivo principal de log, onde todas as verificações serão registradas.LOG_ONLINE: Guarda apenas os registros quando o site estiver online.LOG_OFFLINE: Guarda apenas os registros quando o site estiver offline.
Esses arquivos serão criados automaticamente se não existirem.
# Defina as variáveis de cor
COR_OK="\033[32m"
COR_ALERTA="\033[31m"
COR_INFO="\033[34m"
COR_RESET="\033[0m"
# Função para verificar se o token e chat_id estão preenchidos corretamente
verificar_configuracao() {
if [ -z "$BOT_TOKEN" ] || [ -z "$CHAT_ID" ] || [ "$BOT_TOKEN" == "PREENCHA AQUI O TOKEN GERADO PELO BOT" ] || [ "$CHAT_ID" == "PREENCHA SEU CHAT_ID" ]; then
echo -e "${COR_ALERTA}⛔ Erro: BOT_TOKEN ou CHAT_ID não estão preenchidos corretamente.${COR_RESET}"
exit 1
fi
}- Definição das
Variáveis de Cor
Essas variáveis são códigos de escape ANSI que definem cores para exibir mensagens coloridas no terminal.
Cada uma representa uma cor diferente:
COR_OK="\033[32m"→ Verde (usado para mensagens de sucesso ✅)COR_ALERTA="\033[31m"→ Vermelho (usado para erros⚠️ )COR_INFO="\033[34m"→ Azul (usado para informações ℹ️)COR_RESET="\033[0m"→ Restaura a cor original do terminal
Exemplo de uso:
echo -e "${COR_OK}Tudo certo!${COR_RESET}"A razão para usar duas variáveis de cor (${COR_OK} e ${COR_RESET}) é garantir que somente o texto desejado fique colorido, sem afetar o restante do terminal.
${COR_OK} → Muda a cor do texto para verde (\033[32m).
"Tudo certo!" → Essa string será exibida na cor verde.
${COR_RESET} → Restaura a cor padrão do terminal (\033[0m), garantindo que qualquer texto exibido depois volte à cor original.
- Função
verificar_configuracao()
🔍 O que essa função faz?
- Verifica se as variáveis
BOT_TOKENeCHAT_IDestão preenchidas corretamente. - Se alguma delas estiver vazia (
-z "$VARIAVEL"verifica se a variável está vazia) ou ainda contiver o valor padrão (PREENCHA AQUI O TOKEN GERADO PELO BOT), significa que o usuário esqueceu de configurar as credenciais. - Nesse caso, o script exibe uma mensagem de erro em vermelho (
COR_ALERTA) e finaliza a execução comexit 1.
Esse erro impede que o script continue, garantindo que as credenciais estejam corretas antes de tentar enviar mensagens.
# Função para verificar a conexão com a API do Telegram
verificar_conexao_telegram() {
local TESTE_CONEXAO=$(curl -s -o /dev/null -w "%{http_code}" "https://api.telegram.org/bot$BOT_TOKEN/getMe")
if [ "$TESTE_CONEXAO" != "200" ]; then
echo -e "${COR_ALERTA}⛔ Erro: Não foi possível conectar à API do Telegram. Verifique o BOT_TOKEN.${COR_RESET}"
exit 1
fi
}
criar_pastas_arquivos() {
for log_file in "$LOGS" "$LOG_ONLINE" "$LOG_OFFLINE"; do
if [ ! -e "$log_file" ]; then
dir_name=$(dirname "$log_file")
if [ ! -d "$dir_name" ]; then
echo "⚠️ Diretório ausente: $dir_name"
mkdir -p "$dir_name"
echo "✅ Diretório criado: $dir_name"
fi
echo "⚠️ Arquivo ausente: $log_file"
touch "$log_file"
echo "✅ Arquivo criado: $log_file"
fi
done
}Essa função verifica se a conexão com a API do Telegram está funcionando corretamente.
📌 Passo a passo:
curl -s -o /dev/null -w "%{http_code}"→ Faz uma requisição HTTP para a API do Telegram sem exibir a saída no terminal.-s→ Modo silencioso (sem exibir detalhes).-o /dev/null→ Descarta a resposta da API, já que só queremos o código HTTP.-w "%{http_code}"→ Exibe apenas o código de resposta HTTP.
- Se o código for diferente de 200, significa que a API não respondeu corretamente.
- Exibe uma mensagem de erro em vermelho (
${COR_ALERTA}). - Sai do script (
exit 1), impedindo que ele continue.
- Exibe uma mensagem de erro em vermelho (
🔹 Objetivo: Garantir que o BOT_TOKEN seja válido antes de seguir para outras etapas.
Essa função garante que os diretórios e arquivos de log existam antes de serem usados.
📌 Passo a passo:
-
Loop sobre os arquivos de log
-
$LOGS,$LOG_ONLINEe$LOG_OFFLINEsão verificados um por um.
-
-
Verifica se o arquivo existe (
! -e "$log_file")- Se não existir, continua a execução.
-
Obtém o diretório do arquivo
-
dirname "$log_file"pega apenas o caminho do diretório (sem o nome do arquivo).
-
-
Verifica se o diretório existe (
! -d "$dir_name")- Se não existir, exibe uma mensagem
⚠️ e cria o diretório commkdir -p.
- Se não existir, exibe uma mensagem
-
Cria o arquivo de log se necessário
- Se o arquivo de log não existir, ele é criado com
touch "$log_file".
- Se o arquivo de log não existir, ele é criado com
🔹 Objetivo:
- Evitar erros por falta de arquivos ou diretórios.
- Criar os arquivos/diretórios dinamicamente, garantindo que o script rode sem problemas.
# Função para enviar alerta para o Telegram
enviar_alerta() {
local MENSAGEM="$1"
echo -e "${COR_INFO}🔔 Enviando alerta para o Telegram...${COR_RESET}"
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID" \
-d "text=$MENSAGEM" > /dev/null 2>&1
}Esse bloco contém a função enviar_alerta, que é responsável por enviar mensagens de alerta para um chat no Telegram.
📌 Passo a passo:
-
local MENSAGEM="$1"- O primeiro argumento passado para a função (
$1) é armazenado na variávelMENSAGEM. Essa será a mensagem que será enviada para o Telegram.
- O primeiro argumento passado para a função (
-
echo -e "${COR_INFO}🔔 Enviando alerta para o Telegram...${COR_RESET}"- Antes de enviar a mensagem, a função exibe uma mensagem de status informando que o alerta está sendo enviado para o Telegram.
- A cor da mensagem é azul (definido por
${COR_INFO}), e o reset de cor é feito no final com${COR_RESET}.
-
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage"- Utiliza o
curlpara fazer uma requisiçãoPOSTpara a API do Telegram. - O
-sfaz com que ocurlrode de forma silenciosa (sem mostrar detalhes da requisição).
- Utiliza o
-
Parâmetros da requisição:
-
-d "chat_id=$CHAT_ID": Envia o ID do chat para o qual a mensagem será enviada. -
-d "text=$MENSAGEM": Envia o texto da mensagem (definido pela variávelMENSAGEM).
-
-
> /dev/null 2>&1- Essa parte redireciona a saída da requisição para
/dev/null, ou seja, descarta qualquer saída ou erro gerado pela requisição docurl.
- Essa parte redireciona a saída da requisição para
🔹 Objetivo:
Enviar um alerta para o Telegram no chat definido, com a mensagem fornecida à função.
# Função para verificar o status do site
verificar_status_site() {
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost)
TIME_VIRGINIA=$(TZ="America/New_York" date "+%d-%m-%Y %H:%M:%S") # Hora em Virginia
TIME_BRASIL=$(TZ="America/Sao_Paulo" date "+%d-%m-%Y %H:%M:%S") # Hora no Brasil
case $STATUS in
200)
SITE_STATUS="✅ O site está ONLINE!"
# Registro no log de online com cor
echo -e "${COR_OK}$TIME_VIRGINIA (Virginia) | $TIME_BRASIL (Brasil) - $SITE_STATUS${COR_RESET}" >> "$LOG_ONLINE"
# Registro no log geral com cor
echo -e "${COR_OK}$TIME_VIRGINIA (Virginia) | $TIME_BRASIL (Brasil) - $SITE_STATUS${COR_RESET}" >> "$LOGS"
;;
*)
SITE_STATUS="⛔ O serviço está OFFLINE! Status: $STATUS"
# Registro no log de offline com cor
echo -e "${COR_ALERTA}$TIME_VIRGINIA (Virginia) | $TIME_BRASIL (Brasil) - $SITE_STATUS${COR_RESET}" >> "$LOG_OFFLINE"
# Registro no log geral com cor
echo -e "${COR_ALERTA}$TIME_VIRGINIA (Virginia) | $TIME_BRASIL (Brasil) - $SITE_STATUS${COR_RESET}" >> "$LOGS"
;;
esac
}Esse bloco define a função verificar_status_site, responsável por verificar o status de um site e registrar as informações de status e tempo nos logs.
📌 Passo a passo:
-
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost)- O comando
curlverifica a resposta do site no endereçohttp://localhost. - O parâmetro
-ssilencia a saída, enquanto-o /dev/nulldescarta o conteúdo do site. - A opção
-w "%{http_code}"faz com que ocurlretorne apenas o código HTTP da resposta (por exemplo,200para sucesso ou outros códigos de erro).
- O comando
-
TIME_VIRGINIA=$(TZ="America/New_York" date "+%d-%m-%Y %H:%M:%S")- Obtém a hora atual no formato
dd-mm-yyyy hh:mm:ssno fuso horário de Nova Iorque (EUA), definindo oTZpara o fuso horário de Nova Iorque.
- Obtém a hora atual no formato
-
TIME_BRASIL=$(TZ="America/Sao_Paulo" date "+%d-%m-%Y %H:%M:%S")- Obtém a hora atual no formato
dd-mm-yyyy hh:mm:ssno fuso horário de São Paulo (Brasil), definindo oTZpara o fuso horário de São Paulo.
- Obtém a hora atual no formato
-
case $STATUS in- A estrutura
caseverifica o código de status HTTP recebido.
- A estrutura
-
Se o status for
200(site online):- Define a variável
SITE_STATUS="✅ O site está ONLINE!". - Registra a mensagem nos logs de "online" e "geral", incluindo a hora de Virgínia e Brasil, com cor verde definida pela variável
${COR_OK}.
- Define a variável
-
Se o status for diferente de
200(site offline ou erro):- Define a variável
SITE_STATUS="⛔ O serviço está OFFLINE! Status: $STATUS", onde o código de status é mostrado.
- Define a variável
Note
Esses status são códigos de resposta que o servidor envia para indicar o resultado de uma requisição HTTP.
- Registra a mensagem nos logs de "offline" e "geral", com cor vermelha (alerta) definida por
${COR_ALERTA}.
✔ verificar_status_site → Verifica o status do site localhost, obtém as horas em Virgínia e Brasil, e registra o status nos logs de online ou offline.
- Se o status for
200, o site está online e a mensagem é registrada em verde. - Se o status for outro código, o site está offline e a mensagem é registrada em vermelho.
- A data e a hora são registradas tanto em Virgínia quanto no Brasil.
Esse bloco funciona para monitorar a disponibilidade de um site e manter um histórico no formato de logs!
verificar_portas() {
# Verifica a porta 80 (HTTP)
if nc -zv 127.0.0.1 80 &> /dev/null; then
PORTA_80="✅ Porta 80 (HTTP) está FUNCIONANDO"
else
PORTA_80="⛔ Porta 80 (HTTP) está INDISPONÍVEL"
fi
# Verifica a porta 443 (HTTPS)
if nc -zv 127.0.0.1 443 &> /dev/null; then
PORTA_443="✅ Porta 443 (HTTPS) está FUNCIONANDO"
else
PORTA_443="⛔ Porta 443 (HTTPS) está INDISPONÍVEL"
fi
}📌 Passo a passo:
-
nc -zv 127.0.0.1 80 &> /dev/null- O comando
nc(Netcat) é usado para verificar se a porta 80 (HTTP) está aberta e acessível na máquina local (127.0.0.1). - O parâmetro
-zverifica se a porta está aberta, e-vtorna a execução mais verbosa. A saída é redirecionada para/dev/nullpara não mostrar nada no terminal.
- O comando
-
Estrutura de verificação:
- Se a porta 80 estiver aberta, a variável
PORTA_80é definida com a mensagem "✅ Porta 80 (HTTP) está FUNCIONANDO". - Caso contrário, é definida como "⛔ Porta 80 (HTTP) está INDISPONÍVEL".
- Se a porta 80 estiver aberta, a variável
-
O mesmo processo é feito para a porta 443 (HTTPS):
- Verifica se a porta 443 está aberta e acessível.
- Dependendo do resultado, a variável
PORTA_443é atualizada com a mensagem correspondente.
reiniciar_nginx() {
if ! sudo systemctl is-active --quiet nginx; then
NGINX_STATUS="⛔ Nginx está INATIVO ou com problema!"
# Tenta reiniciar o Nginx
echo -e "${COR_INFO}🔄 Tentando reiniciar o Nginx...${COR_RESET}"
if sudo systemctl restart nginx > /dev/null 2>&1; then
NGINX_REINICIADO="✅ Nginx foi REINICIADO com SUCESSO!"
verificar_portas # Verifica as portas novamente após reiniciar
verificar_status_site # Verifica o status do site novamente após reiniciar
else
NGINX_REINICIADO="⛔ Não foi possível reiniciar o Nginx!"
fi
else
NGINX_STATUS="✅ Nginx está ATIVO e funcionando!"
NGINX_REINICIADO="😁 Não foi necessário reiniciar o Nginx."
fi
}📌 Passo a passo:
-
Verificar se o Nginx está ativo:
if ! sudo systemctl is-active --quiet nginx:- Verifica se o serviço do Nginx está ativo. O comando
systemctl is-active --quiet nginxretorna um status silencioso. - Se o serviço não estiver ativo, o comando dentro do
ifé executado.
- Verifica se o serviço do Nginx está ativo. O comando
-
Se o Nginx estiver inativo ou com problema:
- Define a variável
NGINX_STATUS="⛔ Nginx está INATIVO ou com problema!". - Em seguida, tenta reiniciar o Nginx com o comando
sudo systemctl restart nginx. - Se o reinício for bem-sucedido, a variável
NGINX_REINICIADOé atualizada para "✅ Nginx foi REINICIADO com SUCESSO!".- Após o reinício, as funções
verificar_portaseverificar_status_sitesão chamadas novamente para garantir que as portas e o site estejam funcionando corretamente.
- Após o reinício, as funções
- Define a variável
-
Se o Nginx já estiver ativo:
- Caso o Nginx esteja ativo, a variável
NGINX_STATUSé definida como "✅ Nginx está ATIVO e funcionando!". - A variável
NGINX_REINICIADOé atualizada para "😁 Não foi necessário reiniciar o Nginx.".
- Caso o Nginx esteja ativo, a variável
Essa função garante que o serviço do Nginx esteja sempre funcionando corretamente e, se necessário, tenta reiniciar o serviço para restaurar a funcionalidade.
Essas funções ajudam a manter a infraestrutura web operando corretamente, reiniciando o Nginx e verificando o estado das portas.
verificar_status_nginx() {
NGINX_STATUS=""
reiniciar_nginx
}📌 Passo a passo:
- Objetivo: A função
verificar_status_nginxchama a funçãoreiniciar_nginxpara garantir que o status do serviço do Nginx seja verificado e, caso necessário, reiniciado. - Variável
NGINX_STATUS:- A variável
NGINX_STATUSé inicialmente limpa para garantir que o status mais recente seja exibido.
- A variável
- Chamada de função:
- A função
reiniciar_nginxé chamada para:- Verificar se o Nginx está ativo ou não.
- Tentar reiniciar o serviço caso esteja inativo ou com problema.
- Realizar verificações posteriores de status do site e das portas.
- A função
exibir_saida_terminal() {
echo -e "${COR_INFO}🕒 Data e Hora (Virginia): $TIME_VIRGINIA | Data e Hora (Brasil): $TIME_BRASIL${COR_RESET}"
echo -e "${COR_INFO}\n⚙️ Status das Portas:${COR_RESET}"
echo -e "$PORTA_80"
echo -e "$PORTA_443"
echo -e "${COR_INFO}\n🔧 Status do Nginx:${COR_RESET}"
echo -e "$NGINX_STATUS"
echo -e "${COR_INFO}\n🔄 Reinício do Nginx:${COR_RESET}"
echo -e "$NGINX_REINICIADO"
echo -e "${COR_INFO}\n🌐 Status do Site:${COR_RESET}"
echo -e "$SITE_STATUS"
echo -e "${COR_INFO}\n📂 Logs:${COR_RESET}"
echo -e "- Geral: $LOGS"
echo -e "- Online: $LOG_ONLINE"
echo -e "- Offline: $LOG_OFFLINE"
echo -e "${COR_INFO}🎉 Script executado com SUCESSO! Veja os logs para mais detalhes.${COR_RESET}"
}📌 Passo a passo:
-
Exibição da Data e Hora:
- Exibe as datas e horas atuais em Virginia e no Brasil.
- Utiliza as variáveis
TIME_VIRGINIAeTIME_BRASILque são formatadas anteriormente.
-
Status das Portas:
- Exibe o status das portas 80 (HTTP) e 443 (HTTPS), armazenados nas variáveis
PORTA_80ePORTA_443. - A função
verificar_portasé chamada anteriormente para definir essas variáveis.
- Exibe o status das portas 80 (HTTP) e 443 (HTTPS), armazenados nas variáveis
-
Status do Nginx:
- Exibe o status do Nginx, armazenado na variável
NGINX_STATUS. - Esta variável é atualizada com base na verificação feita pela função
reiniciar_nginx.
- Exibe o status do Nginx, armazenado na variável
-
Reinício do Nginx:
- Exibe o status do reinício do Nginx, com base na variável
NGINX_REINICIADO. - Essa variável é definida dentro da função
reiniciar_nginx, dependendo de o Nginx ter sido ou não reiniciado com sucesso.
- Exibe o status do reinício do Nginx, com base na variável
-
Status do Site:
- Exibe o status do site, armazenado na variável
SITE_STATUS. - Essa variável é preenchida pela função
verificar_status_site.
- Exibe o status do site, armazenado na variável
-
Logs:
- Exibe os caminhos para os arquivos de log, utilizando as variáveis
LOGS,LOG_ONLINE, eLOG_OFFLINE.
- Exibe os caminhos para os arquivos de log, utilizando as variáveis
-
Mensagem de Sucesso:
- Exibe uma mensagem indicando que o script foi executado com sucesso e sugere verificar os logs para mais detalhes.
executar_script() {
verificar_configuracao
verificar_conexao_telegram
criar_pastas_arquivos
verificar_status_site
verificar_portas
verificar_status_nginx
}📌 Passo a passo:
-
Objetivo: A função
executar_scriptchama todas as funções anteriores em sequência para realizar a execução completa do processo de verificação e configuração.- Funções chamadas:
verificar_configuracao: Verifica a configuração do ambiente.verificar_conexao_telegram: Verifica a conexão com a API do Telegram.criar_pastas_arquivos: Cria os diretórios e arquivos de log necessários, caso não existam.verificar_status_site: Verifica o status do site.verificar_portas: Verifica o status das portas 80 (HTTP) e 443 (HTTPS).verificar_status_nginx: Verifica o status do serviço Nginx.
- Funções chamadas:
# Chama a função principal para executar o script
executar_script📌 Objetivo: A linha abaixo chama a função executar_script, iniciando o processo completo de verificação e configuração do sistema. Ao ser executada, todas as funções dentro da executar_script serão acionadas sequencialmente.
MENSAGEM="
🕒 Hora (Virginia): $TIME_VIRGINIA
🕒 Hora (Brasil): $TIME_BRASIL
⚙️ Status das Portas:
$PORTA_80
$PORTA_443
🔧 Status do Nginx:
$NGINX_STATUS
🔄 Reinício do Nginx:
$NGINX_REINICIADO
🌐 Status do Site:
$SITE_STATUS
📂 Logs:
- Geral: $LOGS
- Online: $LOG_ONLINE
- Offline: $LOG_OFFLINE
🎉 Script executado com SUCESSO!
"📌 Passo a passo:
-
Objetivo: Aqui, uma mensagem consolidada é criada para enviar ao Telegram.
-
Variáveis utilizadas:
-
$TIME_VIRGINIAe$TIME_BRASIL: Exibem as horas de Virgínia e Brasil, respectivamente. -
$PORTA_80e$PORTA_443: Exibem o status das portas 80 (HTTP) e 443 (HTTPS). -
$NGINX_STATUS: Exibe o status atual do Nginx. -
$NGINX_REINICIADO: Exibe o status de reinício do Nginx. -
$SITE_STATUS: Exibe o status do site. -
$LOGS,$LOG_ONLINE,$LOG_OFFLINE: Exibem os caminhos dos arquivos de log.
O texto é formatado com emojis e informações para facilitar a leitura do alerta enviado.
-
# Enviar a mensagem consolidada para o Telegram
enviar_alerta "$MENSAGEM"📌 Objetivo: Aqui, a função enviar_alerta é chamada para enviar a mensagem consolidada ao Telegram. A variável $MENSAGEM criada anteriormente é passada como parâmetro para essa função.
# Exibe as informações no terminal
exibir_saida_terminal📌 Objetivo: Após enviar o alerta para o Telegram, a função exibir_saida_terminal é chamada para exibir as informações no terminal de forma organizada e detalhada. Essa função mostrará todas as informações de status e log geradas durante a execução do script (apenas caso ele seja executado manualmente).
Esse bloco finaliza o processo, garantindo que a execução do script seja concluída com sucesso e que o usuário seja notificado tanto no terminal quanto no Telegram.
verificar_configuracao: Verifica se as variáveis essenciais (BOT_TOKEN e CHAT_ID) estão corretamente preenchidas.
verificar_conexao_telegram: Verifica a conexão com a API do Telegram para garantir que o BOT_TOKEN esteja correto e funcionando.
criar_pastas_arquivos: Cria os diretórios e arquivos de log necessários, caso não existam, para garantir o funcionamento adequado do sistema de logs.
enviar_alerta: Envia uma mensagem de alerta para o Telegram, com base no conteúdo especificado.
verificar_status_site: Verifica o status do site (código HTTP) e registra o resultado nos logs, indicando se o site está online ou offline.
verificar_portas: Verifica se as portas 80 (HTTP) e 443 (HTTPS) estão abertas e funcionando corretamente no servidor.
reiniciar_nginx: Verifica o status do Nginx e, caso esteja inativo, tenta reiniciá-lo, verificando novamente o status das portas e do site.
verificar_status_nginx: Verifica o status do Nginx e executa a função reiniciar_nginx se necessário.
exibir_saida_terminal: Exibe no terminal as informações organizadas sobre o status das portas, Nginx, site e logs.
executar_script: Chama todas as funções necessárias para executar o processo completo de verificação e monitoramento.
MENSAGEM: Cria uma mensagem com informações detalhadas sobre o status do sistema, como as portas, o Nginx, o site e os logs, para envio ao Telegram.
enviar_alerta: Envia a mensagem consolidada (gerada pela variável MENSAGEM) para o Telegram.
exibir_saida_terminal: Exibe as informações consolidadas no terminal, incluindo status das portas, do Nginx, do site e dos logs.
sudo chmod +x /usr/local/bin/monitoramento/scripts/monitorar_site.shNote
O comando sudo chmod +x /usr/local/bin/monitoramento/scripts/monitorar_site.sh torna o script monitorar_site.sh executável, concedendo permissão de execução (+x) ao arquivo.
Chame o script para testar:
sudo /usr/local/bin/monitoramento/scripts/monitorar_site.shNote
Dá para ver que o script funciona corretamente e que o Telegram notifica.
sudo apt install cron -yNote
O cron é uma ferramenta no Linux usada para agendar a execução automática de tarefas ou comandos em horários específicos ou intervalos regulares, como backups, atualizações ou scripts, sem a necessidade de intervenção manual.
Após a instalação, inicie e habilite o serviço do cron para que ele inicie automaticamente com o sistema:
sudo systemctl enable cronVerifique se está funcionando corretamente:
sudo systemctl status cronEdite o arquivo crontab para adicionar o agendamento de execução do script a cada minuto:
crontab -eNote
O comando crontab -e abre o editor de texto para editar o arquivo de agendamentos de tarefas (crontab) do usuário atual, permitindo adicionar, remover ou modificar tarefas agendadas para execução automática.
Vai aparecer uma mensagem. Você digitará 1 e irá apertar enter:
Adicione a seguinte linha para rodar o script a cada 5 minutos (ajuste conforme sua necessidade):
*/1 * * * * /usr/local/bin/monitoramento/scripts/monitorar_site.shNote
O comando */1 * * * * /usr/local/bin/monitoramento/scripts/monitorar_site.sh agenda a execução do script
monitorar_site.sh a cada 1 minuto.
Para salvar e sair do editor nano, pressione CTRL + X, depois Y e ENTER.
Warning
Agora que as configurações já foram feitas, podemos deixar o aberto para todos.
Na página da AWS pesquise por security groups, clique no que
você criou para esse projeto, depois clique com o botão direito e selecione a opção Edite inbound rules
No HTTP vc vai mudar para Anywhere iPv4 e salvar a mudança.
Agora tente acessar, por exemplo, do seu celular, abrindo o navegador e digitando:
http://IP_DA_INSTANCIA
Note
Obs: O Script já está automatizado, eu só chamei o arquivo de monitoramento do script para poder tirar os prints das telas de forma mais rápida e não ter que ficar esperando 1 minuto todas as vezes.
Se você fizer esses passos e quiser ver a automação, é só esperar 1 minuto em cada teste.
Após isso, parei o serviço para testar:
tail -f /var/log/monitoramento/geral.log🦘 Pular para o fim da Explicação
Abra com Ctrl + Clique: 📎 Arquivo UserData
Important
O código completo está nesse link, eu vou colocar todo o código abaixo, mas explicando cada detalhe. Então se quiser copiar ou baixar, abra o link.
O script userdata descrito é utilizado para configurar um servidor Linux (Ubuntu) com Nginx e preparar a infraestrutura para monitoramento de um site.
sudo apt update && sudo apt upgrade -y- Objetivo: Atualiza a lista de pacotes disponíveis (
apt update) e instala as atualizações de pacotes (apt upgrade -y) para garantir que o sistema esteja com as versões mais recentes de todos os pacotes.
sudo apt install nginx -y- Objetivo: Instala o servidor web Nginx no sistema. O
-ypermite que a instalação seja realizada sem solicitar confirmação.
sudo systemctl start nginx- Objetivo: Inicia o serviço Nginx, permitindo que ele comece a responder às requisições HTTP.
cd /tmp
git init
git remote add origin https://github.com/andrrade/Project1-CompassUOL-DevSecOps.git
git config core.sparseCheckout true- Objetivo: Prepara o ambiente para fazer o sparse-checkout, uma técnica que permite fazer o download de uma parte específica de um repositório Git, em vez de todo o repositório.
git init: Inicializa um repositório Git local.git remote add origin: Adiciona o repositório remoto do GitHub.git config core.sparseCheckout true: Habilita o sparse-checkout.
echo "meu-site/*" >> .git/info/sparse-checkout- Objetivo: Especifica que o conteúdo dentro do diretório
meu-site/deve ser baixado do repositório Git.
git pull origin main- Objetivo: Baixa os arquivos da branch
maindo repositório Git e os coloca no diretório local do repositório.
sudo mv /tmp/meu-site/* /var/www/html/- Objetivo: Move os arquivos do diretório
meu-site/(baixados do repositório) para o diretório padrão do Nginx (/var/www/html/), onde os arquivos de site são armazenados.
sudo nano /etc/nginx/sites-available/default <<EOF
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.html;
location / {
try_files \$uri \$uri/ =404;
}
}
EOF- Objetivo: Configura o Nginx para servir o conteúdo do diretório
/var/www/html/, incluindo a configuração de escuta na porta 80 e a tentativa de resolver arquivos e diretórios solicitados.
sudo systemctl restart nginx- Objetivo: Reinicia o serviço Nginx para aplicar as novas configurações feitas no arquivo de configuração.
sudo systemctl enable nginx- Objetivo: Configura o Nginx para iniciar automaticamente sempre que o sistema for reiniciado.
sudo nano /etc/systemd/system/multi-user.target.wants/nginx.service <<EOF
[Service]
Restart=always
RestartSec=5
EOF- Objetivo: Configura o Nginx para reiniciar automaticamente caso ocorra uma falha. O parâmetro
RestartSec=5define um intervalo de 30 segundos antes da tentativa de reinício.
sudo systemctl daemon-reload- Objetivo: Atualiza o sistema de serviços para que ele reconheça as novas configurações do Nginx.
sudo mkdir -p /var/log/monitoramento
sudo touch /var/log/monitoramento/servico_online.log /var/log/monitoramento/servico_offline.log /var/log/monitoramento/geral.log- Objetivo: Cria diretórios e arquivos de log necessários para monitoramento do serviço, como logs de status online e offline do site.
sudo chmod -R 755 /var/log/monitoramento
sudo chmod 666 /var/log/monitoramento/geral.log /var/log/monitoramento/servico_online.log /var/log/monitoramento/servico_offline.log- Objetivo: Ajusta as permissões dos diretórios e arquivos de log para garantir que o sistema possa escrever nesses arquivos.
sudo mkdir -p /usr/local/bin/monitoramento/scripts- Objetivo: Cria um diretório onde scripts de monitoramento serão armazenados.
cd /tmp
curl -o /usr/local/bin/monitoramento/scripts/monitorar_site.sh https://raw.githubusercontent.com/andrrade/Project1-CompassUOL-DevSecOps/main/monitorar_site.sh- Objetivo: Baixa o script de monitoramento a partir do repositório GitHub e o salva no diretório
/usr/local/bin/monitoramento/scripts/.
sudo chmod +x /usr/local/bin/monitoramento/scripts/monitorar_site.sh- Objetivo: Torna o script de monitoramento executável.
sudo apt install cron -y- Objetivo: Instala o serviço de agendamento de tarefas
cronno sistema, permitindo agendar a execução de tarefas repetitivas.
sudo systemctl enable cron- Objetivo: Configura o cron para iniciar automaticamente quando o sistema for reiniciado.
echo "*/1 * * * * /usr/local/bin/monitoramento/scripts/monitorar_site.sh" | sudo crontab -- Objetivo: Configura o cron para executar o script de monitoramento a cada 1 minuto.
echo "Configuração completa. O servidor está pronto."- Objetivo: Exibe uma mensagem de conclusão informando que a configuração foi realizada com sucesso e o servidor está pronto.
Na hora que você estiver criando a instância EC2, a Última opção será Advanced details.
Abra essa opção:
Vá até o final dela e escolha subir um arquivo ou colar ele, e está pronto, é só criar a instância.
Warning
-
Configuração do Security Group:
- Ao criar o Security Group, configure a regra HTTP para permitir acesso de qualquer IP (
0.0.0.0/0).
- Ao criar o Security Group, configure a regra HTTP para permitir acesso de qualquer IP (
-
Seguir a Documentação:
- Execute o passo a passo da documentação, mas pare antes da Etapa 2, pois a partir desse ponto, o processo é automatizado com o uso do
UserData.
- Execute o passo a passo da documentação, mas pare antes da Etapa 2, pois a partir desse ponto, o processo é automatizado com o uso do
-
Criação do Bot do Telegram:
- Execute os passos para criar o bot do Telegram.
-
Acessar a Instância e Configurar o Script:
-
Acesse a instância pelo terminal e edite o script de monitoramento:
sudo nano /usr/local/bin/monitoramento/scripts/monitorar_site.sh
-
Preencha as variáveis
BOT_TOKENeCHAT_IDcom seus dados.
-
-
Testar o Script:
-
Você pode aguardar o script rodar automaticamente, já que ele está configurado para ser executado automaticamente.
-
Para testar manualmente, execute o seguinte comando:
sudo /usr/local/bin/monitoramento/scripts/monitorar_site.sh
-
Gostei bastante de participar do Projeto 1 da trilha! Foi uma experiência bastante desafiadora, mas extremamente gratificante. Durante o projeto, tive a oportunidade de aprender muitas coisas novas, especialmente sobre a configuração de servidores, monitoramento e automação de processos, que eram áreas com as quais eu ainda não tinha muita familiaridade.
O projeto me incentivou a estudar mais e a buscar entender cada detalhe do processo. Cada desafio foi uma oportunidade de aprofundar meu conhecimento e de aplicar novas habilidades de forma prática. Também percebi como a documentação é essencial, então me dediquei a detalhar cada passo do processo para garantir que tudo fosse bem compreendido, tanto por mim quanto por outras pessoas que possam acompanhar o projeto no futuro. Detalhar cada etapa me ajudou a consolidar o que aprendi e a criar um material útil para futuras implementações ou ajustes.
Esse projeto realmente despertou em mim a vontade de continuar estudando e explorando novas tecnologias e soluções.
Esse é um link exemplo para você ver como estava meu site no servidor: Projeto 1 - Servidor








































































