# Deploy HostGator sem root

## Objetivo

Publicar o painel Python usando o Apache compartilhado da HostGator sem `mod_proxy` em `.htaccess`.

O Apache entrega `index.php`, e o PHP repassa as requisições para o painel Python local em `127.0.0.1:8080`.

## Arquivos

Copiar para o diretório público do domínio:

```sh
cp deploy/hostgator/index.php ~/public_html/index.php
cp deploy/hostgator/.htaccess ~/public_html/.htaccess
```

No HostGator, o domínio pode apontar para `~/public_html` mesmo que o projeto esteja em `~/www/masper-notanacional`.
Se o document root do domínio for outro, ajustar o destino.

Copiar os scripts operacionais para a pasta do projeto:

```sh
cp deploy/hostgator/start_panel.sh ./start_panel.sh
cp deploy/hostgator/stop_panel.sh ./stop_panel.sh
cp deploy/hostgator/sync_all.sh ./sync_all.sh
cp deploy/hostgator/update_app.sh ./update_app.sh
chmod +x ./start_panel.sh ./stop_panel.sh ./sync_all.sh ./update_app.sh
```

## Subir o painel Python

Na pasta do projeto:

```sh
cd ~/www/masper-notanacional
./start_panel.sh
```

O `.env.prod` deve manter:

```sh
export NFSE_WEB_HOST="127.0.0.1"
export NFSE_WEB_PORT="8080"
```

## Testes

Validar painel local:

```sh
curl -s http://127.0.0.1:8080/login | head
```

Validar via domínio:

```sh
curl -s https://notanacional.masper.net/login | head
```

## Manter vivo por cron

Cron:

```cron
* * * * * /home/notanacional/www/masper-notanacional/start_panel.sh >/dev/null 2>&1
```

Sincronização a cada 10 minutos:

```cron
*/10 * * * * /home/notanacional/www/masper-notanacional/sync_all.sh >/dev/null 2>&1
```

Atualização automática do código a cada 5 minutos:

```cron
*/5 * * * * /home/notanacional/www/masper-notanacional/update_app.sh >/dev/null 2>&1
```

O `update_app.sh` faz `git pull --ff-only`. Quando houver commit novo, ele instala dependências de `requirements-prod-py38.txt` usando apenas wheels binários, valida `py_compile`, copia a ponte PHP para `public_html`, atualiza os scripts locais e reinicia o painel.

Se uma sincronização foi iniciada pelo botão do painel, reiniciar o painel pode interromper essa thread. Para produção, preferir sincronização por cron via `sync_all.sh`; esse processo é separado do painel.

## Limites

Essa ponte depende de o PHP conseguir abrir conexão para `127.0.0.1:8080`. Se a hospedagem bloquear `curl` local ou matar o processo Python, será necessário root/VPS ou suporte Python nativo do cPanel.
