Tutoriais

CI/CD com GitHub Actions fazendo deploy no seu VPS

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

  1. Você faz push para a branch main;
  2. O GitHub Actions roda os testes;
  3. Se passarem, conecta via SSH ao VPS;
  4. 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 arquivo deploy_key;
  • SSH_KNOWN_HOSTS — saída do ssh-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 main com 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.

Compartilhar:

Pronto para hospedar seu próximo projeto?

VPS com painel pré-instalado em 1 clique. Ativação imediata.

Ver planos VPS