Pular para conteúdo

Rotina de atualização

Depois do primeiro deploy, o que você vai repetir no dia a dia. Cada seção funciona sozinha.

Resumo rápido

Quero atualizar... Faça
Só o frontend Atualizar o frontend
Só a API Atualizar a API
API com mudança no banco Migrations antes, depois a API
Pacotes do Ubuntu Atualizar o sistema

Ordem quando mudar tudo

Banco (migration) → API → Frontend. A migration precisa ser compatível com a versão antiga da API por alguns segundos, então prefira mudanças aditivas (nova coluna, nova tabela) em vez de renomear ou apagar.

Atualizar a API

Script no servidor (criar uma vez)

nano /opt/braggo/scripts/deploy-api.sh
#!/bin/bash
set -euo pipefail

NOVO=/tmp/braggo-api-novo
APP=/opt/braggo/api

rm -rf "$NOVO" && mkdir "$NOVO"
tar -xzf /tmp/braggo-api.tar.gz -C "$NOVO"

sudo systemctl stop braggo-api

# guarda a versão atual para rollback
rm -rf "$APP.anterior"
cp -a "$APP" "$APP.anterior"

rsync -a --delete --no-owner --no-group --chmod=D755,F644 "$NOVO"/ "$APP"/

sudo systemctl start braggo-api
sleep 3

if systemctl is-active --quiet braggo-api; then
  echo "OK: braggo-api ativo"
else
  echo "FALHOU: veja o log abaixo"
  sudo journalctl -u braggo-api -n 40 --no-pager
  exit 1
fi

rm -rf "$NOVO" /tmp/braggo-api.tar.gz
chmod +x /opt/braggo/scripts/deploy-api.sh

O que o script faz, em ordem: extrai o pacote novo numa pasta temporária, para a API, copia a versão atual para api.anterior (rollback), sincroniza a pasta com rsync --delete (copia o novo e remove arquivos que não existem mais), inicia a API e confirma que ela subiu.

Note

Se a API grava arquivos dentro da própria pasta (uploads, logs), acrescente --exclude=uploads/ (ou o nome da pasta) ao rsync, senão o --delete apaga esses arquivos. O ideal é gravar fora, em uma pasta como /var/lib/braggo.

Script no seu PC

Salve como deploy-api.ps1 na raiz do repo da API:

$ErrorActionPreference = "Stop"
$projeto = ".\src\Braggo.Api"   # ajuste para o seu .csproj

Remove-Item .\publish -Recurse -Force -ErrorAction SilentlyContinue
dotnet publish $projeto -c Release -o .\publish
if ($LASTEXITCODE -ne 0) { throw "dotnet publish falhou" }

tar -czf publish.tar.gz -C publish .
scp publish.tar.gz servidor:/tmp/braggo-api.tar.gz
ssh -t servidor "bash /opt/braggo/scripts/deploy-api.sh"

Remove-Item publish.tar.gz

Para publicar: .\deploy-api.ps1. O ssh -t é necessário porque o script usa sudo, que pede a senha. Se o PowerShell bloquear a execução do script, rode uma vez Set-ExecutionPolicy -Scope CurrentUser RemoteSigned.

Atualizar o frontend

Salve como deploy-front.ps1 na raiz do projeto Angular:

$ErrorActionPreference = "Stop"
$saida = "dist\NOME\browser"   # ajuste

ng build --configuration production
if ($LASTEXITCODE -ne 0) { throw "ng build falhou" }

tar -czf front.tar.gz -C $saida .
scp front.tar.gz servidor:/tmp/braggo-front.tar.gz
ssh servidor "rm -rf /var/www/braggo/* && tar -xzf /tmp/braggo-front.tar.gz -C /var/www/braggo && chmod -R u=rwX,go=rX /var/www/braggo && rm /tmp/braggo-front.tar.gz"

Remove-Item front.tar.gz

Não precisa reiniciar nada: o Nginx lê os arquivos novos na próxima requisição. Se o navegador ainda mostrar a versão antiga, force com Ctrl+F5 (o index.html já é servido sem cache).

Rollback da API

Se a versão nova subiu mas está errada, volte para a anterior (o script guardou em api.anterior):

sudo systemctl stop braggo-api
rsync -a --delete /opt/braggo/api.anterior/ /opt/braggo/api/
sudo systemctl start braggo-api
sudo systemctl status braggo-api

Só vale se a migration do banco for compatível com a versão antiga. Em caso de dúvida, restaure o backup do banco ou o snapshot da VM.

Atualizar o sistema

Uma vez por mês, ou quando houver aviso de segurança:

sudo apt update
sudo apt upgrade -y
sudo reboot

Antes de atualizar, tire um snapshot da VM. Depois do reinício, confira o checklist abaixo.

Checklist depois de reiniciar a VM

systemctl is-active postgresql braggo-api nginx cloudflared

Deve imprimir active quatro vezes. Se algum não estiver, veja Problemas comuns.

Depois abra https://braggo.com.br e faça um teste real (login, uma tela que consulte o banco).

Rotina sugerida

Frequência Tarefa
A cada deploy rodar o script, conferir systemctl status e testar o site
Semanal olhar journalctl -u braggo-api -p err --since "7 days ago"
Semanal copiar os backups para fora da VM (scp)
Mensal atualizar pacotes do Ubuntu, com snapshot antes
Mensal testar uma restauração de backup em um banco de teste
Após mudanças grandes novo snapshot da VM