CI/CD com GitHub Actions fazendo deploy no seu VPS
Fazer deploy manual — acessar o servidor, dar git pull, rodar comandos — é lento e sujeito a erros. Com GitHub Actions, cada push na branch principal pode testar e publicar sua aplicação automaticamente.
Visão geral do fluxo
- Você faz push para a branch
main; - O GitHub Actions roda os testes;
- Se passarem, conecta via SSH ao VPS;
- Executa o script de deploy no servidor.
1. Crie um usuário de deploy no VPS
sudo adduser --disabled-password --gecos "" deploy
sudo usermod -aG www-data deploy
Dê a ele permissão na pasta da aplicação e, se necessário, permissão restrita de sudo para reiniciar serviços específicos (via visudo):
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl reload php8.3-fpm, /usr/bin/systemctl restart minhaapi
2. Gere uma chave SSH exclusiva para o deploy
No seu computador:
ssh-keygen -t ed25519 -f deploy_key -C "github-actions" -N ""
Adicione a chave pública ao servidor:
sudo mkdir -p /home/deploy/.ssh
sudo tee -a /home/deploy/.ssh/authorized_keys < deploy_key.pub
sudo chown -R deploy:deploy /home/deploy/.ssh
sudo chmod 700 /home/deploy/.ssh && sudo chmod 600 /home/deploy/.ssh/authorized_keys
Obtenha a chave de host do servidor (para evitar ataques man-in-the-middle):
ssh-keyscan -p 22 SEU_IP
3. Cadastre os secrets no GitHub
No repositório: Settings → Secrets and variables → Actions:
SSH_HOST— IP ou domínio do VPS;SSH_USER—deploy;SSH_PORT— porta do SSH;SSH_PRIVATE_KEY— conteúdo do arquivodeploy_key;SSH_KNOWN_HOSTS— saída dossh-keyscan.
Depois, apague a chave privada local se não for mais usá-la.
4. Script de deploy no servidor
/home/deploy/deploy.sh (exemplo para Node.js):
#!/bin/bash
set -euo pipefail
cd /var/www/api
git fetch origin main
git reset --hard origin/main
npm ci --omit=dev
npm run build --if-present
pm2 reload api
chmod +x /home/deploy/deploy.sh
Adapte para seu stack (Composer + artisan no Laravel, pip + migrate no Django etc.).
5. O workflow
.github/workflows/deploy.yml:
name: Deploy
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm test
deploy:
needs: test
runs-on: ubuntu-latest
concurrency: production
steps:
- name: Configurar SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
echo "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/known_hosts
- name: Executar deploy
run: |
ssh -p "${{ secrets.SSH_PORT }}" \
"${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \
"/home/deploy/deploy.sh"
needs: test— o deploy só roda se os testes passarem;concurrency: production— evita dois deploys simultâneos.
6. Proteja o fluxo
- Restrinja a chave no servidor para executar apenas o script de deploy, adicionando no início da linha em
authorized_keys:
command="/home/deploy/deploy.sh",no-port-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAA... github-actions
- Use Environments do GitHub com aprovação manual para produção, se desejar;
- Proteja a branch
maincom revisão obrigatória.
Indo além
- Builds no CI e envio de artefatos (via
rsync) em vez de compilar no servidor; - Imagens Docker publicadas em um registry e atualizadas no VPS com
docker compose pull; - Rollback mantendo releases anteriores.
Conclusão
Com CI/CD, cada deploy fica rápido, consistente e rastreável. Automatize o seu com um VPS-NVME-BR da VittHost, com NVMe e servidores no Brasil.Use o cupom SP-VITT20 e ganhe 20% de desconto na primeira fatura enquanto a promoção estiver ativa.