# Publicação — bi.ledirautomoveis.com.br

Roteiro para pôr o Ledir BI no ar no VPS da HostGator (WHM/cPanel), no
subdomínio `bi.ledirautomoveis.com.br`, dentro da mesma conta cPanel de
`ledirautomoveis.com.br`.

**O sistema antigo não é tocado.** Ele segue no ar no endereço de hoje; nenhum
passo daqui altera arquivo, banco ou configuração dele. O sistema novo nem
precisa acessar o banco antigo: o banco de produção é uma cópia do banco local
já conferido (histórico até 31/08/2026, usuários, metas e carrocerias como
estão). Os meses seguintes entram pela tela Importar arquivos.

Onde aparece `CONTA`, use o usuário da conta cPanel do domínio.

---

## 0. Conferir o servidor (SSH como root)

```bash
ls /opt/cpanel/ | grep ea-php          # precisa de ea-php83 (ou mais novo)
mysql -e "SELECT VERSION()"            # MySQL 8.x, ou MariaDB 10.2+
ls /opt/cpanel/composer/bin/composer   # composer do cPanel
```

Os dois primeiros são impedimento:

- **PHP 8.3 ou mais novo** — o Laravel 13 não roda em versão anterior.
- **MySQL 8 ou MariaDB 10.2+** — quatro consultas usam funções de janela
  (`OVER (...)`): Mensal, Vendedores, Metas e o gabarito. No MySQL 5.7 essas
  telas quebram.

## 1. WHM (como root)

1. **EasyApache 4 → Customize**: instalar `ea-php83` com as extensões
   `pdo_mysql`, `mbstring`, `xml`, `dom`, `simplexml`, `fileinfo`, `openssl`,
   `tokenizer`, `ctype`, `curl`, `zip`, `bcmath`, `intl`. Provisionar.
2. **Manage Shell Access**: dar shell (pode ser *jailshell*) à `CONTA`.

## 2. cPanel da conta `ledirautomoveis.com.br`

1. **Domínios → Criar domínio**: `bi.ledirautomoveis.com.br`, desmarcar
   "compartilhar raiz" e pôr a raiz em **`bi-ledir/public`**
   (`/home/CONTA/bi-ledir/public`). A raiz **não** fica dentro de
   `public_html`: só a pasta `public` do sistema fica exposta na web.
2. **MultiPHP Manager**: o subdomínio em **PHP 8.3**. Só ele — o domínio
   principal, onde está o sistema antigo, continua na versão atual.
3. **MultiPHP INI Editor** (subdomínio, PHP 8.3):
   `upload_max_filesize = 20M`, `post_max_size = 20M`,
   `memory_limit = 512M`, `max_execution_time = 120`.
4. **Bancos de dados MySQL**: criar o banco `CONTA_ledirbi` e o usuário
   `CONTA_ledirbi` com senha forte, e dar **todos os privilégios** a ele
   **só nesse banco**.
5. **SSL/TLS Status**: rodar o AutoSSL para o subdomínio.

## 3. Baixar o código (SSH como `CONTA`)

O repositório é privado. O servidor recebe uma chave só de leitura dele (deploy
key), que não dá acesso a mais nada na sua conta do GitHub.

```bash
ssh-keygen -t ed25519 -f ~/.ssh/bi_ledir -N "" -C "deploy bi.ledirautomoveis.com.br"
cat ~/.ssh/bi_ledir.pub
```

Cole a linha em **GitHub → mauricilis/bi-ledir → Settings → Deploy keys → Add
deploy key**, sem marcar "Allow write access". Depois:

```bash
cat >> ~/.ssh/config <<'CFG'
Host github.com-bi-ledir
    HostName github.com
    User git
    IdentityFile ~/.ssh/bi_ledir
    IdentitiesOnly yes
CFG
chmod 600 ~/.ssh/config
cd ~ && git clone git@github.com-bi-ledir:mauricilis/bi-ledir.git bi-ledir
```

