# Hospedar o convite no cPanel

O pacote contém o convite animado, API PHP e estrutura MySQL. Não precisa instalar Node.js, npm ou Composer na hospedagem.

## 1. Criar o banco

No cPanel, abra **Database Wizard / Assistente de banco de dados** (em versões anteriores: **MySQL Database Wizard**). Crie o banco e um usuário, vincule o usuário ao banco e conceda as permissões nesse banco. Os nomes completos normalmente incluem o prefixo da conta, por exemplo `minhaconta_matteo`.

Abra o **phpMyAdmin**, selecione esse banco e importe `sql/schema.sql`. O arquivo cria as tabelas; não cria nem apaga bancos. São usadas tabelas InnoDB e caracteres `utf8mb4`.

Requisitos: PHP 8.1 ou superior, extensão `pdo_mysql`, sessões PHP e MySQL 5.7+ ou MariaDB 10.2+. Use HTTPS no domínio.

## 2. Enviar os arquivos

Extraia `convite-matteo-cpanel.zip` no computador ou no diretório inicial da conta no Gerenciador de Arquivos. A organização final, para o domínio principal, é:

```text
/home/SUA_CONTA/
├── public_html/
│   ├── index.html
│   ├── assets/
│   ├── event.json
│   ├── favicon.svg
│   ├── .htaccess
│   └── api/
│       ├── rsvp.php
│       └── app-config.php
└── matteo-private/
    ├── config.php
    ├── config.example.php
    ├── bootstrap.php
    ├── rsvp-service.php
    └── .htaccess
```

Copie **o conteúdo** de `public_html/` para a raiz pública do seu domínio. Coloque `matteo-private/` ao lado de `public_html/`, fora da área pública. O SQL e este manual ficam fora da pasta pública.

Não é necessário dar permissão 777. Use as permissões padrão da hospedagem e permita que o PHP leia os arquivos privados.

## 3. Configurar o acesso

Edite somente `matteo-private/config.php`. A chave `app_key` já foi gerada no pacote; mantenha seu valor. Preencha:

```php
'database' => 'SUA_CONTA_matteo',
'username' => 'SUA_CONTA_convite',
'password' => 'A_SENHA_DO_USUARIO_DO_BANCO',
```

O host padrão é `localhost`. Se a hospedagem fornecer outro host/porta, ajuste `host` e `port` também. Deixe `environment` como `production` e `driver` como `mysql`.

`site_url` pode ficar vazio. Se preenchido, use apenas a origem oficial, como `https://convite.seudominio.com`, sem caminho nem barra no final. O visitante deve confirmar nessa mesma origem.

As credenciais ficam no PHP privado; não são colocadas no HTML, JavaScript ou `event.json`. Ao atualizar a versão, preserve o `config.php` da hospedagem, a mesma `app_key` e o banco existente. O empacotador local também preserva um `config.php` já existente em `release/cpanel/matteo-private/`.

## Se usar uma subpasta ou domínio adicional

O frontend usa caminhos relativos e funciona em subpastas. Se publicar em `public_html/convite/`, mantenha `matteo-private/` em `/home/SUA_CONTA/` e altere `convite/api/app-config.php` para:

```php
return dirname(__DIR__, 3) . '/matteo-private';
```

Para outra estrutura, esse arquivo pode retornar o caminho absoluto da pasta privada. Ele contém apenas o caminho, sem a senha do banco.

Depois de definir o domínio, pode atualizar `og:url` e `og:image` em `index.html` para URLs absolutas do seu site se quiser personalizar a prévia ao compartilhar.

## Conferir o funcionamento

Abra o convite e envie uma confirmação de teste com seu nome, telefone e dois acompanhantes. O sistema deve mostrar **3 pessoas confirmadas** e um número de confirmação. No phpMyAdmin, confira um registro em `rsvps`, dois em `companions` e a referência em `rsvp_requests`.

Reenviar exatamente os mesmos dados não cria uma segunda família. Reutilizar uma requisição com dados alterados é recusado. Pessoas de grupos diferentes podem usar o mesmo telefone.

Se aparecer indisponibilidade, confira PHP/`pdo_mysql`, o caminho privado, nome completo do banco/usuário, senha, permissões, importação do SQL e o log de erros do cPanel. A interface só mostra sucesso depois de receber a confirmação de gravação do servidor. Uma falha mantém os campos para tentar novamente.

## Consultar as confirmações

As informações são consultadas no phpMyAdmin; não existe uma lista pública de convidados.

```sql
-- Responsáveis, telefone, total incluindo o responsável e data em UTC.
SELECT public_id, name, phone, guest_count, created_at
FROM rsvps ORDER BY created_at DESC;

-- Acompanhantes associados a cada responsável.
SELECT r.name AS responsavel, r.phone AS telefone,
       c.name AS acompanhante, c.position AS ordem
FROM rsvps r JOIN companions c ON c.rsvp_id = r.id
ORDER BY r.created_at DESC, c.position;

-- Quantidade total de pessoas confirmadas.
SELECT COALESCE(SUM(guest_count), 0) AS total_de_pessoas FROM rsvps;
```

## Gerar outro pacote local

Na pasta do projeto:

```sh
npm run build
npm run package:cpanel
```

O resultado fica em `release/convite-matteo-cpanel.zip`; a pasta preparada fica em `release/cpanel/`. A criação do ZIP usa Python 3 apenas no computador de desenvolvimento. A hospedagem precisa somente de PHP/MySQL.

Referências oficiais: [Database Wizard do cPanel](https://docs.cpanel.net/cpanel/databases/database-wizard/), [bancos e phpMyAdmin](https://docs.cpanel.net/cpanel/databases/mysql-databases/), [transações PDO](https://www.php.net/pdo.transactions.php).
