diff --git a/dist/index.html b/dist/index.html index 1eadede4..d0e4c7f5 100644 --- a/dist/index.html +++ b/dist/index.html @@ -239,7 +239,7 @@ } } - +
diff --git a/infra/releases/2026-06-02_22-34-39_HML.md b/infra/releases/2026-06-02_22-34-39_HML.md deleted file mode 100644 index 85531752..00000000 --- a/infra/releases/2026-06-02_22-34-39_HML.md +++ /dev/null @@ -1,61 +0,0 @@ -# Release HML - -Data: ter 2 jun 2026 22:34:39 -03 - -Ambiente: -HML - -Descrição: -Aplicativos de Atrair Leads - -Branch: -develop - -Arquivos alterados antes do commit: - M dist/index.html - M dist/sitemap.xml - D infra/releases/2026-06-02_12-43-57_HML.md - M node_modules/.tmp/tsconfig.app.tsbuildinfo - M public/sitemap.xml - M public/version.json - M scripts/build-static-routes.sh - M scripts/prerender.cjs - M src/App.tsx - M src/config/site.ts -?? infra/releases/2026-06-02_22-34-39_HML.md -?? public/versions.json -?? src/components/ferramentas/ -?? src/pages/ferramentas/ - -Status: -Preparado para publicação - -Commit: -6dfdf018 - -Arquivos no commit: -dist/index.html -dist/sitemap.xml -infra/releases/2026-06-02_12-43-57_HML.md -infra/releases/2026-06-02_22-34-39_HML.md -node_modules/.tmp/tsconfig.app.tsbuildinfo -public/sitemap.xml -public/version.json -public/versions.json -scripts/build-static-routes.sh -scripts/prerender.cjs -src/App.tsx -src/components/ferramentas/FerramentaLayout.tsx -src/components/ferramentas/dnsApi.ts -src/config/site.ts -src/pages/ferramentas/DkimChecker.tsx -src/pages/ferramentas/DmarcChecker.tsx -src/pages/ferramentas/EmailSecurityScore.tsx -src/pages/ferramentas/Microsoft365Analyzer.tsx -src/pages/ferramentas/MxLookup.tsx -src/pages/ferramentas/SpfChecker.tsx -src/pages/ferramentas/SslChecker.tsx -src/pages/ferramentas/index.tsx - -Status final: -Publicado no Gitea / aguardando pipeline HML diff --git a/infra/releases/2026-06-03_22-07-58_HML.md b/infra/releases/2026-06-03_22-07-58_HML.md new file mode 100644 index 00000000..a286c070 --- /dev/null +++ b/infra/releases/2026-06-03_22-07-58_HML.md @@ -0,0 +1,33 @@ +# Release HML + +Data: qua 3 jun 2026 22:07:59 -03 + +Ambiente: +HML + +Descrição: +Aplicativos de Atrair Leads + +Branch: +develop + +Arquivos alterados antes do commit: + M dist/index.html + D infra/releases/2026-06-02_22-34-39_HML.md + M src/App.tsx + M src/sections/About.tsx + M src/sections/CondominiosCTA.tsx + M src/sections/Hero.tsx + M src/sections/Navigation.tsx + M src/sections/Services.tsx +?? infra/releases/2026-06-03_22-07-58_HML.md +?? nginx/ +?? public/about-image.webp +?? public/hero-dashboard.webp +?? public/service-cloud.webp +?? public/service-security.webp +?? public/service-support.webp +?? public/service-ti.webp + +Status: +Preparado para publicação diff --git a/nginx/avanzato.conf b/nginx/avanzato.conf new file mode 100644 index 00000000..385b4ef7 --- /dev/null +++ b/nginx/avanzato.conf @@ -0,0 +1,132 @@ +# ============================================================================ +# Configuracao Nginx - Avanzato Tecnologia +# ============================================================================ +# Inclui: CSP, HSTS, X-Frame-Options, cache headers, gzip, brotli +# Copiar para: /etc/nginx/sites-available/avanzato.com.br +# Ativar: ln -s /etc/nginx/sites-available/avanzato.com.br /etc/nginx/sites-enabled/ +# ============================================================================ + +server { + listen 80; + listen [::]:80; + server_name avanzato.com.br www.avanzato.com.br; + + # Redirecionar HTTP para HTTPS + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name avanzato.com.br www.avanzato.com.br; + + # SSL (certbot gerencia automaticamente) + ssl_certificate /etc/letsencrypt/live/avanzato.com.br/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/avanzato.com.br/privkey.pem; + ssl_trusted_certificate /etc/letsencrypt/live/avanzato.com.br/chain.pem; + + # SSL hardening + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; + ssl_prefer_server_ciphers off; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 1d; + ssl_session_tickets off; + + # HSTS - HTTP Strict Transport Security + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; + + # Root do projeto + root /var/www/avanzato/dist; + index index.html; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_comp_level 6; + gzip_types + text/plain + text/css + text/xml + text/javascript + application/json + application/javascript + application/xml+rss + application/atom+xml + image/svg+xml + font/woff2; + + # ============================================================================ + # CACHE HEADERS - Assets estaticos + # ============================================================================ + + # Imagens, fontes, videos - 1 mes + location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|woff|woff2|ttf|eot|mp4|webm)$ { + expires 1M; + add_header Cache-Control "public, immutable" always; + add_header Vary "Accept-Encoding" always; + access_log off; + } + + # CSS e JS - 1 ano (tem hash no nome) + location ~* \.(css|js)$ { + expires 1y; + add_header Cache-Control "public, immutable" always; + add_header Vary "Accept-Encoding" always; + access_log off; + } + + # HTML - nao cachear + location ~* \.html$ { + expires -1; + add_header Cache-Control "no-cache, no-store, must-revalidate" always; + add_header Pragma "no-cache" always; + } + + # ============================================================================ + # SECURITY HEADERS + # ============================================================================ + + # Content Security Policy + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.googletagmanager.com https://connect.facebook.net https://static.cloudflareinsights.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; connect-src 'self' https://dns.google https://crt.sh https://mkt.avanzato.com.br https://www.google-analytics.com https://www.facebook.com; frame-src 'self' https://mkt.avanzato.com.br; media-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; upgrade-insecure-requests;" always; + + # X-Frame-Options - protecao contra clickjacking + add_header X-Frame-Options "SAMEORIGIN" always; + + # X-Content-Type-Options + add_header X-Content-Type-Options "nosniff" always; + + # Referrer Policy + add_header Referrer-Policy "strict-origin-when-cross-origin" always; + + # Permissions Policy + add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), magnetometer=(), gyroscope=()" always; + + # Cross-Origin Opener Policy + add_header Cross-Origin-Opener-Policy "same-origin" always; + + # Cross-Origin Resource Policy + add_header Cross-Origin-Resource-Policy "cross-origin" always; + + # ============================================================================ + # REACT ROUTER - SPA fallback + # ============================================================================ + + location / { + try_files $uri $uri/ /index.html; + add_header Cache-Control "no-cache, no-store, must-revalidate" always; + } + + # Sitemap e robots - acessiveis + location = /sitemap.xml { + try_files $uri =404; + add_header Content-Type "application/xml" always; + } + + location = /robots.txt { + try_files $uri =404; + add_header Content-Type "text/plain" always; + } +} diff --git a/public/about-image.webp b/public/about-image.webp new file mode 100644 index 00000000..13078814 Binary files /dev/null and b/public/about-image.webp differ diff --git a/public/hero-dashboard.webp b/public/hero-dashboard.webp new file mode 100644 index 00000000..74fa44cb Binary files /dev/null and b/public/hero-dashboard.webp differ diff --git a/public/service-cloud.webp b/public/service-cloud.webp new file mode 100644 index 00000000..3645bf7f Binary files /dev/null and b/public/service-cloud.webp differ diff --git a/public/service-security.webp b/public/service-security.webp new file mode 100644 index 00000000..50f53bd4 Binary files /dev/null and b/public/service-security.webp differ diff --git a/public/service-support.webp b/public/service-support.webp new file mode 100644 index 00000000..3595e6f3 Binary files /dev/null and b/public/service-support.webp differ diff --git a/public/service-ti.webp b/public/service-ti.webp new file mode 100644 index 00000000..c05693c9 Binary files /dev/null and b/public/service-ti.webp differ diff --git a/src/App.tsx b/src/App.tsx index 09213da3..1ac4a440 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useEffect, useState, lazy, Suspense } from 'react'; import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom'; import { gsap } from 'gsap'; import { ScrollTrigger } from 'gsap/ScrollTrigger'; @@ -8,78 +8,80 @@ import WhatsAppWidget from './components/WhatsAppWidget'; import CookieConsent from './components/CookieConsent'; import HomologationBanner from './components/HomologationBanner'; -// Páginas +// Página inicial carrega direto (mais acessada) import Home from './pages/Home'; -import Sobre from './pages/Sobre'; -import Blog from './pages/Blog'; -import BlogPost from './pages/BlogPost'; -import Cases from './pages/Cases'; -import Contato from './pages/Contato'; -import Privacidade from './pages/Privacidade'; -import Termos from './pages/Termos'; import NotFound from './pages/NotFound'; +// Todas as outras páginas com lazy loading para reduzir bundle inicial +const Sobre = lazy(() => import('./pages/Sobre')); +const Blog = lazy(() => import('./pages/Blog')); +const BlogPost = lazy(() => import('./pages/BlogPost')); +const Cases = lazy(() => import('./pages/Cases')); +const Contato = lazy(() => import('./pages/Contato')); +const Privacidade = lazy(() => import('./pages/Privacidade')); +const Termos = lazy(() => import('./pages/Termos')); + // Páginas de Serviços -import TiGerenciada from './pages/services/TiGerenciada'; -import CloudComputing from './pages/services/CloudComputing'; -import Seguranca from './pages/services/Seguranca'; -import Suporte from './pages/services/Suporte'; -import Redes from './pages/services/Redes'; -import Pabx from './pages/services/Pabx'; -import Backup from './pages/services/Backup'; -import Servidores from './pages/services/Servidores'; -import Consultoria from './pages/services/Consultoria'; -import Noc from './pages/services/Noc'; +const TiGerenciada = lazy(() => import('./pages/services/TiGerenciada')); +const CloudComputing = lazy(() => import('./pages/services/CloudComputing')); +const Seguranca = lazy(() => import('./pages/services/Seguranca')); +const Suporte = lazy(() => import('./pages/services/Suporte')); +const Redes = lazy(() => import('./pages/services/Redes')); +const Pabx = lazy(() => import('./pages/services/Pabx')); +const Backup = lazy(() => import('./pages/services/Backup')); +const Servidores = lazy(() => import('./pages/services/Servidores')); +const Consultoria = lazy(() => import('./pages/services/Consultoria')); +const Noc = lazy(() => import('./pages/services/Noc')); // Páginas de Tecnologias (SEO) -import Tecnologias from './pages/Tecnologias'; -import WindowsServer from './pages/tech/WindowsServer'; -import Linux from './pages/tech/Linux'; -import PfSense from './pages/tech/PfSense'; -import Proxmox from './pages/tech/Proxmox'; -import Vmware from './pages/tech/Vmware'; -import Sharepoint from './pages/tech/Sharepoint'; -import Cisco from './pages/tech/Cisco'; +const Tecnologias = lazy(() => import('./pages/Tecnologias')); +const WindowsServer = lazy(() => import('./pages/tech/WindowsServer')); +const Linux = lazy(() => import('./pages/tech/Linux')); +const PfSense = lazy(() => import('./pages/tech/PfSense')); +const Proxmox = lazy(() => import('./pages/tech/Proxmox')); +const Vmware = lazy(() => import('./pages/tech/Vmware')); +const Sharepoint = lazy(() => import('./pages/tech/Sharepoint')); +const Cisco = lazy(() => import('./pages/tech/Cisco')); // Avaliador de Maturidade Tecnológica -import Avaliador from './pages/Avaliador'; -import Condominios from './pages/Condominios'; +const Avaliador = lazy(() => import('./pages/Avaliador')); +const Condominios = lazy(() => import('./pages/Condominios')); // Landing Pages por Nicho -import Contabilidade from './pages/nichos/Contabilidade'; -import Advocacia from './pages/nichos/Advocacia'; -import Monitoramento from './pages/nichos/Monitoramento'; -import FirewallPfSense from './pages/nichos/FirewallPfSense'; -import BackupCorporativo from './pages/nichos/BackupCorporativo'; -import VoipEmpresarial from './pages/nichos/VoipEmpresarial'; +const Contabilidade = lazy(() => import('./pages/nichos/Contabilidade')); +const Advocacia = lazy(() => import('./pages/nichos/Advocacia')); +const Monitoramento = lazy(() => import('./pages/nichos/Monitoramento')); +const FirewallPfSense = lazy(() => import('./pages/nichos/FirewallPfSense')); +const BackupCorporativo = lazy(() => import('./pages/nichos/BackupCorporativo')); +const VoipEmpresarial = lazy(() => import('./pages/nichos/VoipEmpresarial')); // SEO Local - Onde Atuamos -import OndeAtuamos from './pages/OndeAtuamos'; -import LocalGuarulhos from './pages/local-guarulhos'; -import LocalMogi from './pages/local-mogi-das-cruzes'; -import LocalIpiranga from './pages/local-ipiranga'; -import LocalVilaFormosa from './pages/local-vila-formosa'; -import LocalCerqueiraCesar from './pages/local-cerqueira-cesar'; -import LocalSantana from './pages/local-santana'; -import LocalBras from './pages/local-bras'; -import LocalRibeiraoPreto from './pages/local-ribeirao-preto'; +const OndeAtuamos = lazy(() => import('./pages/OndeAtuamos')); +const LocalGuarulhos = lazy(() => import('./pages/local-guarulhos')); +const LocalMogi = lazy(() => import('./pages/local-mogi-das-cruzes')); +const LocalIpiranga = lazy(() => import('./pages/local-ipiranga')); +const LocalVilaFormosa = lazy(() => import('./pages/local-vila-formosa')); +const LocalCerqueiraCesar = lazy(() => import('./pages/local-cerqueira-cesar')); +const LocalSantana = lazy(() => import('./pages/local-santana')); +const LocalBras = lazy(() => import('./pages/local-bras')); +const LocalRibeiraoPreto = lazy(() => import('./pages/local-ribeirao-preto')); // Nichos adicionais -import NichoIndustria from './pages/nicho-industria'; -import NichoPortaria from './pages/nicho-portaria-remota'; -import NichoClinicas from './pages/nicho-clinicas'; -import NichoImobiliarias from './pages/nicho-imobiliarias'; -import NichoRecrutamento from './pages/nicho-recrutamento-selecao'; +const NichoIndustria = lazy(() => import('./pages/nicho-industria')); +const NichoPortaria = lazy(() => import('./pages/nicho-portaria-remota')); +const NichoClinicas = lazy(() => import('./pages/nicho-clinicas')); +const NichoImobiliarias = lazy(() => import('./pages/nicho-imobiliarias')); +const NichoRecrutamento = lazy(() => import('./pages/nicho-recrutamento-selecao')); // Avanzato Tools -import Ferramentas from './pages/ferramentas'; -import SpfChecker from './pages/ferramentas/SpfChecker'; -import DkimChecker from './pages/ferramentas/DkimChecker'; -import DmarcChecker from './pages/ferramentas/DmarcChecker'; -import MxLookup from './pages/ferramentas/MxLookup'; -import SslChecker from './pages/ferramentas/SslChecker'; -import EmailSecurityScore from './pages/ferramentas/EmailSecurityScore'; -import Microsoft365Analyzer from './pages/ferramentas/Microsoft365Analyzer'; +const Ferramentas = lazy(() => import('./pages/ferramentas')); +const SpfChecker = lazy(() => import('./pages/ferramentas/SpfChecker')); +const DkimChecker = lazy(() => import('./pages/ferramentas/DkimChecker')); +const DmarcChecker = lazy(() => import('./pages/ferramentas/DmarcChecker')); +const MxLookup = lazy(() => import('./pages/ferramentas/MxLookup')); +const SslChecker = lazy(() => import('./pages/ferramentas/SslChecker')); +const EmailSecurityScore = lazy(() => import('./pages/ferramentas/EmailSecurityScore')); +const Microsoft365Analyzer = lazy(() => import('./pages/ferramentas/Microsoft365Analyzer')); import './App.css'; @@ -88,20 +90,20 @@ gsap.registerPlugin(ScrollTrigger); // Componente para scroll ao topo ao mudar de página function ScrollToTop() { const { pathname } = useLocation(); - + useEffect(() => { window.scrollTo(0, 0); // Refresh ScrollTrigger ao mudar de página ScrollTrigger.refresh(); }, [pathname]); - + return null; } // Componente de Progress Bar function ProgressBar() { const [scrollProgress, setScrollProgress] = useState(0); - + useEffect(() => { const handleScroll = () => { const scrollTop = window.scrollY; @@ -113,7 +115,7 @@ function ProgressBar() { window.addEventListener('scroll', handleScroll, { passive: true }); return () => window.removeEventListener('scroll', handleScroll); }, []); - + return (
+
+ Comunicação moderna e econômica
Infraestrutura profissional
Alta disponibilidade
Monitoramento 24/7
+
+