O CSS e o JavaScript já vêm compilados no repositório (`public/build`): o
servidor não precisa de Node.

## 4. Instalar

No cPanel, o `php` do terminal pode ser outra versão. Use sempre o caminho do
8.3:

```bash
cd ~/bi-ledir
PHP=/opt/cpanel/ea-php83/root/usr/bin/php
$PHP /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader
cp .env.example .env && chmod 600 .env
$PHP artisan key:generate
```

Editar o `.env` (`nano .env`):

```dotenv
APP_ENV=production
APP_DEBUG=false
APP_URL=https://bi.ledirautomoveis.com.br
APP_TIMEZONE=America/Sao_Paulo

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=CONTA_ledirbi
DB_USERNAME=CONTA_ledirbi
DB_PASSWORD=(a senha do passo 2.4)

SESSION_SECURE_COOKIE=true
```

Apagar as linhas `DB_LEGACY_*` e `ADMIN_*`: o banco já vem pronto, com os
usuários, e produção não fala com o banco antigo.

## 5. Banco de dados

O arquivo do banco é gerado na máquina local **no dia da publicação** (para
sair com o estado mais recente) — é um `.sql.gz` com o histórico, os usuários
(senhas cifradas) e os cadastros. Ele tem dado financeiro da empresa: envie
direto para o servidor e apague as cópias depois.

Com o arquivo em `~/ledir-bi-banco.sql.gz` no servidor:

```bash
gunzip -c ~/ledir-bi-banco.sql.gz | mysql -u CONTA_ledirbi -p CONTA_ledirbi
rm ~/ledir-bi-banco.sql.gz
$PHP artisan migrate --force          # deve dizer "Nothing to migrate"
```

## 6. Ajustes finais

```bash
chmod -R ug+rwX storage bootstrap/cache
$PHP artisan config:cache
$PHP artisan route:cache
$PHP artisan view:cache
$PHP artisan cutover:verificar
```

Nenhum **impedimento** pode sobrar no `cutover:verificar`. "Conexão com o
legado: indisponível" é só uma nota, e é o esperado — produção não usa essa
conexão.

Abrir `https://bi.ledirautomoveis.com.br`, entrar e conferir: Visão geral de
agosto/2026, o Financeiro (caixa) e o Estoque atual.

## 7. Depois de no ar

- **Backup**: o sistema não faz backup sozinho. No cPanel, **Cron Jobs**, uma
  vez por dia:
  ```
  0 3 * * * mysqldump --single-transaction CONTA_ledirbi | gzip > ~/backups/ledirbi-$(date +\%d).sql.gz
  ```
  (criar a pasta `~/backups`; guarda os últimos 31 dias, sobrescrevendo pelo
  dia do mês). Guardar também uma cópia fora do servidor de tempos em tempos.
  O `mysqldump` lê usuário e senha de `~/.my.cnf`, com permissão `600`.
- **Nenhum outro cron** é necessário: o sistema não tem fila nem tarefa
  agendada.
- **Paralelo**: os dois sistemas recebem as mesmas importações por pelo menos
  um fechamento mensal (ver `CUTOVER.md`, passo 7). A partir de setembro/2026,
  importe os arquivos também em **Importar arquivos**.
- **Senha esquecida**: não há e-mail configurado. Um administrador redefine em
  Usuários, ou no servidor: `$PHP artisan usuario:senha email@...`.

## Atualizar a versão publicada

Na máquina de desenvolvimento, antes do commit de uma mudança que mexa em
tela: `npm run build` (o `public/build` vai junto no commit). Depois do
`git push`, no servidor:

```bash
~/bi-ledir/bin/atualizar-producao
```

O script põe o sistema em manutenção, baixa a versão nova, instala
dependências, aplica migrações, refaz os caches e tira da manutenção. Se algo
falhar no meio, ele para e o sistema fica em manutenção — rode
`$PHP artisan up` depois de corrigir.
