# 🚀 Guia de Deploy via Gitea - Servidor Remoto

## 📍 Informações do Servidor
- **Diretório:** `/var/www/gestorstream`
- **Backend:** `/var/www/gestorstream/backend`
- **Frontend:** `/var/www/gestorstream/frontend`

---

## 🔄 Processo Completo de Atualização

### **Passo 1: Conectar ao Servidor via SSH**

```bash
ssh root@seu-servidor.com
# ou
ssh usuario@seu-servidor.com
```

### **Passo 2: Navegar para o Diretório do Projeto**

```bash
cd /var/www/gestorstream
```

### **Passo 3: Verificar Status do Git**

```bash
# Verificar branch atual
cd backend
git branch

# Verificar status
git status

# Verificar se há mudanças locais não commitadas
git diff
```

### **Passo 4: Fazer Backup (Recomendado)**

```bash
# Criar backup do diretório atual
cd /var/www
sudo tar -czf gestorstream-backup-$(date +%Y%m%d-%H%M%S).tar.gz gestorstream/

# Ou apenas do backend
cd /var/www/gestorstream
sudo tar -czf backend-backup-$(date +%Y%m%d-%H%M%S).tar.gz backend/
```

### **Passo 5: Atualizar Código do Gitea**

```bash
cd /var/www/gestorstream/backend

# Verificar qual branch está usando
git branch

# Puxar as últimas alterações do Gitea
git fetch origin

# Ver o que será atualizado
git log HEAD..origin/main --oneline  # ou origin/master, dependendo da branch

# Atualizar o código
git pull origin main  # ou master, dependendo da sua branch padrão

# Se houver conflitos, você precisará resolvê-los manualmente
```

### **Passo 6: Atualizar Dependências do Backend**

```bash
cd /var/www/gestorstream/backend

# Atualizar dependências do Composer
composer install --no-dev --optimize-autoloader --no-interaction

# Se o composer.lock estiver desatualizado
composer update --no-dev --optimize-autoloader --no-interaction
```

### **Passo 7: Limpar e Recriar Caches**

```bash
cd /var/www/gestorstream/backend

# Limpar todos os caches
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
php artisan optimize:clear

# Recriar caches de produção
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache

# Otimizar autoloader do Composer
composer dump-autoload --optimize --classmap-authoritative
```

### **Passo 8: Executar Migrações**

```bash
cd /var/www/gestorstream/backend

# Verificar status das migrações
php artisan migrate:status

# Executar migrações pendentes
php artisan migrate --force
```

### **Passo 9: Atualizar Frontend (se necessário)**

```bash
cd /var/www/gestorstream/frontend

# Atualizar código
git pull origin main  # ou master

# Instalar/atualizar dependências
npm install

# Build de produção
npm run build
```

### **Passo 10: Ajustar Permissões**

```bash
cd /var/www/gestorstream/backend

# Ajustar permissões do storage e cache
sudo chmod -R 775 storage bootstrap/cache
sudo chown -R www-data:www-data storage bootstrap/cache

# Se o usuário for diferente de www-data, ajuste:
# sudo chown -R seu-usuario:seu-grupo storage bootstrap/cache
```

### **Passo 11: Reiniciar Serviços**

```bash
# Reiniciar PHP-FPM (ajuste a versão do PHP conforme necessário)
sudo systemctl reload php8.2-fpm
# ou
sudo systemctl reload php8.1-fpm
# ou
sudo systemctl reload php-fpm

# Reiniciar Nginx (se necessário)
sudo systemctl reload nginx
# ou
sudo systemctl restart nginx

# Reiniciar Queue Worker (se estiver rodando como serviço)
sudo systemctl restart gestorstream-queue-worker
# ou iniciar manualmente
cd /var/www/gestorstream/backend
php artisan queue:work --daemon --tries=3 --timeout=90
```

### **Passo 12: Verificar se Está Funcionando**

```bash
cd /var/www/gestorstream/backend

# Verificar status do Laravel
php artisan about

# Verificar logs de erro
tail -n 50 storage/logs/laravel.log

# Testar uma rota da API
curl -I http://localhost/api/v1/health
# ou
curl -I https://gestor.jf.eng.br/api/v1/health
```

