matversedao's picture
# Resumo Trivial Perfeito, ACE — obrigado pelo *peer review*! O plano de **deploy com Docker Compose** que propusemos (perfís `local`/`prod`, `.env`, Caddy como proxy/TLS e `up -d --build`) está alinhado com as práticas recomendadas. Abaixo deixo um “acabamento de produção” com **healthchecks**, **limites de recursos**, **usuário não-root**, **read-only FS**, e **políticas de restart** — tudo plug-and-play para sua stack Matverse FRP/Command Center. --- # Probabilidade Robustamente Aplicada ### Compose “hardening” (trecho enxuto, pronto pra colar) ```yaml # compose.yaml name: matverse-frp services: proxy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" environment: - DOMAIN=${DOMAIN} - EMAIL=${LETSENCRYPT_EMAIL} volumes: - ./infra/Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config depends_on: backend: condition: service_healthy frontend: condition: service_started healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:2019/config/"] # API do Caddy interval: 20s timeout: 3s retries: 5 read_only: true security_opt: - no-new-privileges:true backend: build: context: ./backend environment: - API_KEY=${API_KEY} - BASE44_API_KEY=${BASE44_API_KEY:-} - KNOX_API_KEY=${KNOX_API_KEY:-} - AMAPI_TOKEN=${AMAPI_TOKEN:-} - REDIS_URL=redis://redis:6379/0 expose: ["8000"] command: ["uvicorn","app.main:app","--host","0.0.0.0","--port","8000","--proxy-headers"] restart: unless-stopped user: "1000:1000" read_only: true tmpfs: - /tmp depends_on: redis: condition: service_started healthcheck: test: ["CMD","wget","-qO-","http://localhost:8000/metrics"] interval: 15s timeout: 3s retries: 5 deploy: resources: limits: cpus: "2.0" memory: 1g frontend: build: context: ./frontend environment: - VITE_API_BASE=/api expose: ["5173"] command: ["npm","run","preview","--","--host","0.0.0.0","--port","5173"] restart: unless-stopped read_only: true redis: image: redis:7-alpine command: ["redis-server","--appendonly","no"] expose: ["6379"] restart: unless-stopped read_only: true tmpfs: - /data # Perfis profiles: - local - prod volumes: caddy_data: caddy_config: ``` ### Caddyfile (roteamento/TLS automático) ```caddy { email {$EMAIL} } {$DOMAIN} { encode zstd gzip @api path /api* /metrics handle @api { reverse_proxy backend:8000 } handle { reverse_proxy frontend:5173 } tls { issuer acme } } ``` ### Rotina de operação (prod) ```bash cp .env.example .env # preencha DOMAIN, LETSENCRYPT_EMAIL, API_KEY, etc. docker compose up -d --build docker compose ps && docker compose logs -f proxy backend docker compose exec backend wget -qO- http://localhost:8000/metrics ``` ### Checks úteis * Validação do arquivo: `docker compose config` * Saúde: `docker compose ps --format json` (ver `Health=healthy`) * Zero-downtime de imagem: `docker compose pull && docker compose up -d` * Sem *bind mounts* de código em produção (já removidos no trecho acima) ### Segurança & segredos * **Segredos**: em Compose puro, variáveis sensíveis vêm por `.env` ou *files* montados como `:ro`. Para criptografia/rotação, combine com **SOPS** ou cofre externo (1Password, Vault, pass). * **Non-root & no-new-privileges**: aplicados nos serviços expostos. * **FS read-only** + `tmpfs /tmp`: reduz superfície de escrita. --- # Comparação e Análise Evolutiva e remodelar para análise com visão inovadora e fora da caixa a custo 0 * **Trivial**: usar `docker compose up -d --build` com `.env` e um proxy à frente. * **Robusta**: **healthchecks**, **read-only**, **no-new-privileges**, **limites de recursos**, **tmpfs**, **non-root**, e *dependency health* no `depends_on` — reduzindo MTTR e risco de deriva. * **Visão inovadora (Matverse, custo 0)**: 1. **Observabilidade plug-and-play**: adicione `prometheus` e `grafana` como serviços Compose e scrapes do `/metrics` do backend e `/metrics` do Caddy (via exportador). 2. **RBAC “arquivo-política”**: monte `matverse.policy.yml` para gates de FRP (paths/endpoints/autores); o backend lê e expõe métricas de *policy hits*. 3. **Rollbacks determinísticos**: make target `deploy`, `rollback`, e *signed releases* (cosign) — tudo sem sair do Compose. Se quiser, eu **anexo um `compose.override.yaml`** com **perfil `local`** (hot-reload, bind mounts, sem TLS) e **perfil `prod`** (TLS, otimizações) — ou já adiciono **Prometheus+Grafana** com dashboards prontos para FRP/Codex. Quer que eu gere esses arquivos agora? - Follow Up Deployment
21821f5 verified
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Matverse FRP Fullstack - Production Ready</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.gradient-bg {
background: linear-gradient(135deg, #1e3a8a 0%, #2563eb 50%, #3b82f6 100%);
}
.code-block {
font-family: 'Courier New', monospace;
background-color: #1e293b;
color: #f8fafc;
border-radius: 0.5rem;
padding: 1rem;
overflow-x: auto;
}
.feature-card:hover {
transform: translateY(-5px);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
.glow {
box-shadow: 0 0 15px rgba(59, 130, 246, 0.5);
}
</style>
</head>
<body class="bg-gray-50">
<!-- Header -->
<header class="gradient-bg text-white">
<div class="container mx-auto px-4 py-12">
<div class="flex flex-col md:flex-row items-center justify-between">
<div class="mb-8 md:mb-0">
<h1 class="text-4xl md:text-5xl font-bold mb-4">Matverse FRP Fullstack</h1>
<p class="text-xl md:text-2xl opacity-90">Solução completa para Factory Reset Protection corporativo</p>
<div class="mt-8">
<a href="sandbox:/mnt/data/matverse_frp_fullstack.zip" class="inline-flex items-center px-6 py-3 bg-white text-blue-800 font-semibold rounded-lg hover:bg-gray-100 transition duration-300 glow">
<i class="fas fa-download mr-2"></i> Baixar o ZIP
</a>
</div>
</div>
<div class="relative w-full md:w-1/3">
<div class="absolute -top-10 -left-10 w-32 h-32 bg-blue-400 rounded-full opacity-20"></div>
<div class="absolute -bottom-10 -right-10 w-32 h-32 bg-blue-400 rounded-full opacity-20"></div>
<div class="relative bg-white p-6 rounded-xl shadow-xl">
<div class="flex items-center mb-4">
<div class="w-3 h-3 bg-red-500 rounded-full mr-2"></div>
<div class="w-3 h-3 bg-yellow-500 rounded-full mr-2"></div>
<div class="w-3 h-3 bg-green-500 rounded-full"></div>
</div>
<div class="code-block">
<span class="text-green-400">$</span> docker compose up -d --build
<br><br>
<span class="text-green-400">$</span> <span class="text-gray-400"># Frontend: https://frp.seu-dominio.com</span>
<br>
<span class="text-green-400">$</span> <span class="text-gray-400"># API: https://frp.seu-dominio.com/api</span>
</div>
</div>
</div>
</div>
</div>
</header>
<!-- Main Content -->
<main class="container mx-auto px-4 py-12">
<!-- Summary Section -->
<section class="mb-16">
<h2 class="text-3xl font-bold mb-8 text-center">Stack de Produção Completo</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Backend Card -->
<div class="bg-white p-6 rounded-xl shadow-lg feature-card transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-server text-4xl"></i>
</div>
<h3 class="text-xl font-bold mb-3">Backend (FastAPI)</h3>
<ul class="space-y-2 text-gray-700">
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>FRP corporativo autorizado (AMAPI/Knox mock)</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>Auditoria criptográfica (SHA3 + Merkle)</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>Auth via JWT OIDC (JWKS) ou API Key</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>CORS, rate-limit básico e /healthz</span>
</li>
</ul>
</div>
<!-- Frontend Card -->
<div class="bg-white p-6 rounded-xl shadow-lg feature-card transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-desktop text-4xl"></i>
</div>
<h3 class="text-xl font-bold mb-3">Frontend (Vite/React)</h3>
<ul class="space-y-2 text-gray-700">
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>SPA leve e performática</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>/api por proxy</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>UI completa para fluxo de FRP</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>Enroll → Verify → Enterprise Reset → Audit</span>
</li>
</ul>
</div>
<!-- Proxy Card -->
<div class="bg-white p-6 rounded-xl shadow-lg feature-card transition duration-300">
<div class="text-blue-600 mb-4">
<i class="fas fa-network-wired text-4xl"></i>
</div>
<h3 class="text-xl font-bold mb-3">Proxy (Caddy)</h3>
<ul class="space-y-2 text-gray-700">
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>TLS automático (Let's Encrypt)</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>Roteamento inteligente</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>/ → frontend</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>/api → backend</span>
</li>
</ul>
</div>
</div>
</section>
<!-- Probability Model Section -->
<section class="mb-16 bg-white p-8 rounded-xl shadow-lg">
<h2 class="text-3xl font-bold mb-6 text-center">Modelo de Elegibilidade e Risco</h2>
<div class="flex flex-col md:flex-row items-center">
<div class="w-full md:w-1/2 mb-8 md:mb-0">
<div class="code-block text-center">
$$ E=\mathbb{1}\{\text{managed}=1\}\,\mathbb{1}\{|\text{reason}|\ge 5\}\,\mathbb{1}\{|\text{actor}|\ge 3\} $$
</div>
<p class="mt-4 text-gray-700">
Somente <span class="font-bold">E=1</span> permite reset. Reduz <span class="font-bold">falsos positivos</span> e risco jurídico-operacional.
</p>
</div>
<div class="w-full md:w-1/2 md:pl-8">
<div class="bg-blue-50 p-6 rounded-lg">
<h3 class="text-xl font-bold mb-4 text-blue-800">Segurança e Robustez</h3>
<ul class="space-y-3">
<li class="flex items-start">
<div class="bg-blue-100 p-1 rounded-full mr-3">
<i class="fas fa-lock text-blue-600 text-sm"></i>
</div>
<span><strong>JWT OIDC:</strong> Validação por JWKS com cache. P(impersonation) → 0</span>
</li>
<li class="flex items-start">
<div class="bg-blue-100 p-1 rounded-full mr-3">
<i class="fas fa-link text-blue-600 text-sm"></i>
</div>
<span><strong>Auditoria encadeada:</strong> event_hash = SHA3_256(evento), chain_hash = SHA3_256(prev || event_hash || salt)</span>
</li>
<li class="flex items-start">
<div class="bg-blue-100 p-1 rounded-full mr-3">
<i class="fas fa-tachometer-alt text-blue-600 text-sm"></i>
</div>
<span><strong>Rate limiting:</strong> Capacidade C=30 req / W=10s. SLA: E[T] ≤ 150ms</span>
</li>
<li class="flex items-start">
<div class="bg-blue-100 p-1 rounded-full mr-3">
<i class="fas fa-shield-alt text-blue-600 text-sm"></i>
</div>
<span><strong>CORS controlado e TLS com SANs corretos</strong></span>
</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Comparison Section -->
<section class="mb-16">
<h2 class="text-3xl font-bold mb-8 text-center">Comparação e Análise Evolutiva</h2>
<div class="bg-white rounded-xl shadow-lg overflow-hidden">
<div class="grid grid-cols-1 md:grid-cols-2 divide-y md:divide-y-0 md:divide-x divide-gray-200">
<!-- Before -->
<div class="p-8">
<div class="flex items-center mb-6">
<div class="bg-red-100 p-2 rounded-full mr-4">
<i class="fas fa-times-circle text-red-500 text-2xl"></i>
</div>
<h3 class="text-2xl font-bold text-gray-800">Antes</h3>
</div>
<ul class="space-y-4 text-gray-700">
<li class="flex items-start">
<i class="fas fa-exclamation-triangle text-red-500 mt-1 mr-3"></i>
<span>Snippets com chave exposta no front</span>
</li>
<li class="flex items-start">
<i class="fas fa-exclamation-triangle text-red-500 mt-1 mr-3"></i>
<span>Arquitetura acoplada a SaaS externo</span>
</li>
<li class="flex items-start">
<i class="fas fa-exclamation-triangle text-red-500 mt-1 mr-3"></i>
<span>Sem garantia de compliance</span>
</li>
</ul>
</div>
<!-- After -->
<div class="p-8">
<div class="flex items-center mb-6">
<div class="bg-green-100 p-2 rounded-full mr-4">
<i class="fas fa-check-circle text-green-500 text-2xl"></i>
</div>
<h3 class="text-2xl font-bold text-gray-800">Agora (MATVERSE)</h3>
</div>
<ul class="space-y-4 text-gray-700">
<li class="flex items-start">
<i class="fas fa-star text-blue-500 mt-1 mr-3"></i>
<span><strong>Zero vendor lock-in</strong>, infraestrutura OSS (Docker, Caddy, FastAPI, Vite)</span>
</li>
<li class="flex items-start">
<i class="fas fa-star text-blue-500 mt-1 mr-3"></i>
<span><strong>Compliance-first</strong>: somente reset autorizado em ativos gerenciados</span>
</li>
<li class="flex items-start">
<i class="fas fa-star text-blue-500 mt-1 mr-3"></i>
<span><strong>Prod-ready</strong>: TLS automático, CORS, autenticação OIDC, rate-limit, logs JSON</span>
</li>
</ul>
</div>
</div>
</div>
</section>
<!-- Evolution Section -->
<section class="mb-16">
<h2 class="text-3xl font-bold mb-8 text-center">Próximos Incrementos (Custo Zero)</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-6">
<div class="bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-3">
<i class="fas fa-user-shield text-3xl"></i>
</div>
<h3 class="font-bold mb-2">RBAC por JWT</h3>
<p class="text-sm text-gray-600">Admin/Auditor/Operador via claims do token</p>
</div>
<div class="bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-3">
<i class="fas fa-signature text-3xl"></i>
</div>
<h3 class="font-bold mb-2">ICP-Brasil</h3>
<p class="text-sm text-gray-600">Assinatura digital dos bundles de auditoria</p>
</div>
<div class="bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-3">
<i class="fas fa-chart-line text-3xl"></i>
</div>
<h3 class="font-bold mb-2">Prometheus</h3>
<p class="text-sm text-gray-600">Métricas e monitoramento com Grafana</p>
</div>
<div class="bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-3">
<i class="fas fa-memory text-3xl"></i>
</div>
<h3 class="font-bold mb-2">Redis Limiter</h3>
<p class="text-sm text-gray-600">Rate limiting distribuído e HA</p>
</div>
<div class="bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-3">
<i class="fas fa-chart-bar text-3xl"></i>
</div>
<h3 class="font-bold mb-2">Observabilidade</h3>
<p class="text-sm text-gray-600">Prometheus + Grafana com dashboards FRP</p>
</div>
<div class="bg-white p-6 rounded-xl shadow-md hover:shadow-lg transition duration-300">
<div class="text-blue-600 mb-3">
<i class="fas fa-mobile-alt text-3xl"></i>
</div>
<h3 class="font-bold mb-2">Adapters Reais</h3>
<p class="text-sm text-gray-600">Android Management / Samsung Knox</p>
</div>
</div>
</section>
<!-- Deployment Instructions -->
<section class="mb-16">
<h2 class="text-3xl font-bold mb-8 text-center">Como Subir em Produção</h2>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
<!-- With Domain -->
<div class="bg-white p-8 rounded-xl shadow-lg">
<div class="flex items-center mb-6">
<div class="bg-blue-100 p-2 rounded-full mr-4">
<i class="fas fa-globe text-blue-500 text-2xl"></i>
</div>
<h3 class="text-2xl font-bold text-gray-800">Com Domínio</h3>
</div>
<ol class="space-y-4 text-gray-700">
<li class="flex items-start">
<span class="bg-blue-500 text-white rounded-full w-6 h-6 flex items-center justify-center mr-3 flex-shrink-0">1</span>
<span>Aponte o <strong>DNS</strong> do seu domínio para o servidor</span>
</li>
<li class="flex items-start">
<span class="bg-blue-500 text-white rounded-full w-6 h-6 flex items-center justify-center mr-3 flex-shrink-0">2</span>
<span>Copie <code class="bg-gray-100 px-1 rounded">.env.example</code><code class="bg-gray-100 px-1 rounded">.env</code> e preencha:</span>
</li>
<li class="pl-9 mb-4">
<div class="code-block text-sm">
DOMAIN=frp.seu-dominio.com<br>
LETSENCRYPT_EMAIL=seu@email.com<br>
API_KEY=troque-isto<br>
CORS_ORIGINS=https://frp.seu-dominio.com<br>
# Para produção, remova volume mounts de código<br>
# (ver compose.yaml) e use imagens otimizadas<br>
# (Opcional) OIDC_ISSUER=https://keycloak.seu-dominio.com/realms/matverse<br>
# (Opcional) OIDC_AUDIENCE=matverse-frp
</div>
</li>
<li class="flex items-start">
<span class="bg-blue-500 text-white rounded-full w-6 h-6 flex items-center justify-center mr-3 flex-shrink-0">3</span>
<span>Execute: <code class="bg-gray-100 px-1 rounded">docker compose up -d --build</code></span>
</li>
<li class="flex items-start">
<span class="bg-blue-500 text-white rounded-full w-6 h-6 flex items-center justify-center mr-3 flex-shrink-0">4</span>
<span>Acesse <strong>https://$DOMAIN</strong> (front) e <strong>https://$DOMAIN/api</strong> (API)</span>
</li>
</ol>
</div>
<!-- Local Testing -->
<div class="bg-white p-8 rounded-xl shadow-lg">
<div class="flex items-center mb-6">
<div class="bg-purple-100 p-2 rounded-full mr-4">
<i class="fas fa-laptop-code text-purple-500 text-2xl"></i>
</div>
<div>
<h3 class="text-2xl font-bold text-gray-800">Teste Local</h3>
<p class="text-sm text-purple-600">Usando perfil 'local' do Docker Compose</p>
</div>
</div>
<ol class="space-y-4 text-gray-700">
<li class="flex items-start">
<span class="bg-purple-500 text-white rounded-full w-6 h-6 flex items-center justify-center mr-3 flex-shrink-0">1</span>
<span>Execute:</span>
</li>
<li class="pl-9 mb-4">
<div class="code-block text-sm">
docker compose --profile local up -d --build<br><br>
# Frontend: http://localhost:8080<br>
# API: http://localhost:8000 (via proxy /api)
</div>
</li>
<li class="flex items-start">
<span class="bg-purple-500 text-white rounded-full w-6 h-6 flex items-center justify-center mr-3 flex-shrink-0">2</span>
<span>No front (UI), deixe <code class="bg-gray-100 px-1 rounded">Base URL</code> como <strong>/api</strong> (padrão)</span>
</li>
<li class="flex items-start">
<span class="bg-purple-500 text-white rounded-full w-6 h-6 flex items-center justify-center mr-3 flex-shrink-0">3</span>
<span>Nos requests da API (Postman), inclua <code class="bg-gray-100 px-1 rounded">x-api-key: &lt;API_KEY&gt;</code> do seu .env</span>
</li>
</ol>
</div>
</div>
</section>
<!-- Hardening Section -->
<section class="mb-16 bg-white p-8 rounded-xl shadow-lg">
<h2 class="text-3xl font-bold mb-6 text-center">Hardening de Produção</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<div>
<h3 class="text-xl font-bold mb-4 text-blue-800">Melhorias de Segurança</h3>
<ul class="space-y-3 text-gray-700">
<li class="flex items-start">
<div class="bg-blue-100 p-1 rounded-full mr-3">
<i class="fas fa-shield-alt text-blue-600 text-sm"></i>
</div>
<span><strong>Read-only FS</strong> + tmpfs para escrita temporária</span>
</li>
<li class="flex items-start">
<div class="bg-blue-100 p-1 rounded-full mr-3">
<i class="fas fa-user-lock text-blue-600 text-sm"></i>
</div>
<span><strong>Usuário não-root</strong> e no-new-privileges</span>
</li>
<li class="flex items-start">
<div class="bg-blue-100 p-1 rounded-full mr-3">
<i class="fas fa-heartbeat text-blue-600 text-sm"></i>
</div>
<span><strong>Healthchecks</strong> com condições de dependência</span>
</li>
<li class="flex items-start">
<div class="bg-blue-100 p-1 rounded-full mr-3">
<i class="fas fa-tachometer-alt text-blue-600 text-sm"></i>
</div>
<span><strong>Limites de recursos</strong> (CPU/memória)</span>
</li>
</ul>
</div>
<div>
<div class="code-block text-sm">
# compose.yaml hardening<br>
services:<br>
&nbsp;&nbsp;backend:<br>
&nbsp;&nbsp;&nbsp;&nbsp;user: "1000:1000"<br>
&nbsp;&nbsp;&nbsp;&nbsp;read_only: true<br>
&nbsp;&nbsp;&nbsp;&nbsp;tmpfs: /tmp<br>
&nbsp;&nbsp;&nbsp;&nbsp;healthcheck:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test: ["CMD", "wget", "-qO-", "http://localhost:8000/metrics"]<br>
&nbsp;&nbsp;&nbsp;&nbsp;deploy:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;limits:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpus: "2.0"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memory: 1g
</div>
</div>
</div>
</section>
<!-- Final CTA -->
<section class="text-center">
<div class="gradient-bg text-white p-8 rounded-xl shadow-lg">
<h2 class="text-3xl font-bold mb-4">Pronto para Implementar?</h2>
<p class="text-xl opacity-90 mb-8">Baixe agora e tenha uma solução completa de FRP corporativo em minutos</p>
<a href="sandbox:/mnt/data/matverse_frp_fullstack.zip" class="inline-flex items-center px-8 py-4 bg-white text-blue-800 font-bold rounded-lg hover:bg-gray-100 transition duration-300 text-lg glow">
<i class="fas fa-download mr-3"></i> Baixar Matverse FRP Fullstack
</a>
<p class="mt-4 text-blue-100 text-sm">
<i class="fas fa-check-circle mr-2"></i>Pronto para produção: TLS, rate-limiting, auditoria e alta disponibilidade
</p>
</div>
</section>
</main>
<!-- Footer -->
<footer class="bg-gray-800 text-white py-8">
<div class="container mx-auto px-4">
<div class="flex flex-col md:flex-row justify-between items-center">
<div class="mb-4 md:mb-0">
<h3 class="text-xl font-bold">Matverse FRP Fullstack</h3>
<p class="text-gray-400">Solução completa para Factory Reset Protection</p>
</div>
<div class="flex space-x-4">
<a href="#" class="text-gray-400 hover:text-white transition duration-300">
<i class="fab fa-github text-2xl"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white transition duration-300">
<i class="fab fa-docker text-2xl"></i>
</a>
<a href="#" class="text-gray-400 hover:text-white transition duration-300">
<i class="fas fa-book text-2xl"></i>
</a>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-8 text-center text-gray-400">
<p>© 2023 Matverse. Todos os direitos reservados.</p>
</div>
</div>
</footer>
<!-- MathJax for equations -->
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=matversedao/matverse-frp-fullstack" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>