# 🔧 CORREÇÃO: Erro de Permissões no Auto-Update (Novo Servidor)

## 🔴 PROBLEMA IDENTIFICADO

### **Sintoma:**
```
npm error   code: 'EACCES',
npm error   syscall: 'unlink',
npm error   path: '/var/www/gestorstream/frontend/node_modules/.package-lock.json'
npm error }
npm error The operation was rejected by your operating system.
npm error It is likely you do not have the permissions to access this file as the current user
```

E também:
```
❌ ERRO: Não foi possível remover dist/ completamente!
drwxr-xr-x 2 root     root     4096 Jan 14 18:11 api
drwxr-xr-x 2 root     root     4096 Jan 14 18:11 assets
drwxr-xr-x 2 root     root     4096 Jan 14 18:11 Icones
```

### **Causa:**
1. **Diretórios em `dist/` com ownership `root:root`** (criados por comandos manuais como root)
2. **`node_modules` com arquivos de `root:root`** (instalado como root anteriormente)
3. **Cache do npm (`/var/www/.npm`) sem permissões corretas**
4. **O usuário `www-data` não consegue remover/modificar arquivos de root**

---

## ✅ CORREÇÕES APLICADAS

### **1. Script de Build Melhorado**

O script de build agora:
- ✅ Tenta usar `sudo` para remover `dist/` completamente
- ✅ Ajusta permissões de `node_modules` antes do `npm install`
- ✅ Ajusta permissões do cache do npm (`/var/www/.npm`)
- ✅ Tenta múltiplas abordagens se `sudo` não estiver disponível

### **2. Execução com Sudo (quando necessário)**

O sistema agora:
- ✅ Detecta se há arquivos de root em `dist/`
- ✅ Tenta executar o script de build com `sudo` (sem senha)
- ✅ Se falhar, tenta sem `sudo` (fallback)

---

## 🚀 SOLUÇÃO IMEDIATA (No Servidor)

### **Opção 1: Script de Correção Automática**

Execute no servidor:

```bash
#!/bin/bash
# fix-permissions-update.sh

APP_DIR="/var/www/gestorstream"
FRONTEND_DIR="$APP_DIR/frontend"

echo "🔧 Corrigindo permissões para auto-update..."

# 1. Remover dist/ completamente (como root)
echo "📁 Removendo dist/..."
sudo rm -rf "$FRONTEND_DIR/dist"

# 2. Ajustar ownership de node_modules
echo "📦 Ajustando permissões de node_modules..."
if [ -d "$FRONTEND_DIR/node_modules" ]; then
    sudo chown -R www-data:www-data "$FRONTEND_DIR/node_modules"
    sudo chmod -R 755 "$FRONTEND_DIR/node_modules"
fi

# 3. Ajustar ownership do diretório frontend
echo "📁 Ajustando ownership do diretório frontend..."
sudo chown -R www-data:www-data "$FRONTEND_DIR"

# 4. Ajustar permissões do cache do npm
echo "💾 Ajustando cache do npm..."
NPM_CACHE="/var/www/.npm"
if [ -d "$NPM_CACHE" ]; then
    sudo chown -R www-data:www-data "$NPM_CACHE"
    sudo chmod -R 755 "$NPM_CACHE"
fi

# 5. Garantir que package-lock.json é gravável
if [ -f "$FRONTEND_DIR/package-lock.json" ]; then
    sudo chown www-data:www-data "$FRONTEND_DIR/package-lock.json"
    sudo chmod 644 "$FRONTEND_DIR/package-lock.json"
fi

# 6. Criar dist/ vazio com permissões corretas
echo "📁 Criando dist/ com permissões corretas..."
sudo mkdir -p "$FRONTEND_DIR/dist"
sudo chown -R www-data:www-data "$FRONTEND_DIR/dist"
sudo chmod -R 755 "$FRONTEND_DIR/dist"

echo "✅ Permissões corrigidas!"
echo ""
echo "📋 Próximos passos:"
echo "   1. Tente o auto-update novamente"
echo "   2. Se ainda falhar, configure sudo sem senha (veja abaixo)"
```

**Salvar e executar:**
```bash
nano fix-permissions-update.sh
# (cole o conteúdo acima)
chmod +x fix-permissions-update.sh
sudo bash fix-permissions-update.sh
```

---

### **Opção 2: Configurar Sudo Sem Senha (Recomendado)**

Para que o auto-update funcione perfeitamente, configure `www-data` para usar `sudo` sem senha para comandos específicos:

```bash
sudo visudo
```

