Trocando Google Analytics pelo GoatCounter

Recentemente eu configurei o projeto Pi-hole na rede de minha casa com o objetivo de barrar as requisições feitas a sites e serviços de rastreamento e propaganda. Alguns dias com o projeto rodando, percebi que não conseguia acessar as estatísticas do meu blog, que até então estavam no Google Analytics. Eu estava bloqueando requisições feitas pelo meu próprio site. Foi então que decidi buscar alternativas.

GoatCounter

Entre as diversas pesquisas por soluções mais amigáveis em termos de privacidade para os usuários do blog, encontrei o texto em que o Martin Tournoij escreveu explicando os motivos que o fizeram criar o GoatCounter.

O GoatCounter é uma plataforma de código aberto de estatísticas para web. Dentre as suas features, as principais que me fizeram o escolher para o meu blog foram:

Você pode conferir a interface acessando as estatísticas de acesso do blog do autor do GoatCounter em https://stats.arp242.net.

Antes de começar

Existem dois requisitos que são necessários para esse tutorial mas que eu não vou abordar em detalhes. O GoatCounter precisa ser instalado em uma máquina que seja acessível pela internet, portanto, o primeiro requisito é que você tenha uma máquina virtual Linux em algum provedor de hospedagem, como por exemplo DigitalOcean ou AWS.

O segundo é que você tenha um subdomínio apontando para essa máquina virtual. No decorrer do tutorial, usarei o domínio estatisticas.seublog.com.br.

Caso você não queria configurar o GoatCounter na sua própria máquina, o autor oferece o projeto como serviço, inclusive de graça, desde que para uso pessoal - https://www.goatcounter.com/signup.

Instalando GoatCounter

GoatCounter foi feito usando a linguagem de programação Go que, por ser uma linguagem compilada, facilita a distribuição de seus programas. Com GoatCounter não é diferente, podemos baixar o binário na página de releases e simplesmente executá-lo. Nesse tutorial, usaremos a versão 1.4.1, última versão lançada antes desse texto ser escrito.

# Downlaod do binário GoatCounter direto do site do Github
$ curl -L https://github.com/zgoat/goatcounter/releases/download/v1.4.1/goatcounter-v1.4.1-linux-amd64.gz -o goatcounter.gz

# O arquivo vem comprimido, então é necessário extraí-lo
$ gunzip goatcounter.gz

# Por padrão, o binário não vem com permissão de execução.
# Portanto, precisamos usar o comando chmod para adicionar permissão de execução
$ chmod +x goatcounter 

# Agora, para deixar o comando disponível em todo sistema, vamos movê-lo
# para pasta /usr/local/bin/
$ sudo mv goatcounter /usr/local/bin/goatcounter

# Execute o comando abaixo para confirmar que a instalação foi feita corretamente
$ goatcounter version
version=v1.4.1; go=go1.15.1; GOOS=linux; GOARCH=amd64; race=false; cgo=true

Configurando um novo site

Primeiro passo após a instalação é configurar o banco de dados que o GoatCounter usará para guardar as estatísticas do seu site. Ele tem suporte para PostgreSQL e SQLite3, mas para simplificar o processo, seguiremos com SQLite3. O comando abaixo pedirá para você digitar uma senha que será usada para acessar as estatísticas do seu blog e, no final, criará o arquivo db/goatcounter.sqlite3 na pasta em que ele foi executado.

$ goatcounter create -domain estatisticas.meublog.com.br -email [email protected] -createdb

Agora, vamos fazer o primeiro teste. Com o comando abaixo executa o GoatCounter na porta 5000 da sua máquina virtual.

$ goatcounter serve -db sqlite3://db/goatcounter.sqlite3 -listen :5000 -tls none

┏━━━━━━━━━━━━━━━━━━━━━ Thank you for using GoatCounter! ━━━━━━━━━━━━━━━━━━━━━━┓
┃                                                                             ┃
┃ Great you're choosing to self-host GoatCounter! I'd just like to put a      ┃
┃ reminder here that I work on this full-time; it's not a side-project.       ┃
┃ Please consider making a financial contribution according to your means if  ┃
┃ this is useful for you to ensure the long-term viability. Thank you :-)     ┃
┃                                                                             ┃
┃                   https://www.goatcounter.com/contribute                    ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

   Oct  3 00:04:43 INFO: ready; serving 1 sites on ":5000"; dev=false; sites: estatisticas.meublog.com.br

Agora vá até o seu navegador e acesse http://estatisticas.meublog.com.br:5000. Se tudo deu certo até agora, você deverá ver o seguinte erro na tela:

Executar o GoatCounter manualmente, como fizemos acima, foi suficiente para chegarmos até a página do Error 400. Essa página de erro é esperada porque o GoatCounter espera ser acessa pelo endereço http://estatisticas.meublog.com.br, sem a parte :5000.

Precisamos agora executar o GoatCounter de uma forma mais estável. Image se a máquina virtual reinicie durante uma janela de manutenção, o ideal é que o GoatCounter volte a ficar online assim que a máquina esteja disponível. Para isso vamos usar um serviço já disponível na maioria das distribuições Linux, o Systemd.

O Systemd é um componente do Linux que fornece controle de quais programas que serão executados após o sistema operacional iniciar. Essa definição pode até ser considerada simplista, mas é exatamente nessa funcionalidade que estamos interessados.

