- 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)
3.6 KiB
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)
- Descobre automaticamente todos os datasets e tabelas via API do BigQuery
- Exporta em paralelo no formato Parquet com compressão zstd
- Transfere GCS → Hetzner Object Storage via rclone (streaming direto, sem disco local)
- 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