**Adicionar no final do arquivo:**
```
# Permissões para www-data executar comandos de build sem senha
www-data ALL=(ALL) NOPASSWD: /bin/rm -rf /var/www/gestorstream/frontend/dist
www-data ALL=(ALL) NOPASSWD: /bin/chown -R www-data\:www-data /var/www/gestorstream/frontend/*
www-data ALL=(ALL) NOPASSWD: /bin/chmod -R * /var/www/gestorstream/frontend/*
www-data ALL=(ALL) NOPASSWD: /bin/chown -R www-data\:www-data /var/www/.npm
www-data ALL=(ALL) NOPASSWD: /usr/bin/timeout
```

**OU (mais seguro, apenas comandos específicos):**
```
# Permissões para www-data executar script de build com sudo
www-data ALL=(ALL) NOPASSWD: /bin/bash /var/www/gestorstream/backend/storage/app/build_frontend_*.sh
```

**Salvar e testar:**
```bash
# Testar se funciona
sudo -u www-data sudo -n rm -rf /tmp/test-sudo 2>/dev/null && echo "✅ Sudo configurado corretamente" || echo "❌ Sudo não configurado"
```

---

## 🔍 DIAGNÓSTICO

### **Verificar Permissões Atuais:**

```bash
# 1. Verificar ownership de dist/
ls -la /var/www/gestorstream/frontend/dist/

# Deve mostrar www-data:www-data
# Se mostrar root:root, corrigir:
sudo chown -R www-data:www-data /var/www/gestorstream/frontend/dist/

# 2. Verificar ownership de node_modules
ls -la /var/www/gestorstream/frontend/node_modules/ | head -5

# Deve mostrar www-data:www-data
# Se mostrar root:root, corrigir:
sudo chown -R www-data:www-data /var/www/gestorstream/frontend/node_modules/

# 3. Verificar cache do npm
ls -la /var/www/.npm/ 2>/dev/null | head -5

# Se existir e mostrar root:root, corrigir:
sudo chown -R www-data:www-data /var/www/.npm/
```

---

## 📊 CHECKLIST DE VERIFICAÇÃO

Após aplicar correções:

- [ ] `dist/` removido completamente
- [ ] `dist/` recriado com ownership `www-data:www-data`
- [ ] `node_modules` com ownership `www-data:www-data`
- [ ] Cache do npm (`/var/www/.npm`) com ownership `www-data:www-data`
- [ ] `package-lock.json` gravável por `www-data`
- [ ] Sudo configurado (opcional, mas recomendado)
- [ ] Teste de auto-update funcionando

---

## 🎯 RESOLUÇÃO RÁPIDA (TL;DR)

**No servidor, execute:**

```bash
cd /var/www/gestorstream

# 1. Remover dist/ completamente
sudo rm -rf frontend/dist

# 2. Ajustar todas as permissões
sudo chown -R www-data:www-data frontend/
sudo chmod -R 755 frontend/
sudo chmod -R 775 frontend/node_modules/ 2>/dev/null || true

# 3. Ajustar cache do npm
sudo chown -R www-data:www-data /var/www/.npm/ 2>/dev/null || true
sudo chmod -R 755 /var/www/.npm/ 2>/dev/null || true

# 4. Criar dist/ vazio
sudo mkdir -p frontend/dist
sudo chown -R www-data:www-data frontend/dist
sudo chmod -R 755 frontend/dist

# 5. Testar
ls -la frontend/dist/
# Deve mostrar www-data:www-data
```

**Depois, tente o auto-update novamente!**

---

## 🔄 PREVENÇÃO FUTURA

### **Regras de Ouro:**

1. **NUNCA execute `npm install` ou `npm run build` como `root`**
   ```bash
   # ❌ ERRADO
   sudo npm install
   sudo npm run build
   
   # ✅ CORRETO
   sudo -u www-data npm install
   sudo -u www-data npm run build
   ```

2. **Sempre ajuste ownership após comandos manuais:**
   ```bash
   sudo chown -R www-data:www-data /var/www/gestorstream/
   ```

3. **Use o script de correção antes de updates:**
   ```bash
   sudo bash fix-permissions-update.sh
   ```

---

## 📞 SE AINDA NÃO FUNCIONAR

**Coletar informações:**
```bash
# 1. Verificar permissões
ls -la /var/www/gestorstream/frontend/dist/
ls -la /var/www/gestorstream/frontend/node_modules/ | head -10

# 2. Verificar logs do último update
cd /var/www/gestorstream/backend
php artisan tinker --execute="
\$u = \App\Models\SystemUpdate::latest()->first();
echo \$u->log;
" | tail -100

# 3. Verificar se sudo está configurado
sudo -u www-data sudo -n echo "Sudo OK" 2>&1

# 4. Testar build manual
cd /var/www/gestorstream/frontend
sudo -u www-data npm install
sudo -u www-data npm run build
ls -lh dist/index.html
```

**Enviar essas informações para diagnóstico adicional.**
