# Deploy em cPanel — Travel Trade (Laravel)

Deploy **confinado a uma única conta cPanel**. Não instala Docker, não toca nas portas
80/443, não altera configuração global de Apache/nginx. **As outras contas do WHM não são
afetadas.**

- **Servidor:** `5.135.141.210` (cPanel/WHM)
- **Domínio:** `traveltrade-olissippohotels.hoteisdigitais.com` (atrás de Cloudflare)
- **Stack:** Laravel 13 + MySQL (nativos do cPanel), PHP 8.2+
- **Artefacto:** `traveltrade-laravel-deploy.tar.gz` (inclui `vendor/` — **não é preciso Composer no servidor**)

---

## 1. Base de dados (cPanel → MySQL® Databases)

1. Criar base de dados: `CPANELUSER_traveltrade`
2. Criar utilizador: `CPANELUSER_ttuser` + password forte
3. Adicionar o utilizador à BD com **ALL PRIVILEGES**

> Substituir `CPANELUSER` pelo prefixo real da conta (o cPanel adiciona-o automaticamente).

## 2. Enviar o código (fora do web root)

Colocar a app **acima** do docroot, p.ex. em `/home/CPANELUSER/traveltrade-laravel/`:

- cPanel → **File Manager** → ir a `/home/CPANELUSER/`
- Upload de `traveltrade-laravel-deploy.tar.gz`
- **Extract** (fica `/home/CPANELUSER/traveltrade-laravel/` com `app/ public/ vendor/ .env` …)

## 3. Configurar o `.env`

Editar `/home/CPANELUSER/traveltrade-laravel/.env` (já traz `APP_KEY` e `APP_DEBUG=false`):

```
DB_DATABASE=CPANELUSER_traveltrade
DB_USERNAME=CPANELUSER_ttuser
DB_PASSWORD=<a password que definiste>
```

(O `APP_URL` já está com o domínio; email por `sendmail` da conta.)

## 4. Apontar o docroot do subdomínio para `public/`

cPanel → **Domains** → editar `traveltrade-olissippohotels.hoteisdigitais.com` →
**Document Root** = `traveltrade-laravel/public`

> Só altera **este** subdomínio. O Laravel exige que o docroot seja a pasta `public/`
> (nunca a raiz da app). O `.htaccess` já vem incluído em `public/`.

## 5. Preparar a aplicação (cPanel → Terminal, ou SSH)

Usar o PHP 8.2+ da conta (ex.: `ea-php82`; confirmar com `php -v`):

```bash
cd ~/traveltrade-laravel
php artisan migrate --force          # cria todas as tabelas
php artisan db:seed --force          # admin + categorias/idiomas/tipos + parceiro demo
php artisan storage:link             # liga storage/app/public -> public/storage
php artisan config:cache
php artisan route:cache
php artisan view:cache
chmod -R 775 storage bootstrap/cache
```

## 6. TLS

- **AutoSSL** (cPanel → SSL/TLS Status) emite o certificado para o subdomínio; **ou**
- Com **Cloudflare** à frente: SSL/TLS mode **Full (strict)** e garantir que a origem tem
  certificado (AutoSSL). Se o AutoSSL falhar por causa do proxy, pôr o registo em
  **DNS only** durante a emissão e voltar a ativar o proxy depois.

## 7. Primeiro acesso

- Backoffice: `https://traveltrade-olissippohotels.hoteisdigitais.com/login`
  - `admin@traveltrade.local` / `Admin123!` → **mudar a password imediatamente** (Config → Utilizadores).
- Portal do parceiro: `/partner/login`
  - `partner@traveltrade.local` / `Partner123!` (parceiro demo — remover/alterar em produção).

## 8. Atualizações futuras

Reconstruir o pacote localmente (`git archive HEAD | … && composer install --no-dev`),
substituir o conteúdo mantendo o `.env` e o `storage/`, e correr:

```bash
php artisan migrate --force
php artisan config:cache && php artisan route:cache && php artisan view:cache
```

---

### Notas de segurança / isolamento
- Tudo vive dentro de `/home/CPANELUSER/` — sem `sudo`, sem serviços de sistema, sem Docker.
- Nenhuma alteração a portas, vhosts globais ou às outras contas do WHM.
- `APP_DEBUG=false` em produção; logs em `storage/logs/`.
- Se o cPanel não permitir mudar o Document Root (passo 4), alternativa: manter a app em
  `~/traveltrade-laravel` e colocar no docroot existente um `index.php`/`.htaccess` que
  arrancam o Laravel a partir dessa pasta (indico os ficheiros se necessário).
