diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..21f44c2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +# CloneWeb - Web Interface + Crawler Dockerfile +FROM node:20-alpine + +WORKDIR /app + +# Install wget for crawler + bash for scripts +RUN apk add --no-cache wget bash && ln -s /usr/bin/wget /bin/wget + +# --- Crawler service (port 3002) --- +COPY simple-crawler/package*.json /app/simple-crawler/ +WORKDIR /app/simple-crawler +RUN npm install --production + +COPY simple-crawler/ /app/simple-crawler/ + +# --- Web interface service (port 3000) --- +WORKDIR /app +COPY web-interface/package*.json /app/web-interface/ +WORKDIR /app/web-interface +RUN npm install --production + +COPY web-interface/ /app/web-interface/ + +# --- Storage dir for clones --- +RUN mkdir -p /app/cloned-sites + +# Expose port +EXPOSE 3000 + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3000/ || exit 1 + +# Start crawler in background (port 3002), then web server (port 3000) +CMD bash -c "node /app/simple-crawler/wget-cloner.js > /tmp/crawler.log 2>&1 & node server.js" \ No newline at end of file diff --git a/web-interface/public/app-new.js b/web-interface/public/app-new.js index c48c381..db695f6 100644 --- a/web-interface/public/app-new.js +++ b/web-interface/public/app-new.js @@ -100,8 +100,8 @@ async function checkServiceStatus() { const statusIndicator = document.getElementById('serviceStatus'); try { - // Verificar o serviço WGET na porta 3002 (não 3001) - const response = await fetch('http://localhost:3002/health', { + // Verificar o serviço WGET via proxy do servidor (mesma origem) + const response = await fetch('/api/health', { method: 'GET' }); @@ -200,13 +200,26 @@ function setupForms() { async function handleCloneSubmit(e) { e.preventDefault(); - const url = document.getElementById('cloneUrl').value.trim(); - const depth = parseInt(document.getElementById('depthLevel').value); - const includeImages = document.getElementById('includeImages').checked; - const includeCSS = document.getElementById('includeCSS').checked; - const includeJS = document.getElementById('includeJS').checked; - const convertLinks = document.getElementById('convertLinks').checked; - const cloneMethod = document.getElementById('cloneMethod').value; + const cloneUrlEl = document.getElementById('cloneUrl'); + const depthLevelEl = document.getElementById('depthLevel'); + const includeImagesEl = document.getElementById('includeImages'); + const includeCSSEl = document.getElementById('includeCSS'); + const includeJSEl = document.getElementById('includeJS'); + const convertLinksEl = document.getElementById('convertLinks'); + + if (!cloneUrlEl || !depthLevelEl || !includeImagesEl || !includeCSSEl || !includeJSEl || !convertLinksEl) { + console.error('Form elements not found'); + showToast('Erro: Elementos do formulário não encontrados', 'error'); + return; + } + + const url = cloneUrlEl.value.trim(); + const depth = parseInt(depthLevelEl.value); + const includeImages = includeImagesEl.checked; + const includeCSS = includeCSSEl.checked; + const includeJS = includeJSEl.checked; + const convertLinks = convertLinksEl.checked; + const cloneMethod = 'wget'; if (!url) { showToast('Por favor, insira uma URL válida', 'error'); @@ -582,18 +595,18 @@ function saveSettings() { // Utility Functions function openClonedSite(directory) { // Try to open via server endpoint - fetch('http://localhost:8080', { + fetch('/api/health', { method: 'GET' }).then(response => { if (response.ok) { - // Server is running, open the site - const siteName = directory.split('\\').pop(); - window.open(`http://localhost:8080/${siteName}/`, '_blank'); + // Server is running, open the site via same origin + const siteName = directory.split('/').pop(); + window.open(`/${siteName}/index.html`, '_blank'); } else { - showToast('Servidor HTTP não está rodando. Inicie o servidor na porta 8080.', 'error'); + showToast('Servidor não está respondendo.', 'error'); } }).catch(error => { - showToast('Servidor HTTP não está rodando. Inicie o servidor na porta 8080.', 'error'); + showToast('Servidor não está respondendo.', 'error'); }); } diff --git a/web-interface/public/index-new.html b/web-interface/public/index-new.html index 988f13d..b4611e3 100644 --- a/web-interface/public/index-new.html +++ b/web-interface/public/index-new.html @@ -5,7 +5,9 @@
Gerencie todos os sites clonados, versões e metadata
+Pipeline completo: Scout → Designer → Outreach → Orchestrator
+Identifica websites de empresas locais que precisam de redesign
+ +