refactor: Migração completa de PointControl para NoIdle

- Pasta renomeada: /var/www/pointcontrol → /var/www/noidle
- PM2 renomeado: pointcontrol-api → noidle-api
- Package.json backend atualizado
- Package.json frontend atualizado
- Todas as referências de código atualizadas
- Documentação atualizada
- Script de migração executado com sucesso
- Backup criado em /tmp/
- Sistema testado e funcionando

Resolução: Organização completa da estrutura bagunçada
This commit is contained in:
Sérgio Corrêa
2025-11-16 23:38:59 +00:00
parent 710792af01
commit 4fab8593ac
14 changed files with 112 additions and 128 deletions

View File

@@ -260,6 +260,6 @@ SystemEvents.SessionSwitch += (sender, e) => {
Para problemas técnicos, verifique:
1. Logs do cliente (console/arquivo de log)
2. Logs do servidor: `pm2 logs pointcontrol-api`
2. Logs do servidor: `pm2 logs noidle-api`
3. Resposta HTTP dos endpoints (status code, mensagem de erro)

View File

@@ -89,7 +89,7 @@ Componente principal do dashboard com:
### 1. Instalar Dependências
```bash
cd /var/www/pointcontrol/frontend
cd /var/www/noidle/frontend
npm install @mui/material @emotion/react @emotion/styled @mui/icons-material
```
@@ -373,7 +373,7 @@ import { LineChart, BarChart } from 'recharts';
### 1. Build Frontend:
```bash
cd /var/www/pointcontrol/frontend
cd /var/www/noidle/frontend
npm run build
```

View File

@@ -21,7 +21,7 @@ Seu projeto NoIdle foi enviado para:
### Ver Status
```bash
cd /var/www/pointcontrol
cd /var/www/noidle
git status
```
@@ -214,7 +214,7 @@ git push -u origin feature/minha-feature
Sempre que fizer alterações:
```bash
cd /var/www/pointcontrol
cd /var/www/noidle
# Ver o que mudou
git status

View File

@@ -36,7 +36,7 @@ Este script verifica:
Abra o **Gerenciador de Tarefas** (Ctrl+Shift+Esc) e procure por:
- `NoIdle`
- `PointControl`
- `NoIdle`
- Qualquer processo relacionado a monitoramento
### Verificar Serviços Windows
@@ -44,7 +44,7 @@ Abra o **Gerenciador de Tarefas** (Ctrl+Shift+Esc) e procure por:
1. Abra **Services** (Win+R → `services.msc`)
2. Procure por serviços com nome contendo:
- `NoIdle`
- `PointControl`
- `NoIdle`
### Verificar Conexões de Rede
@@ -58,7 +58,7 @@ Get-NetTCPConnection | Where-Object { $_.RemotePort -eq 443 -and $_.State -eq "E
Procure em:
- `C:\Program Files\NoIdle\logs\`
- `C:\Program Files\PointControl\logs\`
- `C:\Program Files\NoIdle\logs\`
- `%APPDATA%\NoIdle\logs\`
- `%LOCALAPPDATA%\NoIdle\logs\`

View File

@@ -83,14 +83,14 @@ Implementei um **sistema MDM completo** no NoIdle, similar ao JumpCloud, permiti
### 1. **Criar Tabelas no Banco**
```bash
cd /var/www/pointcontrol/backend
cd /var/www/noidle/backend
psql $DATABASE_URL -f create_mdm_tables.sql
```
### 2. **Reiniciar Backend**
```bash
pm2 restart pointcontrol-api
pm2 restart noidle-api
```
### 3. **Criar Política via API**
@@ -186,7 +186,7 @@ curl https://admin.noidle.tech/api/policies/1/executions
- [x] Rotas implementadas
- [x] Templates pré-configurados
- [ ] **EXECUTAR:** `psql $DATABASE_URL -f create_mdm_tables.sql`
- [ ] **EXECUTAR:** `pm2 restart pointcontrol-api`
- [ ] **EXECUTAR:** `pm2 restart noidle-api`
### Cliente (Implementação):
- [x] Código CLIENT_MDM.py criado
@@ -385,9 +385,9 @@ print(f"Comandos: {commands}")
### 1. Backend (5 minutos):
```bash
cd /var/www/pointcontrol/backend
cd /var/www/noidle/backend
psql $DATABASE_URL -f create_mdm_tables.sql
pm2 restart pointcontrol-api
pm2 restart noidle-api
```
### 2. Testar API (2 minutos):

View File

@@ -1,8 +1,8 @@
# ⚡ Migração Rápida: PointControl → NoIdle
# ⚡ Migração Rápida: NoIdle → NoIdle
## 🎯 Resumo Executivo
Seu projeto mudou de **PointControl** para **NoIdle**, mas os arquivos e código ainda usam "pointcontrol" em vários lugares. Isso cria confusão e desorganização.
Seu projeto mudou de **NoIdle** para **NoIdle**, mas os arquivos e código ainda usam "noidle" em vários lugares. Isso cria confusão e desorganização.
**Solução:** Script automatizado que renomeia tudo em 5 minutos! ⏱️
@@ -13,13 +13,13 @@ Seu projeto mudou de **PointControl** para **NoIdle**, mas os arquivos e código
### 1⃣ **Verificar o que vai mudar**
```bash
# Ver arquivos que serão afetados
cd /var/www/pointcontrol
grep -r "pointcontrol" . --include="*.js" --include="*.json" --include="*.md" | wc -l
cd /var/www/noidle
grep -r "noidle" . --include="*.js" --include="*.json" --include="*.md" | wc -l
```
### 2⃣ **Executar a migração**
```bash
sudo bash /var/www/pointcontrol/migrate_to_noidle.sh
sudo bash /var/www/noidle/migrate_to_noidle.sh
```
### 3⃣ **Verificar resultado**
@@ -34,12 +34,12 @@ curl http://localhost:3005/api/health
| Item | Antes | Depois |
|------|-------|--------|
| **Pasta** | `/var/www/pointcontrol` | `/var/www/noidle` |
| **PM2** | `pointcontrol-api` | `noidle-api` |
| **Backend** | `"name": "pointcontrol-api"` | `"name": "noidle-api"` |
| **Frontend** | `"name": "pointcontrol-frontend"` | `"name": "noidle-frontend"` |
| **Código** | `PointControl` | `NoIdle` |
| **Logs** | `console.log('PointControl API')` | `console.log('NoIdle API')` |
| **Pasta** | `/var/www/noidle` | `/var/www/noidle` |
| **PM2** | `noidle-api` | `noidle-api` |
| **Backend** | `"name": "noidle-api"` | `"name": "noidle-api"` |
| **Frontend** | `"name": "noidle-frontend"` | `"name": "noidle-frontend"` |
| **Código** | `NoIdle` | `NoIdle` |
| **Logs** | `console.log('NoIdle API')` | `console.log('NoIdle API')` |
---
@@ -47,7 +47,7 @@ curl http://localhost:3005/api/health
1.**Backup automático** (salvo em `/tmp`)
2.**Para serviços** (PM2)
3.**Renomeia pasta** (`pointcontrol``noidle`)
3.**Renomeia pasta** (`noidle``noidle`)
4.**Atualiza package.json** (backend e frontend)
5.**Atualiza código** (todas as referências)
6.**Atualiza documentação** (arquivos .md)
@@ -59,7 +59,7 @@ curl http://localhost:3005/api/health
## 🎬 Executar AGORA
```bash
cd /var/www/pointcontrol
cd /var/www/noidle
sudo bash migrate_to_noidle.sh
```
@@ -93,11 +93,11 @@ pm2 delete noidle-api
# Restaurar pasta
cd /var/www
mv noidle pointcontrol
mv noidle noidle
# Restaurar PM2
cd pointcontrol/backend
pm2 start server.js --name pointcontrol-api
cd noidle/backend
pm2 start server.js --name noidle-api
pm2 save
```
@@ -109,7 +109,7 @@ pm2 save
```bash
cd /var/www/noidle
git add .
git commit -m "refactor: Migração completa de PointControl para NoIdle"
git commit -m "refactor: Migração completa de NoIdle para NoIdle"
git push
```
@@ -118,7 +118,7 @@ git push
sudo nano /etc/nginx/sites-available/admin.noidle.tech
# Verificar se tem paths antigos
# /var/www/pointcontrol → /var/www/noidle
# /var/www/noidle → /var/www/noidle
sudo nginx -t
sudo systemctl reload nginx
@@ -229,7 +229,7 @@ Git: /var/www/noidle (✅ atualizado)
## 🚀 Executar AGORA
```bash
cd /var/www/pointcontrol
cd /var/www/noidle
sudo bash migrate_to_noidle.sh
```

View File

@@ -41,7 +41,7 @@ Após atualizar o cliente:
2. **Faça logon novamente**
3. **Verifique os logs do servidor**:
```bash
pm2 logs pointcontrol-api --lines 30
pm2 logs noidle-api --lines 30
```
4. **Procure por**:
```

View File

@@ -1,8 +1,8 @@
# 🔄 Plano de Migração: PointControl → NoIdle
# 🔄 Plano de Migração: NoIdle → NoIdle
## 📊 Situação Atual
**Problema:** Projeto mudou de nome de "PointControl" para "NoIdle", mas a estrutura de pastas e código ainda usa "pointcontrol" em muitos lugares.
**Problema:** Projeto mudou de nome de "NoIdle" para "NoIdle", mas a estrutura de pastas e código ainda usa "noidle" em muitos lugares.
**Resultado:** Confusão, inconsistência e bagunça no código.
@@ -18,31 +18,31 @@ Renomear **tudo** de forma consistente para "NoIdle" mantendo compatibilidade e
### 1. **Pasta Principal**
```
/var/www/pointcontrol → /var/www/noidle
/var/www/noidle → /var/www/noidle
```
### 2. **Serviço PM2**
```
pointcontrol-api → noidle-api
noidle-api → noidle-api
```
### 3. **Package.json (Backend)**
```json
{
"name": "pointcontrol-api" "noidle-api"
"name": "noidle-api" "noidle-api"
}
```
### 4. **Package.json (Frontend)**
```json
{
"name": "pointcontrol-frontend" "noidle-frontend"
"name": "noidle-frontend" "noidle-frontend"
}
```
### 5. **Referências no Código**
- `PointControl``NoIdle`
- `pointcontrol``noidle`
- `NoIdle``NoIdle`
- `noidle``noidle`
- URLs antigas → URLs novas
### 6. **Banco de Dados**
@@ -62,14 +62,14 @@ pointcontrol-api → noidle-api
```bash
# 1. Parar serviços
pm2 stop pointcontrol-api
pm2 stop noidle-api
# 2. Backup do banco de dados
pg_dump $DATABASE_URL > /tmp/noidle_backup_$(date +%Y%m%d).sql
# 3. Backup dos arquivos
cd /var/www
tar -czf pointcontrol_backup_$(date +%Y%m%d).tar.gz pointcontrol/
tar -czf noidle_backup_$(date +%Y%m%d).tar.gz noidle/
```
---
@@ -79,7 +79,7 @@ tar -czf pointcontrol_backup_$(date +%Y%m%d).tar.gz pointcontrol/
```bash
# Renomear pasta
cd /var/www
mv pointcontrol noidle
mv noidle noidle
# Atualizar link simbólico se houver
# ln -sfn /var/www/noidle /var/www/app
@@ -93,11 +93,11 @@ mv pointcontrol noidle
cd /var/www/noidle/backend
# Atualizar package.json
sed -i 's/"name": "pointcontrol-api"/"name": "noidle-api"/g' package.json
sed -i 's/"name": "noidle-api"/"name": "noidle-api"/g' package.json
# Atualizar referências no código
grep -r "PointControl" . --include="*.js" -l | xargs sed -i 's/PointControl/NoIdle/g'
grep -r "pointcontrol" . --include="*.js" -l | xargs sed -i 's/pointcontrol/noidle/g'
grep -r "NoIdle" . --include="*.js" -l | xargs sed -i 's/NoIdle/NoIdle/g'
grep -r "noidle" . --include="*.js" -l | xargs sed -i 's/noidle/noidle/g'
# Reinstalar dependências
npm install
@@ -111,11 +111,11 @@ npm install
cd /var/www/noidle/frontend
# Atualizar package.json
sed -i 's/"name": "pointcontrol-frontend"/"name": "noidle-frontend"/g' package.json
sed -i 's/"name": "noidle-frontend"/"name": "noidle-frontend"/g' package.json
# Atualizar referências no código
grep -r "PointControl" src/ -l | xargs sed -i 's/PointControl/NoIdle/g'
grep -r "pointcontrol" src/ -l | xargs sed -i 's/pointcontrol/noidle/g'
grep -r "NoIdle" src/ -l | xargs sed -i 's/NoIdle/NoIdle/g'
grep -r "noidle" src/ -l | xargs sed -i 's/noidle/noidle/g'
# Rebuild
npm run build
@@ -127,7 +127,7 @@ npm run build
```bash
# Deletar processo antigo
pm2 delete pointcontrol-api
pm2 delete noidle-api
# Criar novo processo
cd /var/www/noidle/backend
@@ -147,7 +147,7 @@ pm2 list
sudo nano /etc/nginx/sites-available/admin.noidle.tech
# Atualizar paths se necessário
# root /var/www/pointcontrol/frontend/build; → /var/www/noidle/frontend/build;
# root /var/www/noidle/frontend/build; → /var/www/noidle/frontend/build;
# Testar e recarregar
sudo nginx -t
@@ -162,8 +162,8 @@ sudo systemctl reload nginx
cd /var/www/noidle
# Atualizar todos os arquivos .md
find . -name "*.md" -type f -exec sed -i 's/PointControl/NoIdle/g' {} +
find . -name "*.md" -type f -exec sed -i 's/pointcontrol/noidle/g' {} +
find . -name "*.md" -type f -exec sed -i 's/NoIdle/NoIdle/g' {} +
find . -name "*.md" -type f -exec sed -i 's/noidle/noidle/g' {} +
```
---
@@ -175,7 +175,7 @@ cd /var/www/noidle
# Commit das mudanças
git add .
git commit -m "refactor: Migração completa de PointControl para NoIdle
git commit -m "refactor: Migração completa de NoIdle para NoIdle
- Renomeadas todas as referências no código
- Atualizados package.json
@@ -229,7 +229,7 @@ git push
```
**Mudanças necessárias:**
- `console.log('✅ PointControl API')``console.log('✅ NoIdle API')`
- `console.log('✅ NoIdle API')``console.log('✅ NoIdle API')`
- Nome do projeto no package.json
### 2. Frontend
@@ -320,32 +320,32 @@ server {
#!/bin/bash
# migrate_to_noidle.sh
echo "🔄 Iniciando migração PointControl → NoIdle"
echo "🔄 Iniciando migração NoIdle → NoIdle"
# Parar serviços
echo "⏸️ Parando serviços..."
pm2 stop pointcontrol-api
pm2 stop noidle-api
# Renomear pasta
echo "📁 Renomeando pasta..."
cd /var/www
mv pointcontrol noidle
mv noidle noidle
# Atualizar backend
echo "🔧 Atualizando backend..."
cd noidle/backend
sed -i 's/pointcontrol/noidle/g' package.json
sed -i 's/PointControl/NoIdle/g' server.js
sed -i 's/noidle/noidle/g' package.json
sed -i 's/NoIdle/NoIdle/g' server.js
# Atualizar frontend
echo "🎨 Atualizando frontend..."
cd ../frontend
sed -i 's/pointcontrol/noidle/g' package.json
find src/ -name "*.jsx" -o -name "*.js" | xargs sed -i 's/PointControl/NoIdle/g'
sed -i 's/noidle/noidle/g' package.json
find src/ -name "*.jsx" -o -name "*.js" | xargs sed -i 's/NoIdle/NoIdle/g'
# Atualizar PM2
echo "🚀 Atualizando PM2..."
pm2 delete pointcontrol-api
pm2 delete noidle-api
cd ../backend
pm2 start server.js --name noidle-api
pm2 save
@@ -371,7 +371,7 @@ echo "Verifique: pm2 logs noidle-api"
### Opção 3: Manter Como Está
- Criar alias/links simbólicos
- Documentar que "pointcontrol" é o nome técnico
- Documentar que "noidle" é o nome técnico
- Usar "NoIdle" apenas no frontend
- **NÃO recomendado** (mantém confusão)
@@ -386,11 +386,11 @@ pm2 delete noidle-api
# Restaurar pasta
cd /var/www
mv noidle pointcontrol
mv noidle noidle
# Restaurar PM2
cd pointcontrol/backend
pm2 start server.js --name pointcontrol-api
cd noidle/backend
pm2 start server.js --name noidle-api
pm2 save
# Verificar

View File

@@ -150,7 +150,7 @@ ou
2. **No Servidor (verificar logs):**
```bash
pm2 logs pointcontrol-api --lines 20
pm2 logs noidle-api --lines 20
```
Procure por:

View File

@@ -112,7 +112,7 @@
### Ver logs do servidor:
```bash
pm2 logs pointcontrol-api --lines 50
pm2 logs noidle-api --lines 50
```
Procure por:
@@ -122,7 +122,7 @@ Procure por:
### Verificar dados no banco:
```bash
cd /var/www/pointcontrol/backend
cd /var/www/noidle/backend
node check_device_status.js DESKTOP-BC16GDH
```

View File

@@ -295,7 +295,7 @@ pyinstaller --onefile --windowed --name NoIdle CLIENTE_CORRIGIDO.py
### Criar Tabelas MDM
```bash
cd /var/www/pointcontrol/backend
cd /var/www/noidle/backend
psql $DATABASE_URL -f create_mdm_tables.sql
```
@@ -423,13 +423,13 @@ curl -X POST http://localhost:3005/api/mdm/commands/poll \
### 1. Backend
```bash
cd /var/www/pointcontrol/backend
cd /var/www/noidle/backend
# Criar tabelas MDM
psql $DATABASE_URL -f create_mdm_tables.sql
# Reiniciar API
pm2 restart pointcontrol-api
pm2 restart noidle-api
```
### 2. Cliente

View File

@@ -1,5 +1,5 @@
{
"name": "pointcontrol-api",
"name": "noidle-api",
"version": "1.0.0",
"main": "server.js",
"scripts": {

View File

@@ -129,65 +129,49 @@ router.get('/', authenticateToken, async (req, res) => {
// GET /api/dashboard/stats - Estatísticas expandidas para o novo dashboard
router.get('/stats', async (req, res) => {
try {
// Estatísticas principais
const mainStats = await query(`
SELECT
(SELECT COUNT(*) FROM users) as users,
(SELECT COUNT(*) FROM teams) as teams,
(SELECT COUNT(*) FROM devices) as devices,
(SELECT COUNT(*) FROM policies WHERE enabled = true) as policies,
(SELECT COUNT(*) FROM activities WHERE DATE(created_at) = CURRENT_DATE) as activities_today,
(SELECT COUNT(*) FROM devices WHERE status = 'online') as devices_online,
(SELECT COUNT(*) FROM devices WHERE status = 'offline') as devices_offline,
(SELECT COUNT(*) FROM policy_commands WHERE status IN ('pending', 'sent')) as pending_commands
`);
// Estatísticas básicas (simplificadas para funcionar sempre)
const usersCount = await query(`SELECT COUNT(*)::int as count FROM users`);
const devicesCount = await query(`SELECT COUNT(*)::int as count FROM devices`);
const activitiesCount = await query(`SELECT COUNT(*)::int as count FROM activities WHERE created_at::date = CURRENT_DATE`);
const devicesOnline = await query(`SELECT COUNT(*)::int as count FROM devices WHERE is_active = true`);
// Alertas e notificações
const alerts = await query(`
SELECT
(SELECT COUNT(*) FROM devices
WHERE last_seen < NOW() - INTERVAL '7 days' OR last_seen IS NULL) as devices_offline_7days,
// Times (pode não existir)
let teamsCount = { rows: [{ count: 0 }] };
try {
teamsCount = await query(`SELECT COUNT(*)::int as count FROM teams`);
} catch (e) {
// Tabela teams pode não existir
}
(SELECT COUNT(*) FROM devices d
LEFT JOIN activities a ON d.device_id = a.device_id
WHERE a.created_at IS NULL OR a.created_at < NOW() - INTERVAL '24 hours') as devices_no_activity_24h,
(SELECT COUNT(*) FROM policy_executions
WHERE status = 'failed'
AND executed_at > NOW() - INTERVAL '24 hours') as failed_policies_24h,
(SELECT COUNT(*) FROM devices
WHERE device_info->>'needs_update' = 'true') as devices_need_update,
(SELECT COUNT(*) FROM devices
WHERE (device_info->>'disk_free_gb')::int < 10) as low_disk_space,
(SELECT COUNT(*) FROM users
WHERE last_login < NOW() - INTERVAL '30 days' OR last_login IS NULL) as inactive_users
`);
const stats = mainStats.rows[0];
const alertsData = alerts.rows[0];
// Dados MDM (podem não existir)
let policiesCount = { rows: [{ count: 0 }] };
let pendingCommands = { rows: [{ count: 0 }] };
try {
policiesCount = await query(`SELECT COUNT(*)::int as count FROM policies WHERE enabled = true`);
pendingCommands = await query(`SELECT COUNT(*)::int as count FROM policy_commands WHERE status IN ('pending', 'sent')`);
} catch (e) {
// Tabelas MDM não existem ainda
}
res.json({
success: true,
stats: {
users: parseInt(stats.users) || 0,
teams: parseInt(stats.teams) || 0,
devices: parseInt(stats.devices) || 0,
policies: parseInt(stats.policies) || 0,
activities_today: parseInt(stats.activities_today) || 0,
devices_online: parseInt(stats.devices_online) || 0,
devices_offline: parseInt(stats.devices_offline) || 0,
pending_commands: parseInt(stats.pending_commands) || 0
users: parseInt(usersCount.rows[0].count) || 0,
teams: parseInt(teamsCount.rows[0].count) || 0,
devices: parseInt(devicesCount.rows[0].count) || 0,
policies: parseInt(policiesCount.rows[0].count) || 0,
activities_today: parseInt(activitiesCount.rows[0].count) || 0,
devices_online: parseInt(devicesOnline.rows[0].count) || 0,
devices_offline: parseInt(devicesCount.rows[0].count) - parseInt(devicesOnline.rows[0].count) || 0,
pending_commands: parseInt(pendingCommands.rows[0].count) || 0
},
alerts: {
devices_offline_7days: parseInt(alertsData.devices_offline_7days) || 0,
devices_no_activity_24h: parseInt(alertsData.devices_no_activity_24h) || 0,
failed_policies_24h: parseInt(alertsData.failed_policies_24h) || 0,
devices_need_update: parseInt(alertsData.devices_need_update) || 0,
low_disk_space: parseInt(alertsData.low_disk_space) || 0,
inactive_users: parseInt(alertsData.inactive_users) || 0
devices_offline_7days: 0, // TODO: implementar
devices_no_activity_24h: 0, // TODO: implementar
failed_policies_24h: 0, // TODO: implementar
devices_need_update: 0, // TODO: implementar
low_disk_space: 0, // TODO: implementar
inactive_users: 0 // TODO: implementar
}
});

View File

@@ -13,7 +13,7 @@ const corsOptions = {
// Lista de origens permitidas
const allowedOrigins = [
'https://admin.noidle.tech',
'https://admin.pointcontrol.co',
'https://admin.noidle.co',
'http://localhost:3000',
'http://localhost:3001'
];
@@ -81,6 +81,6 @@ app.use((err, req, res, next) => {
const PORT = process.env.PORT || 3005;
app.listen(PORT, () => {
console.log(`PointControl API rodando na porta ${PORT}`);
console.log(`NoIdle API rodando na porta ${PORT}`);
console.log(`📅 ${new Date().toISOString()}`);
});