# Deploy · www.semeiacomigo.com.br · Cloudflare

Plano técnico específico para o stack Cloudflare (já hospedagem da Semear).

## Caminho recomendado: Cloudflare Pages

Como o site já roda em Cloudflare, **Pages** é o caminho natural — mesmo painel, SSL automático, CDN global incluído, custo zero.

## Opção A · Deploy via Wrangler CLI (mais rápido)

```bash
# Uma vez só
npm install -g wrangler
wrangler login   # autentica com sua conta Cloudflare

# Deploy
cd "Academia-de-Lideranca"
wrangler pages deploy . --project-name=academia-semear
```

Em ~30 segundos a Academia está no ar em:
- URL provisória: `academia-semear.pages.dev`
- Próximo passo: vincular ao domínio (próxima seção)

## Opção B · Deploy via GitHub (recomendado a médio prazo)

Permite atualizar a Academia só fazendo `git push`:

1. Criar repositório privado no GitHub: `academia-semear`
2. Push da pasta atual
3. No Cloudflare Pages → Connect to Git → Selecionar repo
4. Build settings:
   - **Build command:** (deixar vazio — é HTML estático)
   - **Build output directory:** `/`
   - **Root directory:** `Academia-de-Lideranca`
5. Cada commit no repo gera novo deploy automaticamente

## Publicar no domínio Semear (rota real em produção)

A Academia NÃO usa subdomínio próprio. Ela é servida sob o caminho `/academia/` do site
principal, por um Worker de proxy que já está no ar. (O `academia.semeiacomigo.com.br` que
versões antigas deste doc citavam nunca foi criado; não existe em DNS.)

- **Worker:** `academia-proxy` (fonte em `_proxy-academia/`)
- **Rotas:** `semeiacomigo.com.br/academia*` e `www.semeiacomigo.com.br/academia*`
- **Origem:** `https://academia-semear.pages.dev` (o projeto Pages deste deploy)

Ou seja: todo `wrangler pages deploy` no projeto `academia-semear` já entra em produção,
porque o proxy aponta para o alias de produção do Pages. Não há passo de "vincular domínio".

Para (re)publicar o proxy (só se um dia mudar a rota ou a origem):

```bash
cd _proxy-academia && npx wrangler deploy
```

### Estrutura de URLs reais

| URL pública | Conteúdo |
|---|---|
| `https://semeiacomigo.com.br/academia/` | Redireciona ao Hub (`01-hub/`) |
| `https://semeiacomigo.com.br/academia/01-hub/` | Hub do Participante |
| `https://semeiacomigo.com.br/academia/02-diagnosticos/disc` | DISC direto |
| `https://semeiacomigo.com.br/academia/02-diagnosticos/maas` | MAAS direto |
| `https://semeiacomigo.com.br/academia/03-sessoes/sessao-01-...` | Sessões individuais |
| `https://semeiacomigo.com.br/academia/06-ferramentas-sistemicas/` | Ferramentas profundas |
| `https://semeiacomigo.com.br/academia/07-guia-facilitadora/` | Guia (acesso restrito, ver seção a seguir) |
| `https://semeiacomigo.com.br/academia/04-painel-facilitador/` | Painel agregado (acesso restrito) |

> O `.pages.dev` (ex.: `academia-semear.pages.dev`) segue acessível direto e serve o mesmo
> conteúdo, mas a URL oficial para participantes é a do caminho `/academia/`.

## Proteção do conteúdo restrito (Guia + Painel)

O Guia da Facilitadora e o Painel não devem ser acessíveis publicamente. Três opções (do mais simples ao mais robusto):

### 1. Cloudflare Access (recomendado — gratuito até 50 usuários)

Painel: **Zero Trust → Access → Applications → Add an application → Self-hosted**

Configurar:
- Application name: "Guia Facilitadora"
- Application domain: `semeiacomigo.com.br/academia/07-guia-facilitadora/*`
- Add policy: "Allow" → emails da Semear (Fernanda, Vanessa, etc)

Quem tentar acessar vê um login obrigatório (email + código OTP enviado por e-mail). Funciona igual para o Painel:
- Domain: `semeiacomigo.com.br/academia/04-painel-facilitador/*`

### 2. Senha via Worker (alternativa simples)

Se preferir não usar Cloudflare Access:

```javascript
// workers/proteger-guia.js
export default {
  async fetch(request) {
    const auth = request.headers.get('Authorization');
    if (auth !== 'Basic ' + btoa('semear:SENHA_AQUI')) {
      return new Response('Auth required', {
        status: 401,
        headers: { 'WWW-Authenticate': 'Basic realm="Semear"' }
      });
    }
    return fetch(request);
  }
};
```

### 3. `noindex` + URL obscura (mínimo)

Adicionar nas páginas do Guia/Painel:
```html
<meta name="robots" content="noindex, nofollow">
```

Não impede acesso direto, mas impede Google de indexar. Combine com URL longa não óbvia se quiser camada mínima.

## Headers de segurança (importante)

Criar arquivo `_headers` na raiz da pasta:

```
/*
  X-Frame-Options: SAMEORIGIN
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin
  Permissions-Policy: geolocation=(), microphone=(), camera=()

/07-guia-facilitadora/*
  X-Robots-Tag: noindex

/04-painel-facilitador/*
  X-Robots-Tag: noindex
```

Cloudflare Pages aplica automaticamente.

## Redirect raiz

O `_redirects` na raiz faz `/academia/` (que o proxy entrega como `/` na origem) ir direto ao Hub:

```
/   /01-hub/index.html   302
```

## Backend (API + D1) e segredos — ATUALIZADO 07/2026

