|
1 | | -# sqliteWASMGithub |
| 1 | +# Site estático com SQLite + WASM no GitHub Pages |
| 2 | + |
| 3 | +Este projeto mostra como publicar um site estático no GitHub Pages que baixa um banco SQLite grande, comprime em gzip/brotli, grava no navegador (OPFS/IndexedDB) e executa consultas localmente com SQLite WASM. |
| 4 | + |
| 5 | +## Limites relevantes do GitHub Pages |
| 6 | +- Repositório e artefatos publicados: ~1 GB é o teto prático. Acima disso a publicação costuma falhar. |
| 7 | +- Arquivos individuais no Git: evite >100 MB. Para bancos >500 MB, publique o `.sqlite.gz` via GitHub Releases ou outro storage estático e aponte a URL no loader. |
| 8 | +- Builds automatizados (Pages Actions) têm janela curta (~10 min) e banda limitada. Prefira subir o arquivo já comprimido, sem etapas pesadas no CI. |
| 9 | + |
| 10 | +## Estrutura |
| 11 | +- `docs/`: site servível pelo Pages. |
| 12 | +- `docs/data/`: manifest e (opcionalmente) o banco comprimido. Para arquivos grandes, use só um placeholder e referencie uma URL externa. |
| 13 | +- `docs/js/`: loader do banco e UI. |
| 14 | +- `docs/vendor/`: dependências de terceiros (pako). O wasm do SQLite é carregado de CDN por padrão. |
| 15 | +- `scripts/`: utilitários para preparar o banco. |
| 16 | + |
| 17 | +## Fluxo resumido |
| 18 | +1) Gerar/atualizar o banco: `sqlite3 data/source.sqlite ".read migrations.sql"`, depois `scripts/prepare-db.sh`. |
| 19 | +2) Publicar o `.sqlite.gz` (recomendado via Releases) e atualizar `docs/data/manifest.json` com `version`, `url`, `size` e `sha256`. |
| 20 | +3) Rodar `scripts/serve.sh` para testar localmente (`http://localhost:8080`). |
| 21 | +4) Subir para o GitHub e habilitar Pages apontando para `docs/`. |
| 22 | + |
| 23 | +## Workflow no GitHub Actions |
| 24 | +- O deploy do Pages gera os artefatos no CI (db comprimido + manifest). |
| 25 | +- Por isso os arquivos gerados localmente ficam no `.gitignore`: |
| 26 | + `data/source.sqlite`, `docs/data/db.sqlite.*`, `docs/data/manifest.json` e `tmp/`. |
| 27 | +- Para testes locais, gere com `scripts/generate-test-db.sh` e `scripts/prepare-db.sh`. |
| 28 | + |
| 29 | +## Como gerar um banco de ~500 MB (sequencial) |
| 30 | +1) Gerar o banco grande de teste: |
| 31 | +``` |
| 32 | +scripts/generate-test-db.sh |
| 33 | +``` |
| 34 | +Opcional (ajustar tamanho): |
| 35 | +``` |
| 36 | +ROWS=450000 PAYLOAD_SIZE=1024 scripts/generate-test-db.sh data/source.sqlite |
| 37 | +``` |
| 38 | +Observações: |
| 39 | +- Execute os comandos a partir da raiz do projeto. |
| 40 | +- O banco de origem fica em `data/source.sqlite` (fora de `docs/`). |
| 41 | +- Os arquivos comprimidos e o `manifest.json` são gravados em `docs/data/`. |
| 42 | + |
| 43 | +2) Compactar e gerar o manifest: |
| 44 | +``` |
| 45 | +DB_VERSION=test-500mb \ |
| 46 | +DB_URL=./data/db.sqlite.gz \ |
| 47 | +DB_BROTLI_URL=./data/db.sqlite.br \ |
| 48 | +scripts/prepare-db.sh data/source.sqlite |
| 49 | +``` |
| 50 | + |
| 51 | +3) Servir localmente: |
| 52 | +``` |
| 53 | +scripts/serve.sh 8080 |
| 54 | +``` |
| 55 | +Abrir `http://localhost:8080` e executar uma query de teste: |
| 56 | +``` |
| 57 | +SELECT id, nome, categoria, valor, length(payload) AS payload_len |
| 58 | +FROM items |
| 59 | +LIMIT 10; |
| 60 | +``` |
| 61 | + |
| 62 | +## Observações |
| 63 | +- Navegador precisa suportar WASM e, para streaming eficiente, `DecompressionStream` e OPFS. O loader possui fallback para pako + buffer em memória (menos ideal). |
| 64 | +- Mantenha consultas paginadas/limitadas na UI para evitar estouro de memória ao ler tabelas grandes. |
| 65 | + |
0 commit comments