Servidor base¶
Preparação da VM antes de instalar qualquer parte do app. Se esta etapa estiver bem feita, o resto do deploy é só copiar arquivos.
1. A VM no VMware¶
- Rede em modo Bridged. Assim a VM recebe um IP da sua rede local, como se fosse outro computador, e você acessa por SSH direto do Windows. Em VM → Settings → Network Adapter, escolha Bridged. Se o VMware escolher o adaptador errado, abra o Virtual Network Editor e fixe a placa física (a do cabo) em vez de Automatic.
- Snapshot. Tire um snapshot depois de cada etapa importante (instalação limpa, servidor pronto, primeiro deploy). É a rede de segurança mais barata que existe.
- Subir junto com o Windows (opcional). Por padrão a VM só liga quando você a inicia. Para ela subir sozinha depois de um reinício do PC, crie uma tarefa agendada no Windows (disparo "Ao iniciar o computador") que rode:
& "C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws start "C:\CAMINHO\servidor.vmx" nogui
Ajuste os dois caminhos. Desative também a suspensão automática do Windows, senão a VM para quando o PC dorme.
2. Atualizar o sistema¶
No primeiro acesso, direto no console da VM:
sudo apt update
sudo apt upgrade -y
apt update atualiza a lista de pacotes disponíveis e apt upgrade instala as versões novas dos pacotes que já existem.
Instale também as ferramentas que vamos usar:
sudo apt install -y openssh-server curl wget unzip rsync nano ufw
openssh-server permite o acesso remoto, rsync é usado nos scripts de deploy e ufw é o firewall.
O Ubuntu Server já instala atualizações de segurança automaticamente (unattended-upgrades). Para conferir ou ajustar: sudo dpkg-reconfigure -plow unattended-upgrades.
3. Fuso horário¶
sudo timedatectl set-timezone America/Sao_Paulo
timedatectl
Isso deixa logs e backups com a hora de Brasília, o que ajuda muito na hora de investigar um problema.
4. IP fixo da VM¶
O túnel Cloudflare não depende do IP da VM, mas o seu acesso por SSH depende. Se o IP mudar, o alias SSH quebra. Há duas formas de fixar:
Opção A (mais simples): reserva no roteador. No painel do roteador, procure por "DHCP estático" ou "reserva de IP" e associe o MAC da VM a um IP.
Opção B: IP fixo na própria VM (netplan). Descubra o nome da interface e o IP atual:
ip -br a
ip route | grep default
Anote o nome da interface (por exemplo ens33) e o gateway (por exemplo 192.168.0.1). Edite o arquivo de rede (veja o nome real com ls /etc/netplan/):
sudo nano /etc/netplan/50-cloud-init.yaml
network:
version: 2
ethernets:
ens33:
dhcp4: false
addresses: [192.168.0.50/24]
routes:
- to: default
via: 192.168.0.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
Aplique com:
sudo netplan apply
Cuidado ao aplicar
Se você estiver conectado por SSH, a conexão cai quando o IP muda. Faça isso pelo console da VM e use um IP fora da faixa de DHCP do roteador, para não colidir com outro aparelho.
5. SSH a partir do Windows¶
Descubra o IP da VM (ip -br a) e teste a conexão no PowerShell:
ssh jhon@IP_DA_VM
Chave SSH (sem digitar senha)¶
No PowerShell, gere uma chave (só uma vez, aceite os padrões):
ssh-keygen -t ed25519 -C "jhon-pc"
Envie a chave pública para a VM:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh jhon@IP_DA_VM "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Esse comando cria a pasta .ssh na VM com as permissões corretas e acrescenta sua chave ao arquivo de chaves autorizadas.
Alias servidor¶
Crie (ou edite) o arquivo de configuração do SSH no Windows:
notepad $env:USERPROFILE\.ssh\config
Host servidor
HostName IP_DA_VM
User jhon
A partir daí, todos os comandos desta documentação usam ssh servidor e scp ... servidor:....
Desligar login por senha (opcional, recomendado)¶
Depois de confirmar que a chave funciona, bloqueie senha no SSH:
sudo nano /etc/ssh/sshd_config.d/99-braggo.conf
PasswordAuthentication no
PermitRootLogin no
sudo sshd -t
sudo systemctl restart ssh
sshd -t valida a configuração antes de reiniciar. Mantenha a sessão aberta e teste uma nova conexão em outro terminal antes de fechar a atual, para não se trancar para fora.
6. Firewall (UFW)¶
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw enable
sudo ufw status verbose
Libera SSH e HTTP (porta 80, usada pelo Nginx) e bloqueia todo o resto que chega. A porta 80 só precisa estar aberta para a rede local, pois o tráfego da internet entra pelo túnel, que é uma conexão de saída. Não abra 5432 (PostgreSQL) nem 5000 (API).
Se o ufw enable avisar sobre interromper conexões SSH, tudo bem: a regra do OpenSSH já foi adicionada antes.
7. Usuário do serviço e pastas¶
Criar um usuário de sistema só para rodar a API evita que ela tenha poderes de administrador se for comprometida:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin braggo
Pastas do projeto e permissões:
sudo mkdir -p /opt/braggo/api /opt/braggo/scripts
sudo mkdir -p /var/www/braggo
sudo mkdir -p /etc/braggo
sudo mkdir -p /var/backups/braggo
sudo chown -R jhon:braggo /opt/braggo
sudo chmod -R 750 /opt/braggo
sudo chown -R jhon:www-data /var/www/braggo
sudo chown root:braggo /etc/braggo
sudo chmod 750 /etc/braggo
sudo chown root:jhon /var/backups/braggo
sudo chmod 750 /var/backups/braggo
| Pasta | Para quê | Dono |
|---|---|---|
/opt/braggo/api |
arquivos publicados da API | jhon (grupo braggo lê) |
/opt/braggo/scripts |
scripts de deploy | jhon |
/var/www/braggo |
arquivos estáticos do Angular | jhon (grupo www-data, o do Nginx) |
/etc/braggo |
variáveis secretas da API | root (grupo braggo lê) |
/var/backups/braggo |
backups do banco | root (jhon lê) |
O dono ser o jhon nas pastas de deploy permite copiar arquivos com scp sem precisar de sudo.
8. Instalar o Nginx¶
sudo apt install -y nginx
sudo systemctl enable --now nginx
enable --now liga o serviço agora e configura para iniciar sempre que a VM ligar. A configuração do site está em Frontend e Nginx.
Checklist ao final desta etapa¶
- [ ]
ssh servidorentra sem pedir senha - [ ]
sudo ufw statusmostra OpenSSH e 80/tcp liberados - [ ]
timedatectlmostra o fuso de São Paulo - [ ] As pastas
/opt/braggo,/var/www/braggo,/etc/braggoe/var/backups/braggoexistem - [ ] Snapshot tirado