# CREW TRACKER — Guia de Implantação

> ⚠️ **Aviso importante**: eu não tenho acesso remoto à sua VPS (não tenho SSH,
> nem consigo rodar comandos nela). Tudo abaixo foi **construído e testado
> aqui no meu ambiente** (sintaxe Python validada, parser testado com CSV de
> exemplo, PHP revisado manualmente). Os comandos a seguir são para **você
> rodar como root na sua VPS**, na ordem apresentada. Copie e cole os blocos
> um de cada vez e me mande o retorno se algo der erro.

---

## 0. Verificação do ambiente (rode primeiro, não altera nada)

```bash
# Sistema operacional
lsb_release -a || cat /etc/os-release

# Nginx instalado / versão / status
nginx -v
systemctl status nginx --no-pager

# PHP instalado / versão / módulos
php -v
php -m | grep -i pdo
systemctl status "php*-fpm" --no-pager

# MySQL / MariaDB instalado / versão / status
mysql --version
systemctl status mysql --no-pager || systemctl status mariadb --no-pager

# Bancos de dados existentes (não vamos mexer em nenhum deles)
mysql -u root -p -e "SHOW DATABASES;"

# Sites nginx existentes (não vamos alterar nenhum)
ls -la /etc/nginx/sites-available/
ls -la /etc/nginx/sites-enabled/

# Permissões da pasta /var/www
ls -la /var/www/
whoami
```

Me envie o retorno desses comandos se quiser que eu ajuste algo (ex.: versão
do PHP-FPM no nginx.conf, ou nome do socket php-fpm) antes de seguir.

---

## 1. Criar a estrutura do projeto

```bash
mkdir -p /var/www/crewtracker/{api,scripts,sql,icons}
```

Nada em `/var/www` além dessa nova pasta é tocado.

## 2. Enviar os arquivos para a VPS

Você recebeu um arquivo `crewtracker.zip` comigo. Envie para a VPS (do seu
computador local, via `scp`, SFTP, ou upload do painel da VPS):

```bash
scp crewtracker.zip root@SEU_IP:/root/
```

Na VPS, extraia direto na pasta do projeto:

```bash
cd /root
unzip crewtracker.zip -d /tmp/crewtracker_src
cp -r /tmp/crewtracker_src/* /var/www/crewtracker/
```

## 3. Permissões

```bash
chown -R www-data:www-data /var/www/crewtracker
find /var/www/crewtracker -type d -exec chmod 755 {} \;
find /var/www/crewtracker -type f -exec chmod 644 {} \;

# api/config.php contém a senha do banco — restrinja um pouco mais
chmod 640 /var/www/crewtracker/api/config.php
chown www-data:www-data /var/www/crewtracker/api/config.php
```

---

## 4. Banco de dados MySQL

```bash
mysql -u root -p < /var/www/crewtracker/sql/schema.sql
```

Criar um usuário dedicado (privilégio mínimo, só nesse banco):

```bash
mysql -u root -p -e "
CREATE USER IF NOT EXISTS 'crewtracker_user'@'localhost' IDENTIFIED BY 'TROQUE_ESTA_SENHA_FORTE';
GRANT SELECT, INSERT, UPDATE, DELETE ON crewtracker_db.* TO 'crewtracker_user'@'localhost';
FLUSH PRIVILEGES;
"
```

Depois, edite `/var/www/crewtracker/api/config.php` e coloque a mesma senha em `DB_PASS`:

```bash
nano /var/www/crewtracker/api/config.php
```

**Teste a conexão:**

```bash
mysql -u crewtracker_user -p crewtracker_db -e "SHOW TABLES;"
```

Deve listar `flights`, `crew`, `flight_crew`.

---

## 5. Configurar o Nginx

```bash
cp /var/www/crewtracker/nginx/crewtracker.conf /etc/nginx/sites-available/crewtracker
```

Edite e ajuste `server_name` (domínio ou IP) e a versão do socket PHP-FPM:

```bash
nano /etc/nginx/sites-available/crewtracker
```

```bash
# confirme a versão real do php-fpm instalada:
ls /run/php/
```

Ative o site e teste a configuração:

```bash
ln -s /etc/nginx/sites-available/crewtracker /etc/nginx/sites-enabled/crewtracker
nginx -t
systemctl reload nginx
```

`nginx -t` precisa retornar `syntax is ok` / `test is successful` antes do reload.

---

## 6. HTTPS (se você já tiver um domínio apontando pra VPS)

```bash
apt install -y certbot python3-certbot-nginx
certbot --nginx -d seu-dominio.com
```

O Certbot ajusta o bloco `server` automaticamente para 301 → HTTPS. Sem
domínio, pule esta etapa — o app funciona por IP/HTTP na rede local, mas
**para instalar como PWA no iPhone, o Safari exige HTTPS** (ou `localhost`).
Então, para instalar no iPhone de verdade, você vai precisar de um domínio.

