Solucao Final Injetora
This commit is contained in:
parent
e8bc996081
commit
985d657b28
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,48 @@
|
||||||
|
import fs from 'fs';
|
||||||
|
|
||||||
|
async function migrarPelaWeb() {
|
||||||
|
console.log('🚀 Preparando o envio de dados via Injeção Web (Driblando Firewall)...');
|
||||||
|
|
||||||
|
// 1. Lendo os arquivos
|
||||||
|
const sql = fs.readFileSync('../schema.sql', 'utf8');
|
||||||
|
|
||||||
|
// Pegue o seu arquivo que já foi salvo!
|
||||||
|
const arquivos = fs.readdirSync('.');
|
||||||
|
const arquivoBackup = arquivos.find(a => a.startsWith('backup_supabase_') && a.endsWith('.json'));
|
||||||
|
|
||||||
|
if (!arquivoBackup) {
|
||||||
|
console.log('❌ O JSON de backup não foi encontrado na pasta manager!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const jsonData = JSON.parse(fs.readFileSync(arquivoBackup, 'utf8'));
|
||||||
|
|
||||||
|
// 2. Fazendo o Disparo para a WEB!!!
|
||||||
|
console.log('🔥 Disparando os dados para a sua nuvem através da porta 443 liberada!');
|
||||||
|
try {
|
||||||
|
const payloadLength = JSON.stringify({ senha: 'magia2026', sql, jsonData }).length;
|
||||||
|
console.log(`📦 Tamanho da carga: ${(payloadLength / 1024 / 1024).toFixed(2)} MB`);
|
||||||
|
|
||||||
|
const response = await fetch('https://edumanager.microtecinformaticacurso.com.br/api/migracao-remota', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
senha: 'magia2026',
|
||||||
|
sql: sql,
|
||||||
|
jsonData: jsonData
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
const resultado = await response.json();
|
||||||
|
if (response.ok) {
|
||||||
|
console.log('✅ SUCESSO ABSOLUTO:', resultado.message);
|
||||||
|
console.log('O seu banco de dados na VPS está criado e populado! Pode abrir o sistema.');
|
||||||
|
} else {
|
||||||
|
console.log('⚠️ ALERTA:', resultado.error || resultado);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('❌ Falha na conexão HTTP:', err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
migrarPelaWeb();
|
||||||
|
|
@ -24,7 +24,7 @@ import fs from 'fs';
|
||||||
// ============================================================
|
// ============================================================
|
||||||
const SUPABASE_URL = process.env.VITE_SUPABASE_URL || 'https://ekbuvcjsfcczviqqlfit.supabase.co';
|
const SUPABASE_URL = process.env.VITE_SUPABASE_URL || 'https://ekbuvcjsfcczviqqlfit.supabase.co';
|
||||||
const SUPABASE_KEY = process.env.VITE_SUPABASE_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImVrYnV2Y2pzZmNjenZpcXFsZml0Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzA5OTU0MzIsImV4cCI6MjA4NjU3MTQzMn0.oIzBeGF-PjaviZejYb1TeOOEzMm-Jjth1XzvJrjD6us';
|
const SUPABASE_KEY = process.env.VITE_SUPABASE_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImVrYnV2Y2pzZmNjenZpcXFsZml0Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzA5OTU0MzIsImV4cCI6MjA4NjU3MTQzMn0.oIzBeGF-PjaviZejYb1TeOOEzMm-Jjth1XzvJrjD6us';
|
||||||
const DATABASE_URL = process.env.DATABASE_URL || 'postgresql://edumanager:EduManager2026!Seguro@localhost:5432/edumanager';
|
const DATABASE_URL = process.env.DATABASE_URL || 'postgresql://edumanager:EduManager2026!Seguro@150.230.87.131:5432/edumanager';
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// INICIALIZAÇÃO
|
// INICIALIZAÇÃO
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -13,7 +13,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.700.0",
|
"@aws-sdk/client-s3": "^3.700.0",
|
||||||
"@google/genai": "^1.40.0",
|
"@google/genai": "^1.40.0",
|
||||||
"@supabase/supabase-js": "2.39.0",
|
"@supabase/supabase-js": "^2.39.0",
|
||||||
"@vladmandic/face-api": "^1.7.15",
|
"@vladmandic/face-api": "^1.7.15",
|
||||||
"browser-image-compression": "^2.0.2",
|
"browser-image-compression": "^2.0.2",
|
||||||
"cors": "^2.8.6",
|
"cors": "^2.8.6",
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
"jspdf-autotable": "^3.8.2",
|
"jspdf-autotable": "^3.8.2",
|
||||||
"lucide-react": "^0.563.0",
|
"lucide-react": "^0.563.0",
|
||||||
"multer": "^2.1.1",
|
"multer": "^2.1.1",
|
||||||
"pg": "^8.13.0",
|
"pg": "^8.20.0",
|
||||||
"react": "^19.2.4",
|
"react": "^19.2.4",
|
||||||
"react-dom": "^19.2.4",
|
"react-dom": "^19.2.4",
|
||||||
"recharts": "^3.7.0",
|
"recharts": "^3.7.0",
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,42 @@ app.put('/api/school-data', async (req, res) => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ============================================================
|
||||||
|
// ROTA MÁGICA: Driblar Firewall e Migrar via HTTP
|
||||||
|
// ============================================================
|
||||||
|
app.post('/api/migracao-remota', async (req, res) => {
|
||||||
|
try {
|
||||||
|
const { senha, sql, jsonData } = req.body;
|
||||||
|
if (senha !== 'magia2026') return res.status(401).send('Não autorizado');
|
||||||
|
|
||||||
|
const client = await pool.connect();
|
||||||
|
try {
|
||||||
|
await client.query('BEGIN');
|
||||||
|
// 1. Criar todas as tabelas!
|
||||||
|
if (sql) await client.query(sql);
|
||||||
|
|
||||||
|
// 2. Injetar a mega tabela ponte
|
||||||
|
if (jsonData) {
|
||||||
|
await client.query(
|
||||||
|
`INSERT INTO school_data (id, data, updated_at) VALUES (1, $1, NOW())
|
||||||
|
ON CONFLICT (id) DO UPDATE SET data = EXCLUDED.data, updated_at = NOW()`,
|
||||||
|
[JSON.stringify(jsonData)]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
await client.query('COMMIT');
|
||||||
|
res.json({ success: true, message: 'Banco de dados criado e populado pela internet!' });
|
||||||
|
} catch (err) {
|
||||||
|
await client.query('ROLLBACK');
|
||||||
|
throw err;
|
||||||
|
} finally {
|
||||||
|
client.release();
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Erro na migração HTTP:', error);
|
||||||
|
res.status(500).json({ error: error.message });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// Upload de Logo (MinIO em vez de Supabase Storage)
|
// Upload de Logo (MinIO em vez de Supabase Storage)
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue