# Deploy em cPanel — checklist

Segue por ordem. Cada passo pressupõe o anterior.

## 1. Antes de enviar ficheiros

- [ ] **Ativa o SSL primeiro.** cPanel → *SSL/TLS Status* → *Run AutoSSL*. Confirma que
      `https://odominio/` abre sem aviso.
      O cookie de sessão é marcado `Secure` quando a ligação é HTTPS; instalar em HTTP e só
      depois ligar o SSL obriga a limpar cookies para conseguires entrar.
- [ ] cPanel → *Select PHP Version*: PHP **8.1** ou superior, com `pdo_mysql` e `mbstring` ligados.
- [ ] Confirma que consegues escrever acima de `public_html` (o *File Manager* mostra a home
      do utilizador). Se não conseguires, usa a disposição alternativa do passo 3.

## 2. Base de dados

- [ ] cPanel → *MySQL® Databases* → *Create New Database*: `painel`.
      O nome real fica prefixado, algo como `utiliz_painel`.
- [ ] *Add New User*: password longa gerada pelo próprio cPanel. Guarda-a no gestor de passwords.
- [ ] *Add User To Database* → **All Privileges**.
- [ ] Anota os três valores completos: base, utilizador, password.

## 3. Ficheiros

Disposição preferida:

```
/home/utilizador/
  public_html/painel/      <- conteúdo da pasta painel/ do repositório
  painel-private/          <- conteúdo da pasta private/ do repositório
```

Alternativa, se o host não deixar escrever fora de `public_html`:

```
/home/utilizador/public_html/painel/
  index.php  login.php  install.php  assets/  .htaccess
  private/                 <- conteúdo da pasta private/ do repositório
```

- [ ] Envia por *File Manager* (upload do zip e *Extract*) ou por FTP.
- [ ] Confirma que o `.htaccess` de `painel/` foi mesmo enviado — os ficheiros começados por
      ponto ficam escondidos por defeito no File Manager (*Settings* → *Show Hidden Files*).
- [ ] Se usaste a alternativa, confirma que `private/.htaccess` também subiu.

## 4. Permissões

No File Manager, ou por Terminal:

```
find public_html/painel -type d -exec chmod 755 {} \;
find public_html/painel -type f -exec chmod 644 {} \;
find painel-private -type d -exec chmod 750 {} \;
find painel-private -type f -exec chmod 640 {} \;
chmod 700 painel-private/storage
chmod 600 painel-private/config.php
```

- [ ] Pastas `755` (webroot) e `750` (privado)
- [ ] Ficheiros `644` (webroot) e `640` (privado)
- [ ] `config.php` **`600`** — só o dono lê
- [ ] `storage/` com escrita para o utilizador do PHP (`700`, ou `755` se o PHP correr como
      outro utilizador; testa o instalador, ele avisa se não conseguir escrever)
- [ ] Nunca `777`. Se algo só funciona com `777`, o problema é de dono do ficheiro, não de
      permissões.

## 5. Configuração

- [ ] `cp private/config.example.php private/config.php`
- [ ] Preenche `db` (host quase sempre `localhost`), `base_path` (`/painel`), `timezone`.
- [ ] `debug` a `false`.
- [ ] Gera o hash da password:

  ```
  php bin/gerar-hash.php
  ```

  Corre no *Terminal* do cPanel ou na tua máquina. Lê a password de STDIN — nunca a passes
  como argumento, ficaria no histórico da shell e visível na lista de processos. Cola o hash
  impresso em `password_hash`.

- [ ] `chmod 600 private/config.php` outra vez, caso o editor tenha reposto as permissões.

## 6. Instalar

- [ ] Abre `https://odominio/painel/install.php`.
- [ ] Todas as verificações a verde. As que ficarem a vermelho impedem a instalação.
- [ ] Carrega em *Instalar*. Corre as migrations e cria as 7 disciplinas e os 3 períodos.
- [ ] **Confirma que o `install.php` desapareceu.** Se a página disser que não conseguiu
      apagar-se, apaga-o pelo File Manager, agora. Um instalador esquecido no servidor é um
      botão de reinstalação exposto ao mundo.
- [ ] Abre `https://odominio/painel/` e entra.

## 7. Verificação pós-instalação

- [ ] `https://odominio/painel/private/config.php` devolve 403 ou 404 (nunca o conteúdo).
      Se estiveres na disposição preferida, o caminho nem existe — melhor ainda.
- [ ] `https://odominio/painel-private/config.php` devolve 404.
- [ ] `https://odominio/painel/dashboard` abre. Se der 404, o `mod_rewrite` não está ativo:
      põe `'pretty_urls' => false` no `config.php`.
- [ ] Página *Segurança* dentro da app: `install.php` marcado como apagado, ligação em HTTPS.
- [ ] Erra a password de propósito seis vezes e confirma que bloqueia. Espera os minutos
      indicados, ou apaga as linhas de `login_attempts` no phpMyAdmin.
- [ ] No telemóvel: abre o site, *Partilhar* → *Adicionar ao ecrã principal*.

## 8. Rotina

- [ ] Export da base em phpMyAdmin antes de cada actualização de ficheiros.
- [ ] Vê `painel-private/storage/error.log` de vez em quando. Deve estar vazio.
- [ ] Não há cron: as tarefas diárias (limpeza do registo de entradas, fecho de sessões de
      estudo esquecidas abertas) correm no primeiro pedido de cada dia.
