# Deploy — Minas Summit 2027 (EC2 + Apache)

Aplicação TanStack Start (SSR) buildada com Nitro no preset **node-server**.
O Node roda como serviço (systemd) na porta interna `3000` e o **Apache** faz
proxy reverso na porta 80/443.

- Diretório na EC2: `/var/www/html/minas-summit/minas-summit-2027`
- Build: `.output/server/index.mjs` (servidor) + `.output/public` (assets)
- **Todas as imagens são servidas localmente** (ficam em `src/assets/**` e são
  empacotadas em `.output/public/assets` no build). Não há dependência de CDN.

---

## 1. Pré-requisitos no servidor

```bash
sudo dnf install -y git httpd            # Amazon Linux 2023
# ou: sudo apt install -y git apache2    # Ubuntu/Debian

# Node.js 22 LTS
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -   # Ubuntu
sudo apt install -y nodejs
# Amazon Linux: sudo dnf install -y nodejs22 && sudo alternatives --set node /usr/bin/node-22

node -v   # >= 20.19 (recomendado 22.x)
```

Módulos do Apache necessários:

```bash
# Ubuntu/Debian
sudo a2enmod proxy proxy_http headers rewrite deflate expires
sudo systemctl restart apache2
# Amazon Linux: mod_proxy/mod_proxy_http já vêm habilitados em /etc/httpd/conf.modules.d/
```

## 2. Primeiro deploy

```bash
sudo mkdir -p /var/www/html/minas-summit
sudo chown -R $USER:$USER /var/www/html/minas-summit
cd /var/www/html/minas-summit

git clone <URL_DO_REPOSITORIO_GIT> minas-summit-2027
cd minas-summit-2027

npm ci
npm run build      # gera .output/
```

Teste rápido:

```bash
PORT=3000 node .output/server/index.mjs
curl -I http://127.0.0.1:3000/
```

## 3. Serviço systemd

`/etc/systemd/system/minas-summit-2027.service`:

```ini
[Unit]
Description=Minas Summit 2027 (TanStack Start SSR)
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/www/html/minas-summit/minas-summit-2027
ExecStart=/usr/bin/node .output/server/index.mjs
Environment=NODE_ENV=production
Environment=PORT=3000
Environment=HOST=127.0.0.1
Restart=always
RestartSec=3
User=www-data
Group=www-data
StandardOutput=journal
StandardError=journal

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

> Em Amazon Linux troque `www-data` por `apache`. Garanta que o usuário do
> serviço tenha leitura no diretório: `sudo chown -R apache:apache /var/www/html/minas-summit/minas-summit-2027`.

```bash
sudo systemctl daemon-reload
sudo systemctl enable --now minas-summit-2027
sudo systemctl status minas-summit-2027
journalctl -u minas-summit-2027 -f     # logs
```

## 4. VirtualHost do Apache

`/etc/apache2/sites-available/minas-summit-2027.conf`
(ou `/etc/httpd/conf.d/minas-summit-2027.conf` no Amazon Linux):

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

    # Assets estáticos servidos direto pelo Apache (mais rápido, sem CDN)
    Alias /assets /var/www/html/minas-summit/minas-summit-2027/.output/public/assets
    <Directory /var/www/html/minas-summit/minas-summit-2027/.output/public>
        Require all granted
        Options -Indexes
        <IfModule mod_expires.c>
            ExpiresActive On
            ExpiresDefault "access plus 1 year"
        </IfModule>
        Header set Cache-Control "public, max-age=31536000, immutable"
    </Directory>

    # favicon / robots
    AliasMatch "^/(favicon\.png|robots\.txt)$" \
        "/var/www/html/minas-summit/minas-summit-2027/.output/public/$1"

    # Todo o resto (SSR, rotas /patrocinio, etc.) vai para o Node
    ProxyPreserveHost On
    ProxyPass /assets !
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
    RequestHeader set X-Forwarded-Proto "http"

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

```bash
sudo a2ensite minas-summit-2027 && sudo systemctl reload apache2
# Amazon Linux: sudo apachectl configtest && sudo systemctl reload httpd
```

### HTTPS

```bash
sudo certbot --apache -d minassummit.com -d www.minassummit.com
```

O Certbot cria o VirtualHost `:443`; mantenha nele os mesmos blocos `Alias`,
`ProxyPass` e troque o header para `RequestHeader set X-Forwarded-Proto "https"`.

## 5. Atualização contínua (deploy de novas versões)

Script `deploy.sh` na raiz do projeto (já versionado):

```bash
cd /var/www/html/minas-summit/minas-summit-2027
./deploy.sh
```

Ele faz: `git pull` → `npm ci` → `npm run build` → `systemctl restart` →
health check. Em caso de falha do build, o serviço antigo continua no ar
(o build só substitui `.output` ao final).

### Deploy automático via GitHub Actions (opcional)

```yaml
name: Deploy EC2
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            cd /var/www/html/minas-summit/minas-summit-2027
            ./deploy.sh
```

Para deploy por webhook, exponha um endpoint interno ou use o
`git pull` agendado via cron (`*/5 * * * * cd ... && ./deploy.sh --if-changed`).

## 6. Observações importantes

- **Imagens locais**: os arquivos em `src/assets/` (logos e fotos dos eventos)
  são importados pelo Vite e emitidos com hash em `.output/public/assets`.
  Nada é carregado de CDN externo. Ao adicionar fotos novas, coloque o arquivo
  em `src/assets/eventos/` e importe no componente.
- **Fontes**: o site usa Google Fonts via `<link>` em `src/routes/__root.tsx`.
  Se o requisito for 100% offline, baixe os `.woff2` para `public/fonts/`,
  remova os `<link>` e declare `@font-face` em `src/styles.css`.
- **Porta**: mude `PORT` no systemd se 3000 estiver ocupada (ajuste também o
  `ProxyPass`).
- **Memória**: o build precisa de ~2 GB de RAM. Em instâncias t3.micro, crie
  swap antes: `sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile`.
- **Nunca commitar** `.output/` e `node_modules/` (já no `.gitignore`).

## 7. Troubleshooting

| Sintoma | Causa provável | Solução |
| --- | --- | --- |
| 503 no Apache | Node fora do ar | `sudo systemctl status minas-summit-2027`, ver `journalctl -u` |
| 404 em `/patrocinio` ao dar refresh | `ProxyPass` não cobre a rota | confirmar `ProxyPass / http://127.0.0.1:3000/` |
| Imagens 404 | `Alias /assets` apontando pro caminho errado | conferir `.output/public/assets` existe após o build |
| Build falha por memória | RAM insuficiente | criar swap (acima) |
| Mudanças não aparecem | build antigo em cache | `./deploy.sh` + `Ctrl+F5`; conferir `Cache-Control` |
