Pular para conteúdo

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 servidor entra sem pedir senha
  • [ ] sudo ufw status mostra OpenSSH e 80/tcp liberados
  • [ ] timedatectl mostra o fuso de São Paulo
  • [ ] As pastas /opt/braggo, /var/www/braggo, /etc/braggo e /var/backups/braggo existem
  • [ ] Snapshot tirado