Dashboard first-party para medir visitas, cliques de download e instalacoes sem Google Analytics/Firebase.
- Next.js (React + TypeScript)
- Armazenamento first-party em arquivo append-only (
NDJSON) - Recharts para visualizacao
- API Route Handlers para ingestao e consultas
src/
domain/
events/
types.ts
EventRepository.ts
application/
use-cases/
TrackEventUseCase.ts
GetOverviewMetricsUseCase.ts
GetTimeseriesUseCase.ts
GetFunnelMetricsUseCase.ts
GetTopPagesUseCase.ts
infrastructure/
db/fileStore.ts
repositories/FileEventRepository.ts
container.ts
interface/
http/
validators.ts
requestMeta.ts
http.ts
app/
api/v1/...
dashboard/page.tsx
Principios aplicados:
- SRP: cada camada faz uma coisa (dominio, casos de uso, persistencia, HTTP/UI).
- OCP: novas metricas/eventos entram com novos casos de uso/repositorio sem quebrar controllers.
- LSP/ISP:
EventRepositorysepara contrato do storage. - DIP: use cases dependem de interface, nao de SQLite diretamente.
page_viewdownload_clickpwa_installedfirst_open
Obs.: eventos classificados como bot sao armazenados, mas excluidos das metricas do dashboard.
Body:
{
"eventName": "download_click",
"visitorId": "visitor-123",
"sessionId": "session-123",
"path": "/",
"metadata": {
"channel": "hero-cta"
}
}Header opcional:
X-Analytics-Key: <ANALYTICS_WRITE_KEY>
Blocos suportados no export CSV:
pagesreferrerscountriesevents
Auth dashboard:
POST /api/v1/auth/loginPOST /api/v1/auth/logout
range: 7d, 30d ou 90d.
Copie .env.example para .env:
cp .env.example .envDATABASE_PATH: caminho do arquivoNDJSON.VERCEL_BASELINE_PATH: caminho dovercel-baseline.json(opcional, default busca em./config,./dashboard/config,./datae./dashboard/data).ANALYTICS_WRITE_KEY: chave para proteger ingestao.TRACKING_ALLOWED_ORIGINS: origens permitidas, separado por virgula ou*.VISITOR_HASH_SALT: salt para derivar visitor id quando cliente nao envia.DASHBOARD_AUTH_USERNAME: usuario para login do dashboard.DASHBOARD_AUTH_PASSWORD_HASH: hash da senha (formatoscrypt$N$r$p$salt$hash).DASHBOARD_SESSION_SECRET: segredo para criptografar cookie de sessao.DASHBOARD_SESSION_TTL_SECONDS: TTL da sessao em segundos.DASHBOARD_SESSION_COOKIE_SECURE:trueem producao HTTPS;falseem dev HTTP.DASHBOARD_AUTH_ALLOWED_ORIGINS: opcional, allowlist de origem para login/logout.
Gerar hash de senha:
npm run auth:hash -- "sua-senha-forte"O arquivo config/vercel-baseline.json pode definir um snapshot inicial da Vercel para a dashboard iniciar com esses valores.
capturedAt(ISO UTC) define o corte: eventos locais comoccurredAt <= capturedAtsao ignorados.- Eventos depois de
capturedAtsao somados ao baseline.
npm install
npm run devDashboard:
http://localhost:3000/dashboard- login em
http://localhost:3000/dashboard/login
Use o snippet em docs/tracker-snippet.ts.
No minimo, envie:
page_viewao carregar rotadownload_clickno CTAfirst_openquando detectar instalacao/primeira abertura
sudo apt update
sudo apt install -y curl gnupg ca-certificates nginx
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs build-essentialmkdir -p ~/apps
cd ~/apps
git clone <SEU_REPO_GIT> analytics-first-party
cd analytics-first-party
cp .env.example .env
npm install
npm run buildsudo npm install -g pm2
pm2 start npm --name analytics-first-party -- start
pm2 save
pm2 startupArquivo /etc/nginx/sites-available/analytics-first-party:
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Ativar:
sudo ln -s /etc/nginx/sites-available/analytics-first-party /etc/nginx/sites-enabled/analytics-first-party
sudo nginx -t
sudo systemctl restart nginx- Definir
ANALYTICS_WRITE_KEYforte. - Definir
VISITOR_HASH_SALTunico. - Restringir
TRACKING_ALLOWED_ORIGINS. - Ativar TLS (certbot) antes de ir para trafego real.
- Fazer backup diario do arquivo de eventos (
data/events.ndjson).