# Deploy do site FCJ Group em EC2 (Apache + Node)

Site: TanStack Start (SSR). O build gera um **servidor Node** próprio; o **Apache**
funciona apenas como proxy reverso (porta 80/443 → porta 3000).

- Repositório clonado em: `/var/www/html/fcjventurebuilder/fcj-group-2026`
- Entrypoint do build: `.output/server/index.mjs`
- Arquivos estáticos do build: `.output/public` (servidos pelo próprio Node)
- Imagens: todas locais em `public/media/` (nenhuma dependência de CDN externo)

---

## 1. Pré-requisitos na EC2 (uma vez)

```bash
# Node 22 LTS
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs git

# Apache + módulos de proxy
sudo apt-get install -y apache2
sudo a2enmod proxy proxy_http headers rewrite deflate
sudo systemctl restart apache2
```

Opcional (build mais rápido): `curl -fsSL https://bun.sh/install | bash`.

## 2. Clonar o repositório

```bash
sudo mkdir -p /var/www/html/fcjventurebuilder
sudo chown -R $USER:$USER /var/www/html/fcjventurebuilder
cd /var/www/html/fcjventurebuilder
git clone <URL_DO_REPOSITORIO_GIT> fcj-group-2026
cd fcj-group-2026
npm ci
npm run build
```

O build cria `.output/`. Teste manualmente:

```bash
PORT=3000 node .output/server/index.mjs
# em outro terminal: curl -I http://localhost:3000/
```

## 3. Serviço systemd

Crie `/etc/systemd/system/fcj-site.service`:

```ini
[Unit]
Description=FCJ Group 2026 (TanStack Start SSR)
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/www/html/fcjventurebuilder/fcj-group-2026
Environment=NODE_ENV=production
Environment=PORT=3000
Environment=HOST=127.0.0.1
ExecStart=/usr/bin/node .output/server/index.mjs
Restart=always
RestartSec=3
User=www-data
Group=www-data
StandardOutput=append:/var/log/fcj-site.log
StandardError=append:/var/log/fcj-site.log

[Install]
WantedBy=multi-user.target
```

```bash
sudo chown -R www-data:www-data /var/www/html/fcjventurebuilder/fcj-group-2026
sudo systemctl daemon-reload
sudo systemctl enable --now fcj-site
sudo systemctl status fcj-site
```

## 4. VirtualHost do Apache

`/etc/apache2/sites-available/fcj-group-2026.conf`:

```apache
<VirtualHost *:80>
    ServerName fcjventurebuilder.com
    ServerAlias www.fcjventurebuilder.com

    ProxyPreserveHost On
    ProxyTimeout 60
    RequestHeader set X-Forwarded-Proto "http"

    ProxyPass        / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/

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

```bash
sudo a2ensite fcj-group-2026
sudo apachectl configtest && sudo systemctl reload apache2
```

HTTPS (Let's Encrypt):

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

No VirtualHost SSL gerado, mantenha as mesmas diretivas `ProxyPass` e troque
`RequestHeader set X-Forwarded-Proto "https"`.

> Não aponte `DocumentRoot` para a pasta do projeto: o SSR precisa passar pelo Node.
> Todas as rotas (`/`, `/master`, `/startups`, `/club`, `/o-que-e-venture-builder`)
> são renderizadas no servidor, então não há regra de rewrite/SPA a configurar.

## 5. Atualizações contínuas

Use o script incluso no repositório:

```bash
cd /var/www/html/fcjventurebuilder/fcj-group-2026
sudo ./scripts/deploy.sh
```

Ele executa: `git pull` → `npm ci` → `npm run build` → `systemctl restart fcj-site`.

Se preferir manual:

```bash
git pull --ff-only
npm ci
npm run build
sudo systemctl restart fcj-site
```

O restart leva menos de 1 segundo; o build antigo continua servindo até lá.

### Automatizar (opcional)

- **Webhook do GitHub** apontando para um pequeno serviço que roda `scripts/deploy.sh`.
- **GitHub Actions** com SSH:
  `ssh ubuntu@EC2 "cd /var/www/html/fcjventurebuilder/fcj-group-2026 && sudo ./scripts/deploy.sh"`.
- **Cron** simples (a cada 5 min, só publica se houver commit novo):
  `*/5 * * * * cd /var/www/html/fcjventurebuilder/fcj-group-2026 && ./scripts/deploy.sh --if-changed >> /var/log/fcj-deploy.log 2>&1`

## 6. Imagens e arquivos estáticos (sem CDN)

Todas as fotos ficam versionadas em `public/media/` (e `public/media/professores/`)
e são copiadas para `.output/public/media/` no build. Nenhuma imagem depende de
domínio externo da Lovable.

Para adicionar uma imagem nova:

1. coloque o arquivo em `public/media/`;
2. referencie no código como `/media/nome-do-arquivo.jpg`;
3. commit + `scripts/deploy.sh`.

Única dependência externa restante: as fontes do Google Fonts e os vídeos do
YouTube (embeds na página Master).

## 7. Configuração de build

`vite.config.ts` define `nitro: { preset: "node-server" }`, o que gera
`.output/server/index.mjs` (servidor Node autônomo) e `.output/public`.
Dentro do ambiente da Lovable esse preset é ignorado automaticamente — o preview
continua funcionando normalmente e o mesmo repositório serve para os dois casos.

Variáveis suportadas pelo runtime: `PORT` (padrão 3000) e `HOST`.

## 8. Diagnóstico

```bash
sudo systemctl status fcj-site
sudo tail -f /var/log/fcj-site.log
sudo tail -f /var/log/apache2/fcj-error.log
curl -I http://127.0.0.1:3000/
```

| Sintoma | Causa provável |
| --- | --- |
| 503 no Apache | serviço Node parado (`systemctl restart fcj-site`) ou porta diferente |
| 404 em rota interna | build desatualizado — rode `npm run build` e reinicie |
| Imagem não carrega | arquivo ausente em `public/media/` no commit |
| Build falha por memória | use uma instância ≥ 2 GB ou `NODE_OPTIONS=--max-old-space-size=2048` |
