diff --git a/frontend/src/app/admin/backup/emergency/page.tsx b/frontend/src/app/admin/backup/emergency/page.tsx deleted file mode 100644 index bc39c38..0000000 --- a/frontend/src/app/admin/backup/emergency/page.tsx +++ /dev/null @@ -1,92 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import { useRouter } from 'next/navigation'; - -export default function EmergencyBackupPage() { - const [file, setFile] = useState(null); - const [status, setStatus] = useState<'idle' | 'uploading' | 'success' | 'error'>('idle'); - const [message, setMessage] = useState(''); - const router = useRouter(); - - const handleUpload = async () => { - if (!file) return; - setStatus('uploading'); - setMessage('Restaurando sistema de emergência... Por favor, aguarde.'); - - const formData = new FormData(); - formData.append('file', file); - - try { - const res = await fetch('/api/admin/backup/full', { - method: 'POST', - body: formData, - }); - - if (res.ok) { - setStatus('success'); - setMessage('Sistema restaurado com sucesso! Redirecionando para o login...'); - setTimeout(() => router.push('/admin/login'), 3000); - } else { - const errorData = await res.json(); - setStatus('error'); - setMessage(errorData.error || 'Erro ao restaurar backup.'); - } - } catch (err) { - setStatus('error'); - setMessage('A conexão caiu, mas o servidor pode ainda estar processando. Aguarde 2 minutos e tente logar. Se não funcionar, verifique os logs do Dokploy.'); - console.error('Erro de restauração:', err); - } - }; - - return ( -
-
-

🔑 Chave Mestra de Restauração

-

Use esta página para restaurar seu backup ZIP em um banco de dados novo.

- -
-
- setFile(e.target.files?.[0] || null)} - /> -
- {file ? ( - {file.name} - ) : ( - 'Clique ou arraste o arquivo .zip de backup aqui' - )} -
-
- - - - {message && ( -
- {message} -
- )} -
-
-
- ); -} diff --git a/frontend/src/app/admin/layout.tsx b/frontend/src/app/admin/layout.tsx index 1588f44..d4a4817 100644 --- a/frontend/src/app/admin/layout.tsx +++ b/frontend/src/app/admin/layout.tsx @@ -87,12 +87,6 @@ export default function AdminLayout({ useEffect(() => { setMounted(true); const fetchUser = async () => { - // Pular verificação para rotas de emergência - if (pathname?.endsWith('/admin/backup/emergency') || pathname?.endsWith('/admin/rescue')) { - setIsLoading(false); - return; - } - try { const response = await fetch('/api/auth/me'); if (response.ok) { @@ -177,15 +171,6 @@ export default function AdminLayout({ ); } - // Se for uma rota de emergência, renderiza apenas o conteúdo - if (pathname?.endsWith('/admin/backup/emergency') || pathname?.endsWith('/admin/rescue')) { - return ( -
- {children} -
- ); - } - // Se não tem usuário após loading, não renderizar nada (está redirecionando) if (!user) { return null; diff --git a/frontend/src/app/admin/rescue/page.tsx b/frontend/src/app/admin/rescue/page.tsx deleted file mode 100644 index 60fb500..0000000 --- a/frontend/src/app/admin/rescue/page.tsx +++ /dev/null @@ -1,103 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import { useRouter } from 'next/navigation'; - -export default function RescuePage() { - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [name, setName] = useState(''); - const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle'); - const [message, setMessage] = useState(''); - const router = useRouter(); - - const handleCreate = async (e: React.FormEvent) => { - e.preventDefault(); - setStatus('loading'); - - try { - const res = await fetch('/api/admin/rescue', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ email, password, name }), - }); - - if (res.ok) { - setStatus('success'); - setMessage('Usuário administrador criado com sucesso! Redirecionando...'); - setTimeout(() => router.push('/acesso'), 2000); - } else { - const error = await res.json(); - setStatus('error'); - setMessage(error.error || 'Erro ao criar usuário.'); - } - } catch (err) { - setStatus('error'); - setMessage('Erro de conexão.'); - } - }; - - return ( -
-
-
- -

Resgate de Emergência

-
- -

Use esta página apenas se você foi bloqueado do sistema. Ela criará um novo administrador.

- -
-
- - setName(e.target.value)} - placeholder="Ex: Erik" - /> -
-
- - setEmail(e.target.value)} - placeholder="seu@email.com" - /> -
-
- - setPassword(e.target.value)} - placeholder="••••••••" - /> -
- - - - {message && ( -
- {message} -
- )} -
-
-
- ); -} diff --git a/frontend/src/app/api/admin/rescue/route.ts b/frontend/src/app/api/admin/rescue/route.ts deleted file mode 100644 index 7d6017a..0000000 --- a/frontend/src/app/api/admin/rescue/route.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NextRequest, NextResponse } from 'next/server'; -import prisma from '@/lib/prisma'; -import bcrypt from 'bcryptjs'; - -export async function POST(req: NextRequest) { - try { - const { email, password, name } = await req.json(); - - if (!email || !password) { - return NextResponse.json({ error: 'Email e senha são obrigatórios' }, { status: 400 }); - } - - // Criptografar senha - const hashedPassword = await bcrypt.hash(password, 10); - - // Criar ou atualizar usuário - const user = await prisma.user.upsert({ - where: { email }, - update: { - password: hashedPassword, - name: name || undefined - }, - create: { - email, - password: hashedPassword, - name: name || 'Administrador' - } - }); - - return NextResponse.json({ message: 'Usuário configurado com sucesso' }); - } catch (error) { - console.error('Erro no resgate de usuário:', error); - return NextResponse.json({ error: 'Erro interno no servidor' }, { status: 500 }); - } -} diff --git a/frontend/start.sh b/frontend/start.sh index 9fe8f5d..20d07b8 100644 --- a/frontend/start.sh +++ b/frontend/start.sh @@ -50,5 +50,30 @@ else echo "⚠️ DATABASE_URL não encontrada. O site pode falhar." fi +# --- DIAGNÓSTICO DE REDE (S3) --- +if [ ! -z "$S3_ENDPOINT" ]; then + echo "📡 Testando conexão S3 em $S3_ENDPOINT na porta ${S3_PORT:-9000}..." + node -e " + const net = require('net'); + const s3Host = '$S3_ENDPOINT'; + const s3Port = parseInt('${S3_PORT:-9000}'); + + const client = net.createConnection({ host: s3Host, port: s3Port, timeout: 5000 }, () => { + console.log('✅ REDE S3 OK: A porta ' + s3Port + ' está aberta!'); + process.exit(0); + }); + + client.on('error', (err) => { + console.log('❌ REDE S3 ERRO: ' + err.message); + process.exit(1); + }); + + client.on('timeout', () => { + console.log('❌ REDE S3 TIMEOUT: O host ' + s3Host + ' não respondeu.'); + process.exit(1); + }); + " || echo "⚠️ Aviso: Não foi possível confirmar o S3, mas continuaremos..." +fi + echo "🚀 Iniciando Octto Engenharia..." exec node server.js