---

## 7. Testar a API

```bash
curl -s "http://SEU_DOMINIO_OU_IP/api/crew.php" | head -c 300
curl -s "http://SEU_DOMINIO_OU_IP/api/search.php?crew=TESTE"
```

O segundo comando deve responder algo como:

```json
{"encontrado":false,"mensagem":"Nenhum registro encontrado para o Crew Code \"TESTE\"."}
```

(porque ainda não importamos nenhum voo — ver próxima seção).

---

## 8. Importar seu CSV do Flighty

```bash
apt install -y python3-pip
pip install pymysql --break-system-packages
```

**Primeiro, sempre rode em modo `--dry-run`** para conferir o que seria
extraído das Notes, sem gravar nada:

```bash
python3 /var/www/crewtracker/scripts/import_flighty.py /caminho/do/seu_export.csv --dry-run
```

Leia a saída: cada voo aparece com a lista de crew extraída das Notes. Se os
Crew Codes / nomes / tipos saírem errados, é porque **o formato real das suas
Notes é diferente do que eu assumi** (ver aviso no topo do script,
`scripts/import_flighty.py`). Nesse caso, me mande 2-3 linhas reais de
exemplo (pode anonimizar) que eu ajusto o regex do script pra você.

Quando a saída do `--dry-run` estiver correta, rode de verdade:

```bash
python3 /var/www/crewtracker/scripts/import_flighty.py /caminho/do/seu_export.csv \
  --db-host localhost \
  --db-name crewtracker_db \
  --db-user crewtracker_user \
  --db-pass 'SUA_SENHA'
```

O script pode ser rodado várias vezes com o mesmo CSV (ou CSVs atualizados)
sem duplicar nada: voos repetidos são ignorados por chave única, e
registros de crew/tipo repetidos (mesmo voo + mesma pessoa + mesmo tipo +
mesma data) também. Registros novos com tipo diferente em datas diferentes
são **adicionados**, nunca sobrescrevem os antigos.

---

## 9. Testar no navegador

```
http://SEU_DOMINIO_OU_IP/
```

ou, com HTTPS configurado:

```
https://seu-dominio.com/
```

Digite um Crew Code que você importou e clique em **Pesquisar**.

---

## 10. Instalar no iPhone (PWA)

1. Abra o site no **Safari** do iPhone (precisa ser HTTPS).
2. Toque no ícone de **Compartilhar** (quadrado com seta pra cima).
3. Toque em **"Adicionar à Tela de Início"**.
4. Confirme o nome ("Crew Tracker") e toque em **Adicionar**.
5. O ícone aparece na tela de início e abre em tela cheia, sem a barra do Safari.

---

## 11. Testar o PWA / service worker

No Safari desktop ou no iPhone:

- Abra as ferramentas de desenvolvedor (ou apenas confie no comportamento):
  o app deve carregar normalmente na primeira vez.
- Ative modo avião / desligue o Wi-Fi e reabra o app pela tela de início:
  o "casco" do app (tela inicial, campo de busca) deve continuar aparecendo
  graças ao cache do `service-worker.js`. A busca em si (API) exige conexão.

Verificação rápida via terminal:

```bash
curl -I http://SEU_DOMINIO_OU_IP/manifest.json
curl -I http://SEU_DOMINIO_OU_IP/service-worker.js
```

Ambos devem responder `200 OK` com `Content-Type` coerente (json / javascript).

---

## Resumo dos arquivos entregues

```
/var/www/crewtracker/
├── index.html
├── style.css
├── app.js
├── manifest.json
├── service-worker.js
├── icons/
│   ├── icon-180.png
│   ├── icon-192.png
│   ├── icon-512.png
│   └── favicon-32.png
├── api/
│   ├── config.php      (credenciais MySQL — não é servido como estático)
│   ├── search.php       GET /api/search.php?crew=CODE
│   ├── crew.php         GET /api/crew.php?q=CO   (autocomplete)
│   └── flight.php       GET /api/flight.php?id=123
├── sql/
│   └── schema.sql       (CREATE DATABASE + as 3 tabelas)
├── scripts/
│   └── import_flighty.py
└── nginx/
    └── crewtracker.conf (copiar para /etc/nginx/sites-available/)
```

## Próximos passos recomendados

1. Rode a seção 0 e me mande o retorno se quiser que eu calibre alguma coisa
   (versão do PHP-FPM, nome do banco existente que eu deva evitar, etc.).
2. Me mande 2-3 linhas reais do campo **Notes** do seu CSV Flighty
   (pode remover nomes reais, só preciso ver a *estrutura*) para eu calibrar
   com precisão o `parse_notes()` do script de importação.
