# Deploy na EC2 (Node + PM2 + Apache)

Este projeto é **TanStack Start com SSR** — precisa de um processo Node em execução (não é site estático).
O `vite.config.ts` já está configurado com `nitro.preset = "node-server"`, então o build gera um servidor Node pronto para produção.

Porta utilizada: **3001** (a 3000 já está ocupada na instância).

---

## 1. Pré-requisitos na EC2 (Ubuntu 22.04+)

```bash
# Node 20+ (via NodeSource)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs git apache2

# PM2 global
sudo npm install -g pm2

# Módulos do Apache necessários para reverse proxy + WebSocket
sudo a2enmod proxy proxy_http proxy_wstunnel headers rewrite ssl
sudo systemctl restart apache2
```

Libere a porta 80/443 no Security Group da EC2. A porta 3001 NÃO precisa ficar exposta — o Apache faz proxy interno.

---

## 2. Clonar e buildar

```bash
cd /var/www
sudo git clone <URL_DO_REPO> cvb
sudo chown -R $USER:$USER cvb
cd cvb

npm install
npm run build
```

Saída do build:
- `.output/server/index.mjs` → **entrypoint do servidor** (é o que o PM2 executa)
- `.output/public/` → assets estáticos (servidos automaticamente pelo próprio Node)

---

## 3. Rodar com PM2 na porta 3001

Crie um arquivo `ecosystem.config.cjs` na raiz do projeto:

```js
module.exports = {
  apps: [
    {
      name: "cvb",
      script: ".output/server/index.mjs",
      cwd: "/var/www/cvb",
      exec_mode: "fork",
      instances: 1,
      env: {
        NODE_ENV: "production",
        PORT: 3001,
        HOST: "127.0.0.1",

        // SMTP — envio do formulário de contato via Google Workspace
        // Gere uma App Password em https://myaccount.google.com/apppasswords
        // (a conta precisa ter verificação em duas etapas ativa).
        SMTP_HOST: "smtp.gmail.com",
        SMTP_PORT: "465",
        SMTP_USER: "contato@consultingventurebuilder.com.br",
        SMTP_PASS: "xxxx xxxx xxxx xxxx", // App Password (16 chars)
        SMTP_FROM: "CVB <contato@consultingventurebuilder.com.br>",
        CONTACT_TO: "contato@consultingventurebuilder.com.br",
      },
    },
  ],
};
```

> Segurança: prefira colocar os valores sensíveis em um arquivo `.env`
> fora do repo (ex.: `/etc/cvb.env`) e carregar via `env_file` do PM2 ou
> via `pm2 start --update-env`. Nunca commite a App Password.

### Formulário de contato (SMTP Google Workspace)

A rota `POST /api/public/contact` envia os leads para `contato@consultingventurebuilder.com.br` usando a própria caixa do Workspace via SMTP autenticado (`smtp.gmail.com:465`).

Passos únicos no Google:
1. Ative a verificação em duas etapas na conta `contato@…`.
2. Em https://myaccount.google.com/apppasswords, gere uma **App Password** (nome sugerido: "CVB site").
3. Cole o valor em `SMTP_PASS` no `ecosystem.config.cjs` (ou no `.env`).
4. `pm2 restart cvb --update-env`.

Não é necessário liberar IP da EC2 nem configurar SMTP relay — a App Password autentica sem depender do IP de origem. O `Reply-To` é preenchido com o e-mail informado pelo lead, então basta responder o e-mail recebido.


Comandos:

```bash
pm2 start ecosystem.config.cjs
pm2 save
pm2 startup systemd -u $USER --hp $HOME   # copiar/colar o comando sugerido
pm2 logs cvb                              # acompanhar logs
pm2 restart cvb                           # após deploy
```

Teste local na instância:
```bash
curl -I http://127.0.0.1:3001
```

---

## 4. Apache como reverse proxy

**Não aponte `DocumentRoot` para nenhuma pasta do build** — o Node é quem serve tudo (HTML SSR + assets).

`/etc/apache2/sites-available/cvb.conf`:

```apache
<VirtualHost *:80>
    ServerName seu-dominio.com
    ServerAlias www.seu-dominio.com

    LimitRequestBody 10485760

    ProxyRequests Off
    ProxyPreserveHost On

    # WebSocket / HMR-style upgrades (quando houver)
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} =websocket [NC]
    RewriteRule /(.*) ws://127.0.0.1:3001/$1 [P,L]

    ProxyPass        / http://127.0.0.1:3001/
    ProxyPassReverse / http://127.0.0.1:3001/

    RequestHeader set X-Forwarded-Proto "http"
    RequestHeader set X-Forwarded-For   "%{REMOTE_ADDR}s"

    ProxyTimeout 60

    ErrorLog  ${APACHE_LOG_DIR}/cvb-error.log
    CustomLog ${APACHE_LOG_DIR}/cvb-access.log combined
</VirtualHost>
```

Ativar:

```bash
sudo a2ensite cvb.conf
sudo a2dissite 000-default.conf   # opcional, se o default estiver conflitando
sudo apache2ctl configtest
sudo systemctl reload apache2
```

---

## 5. HTTPS com Let's Encrypt (opcional, recomendado)

```bash
sudo apt-get install -y certbot python3-certbot-apache
sudo certbot --apache -d seu-dominio.com -d www.seu-dominio.com
```

O Certbot cria automaticamente o vhost `:443`, configura `SSLEngine`, ajusta `RequestHeader set X-Forwarded-Proto "https"` e habilita renovação.

---

## 6. Fluxo de deploy (atualizações)

```bash
cd /var/www/cvb
git pull
npm install
npm run build
pm2 restart cvb
```

Opcional: script `deploy.sh` na raiz com esses comandos + `pm2 save`.

---

## Resumo — o que apontar no vhost

| Item                        | Valor                                     |
| --------------------------- | ----------------------------------------- |
| Tipo de vhost               | **reverse proxy** (não `DocumentRoot`)    |
| `ProxyPass`                 | `http://127.0.0.1:3001/`                  |
| Módulos Apache              | `proxy`, `proxy_http`, `proxy_wstunnel`, `headers`, `rewrite` (`ssl` para HTTPS) |
| Entrypoint executado no PM2 | `.output/server/index.mjs`                |
| Diretório de trabalho       | raiz do repositório (ex. `/var/www/cvb`)  |
| Assets estáticos            | Servidos pelo Node a partir de `.output/public/` (não precisa configurar) |
