# Guia de Deploy - X3 Sites Propostas

## Opções de Deploy

### Opção 1: Lovable (Recomendada)

O projeto foi desenvolvido no Lovable e pode ser publicado diretamente pela plataforma:

1. Clique em **Publish** no canto superior direito do editor
2. O deploy é automático em ambiente serverless (Cloudflare Workers)
3. A URL será algo como: `https://seu-projeto.lovable.app`

**Vantagens:**
- Zero configuração de servidor
- Server functions funcionam nativamente
- SSL automático
- Atualizações com um clique

---

### Opção 2: cPanel (Node.js)

> **Aviso importante:** Este projeto usa TanStack Start com SSR e server functions. Para rodar em cPanel, o plano deve ter suporte a **Node.js** (via Passenger ou SSH). Hospedagens cPanel básicas (apenas PHP) não são compatíveis.

#### Pré-requisitos

- cPanel com acesso SSH ou Node.js Selector (CloudLinux)
- Node.js **20 ou superior**
- Git (para clonar o repositório)
- Acesso ao terminal ou gerenciador de arquivos

#### Passo a passo

##### 1. Clone o repositório

Via SSH no cPanel:

```bash
cd ~/public_html
git clone https://github.com/seu-usuario/x3-sites-propostas.git
cd x3-sites-propostas
```

Ou faça upload manual dos arquivos via File Manager.

##### 2. Instale as dependências

```bash
# Se o cPanel tiver npm disponível:
npm install

# Ou se tiver bun:
bun install
```

> **Nota:** Se o cPanel não tiver `bun`, use `npm`. O `package.json` usa `bun` nos scripts, mas você pode rodar com npm trocando `bun` por `npm run`.

##### 3. Configure as variáveis de ambiente

Crie um arquivo `.env` na raiz:

```bash
ADMIN_PASSWORD=sua-senha-segura-aqui-minimo-8-caracteres
```

> **Segurança:** Use uma senha forte. O sistema valida email + senha server-side.

##### 4. Faça o build

```bash
npm run build
```

Isso gera a pasta `dist/` com os arquivos de produção.

##### 5. Configure o servidor Node.js

O build deste projeto gera código para **Cloudflare Workers** (serverless). Para rodar em Node.js/cPanel, você precisa de um servidor HTTP.

**Opção A: miniflare (mais próximo do ambiente original)**

```bash
npm install -g miniflare
miniflare dist/server/index.js --port 3000
```

**Opção B: Servidor customizado (Node.js puro)**

Crie um arquivo `start.js` na raiz:

```javascript
import { createServer } from "node:http";
import { readFileSync } from "node:fs";
import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url";

const __dirname = dirname(fileURLToPath(import.meta.url));
const PORT = process.env.PORT || 3000;

// Importa o handler do worker
const worker = await import("./dist/server/index.js");
const handler = worker.default;

const server = createServer(async (req, res) => {
  // Converte Node.js Request para Web Standard Request
  const url = new URL(req.url, `http://${req.headers.host}`);
  const body = req.method !== "GET" && req.method !== "HEAD"
    ? await new Promise((resolve, reject) => {
        const chunks = [];
        req.on("data", (chunk) => chunks.push(chunk));
        req.on("end", () => resolve(Buffer.concat(chunks)));
        req.on("error", reject);
      })
    : undefined;

  const request = new Request(url, {
    method: req.method,
    headers: req.headers,
    body,
  });

  try {
    const response = await handler.fetch(request, {}, {});
    res.statusCode = response.status;
    res.statusMessage = response.statusText;
    response.headers.forEach((value, key) => res.setHeader(key, value));
    const responseBody = await response.text();
    res.end(responseBody);
  } catch (error) {
    console.error(error);
    res.statusCode = 500;
    res.end("Internal Server Error");
  }
});

server.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});
```

Rode com:

```bash
node start.js
```

##### 6. Configure o Proxy no Apache/Nginx

No cPanel, configure um proxy reverso apontando para a porta 3000 (ou use o Node.js Selector se disponível).

**Exemplo .htaccess:**

```apache
RewriteEngine On
RewriteRule ^(.*)$ http://localhost:3000/$1 [P,L]
```

Ou configure via **Setup Node.js App** no cPanel se o recurso estiver disponível.

##### 7. Mantenha o processo rodando

Use **PM2** (se tiver acesso SSH) ou configure o Passenger para manter o app online:

```bash
npm install -g pm2
pm2 start start.js --name x3-propostas
pm2 save
pm2 startup
```

---

### Opção 3: Build Estático (SPA) - Limitada

Se precisar de apenas arquivos estáticos, a funcionalidade será limitada:

- ❌ Server functions (autenticação, sessão, etc.)
- ❌ Geração de PDF server-side
- ❌ Status de proposta em tempo real

O build padrão gera SSR. Para SPA pura, seria necessário reconfigurar o framework.

---

## Checklist Pré-Deploy

- [ ] `ADMIN_PASSWORD` configurada
- [ ] Build completo sem erros (`npm run build`)
- [ ] Pasta `dist/` gerada com `client/` e `server/`
- [ ] Domínio configurado (DNS apontando para o servidor)
- [ ] SSL/HTTPS habilitado (obrigatório para cookies secure)
- [ ] Variáveis de ambiente carregadas no servidor

## Troubleshooting

| Problema | Causa | Solução |
|----------|-------|---------|
| Erro 500 ao acessar | `ADMIN_PASSWORD` não configurada | Defina a variável de ambiente |
| Cookies não persistem | Sem HTTPS | Ative SSL no domínio |
| Build falha | Node.js < 20 | Atualize o Node.js |
| 404 em rotas internas | SSR não configurado | Use proxy reverso ou server Node.js |
| WhatsApp não abre | Bloqueador de popup | Permita popups no navegador |

## Suporte

Para dúvidas sobre o sistema, entre em contato com a equipe X3 Sites.
