Files
baseldosdados/README.md
rafapolo 41e7f7a972 replace duckdb-ui with ttyd shell: add /query HTTP endpoint, fix utf-8/locale, region config
- swap DuckDB UI for ttyd web terminal (--writable, -readonly db)
- add POST /query endpoint with X-Password auth for curl-based SQL execution
- fix UTF-8 rendering: set LANG/LC_ALL=C.UTF-8 in container
- pass BUCKET_REGION env var for correct S3 signing region
- simplify start.sh: drop Xvfb, views.duckdb generation, blocking duckdb -ui
- add less, ncurses-bin to Dockerfile for proper pager/terminal support
- update Caddyfile: single route to ttyd with flush_interval -1 for websocket
- update README to reflect current architecture and document /query usage
- remove duckdb-ui.service, schemas.json, file_tree.md (generated artifacts)
2026-03-26 11:54:46 +01:00

3.6 KiB

baseldosdados

Mirror completo das tabelas públicas do projeto Base dos Dados — 533 tabelas, ~675 GB em Parquet+zstd — hospedado no Hetzner Object Storage e acessível via DuckDB no browser.

Scripts

Script Função
roda.sh Exporta BigQuery → GCS → Hetzner S3 (pipeline principal)
prepara_db.py Cria basedosdados.duckdb com views sobre os parquets do S3

Fluxo de exportação

BigQuery (basedosdados) → GCS (Parquet + zstd) → Hetzner Object Storage (rclone)
  1. Descobre automaticamente todos os datasets e tabelas via API do BigQuery
  2. Exporta em paralelo no formato Parquet com compressão zstd
  3. Transfere GCS → Hetzner Object Storage via rclone (streaming direto, sem disco local)
  4. Verifica a contagem de arquivos entre GCS e S3

Resume automático: se interrompido, basta rodar novamente — tabelas e transfers já concluídos são pulados.

Estrutura dos dados no S3

s3://<HETZNER_S3_BUCKET>/
└── <dataset>/
    └── <tabela>/
        └── *.parquet

Configuração

Crie um arquivo .env:

Variável Descrição
YOUR_PROJECT ID do seu projeto GCP (para faturamento)
BUCKET_NAME Nome do bucket GCS intermediário
BUCKET_REGION Região do bucket S3 (ex: eu-central)
SOURCE_PROJECT Projeto fonte (basedosdados)
PARALLEL_EXPORTS Jobs paralelos de exportação BigQuery (padrão: 8)
HETZNER_S3_BUCKET Nome do bucket no Hetzner Object Storage
HETZNER_S3_ENDPOINT Endpoint do Hetzner (ex: https://hel1.your-objectstorage.com)
S3_CONCURRENCY Transfers paralelos do rclone (padrão: 64)
PARALLEL_UPLOADS Datasets enviados em paralelo (padrão: 4)
AWS_ACCESS_KEY_ID Access key do Hetzner Object Storage
AWS_SECRET_ACCESS_KEY Secret key do Hetzner Object Storage
BASIC_AUTH_PASSWORD Senha de acesso ao shell web e endpoint /query

Uso — exportação

chmod +x roda.sh
./roda.sh --dry-run    # estima tamanho e custo
./roda.sh              # execução local
./roda.sh --gcloud-run # cria VM no GCP, roda lá e deleta ao final

Autenticação GCP necessária antes da primeira exportação:

gcloud auth login
gcloud auth application-default login
gcloud config set project SEU_PROJECT_ID

--gcloud-run

Cria uma VM e2-standard-4 Debian 12 em us-central1-a, copia o script e o .env, instala dependências e executa via SSH.

Variável Padrão Descrição
GCP_VM_NAME bd-export-vm Nome da instância
GCP_VM_ZONE us-central1-a Zona do Compute Engine

Uso — exploração local

python prepara_db.py  # cria basedosdados.duckdb com views para todas as tabelas
duckdb basedosdados.duckdb

Acesso web — https://db.xn--2dk.xyz

Container Docker com Caddy + ttyd expondo um shell DuckDB no browser, protegido por senha.

Shell interativo

Acesse https://db.xn--2dk.xyz → autentique com a senha → shell DuckDB direto no browser.

API HTTP (curl)

# Query simples
curl -X POST https://db.xn--2dk.xyz/query \
  -H "X-Password: <senha>" \
  --data-binary "SELECT count(*) FROM br_anatel_banda_larga_fixa.densidade_brasil"

# De um arquivo SQL
curl -X POST https://db.xn--2dk.xyz/query \
  -H "X-Password: <senha>" \
  --data-binary @query.sql >> result.csv

# Inline com heredoc
curl -X POST https://db.xn--2dk.xyz/query \
  -H "X-Password: <senha>" \
  --data-binary @- << 'EOF'
SELECT sigla_uf, sum(densidade) AS total
FROM br_anatel_banda_larga_fixa.densidade_uf
WHERE ano = 2023
GROUP BY 1 ORDER BY 2 DESC
EOF

Deploy

haloy deploy