O Data Lake de $0 para Startups: DataSpoc + S3 em 30 Minutos
Você é o engenheiro fundador de uma startup seed-stage. Seu CEO pergunta “quantos usuários se cadastraram semana passada?” e você faz SSH no servidor de produção, abre o psql, escreve uma query, cola o resultado no Slack. Na semana seguinte a pergunta é “qual é nosso MRR do Stripe?” e agora você está malabarizando duas fontes de dados.
Este post constrói uma plataforma de dados completa em 30 minutos por menos de $5/mês. Você vai ingerir do Postgres e Stripe, consultar com SQL e IA, e conectar o Claude como agente. No final, qualquer pessoa no seu time pode fazer perguntas sobre seus dados sem incomodar você.
O Que Você Vai Construir
Postgres ──→ [Pipe] ──→ S3 Bucket ──→ [Lens] ──→ SQL ShellStripe ──→ [Pipe] ──┘ │ ├──→ AI Ask │ ├──→ Jupyter │ └──→ MCP → Claude- Pipe extrai do Postgres e Stripe, escreve Parquet no S3
- Lens consulta os arquivos Parquet com DuckDB
- MCP conecta o Claude (ou Cursor, Windsurf) ao seu data lake
Custo total: armazenamento S3 (~$2/mês para dados de escala startup) + DataSpoc ($0, open source).
Minuto 0-5: Instalar Tudo
# Install both toolspip install dataspoc-pipe dataspoc-lens
# Install the Singer taps you needdataspoc-pipe add tap-postgresdataspoc-pipe add tap-stripe
# Verifydataspoc-pipe --versiondataspoc-lens --versionCrie um bucket S3 para seu data lake:
aws s3 mb s3://mycompany-data-lake --region us-east-1Minuto 5-12: Ingerir do Postgres
Crie a configuração do pipeline:
source: tap: tap-postgres config: host: "${DATABASE_HOST}" port: 5432 database: "${DATABASE_NAME}" user: "${DATABASE_READONLY_USER}" password: "${DATABASE_READONLY_PASSWORD}"
tables: - name: users replication_method: incremental replication_key: updated_at
- name: orders replication_method: incremental replication_key: updated_at
- name: subscriptions replication_method: incremental replication_key: updated_at
target: bucket: "s3://mycompany-data-lake" prefix: "raw/postgres" format: parquetCrie um usuário de banco de dados somente leitura (nunca use as credenciais da sua aplicação para ETL):
-- Run once on your Postgres databaseCREATE USER dataspoc_readonly WITH PASSWORD 'secure-random-password';GRANT CONNECT ON DATABASE myapp TO dataspoc_readonly;GRANT USAGE ON SCHEMA public TO dataspoc_readonly;GRANT SELECT ON ALL TABLES IN SCHEMA public TO dataspoc_readonly;ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO dataspoc_readonly;Defina as variáveis de ambiente e execute:
export DATABASE_HOST="your-rds-endpoint.amazonaws.com"export DATABASE_NAME="myapp"export DATABASE_READONLY_USER="dataspoc_readonly"export DATABASE_READONLY_PASSWORD="secure-random-password"
dataspoc-pipe run postgres-app[09:05:01] Starting pipeline: postgres-app[09:05:02] Extracting: users (2,340 rows)[09:05:03] → raw/postgres/users/users_20260428.parquet (180 KB)[09:05:03] Extracting: orders (8,920 rows)[09:05:05] → raw/postgres/orders/orders_20260428.parquet (720 KB)[09:05:05] Extracting: subscriptions (1,890 rows)[09:05:06] → raw/postgres/subscriptions/subscriptions_20260428.parquet (95 KB)[09:05:06] Pipeline complete: 3 tables, 13,150 rowsMinuto 12-20: Ingerir do Stripe
source: tap: tap-stripe config: api_key: "${STRIPE_API_KEY}" # Use a restricted key with read-only access start_date: "2025-01-01"
streams: - charges - customers - invoices - subscriptions - balance_transactions
target: bucket: "s3://mycompany-data-lake" prefix: "raw/stripe" format: parquetObtenha uma chave de API restrita no Stripe Dashboard (Settings > API Keys > Create Restricted Key com acesso somente leitura):
export STRIPE_API_KEY="rk_live_..."
dataspoc-pipe run stripe[09:12:01] Starting pipeline: stripe[09:12:03] Extracting: charges (4,560 records)[09:12:08] Extracting: customers (2,120 records)[09:12:11] Extracting: invoices (3,890 records)[09:12:15] Extracting: subscriptions (1,450 records)[09:12:18] Extracting: balance_transactions (12,340 records)[09:12:22] Pipeline complete: 5 streams, 24,360 recordsMinuto 20-25: Conectar o Lens e Consultar
Registre o bucket no Lens:
dataspoc-lens add-bucket s3://mycompany-data-lake --name datalakedataspoc-lens tablesraw.postgres.usersraw.postgres.ordersraw.postgres.subscriptionsraw.stripe.chargesraw.stripe.customersraw.stripe.invoicesraw.stripe.subscriptionsraw.stripe.balance_transactionsOito tabelas de duas fontes. Agora consulte:
# How many users signed up last week?dataspoc-lens query " SELECT COUNT(*) AS signups FROM raw.postgres.users WHERE created_at >= CURRENT_DATE - INTERVAL 7 DAY"
# What is our MRR?dataspoc-lens query " SELECT SUM(plan_amount / 100.0) AS mrr_dollars FROM raw.stripe.subscriptions WHERE status = 'active'"
# Revenue by day this monthdataspoc-lens query " SELECT DATE_TRUNC('day', created::TIMESTAMP) AS day, SUM(amount / 100.0) AS revenue FROM raw.stripe.charges WHERE status = 'succeeded' AND created::TIMESTAMP >= DATE_TRUNC('month', CURRENT_DATE) GROUP BY 1 ORDER BY 1"Ou use IA (configure um provedor ou use Ollama de graça):
dataspoc-lens setup-ai # installs Ollama + local model
dataspoc-lens ask "what is our MRR?"dataspoc-lens ask "how many users signed up each day this week?"dataspoc-lens ask "what is the average revenue per user?"Minuto 25-30: Conectar o Claude via MCP
Adicione a configuração do servidor MCP para Claude Desktop ou qualquer ferramenta compatível com MCP:
{ "mcpServers": { "dataspoc-lens": { "command": "dataspoc-lens", "args": ["mcp"], "env": { "AWS_PROFILE": "default" } } }}Agora no Claude Desktop, digite:
What tables do we have in the data lake?O Claude chama o servidor MCP, descobre suas tabelas e responde. Continue com:
What is our MRR and how has it changed month over month?O Claude escreve SQL, executa contra seus arquivos Parquet e dá uma resposta formatada com análise. Seu CEO agora pode perguntar diretamente ao Claude em vez de te pingar no Slack.
Agende
Adicione um cron job para manter os dados frescos:
crontab -e# Extract from Postgres every hour0 * * * * cd /opt/dataspoc && dataspoc-pipe run postgres-app >> /var/log/dataspoc/postgres.log 2>&1
# Extract from Stripe every 6 hours (API rate limits)0 */6 * * * cd /opt/dataspoc && dataspoc-pipe run stripe >> /var/log/dataspoc/stripe.log 2>&1
# Refresh Lens cache after extractions5 * * * * dataspoc-lens cache refresh-stale >> /var/log/dataspoc/cache.log 2>&1Detalhamento de Custos
| Componente | Custo Mensal | Notas |
|---|---|---|
| DataSpoc Pipe | $0 | Open source |
| DataSpoc Lens | $0 | Open source |
| Armazenamento S3 (1 GB) | $0.023 | Parquet é altamente comprimido |
| Requisições S3 | ~$1-2 | PUT/GET para extração e queries |
| Ollama (IA local) | $0 | Roda na sua máquina |
| Total | < $3/mês |
Compare com alternativas:
| Alternativa | Custo Mensal |
|---|---|
| Snowflake | $400+ (warehouse mínimo) |
| BigQuery | $0 (free tier) depois $5/TB consultado |
| Fivetran + Snowflake | $500+ |
| Airbyte Cloud + Redshift | $400+ |
| DataSpoc + S3 | < $5 |
O Que Você Ganha
Por menos de $5/mês, sua startup agora tem:
- Ingestão de dados automatizada do Postgres e Stripe (horária)
- Analytics SQL sobre Parquet na nuvem (sem warehouse para gerenciar)
- Queries com IA (grátis com Ollama, ou use Claude/OpenAI)
- Integração MCP para Claude Desktop, Cursor, Windsurf
- Extração incremental (apenas dados novos são buscados)
- Sem infraestrutura para gerenciar (S3 + ferramentas CLI)
Caminho de Crescimento: Quando Escalar
Esta configuração suporta uma startup do seed até a Series A confortavelmente. Aqui está quando considerar upgrades:
| Marco | Ação |
|---|---|
| Dados > 10 GB | Adicionar mais armazenamento S3 ($0.23/mês por 10 GB) |
| Precisa de transforms | Adicionar arquivos SQL de transform (veja nosso post alternativa ao dbt) |
| 5+ fontes de dados | Adicionar mais pipelines Pipe (mesmo padrão) |
| Precisa de dashboards | Conectar Metabase/Superset ao DuckDB via Lens |
| Time > 5 analistas | Considerar cache do Lens em servidor compartilhado |
| Dados > 1 TB | Considerar estratégia de particionamento, ainda funciona com DuckDB |
| Precisa de real-time | Aí sim olhe para Kafka + streaming — ainda não |
O insight principal: você sempre pode migrar para um stack mais pesado depois. Parquet no S3 é o formato de dados universal. Se você superar o DataSpoc, seus dados funcionam com Spark, Trino, Athena ou Snowflake external tables.
Adicionando Mais Fontes Depois
O DataSpoc Pipe suporta mais de 400 taps Singer. Adicione qualquer fonte em minutos:
# HubSpot CRMdataspoc-pipe add tap-hubspot
# Google Analyticsdataspoc-pipe add tap-google-analytics
# Salesforcedataspoc-pipe add tap-salesforce
# MySQL (if you have a second database)dataspoc-pipe add tap-mysql
# Google Sheets (for manual data)dataspoc-pipe add tap-google-sheetsCada fonte ganha seu próprio YAML de pipeline e roda em seu próprio agendamento. Todos os dados pousam no mesmo bucket S3, consultáveis pela mesma interface Lens.
O Script de Setup Completo
Salve isso e execute para configurar tudo de uma vez:
#!/bin/bash# setup-data-lake.sh -- Complete startup data lake setupset -e
echo "=== DataSpoc Data Lake Setup ==="
# Install toolsecho "[1/6] Installing DataSpoc..."pip install dataspoc-pipe dataspoc-lens
# Install tapsecho "[2/6] Installing source connectors..."dataspoc-pipe add tap-postgresdataspoc-pipe add tap-stripe
# Create S3 bucketecho "[3/6] Creating S3 bucket..."aws s3 mb s3://mycompany-data-lake --region us-east-1
# Run initial extractionecho "[4/6] Running initial extraction..."dataspoc-pipe run postgres-appdataspoc-pipe run stripe
# Configure Lensecho "[5/6] Configuring query engine..."dataspoc-lens add-bucket s3://mycompany-data-lake --name datalake
# Setup local AIecho "[6/6] Setting up AI queries..."dataspoc-lens setup-ai
echo ""echo "=== Setup Complete ==="echo "Tables available:"dataspoc-lens tablesecho ""echo "Try: dataspoc-lens ask 'how many users signed up this week?'"Trinta minutos. Menos de $5/mês. Uma plataforma de dados completa que cresce com você. Pare de fazer SSH na produção para responder perguntas de negócio.