> As seções antigas deste documento descreviam a Academia como "só localStorage". Desde a versão com
> Functions + D1 isso mudou: o produto tem sync automático de progresso, login de facilitadora e
> expurgo LGPD. Esta seção é a fonte da verdade atual.

### O que roda no servidor

- **Cloudflare Pages Functions** (`functions/api/*`): sync de progresso, login/recuperação de senha da
  facilitadora, painel de turma, log de erros, apagar dados, healthcheck (`/api/saude`).
- **D1** (`academia-semear-db`): participantes (só dados compartilháveis: scores + sinalização de
  adesão; reflexões íntimas NUNCA saem do aparelho), facilitadoras, sessões, tokens, logs, alertas.
- **Worker cron** (`_cron-expurgo/`): expurgo LGPD semanal (domingo 4h UTC), apaga pids inativos há
  12 meses.

### Segredos (obrigatório antes do piloto)

Nenhum segredo vive no código. Configurar via Wrangler (ou painel Pages → Settings → Environment):

```bash
# No projeto Pages (academia-semear) — e-mail transacional de recuperação de senha
npx wrangler pages secret put RESEND_API_KEY --project-name=academia-semear
npx wrangler pages secret put RESEND_FROM --project-name=academia-semear   # ex.: academia@semeiacomigo.com.br

# No worker do expurgo — chave do gatilho manual
cd _cron-expurgo && npx wrangler secret put EXPURGO_KEY
```

- A chave do Resend é criada em resend.com (domínio semeiacomigo.com.br precisa estar verificado lá).
- **Sem RESEND_API_KEY a recuperação de senha falha em silêncio** (a rota responde ok, o e-mail não
  sai). Sempre testar o fluxo depois de configurar: pedir recuperação e conferir a chegada do e-mail.

### Verificação do D1 (checklist)

```bash
npx wrangler d1 list   # o banco academia-semear-db deve aparecer
```
O `database_id` do `wrangler.toml` da raiz e o do `_cron-expurgo/wrangler.toml` devem ser IGUAIS.
Aplicar schemas na primeira vez: `schema.sql`, depois `auth-schema.sql`, depois `hardening-schema.sql`
(`npx wrangler d1 execute academia-semear-db --remote --file=schema.sql`, etc.).

### Backup do D1 (semanal, junto com o fechamento)

```bash
npx wrangler d1 export academia-semear-db --remote --output=backup-academia-$(date +%Y%m%d).sql
```
Guardar no Drive da Semear (pasta da Academia). O dado íntimo continua só no aparelho de cada
participante; este backup cobre progresso, contas de facilitadora e logs.

## LGPD e privacidade dos dados — ATUALIZADO 07/2026

- **Reflexões e exercícios íntimos** (genograma, lealdades, crenças, posições, linha do tempo, diários):
  ficam SÓ no aparelho do participante. O sync envia apenas a sinalização de adesão (fez/não fez).
- **Scores e progresso** (MAAS, DISC, habilidades, sessões concluídas): sincronizam com o D1 de forma
  nominal, com consentimento colhido no primeiro acesso (modal de boas-vindas).
- **Expurgo automático:** 12 meses após o fim do programa (ou de inatividade), o cron apaga o registro.
- **Apagar tudo:** o participante apaga aparelho + nuvem em "Meus dados" a qualquer momento.
- **Limitações práticas:** limpou o cache do navegador, perde o conteúdo íntimo local (o progresso
  sincronizado volta). Orientar exportação de JSON antes de trocar de aparelho.

## Checklist pré-deploy

- [ ] Testar todos os links no Hub localmente (`open index.html`)
- [ ] Confirmar paths relativos (verificado — está OK)
- [ ] Criar `_headers` com configs de segurança
- [ ] Criar `_redirects` para raiz → Hub
- [ ] Configurar Cloudflare Pages
- [x] Proxy `/academia/` no ar (worker `academia-proxy` → `academia-semear.pages.dev`)
- [ ] Configurar Cloudflare Access nas pastas restritas
- [ ] Testar acesso público às sessões
- [ ] Testar acesso restrito ao Guia (logar como facilitadora)
- [ ] Validar SSL ativo (cadeado verde)
- [ ] Testar exportação JSON em uma sessão real
- [ ] Testar importação JSON no Painel
- [ ] Backup das pastas no Drive da Semear

## Pacote pronto para deploy

A pasta `Academia-de-Lideranca` já contém:
- `index.html` (redireciona ao Hub) ✓
- Estrutura completa de pastas ✓
- Paths relativos (não absolutos) ✓
- Compatível com qualquer subdiretório ou domínio ✓

Próximo passo é gerar `_headers` e `_redirects` — vou criar agora.

## Roadmap pós-launch

**Sprint 1 (mês 1):**
- Deploy pelo Cloudflare Pages
- Configurar Cloudflare Access para Guia + Painel
- Rodar piloto com 3-5 pessoas internas da Semear
- Coletar feedback

**Sprint 2 (mês 2):**
- Ajustes finos a partir do piloto
- Adicionar tracking básico (Cloudflare Web Analytics — gratuito e sem cookies)
- Primeira turma comercial

**Sprint 3 (mês 4-6):**
- Considerar Worker para automatizar coleta JSON → Drive Semear (se a fricção do envio manual atrapalhar)
- Customizar visual por cliente (logo + cores) se houver demanda enterprise

**Sprint 4 (mês 6-12):**
- Painel administrativo para Semear (gestão de turmas)
- Sistema de certificação automático em PDF
- Mailings agendados de retorno (ex: "como está sua microação?")
