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 |