Para fazer com que o systemd fique responsável por executar um determinado programa, basta criar um arquivo na pasta /etc/systemd/system/ e descrever as instruções. No nosso caso, vamos criar o arquivo goatcounter.service:

$ sudo vim /etc/systemd/system/goatcounter.service

O conteúdo do arquivo deverá ser o seguinte:

# /etc/systemd/system/goatcounter.service

# Descrição sobre o programa que vamos executar
[Unit]
Description=GoatCounter

[Service]
Type=simple
# Se alguma coisa inesperada acontecer com o programa,
# o Systemd vai tentar reiniciá-lo assim que possível
Restart=always
# Executando pelo systemd, precisamos passar o caminho
# completo do banco de dados do site. Substitua o <seu-usuário>
# pelo usuário que você está usando para acessar a máquina virtual
ExecStart=/usr/bin/env goatcounter serve -db sqlite3:///home/<seu-usuário>/db/goatcounter.sqlite3 -listen :5000 -tls none

[Install]
WantedBy=multi-user.target

Pronto, agora o comando abaixo inicializará o GoatCounter:

$ systemctl start goatcounter

Dica: No futuro, para verificar se o GoatCounter está ativo, use a opção status do systemctl:

$ systemctl status goatcounter

Último passo antes de começar a guardar as estatísticas com seu site, é configurar acesso via HTTPS ao GoatCounter. Para isso, vamos usar um outro programa chamado Caddy Server.


Atualização: 10 Nov 2020

Após publicar esse texto, eu o enviei para o grupo oficial do GoatCounter no Telegram, em que o próprio criador faz parte. Para minha surpresa, ele leu e revisou o texto, e me avisou que o GoatCounter já é integrado ao Let’s Encrypt, ou seja, ele suporta HTTPS por padrão. Essa informação faz com que a próxima seção, sobre Caddy Server, não seja necessária. Porém, como o conteúdo ainda é válido em cenários que não há suporte automático ao HTTPS, vou mantê-lo no texto.

Se você quiser usar apenas o GoatCounter, a opção mais simples, existem dois novos passos necessários:

1 - Você precisará permitir que o GoatCounter tenha acesso a porta 443, usada para o HTTPS. Para isso, use o seguinte comando:

sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/goatcounter

2 - Agora, abra o arquivo /etc/systemd/system/goatcounter.service e remova o trecho -listen :5000 -tls none.

Pronto, agora basta reiniciar o GoatCounter usando systemctl restart goatcounter e siga para a seção Atualize o seu blog.


Caddy Server

Caddy Server é um servidor web extremamente fácil de se configurar. Vamos usá-lo principalmente por ter suporte automático a HTTPS.

Instalando o Caddy

As instruções de instalação abaixo são para Ubuntu ou Debian. Se esse não é o seu caso, olhe na documentação os passos de instalação para o seu sistema operacional.

# Adiciona respositório do Caddy no gerenciador de pacotes APT
$ echo "deb [trusted=yes] https://apt.fury.io/caddy/ /" \
    | sudo tee -a /etc/apt/sources.list.d/caddy-fury.list

# Atualiza a lista de pacotes disponíveis
$ sudo apt update

# Instala o Caddy
$ sudo apt install caddy

Configurando

O papel do Caddy é simplesmente redirecionar as requisições que chegam no endereço https://estatisticas.meublog.com.br para o GoatCounter que está rodando na porta 5000 (caso queria se aprofundar nesse tópico, pesquise por proxy reverso). Para configurarmos esse comportamente, precisamos de apenas duas linhas no arquivo /etc/caddy/Caddyfile (caso o arquivo já tenha algum conteúdo, comente com # ou apague todas linhas):

# /etc/caddy/Caddyfile
estatisticas.meublog.com.br
reverse_proxy localhost:5000

Assim como fizemos com o GoatCounter, o Caddy precisa ser reiniciado para que as configurações sejam efetivadas.

$ systemctl restart caddy

Agora vá até o navegador e acesse: https://estatisticas.meublog.com.br. O email e senha foram definidos no passo Configurando um novo site.

Atualize o seu blog

Último passo agora é adicionar a tag <script> no seu blog. A partir daí os acessos serão contabilizados pelo GoatCounter e você terá as estatísticas do seu blog disponíveis.

<script data-goatcounter="https://estatisticas.meublog.com.br/count"
        async src="//estatisticas.meublog.com.br/count.js"></script>

Próximos passos

Um tópico muito importante que não abordei e que vale um texto por si só, é como fazer backup do banco de dados que contém as estatísticas do site. Alguns dos serviços de hospedagem fornecem opções de backup automatizados por um preço adicional.

O próximo tutorial vem da mesma motivação em que escrevi esse texto: como substituir o serviço de comentários Disqus pelo Commento. Don Williamson escreveu um texto similar, em que ele ensina como trocar o Disqus pelas Issues do Github. No texto ele demonstra que, além de aumentar o tempo de carregamento da página em 4 segundos, o Disqus faz 105 requisições para serviços de rastreamento externos.

Se você tiver dúvidas ou sugestões de outros serviços de estatísticas para web, deixe um comentário.

Gif de uma cabra filhote

o/