---

## 🔧 Script Automatizado Completo

Crie um arquivo `deploy.sh` no servidor:

```bash
#!/bin/bash

set -e  # Para o script se houver erro

echo "🚀 Iniciando deploy do GestorStream..."
echo ""

# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Diretório do projeto
PROJECT_DIR="/var/www/gestorstream"
BACKEND_DIR="$PROJECT_DIR/backend"
FRONTEND_DIR="$PROJECT_DIR/frontend"

# Função para exibir erros
error() {
    echo -e "${RED}❌ $1${NC}"
    exit 1
}

# Função para exibir sucesso
success() {
    echo -e "${GREEN}✅ $1${NC}"
}

# Função para exibir aviso
warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

# 1. Backup
echo "1️⃣ Criando backup..."
cd $PROJECT_DIR
BACKUP_FILE="gestorstream-backup-$(date +%Y%m%d-%H%M%S).tar.gz"
tar -czf "/tmp/$BACKUP_FILE" backend/ 2>/dev/null || warning "Não foi possível criar backup"
success "Backup criado: /tmp/$BACKUP_FILE"
echo ""

# 2. Atualizar Backend
echo "2️⃣ Atualizando backend..."
cd $BACKEND_DIR

# Verificar se é um repositório git
if [ ! -d ".git" ]; then
    error "Diretório backend não é um repositório Git"
fi

# Verificar branch atual
CURRENT_BRANCH=$(git branch --show-current)
echo "Branch atual: $CURRENT_BRANCH"

# Puxar alterações
echo "Puxando alterações do Gitea..."
git fetch origin
git pull origin $CURRENT_BRANCH || error "Erro ao fazer pull do Git"
success "Código atualizado"
echo ""

# 3. Atualizar dependências
echo "3️⃣ Atualizando dependências do Composer..."
composer install --no-dev --optimize-autoloader --no-interaction || error "Erro ao instalar dependências"
success "Dependências atualizadas"
echo ""

# 4. Limpar caches
echo "4️⃣ Limpando caches..."
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
php artisan optimize:clear
success "Caches limpos"
echo ""

# 5. Executar migrações
echo "5️⃣ Executando migrações..."
php artisan migrate --force || warning "Algumas migrações podem ter falhado"
success "Migrações executadas"
echo ""

# 6. Recriar caches
echo "6️⃣ Recriando caches de produção..."
php artisan config:cache
php artisan route:cache
php artisan view:cache
success "Caches recriados"
echo ""

# 7. Ajustar permissões
echo "7️⃣ Ajustando permissões..."
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || warning "Não foi possível alterar owner (pode precisar de sudo)"
success "Permissões ajustadas"
echo ""

# 8. Atualizar Frontend (opcional)
read -p "Deseja atualizar o frontend também? (s/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Ss]$ ]]; then
    echo "8️⃣ Atualizando frontend..."
    cd $FRONTEND_DIR
    
    if [ -d ".git" ]; then
        git pull origin $CURRENT_BRANCH || warning "Erro ao atualizar frontend"
        npm install
        npm run build
        success "Frontend atualizado"
    else
        warning "Frontend não é um repositório Git, pulando..."
    fi
    echo ""
fi

# 9. Reiniciar serviços
echo "9️⃣ Reiniciando serviços..."
if systemctl is-active --quiet php8.2-fpm 2>/dev/null; then
    systemctl reload php8.2-fpm
    success "PHP-FPM recarregado"
elif systemctl is-active --quiet php8.1-fpm 2>/dev/null; then
    systemctl reload php8.1-fpm
    success "PHP-FPM recarregado"
elif systemctl is-active --quiet php-fpm 2>/dev/null; then
    systemctl reload php-fpm
    success "PHP-FPM recarregado"
else
    warning "PHP-FPM não encontrado ou não está rodando"
fi

if systemctl is-active --quiet nginx 2>/dev/null; then
    systemctl reload nginx
    success "Nginx recarregado"
fi

if systemctl is-active --quiet gestorstream-queue-worker 2>/dev/null; then
    systemctl restart gestorstream-queue-worker
    success "Queue worker reiniciado"
fi
echo ""

# 10. Verificação final
echo "🔟 Verificando status..."
cd $BACKEND_DIR
php artisan about > /dev/null 2>&1
if [ $? -eq 0 ]; then
    success "Laravel está funcionando corretamente"
else
    error "Laravel não está funcionando - verifique os logs"
fi

# Verificar erros recentes
ERROR_COUNT=$(tail -n 100 storage/logs/laravel.log | grep -i "ERROR\|FATAL" | wc -l)
if [ "$ERROR_COUNT" -gt 0 ]; then
    warning "Encontrados $ERROR_COUNT erros recentes no log"
    echo "Últimos erros:"
    tail -n 100 storage/logs/laravel.log | grep -i "ERROR\|FATAL" | tail -n 3
else
    success "Nenhum erro recente encontrado"
fi
echo ""

echo "✅ Deploy concluído com sucesso!"
echo ""
echo "📋 Próximos passos:"
echo "1. Teste o sistema no navegador: https://gestor.jf.eng.br"
echo "2. Verifique os logs se houver problemas: tail -f $BACKEND_DIR/storage/logs/laravel.log"
echo "3. Verifique se o queue worker está rodando: ps aux | grep 'queue:work'"
echo ""
```

