Plausible Analytics self-hosted na VPS

Plausible Analytics é a alternativa privacy-first ao Google Analytics, sem cookies, sem rastreamento entre sites, compliant com GDPR/LGPD por padrão e script de apenas 1 KB. Self-hosteado na VPS, os dados dos seus visitantes ficam exclusivamente na sua infraestrutura, sem compartilhar com terceiros.

Instalar Plausible com Docker Compose

Stack oficial com PostgreSQL e ClickHouse:

bash
# Clonar o repositório oficial do Plausible:
git clone https://github.com/plausible/community-edition /opt/plausible
cd /opt/plausible

# Gerar chaves secretas:
openssl rand -base64 48   # para SECRET_KEY_BASE
openssl rand -base64 48   # para TOTP_VAULT_KEY

# Editar plausible-conf.env:
cat > plausible-conf.env << 'EOF'
BASE_URL=https://analytics.seudominio.com.br
SECRET_KEY_BASE=CHAVE_GERADA_ACIMA_48_CHARS
TOTP_VAULT_KEY=OUTRA_CHAVE_GERADA
DISABLE_REGISTRATION=invite_only
# MAILER_EMAIL=admin@seudominio.com.br
# SMTP_HOST_ADDR=smtp.gmail.com
# SMTP_HOST_PORT=587
# SMTP_USER_NAME=seu@email.com
# SMTP_USER_PWD=app_password
EOF

# O docker-compose.yml oficial já inclui PostgreSQL e ClickHouse
# Subir a stack:
docker compose up -d

# Criar conta admin (primeiro acesso):
# Acessar http://localhost:8000 (antes de configurar Nginx)
# Criar conta com email e senha

Configurar Nginx como proxy reverso

Proxy com SSL para o Plausible:

nginx
# /etc/nginx/conf.d/plausible.conf
server {
    listen 80;
    server_name analytics.seudominio.com.br;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name analytics.seudominio.com.br;

    ssl_certificate     /etc/letsencrypt/live/analytics.seudominio.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/analytics.seudominio.com.br/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

Adicionar o script de tracking ao site

Snippet de apenas 1 KB para rastrear visitantes sem cookies:

html
<!-- Adicionar ao <head> do site -->
<script defer data-domain="seusite.com.br"
  src="https://analytics.seudominio.com.br/js/script.js">
</script>

<!-- Com proxy para evitar bloqueio por ad-blockers: -->
<!-- No Nginx do SEU SITE (não do Plausible): -->
<!--
location /stats/js/script.js {
    proxy_pass https://analytics.seudominio.com.br/js/script.js;
    proxy_set_header Host analytics.seudominio.com.br;
}
location /stats/api/event {
    proxy_pass https://analytics.seudominio.com.br/api/event;
    proxy_set_header Host analytics.seudominio.com.br;
    proxy_set_header X-Forwarded-For $remote_addr;
}
-->
<!-- Então usar: -->
<!-- <script defer data-domain="seusite.com.br" data-api="/stats/api/event"
  src="/stats/js/script.js"></script> -->

<!-- Para SPAs (React, Vue, Next.js) — rastrear navegação de rota: -->
<script defer data-domain="seusite.com.br"
  src="https://analytics.seudominio.com.br/js/script.pageview-props.js">
</script>

API de estatísticas do Plausible

Acessar dados de analytics via API para relatórios customizados:

bash
# Gerar API key: analytics.seudominio.com.br/settings → API Keys

# Visitantes únicos dos últimos 30 dias:
curl "https://analytics.seudominio.com.br/api/v1/stats/aggregate?site_id=seusite.com.br&period=30d&metrics=visitors,pageviews,bounce_rate,visit_duration" \
  -H "Authorization: Bearer SEU_API_KEY" | python3 -m json.tool

# Top páginas:
curl "https://analytics.seudominio.com.br/api/v1/stats/breakdown?site_id=seusite.com.br&period=7d&property=event:page&metrics=visitors,pageviews&limit=10" \
  -H "Authorization: Bearer SEU_API_KEY"

# Top países:
curl "https://analytics.seudominio.com.br/api/v1/stats/breakdown?site_id=seusite.com.br&period=30d&property=visit:country&metrics=visitors" \
  -H "Authorization: Bearer SEU_API_KEY"

# Exportar dados históricos:
# analytics.seudominio.com.br/seusite.com.br/settings → Export Data

Manutenção e atualização

Atualizar o Plausible e fazer backup dos dados:

bash
# Atualizar Plausible:
cd /opt/plausible
docker compose pull
docker compose up -d --force-recreate

# Verificar saúde dos containers:
docker compose ps
docker compose logs plausible --tail=20

# Backup dos dados:
DATE=$(date +%Y%m%d_%H%M)

# PostgreSQL (metadados: usuários, sites, goals)
docker compose exec -T plausible_db \
  pg_dump -U postgres plausible_db | gzip > /var/backups/plausible_pg_${DATE}.sql.gz

# ClickHouse (eventos de analytics — pode ser grande)
# O volume clickhouse_data_volume contém todos os eventos
docker run --rm \
  -v plausible_clickhouse_data_volume:/data \
  -v /var/backups:/backup \
  alpine tar czf "/backup/plausible_clickhouse_${DATE}.tar.gz" /data

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Google Analytics: gratuito mas seus dados de visitantes alimentam o sistema de ads do Google, requer consent banner para LGPD/GDPR, script pesado (~45 KB). Plausible: dados ficam no seu servidor, sem cookies (sem consent banner obrigatório), script de 1 KB (mais rápido), interface mais simples. Para sites que priorizam privacidade ou querem dados dos visitantes exclusivamente para si: Plausible é superior.

O ClickHouse comprime dados de eventos eficientemente. Para um site com 10.000 visitantes/mês: ~1-2 GB por ano. Para 100.000 visitantes/mês: ~10-20 GB por ano. Configure lifecycle policies para deletar eventos antigos se o disco for limitado. O PostgreSQL (metadados) é pequeno, alguns MB.

Sim, a versão Community Edition (CE) é licença AGPL-3.0, totalmente gratuita para self-hosting, sem limites de sites, visitantes ou usuários. O Plausible Cloud (versão SaaS) tem planos pagos que financiam o desenvolvimento da versão open-source.

Plausible usa um hash diário baseado em IP + User-Agent + domínio para identificar visitantes únicos sem armazenar dados pessoais. O hash muda todo dia, impossibilitando rastreamento entre sessões. Essa abordagem é considerada privacy-by-design e geralmente não requer consent banner sob LGPD/GDPR.

Plausible suporta custom events via JavaScript: window.plausible("Compra", {props: {plano: "pro", valor: 99}}). No painel, crie Goals correspondentes para ver as métricas. Para rastrear formulários, cliques em links externos e downloads: use o script script.file-downloads.outbound-links.js (variante com mais features).