Study Notes

VPS

Virtual Private Server é o nome comercial de uma VM alugada de um cloud provider.

Exemplos: Amazon EC2, HostGator VPS e Azure Virtual Machines

Características:

  • Acesso (via SSH) sendo root completo
  • Escolha do OS
  • IP dedicado próprio
  • Possibilidade de configurar múltiplos domains

SSH

Para conectar na VPS usamos o protocolo Secure Shell/ um cliente SSH (ou PuTTY se estivermos no Windows).

chmod 400 /caminho/para/sua/chave_privada.pem # para apenas leitura com o perfil do usuário

ssh -i /caminho/para/sua/chave_privada.pem usuario@servidor

ssh -i ~/thom.pem ubuntu@15.228.225.117 # exemplo 

Se não for passado a flag -i especificando o caminho para a chave, o SSH procurará por default em ~/.ssh/*.pem.

Server Operational System

O sistemas operacional de VPSs são otimizados para servidores. Ou seja, incluem apenas o essencial para o sistema funcionar, sem até mesmo GUI. Um exemplo que denota essa diferença é na distro Ubuntu 24.04 (Noble Numbat) que existe o Ubuntu 24.04 Desktop e o Ubuntu 24.04 Server.

EC2 - Elastic Compute Cloud


É a VPS da amazon. O "elástico" vem do fato dela permitir vertical e horizontal scaling.

Termination Protection

Com uma instância criada, nós podemos a qualquer momento removê-la através do processo de “Encerrar instância”. Se for uma instância de produção, que está realmente executando código de um produto real, é interessante evitar que essa instância seja encerrada. Alguém pode acabar encerrando-a sem querer, por alguma confusão. Para isso podemos selecionar nossa instância, ir em “Ações > Configurações de instância > Alterar proteção contra encerramento”. Dessa forma não será possível encerrar a instância. O mesmo vale para a ação de desligamento.

Security Groups

São firewalls virtuais gerenciado pela AWS para controlar o tráfego de entrada e saída das instancias EC2. Ou seja, atua antes de entrar no firewall de fato do OS da VPS (antes do iptables). (Exemplo: Se bloquear a porta 22 (ssh) com Security Group não é possível acessar a VPS). É muito comum usar o Security Group para regras amplas (ex: porta 22 só do seu IP especifico) e iptables para regras mais detalhadas (ex: limitar taxa, bloquear pacotes específicos). Em resumo, a ideia é criar esses grupos reutilizáveis e anexá-los nas instâncias conforme necessário. Abaixo, seguem exemplos de Security Groups que podem ser criados:

Nome do Security GroupDescriçãoRegras de entrada (inbound)
web-trafficPermite acesso HTTP/HTTPS para todosTCP 80 e 443 de 0.0.0.0/0
dev-accessPermite SSH só do seu IPTCP 22 de 200.155.100.1/32
app-trafficLibera acesso à API do appTCP 3000 de 0.0.0.0/0 ou só da empresa
monitoringPermite acesso do Zabbix ou PrometheusTCP 9100 de IP_MONITORING/32

Instâncias pré-configuradas

São VMs que já vêm com softwares e configurações prontas para uso. Ou seja, ao invés de ter que toda vez baixar um imagem zerada (como o Ubuntu 24.04 Server), uma opção seria escolher com Nginx + SSL configurado, por exemplo. Ou então uma que já venha com um modelo de ML carregado. Ou seja, existe um marketplace de imagens que nos permitem criar instâncias já com softwares pré-instalados/ configurados.

Getting Started

Depois de ter criado uma instância no EC2, vamos configurar para montar um servidor básico usando o Ubuntu Server. Conecte-se a VPS usando SSH.

sudo apt update && apt upgrade -y # atualizar sistema
Criar novos usuários
sudo adduser novo_usuario

Essa etapa faz com que seja criado um dir /home/novo_usuario/ (com .bashrc, .profile e etc) e seu próprio shell /bin/bash.

Adicionar usuário ao grupo sudo
sudo usermod -aG sudo novo_usuario

Isso faz com que seja permitido o usuário usar o sudo para executar comandos como root. Dessa forma, podendo instalar pacotes, alterar configurações do sistema e etc.

Permitir usuário fazer login por SSH
sudo rsync --archive --chown=novo_usuario:seu_usuario /home/ubuntu/.ssh /home/novo_usuario/

No caso do comando acima, a pasta /home/ubuntu/.ssh (que contem chaves SSH autorizadas) do usuário root da VPS é copiada usando rsync (que, diferentemente do cp, faz isso de forma inteligente mudando o dono/grupo com o --chown e preservando permissões, timestamps, symlinks e etc). Ou seja, isso faz com que esse novo usuário consiga acessar o servidor via ssh da mesma forma que o usuário root ubuntu consegue (usando mesmo arquivo .pem). Se quiser gerar um novo login ssh para o usuário, é preciso primeiro trocar o usuário dentro da sessão atual.

sudo su - novo_usuario # su = substitute user e - = opção login completo do novo usuário
ssh-keygen -t ed25519 -C "acesso para VPS" # gerar ssh key

mkdir -p ~/.ssh
chmod 700 ~/.ssh

cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys # copiar a chave para o authorized_key - o arquivo que mostra as chaves autorizadas para autenticar esse usuário via ssh
chmod 600 ~/.ssh/authorized_keys

scp novo_usuario@servidor:/home/novo_usuario/.ssh/id_ed25519 ~/.ssh/minha-chave-vps
Instalar Nginx

Um servidor web (ou reverse proxy/load balancer).

sudo apt install nginx
sudo systemctl status nginx # verificar status do serviço
sudo ss -tuln | grep :80 # verficar porta 80 tcp se ta liberada

Instalar Docker

# Atualiza a lista de pacotes e instala dependências necessárias
sudo apt update
sudo apt install ca-certificates curl gnupg

# Cria o diretório para as chaves de segurança do apt
sudo install -m 0755 -d /etc/apt/keyrings

# Baixa a chave de segurança oficial do Docker e a salva no formato correto
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Adiciona o repositório do Docker à lista de fontes do seu sistema
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


# Atualiza a lista de pacotes novamente para incluir os do repositório Docker
sudo apt update

# Instala o Docker Engine, a linha de comando (CLI) e os plugins mais recentes
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# A variável $USER será substituída automaticamente pelo seu nome de usuário atual
sudo usermod -aG docker $USER

exit # Para que a mudança de grupo tenha efeito, você precisa sair da sua sessão SSH e se conectar novamente.

ssh seu_usuario@ip_da_vps

docker ps

Ao baixar docker e rodar e expor as aplicações em containers traz vários benefícios de gerenciamento do que rodar as aplicações diretamente na VM. Exemplo:

  • VPS limpa de dependências (cada app tem suas próprias dependencies conteinerizada). Isso também reduz possíveis conflitos de versões de dependências entre dois apps diferentes
  • Segurança por Isolamento (se um app for comprometido, o invasor a princípio estará "preso" dentro daquele container, não tendo acesso ao sistema por completo)
  • ==Facilidade para Fazer Backup e Mover==

Referências


On this page