**Para usar o script:**

```bash
# 1. Criar o arquivo
cd /var/www/gestorstream/backend
nano deploy.sh

# 2. Colar o conteúdo do script acima

# 3. Dar permissão de execução
chmod +x deploy.sh

# 4. Executar
./deploy.sh
```

---

## 🚨 Troubleshooting

### Erro: "Permission denied" ao fazer git pull

```bash
# Verificar permissões do diretório .git
ls -la /var/www/gestorstream/backend/.git

# Ajustar owner se necessário
sudo chown -R seu-usuario:seu-grupo /var/www/gestorstream/backend/.git
```

### Erro: "Composer lock file is not up to date"

```bash
cd /var/www/gestorstream/backend
composer update --no-dev --optimize-autoloader
```

### Erro 500 após deploy

```bash
cd /var/www/gestorstream/backend

# Ver logs
tail -n 100 storage/logs/laravel.log

# Limpar tudo e recriar
php artisan optimize:clear
php artisan config:cache
php artisan route:cache

# Verificar permissões
ls -la storage/
chmod -R 775 storage bootstrap/cache
```

### Erro: "Class not found" ou "Target class does not exist"

```bash
cd /var/www/gestorstream/backend

# Limpar autoload e recriar
composer dump-autoload --optimize
php artisan config:clear
php artisan config:cache
```

---

## 📝 Comandos Rápidos (Resumo)

```bash
# Atualização rápida
cd /var/www/gestorstream/backend
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan optimize:clear
php artisan migrate --force
php artisan config:cache
php artisan route:cache
sudo systemctl reload php8.2-fpm
```

---

## 🔐 Configuração do Git no Servidor (Primeira Vez)

Se ainda não configurou o Git no servidor:

```bash
# Configurar usuário Git
git config --global user.name "Seu Nome"
git config --global user.email "seu-email@exemplo.com"

# Configurar repositório remoto (se necessário)
cd /var/www/gestorstream/backend
git remote -v  # Verificar remotes
git remote set-url origin https://gitea.exemplo.com/usuario/gestorstream.git

# Ou com SSH
git remote set-url origin git@gitea.exemplo.com:usuario/gestorstream.git
```

---

## ✅ Checklist de Deploy

- [ ] Backup criado
- [ ] Código atualizado do Gitea
- [ ] Dependências atualizadas
- [ ] Caches limpos e recriados
- [ ] Migrações executadas
- [ ] Permissões ajustadas
- [ ] Serviços reiniciados
- [ ] Sistema testado no navegador
- [ ] Logs verificados
- [ ] Queue worker funcionando

---

**Última atualização:** 2025-12-12

