7.8 KiB
title: GoatCounter created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, web-analytics, privacy, self-hosted, analytics, go, golang, sqlite, postgresql, minimal] confidence: high contested: false sources: [https://selfh.st/apps/?tag=web-analytics]
🐐 GoatCounter
Analytics web privacy-first écrit en Go, ultra-léger et single-binary — un script de 1.5 Ko, parfait pour blogs, sites personnels et petits projets. Source : selfh.st
📋 Métadonnées
| Métadonnée | Valeur |
|---|---|
| Site web | goatcounter.com |
| GitHub | github.com/arp242/goatcounter |
| License | EUPL-1.2 (ou AGPL-3.0 pour les patches) |
| Langage | Go (single binary) / SQLite ou PostgreSQL |
| Étoiles | 259 |
| Dernière MAJ | 2026-05 |
| Catégorie | cat-web-analytics |
📝 Description
GoatCounter est une plateforme d'analyse web open source et privacy-first développée par Martin Tournoij (arp242). Sa philosophie est simple : fournir des statistiques utiles sans la complexité ni la lourdeur éthique de Google Analytics, dans un binaire Go unique facile à déployer.
Points forts : script de tracking ultra-léger (~1.5 Ko, comparable à Plausible), aucun cookie, conformité RGPD native (pas de bandeau de consentement requis), stockage en SQLite (par défaut, parfait pour les petits sites) ou PostgreSQL (pour les sites à fort trafic), single binary sans dépendance — pas de Node.js, pas de PHP, pas de runtime tiers.
Fonctionnalités clés : tableau de bord par site avec visiteurs uniques, pages vues, sources, pays, navigateurs, tracking des événements personnalisés (clics, soumissions de formulaires), intégration Stripe pour e-commerce, API JSON complète, partage de dashboards (lien public en lecture seule), export CSV des données, téléchargement / upload de configuration, anti-adblock bypass intégré (le script se charge même avec adblock), personnalisation via thèmes, sites illimités dans une seule instance.
GoatCounter propose aussi un service cloud officiel (codeberg.org en fait l'hébergeur historique ; la société fournit un service payant). L'UI est volontairement sobre et lisible, avec un mode sombre bien pensé. Le projet est actif et maintenu, avec des releases fréquentes.
🚀 Installation
Option 1 : Docker Compose (SQLite)
# docker-compose.yml
version: '3.8'
services:
goatcounter:
image: arp242/goatcounter:latest
container_name: goatcounter
restart: unless-stopped
ports:
- "8080:8080"
environment:
GOATCOUNTER_LISTEN: "0.0.0.0:8080"
GOATCOUNTER_PUBLIC_URL: "https://gc.example.com"
GOATCOUNTER_DOMAIN: "gc.example.com"
GOATCOUNTER_ADMIN_EMAIL: "admin@example.com"
GOATCOUNTER_ADMIN_PASSWORD: changez-moi
GOATCOUNTER_DB: "sqlite:///data/goatcounter.db"
GOATCOUNTER_TLS: "auto"
volumes:
- ./data:/data
networks:
- goat-net
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/"]
interval: 30s
timeout: 5s
retries: 3
networks:
goat-net:
driver: bridge
Variante PostgreSQL : remplacer
GOATCOUNTER_DBparpostgres://user:***@db:5432/goatcounteret ajouter un servicedb(postgres:16-alpine).
Lancement :
docker compose up -d
# Accéder à https://localhost:8080
# Lancer le setup initial :
docker compose exec goatcounter goatcounter db create-site \
-email admin@example.com -password changeme -domain example.com
Option 2 : Installation manuelle (binaire Go)
# Télécharger le binaire
wget https://github.com/arp242/goatcounter/releases/download/v2.10.0/goatcounter-v2.10.0-linux-amd64.tar.gz
tar xzf goatcounter-v2.10.0-linux-amd64.tar.gz
sudo mv goatcounter /usr/local/bin/
# Créer un user dédié
sudo useradd -r -m -d /var/lib/goatcounter -s /bin/bash goatcounter
# Lancer en mode dev / service
sudo -u goatcounter goatcounter serve -listen 127.0.0.1:8080 \
-public-url https://gc.example.com \
-db 'sqlite:/var/lib/goatcounter/goatcounter.db' \
-tls auto
Configuration systemd (/etc/systemd/system/goatcounter.service) :
[Unit]
Description=GoatCounter analytics
After=network.target
[Service]
User=goatcounter
Group=goatcounter
ExecStart=/usr/local/bin/goatcounter serve \
-listen 127.0.0.1:8080 \
-public-url https://gc.example.com \
-db 'sqlite:/var/lib/goatcounter/goatcounter.db' \
-tls auto
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now goatcounter
⚙️ Configuration
- GOATCOUNTER_LISTEN : adresse d'écoute (par défaut
0.0.0.0:8080). - GOATCOUNTER_PUBLIC_URL : URL publique, obligatoire pour HTTPS auto-généré.
- GOATCOUNTER_DOMAIN : domaine principal géré par l'instance.
- GOATCOUNTER_DB :
sqlite:///path/db.dboupostgres://.... - GOATCOUNTER_ADMIN_EMAIL / GOATCOUNTER_ADMIN_PASSWORD : identifiants du premier admin.
- GOATCOUNTER_TLS :
auto(Let's Encrypt intégré),acme, ounone(derrière un reverse proxy). - GOATCOUNTER_BOT_REGEX : regex pour identifier les bots (par défaut, vaste pattern).
- GOATCOUNTER_IGNORE_BOTS :
true(recommandé) pour exclure les bots des stats. - Snippet de tracking :
<script data-goatcounter="https://gc.example.com/count"
async src="//gc.example.com/count.js"></script>
- Sites multiples : GoatCounter supporte nativement plusieurs domaines depuis une seule instance.
- Événements personnalisés : envoyer un hit avec
?event=...&val=....
🔄 Alternatives
Open source :
- app-umami — plus complet, base PostgreSQL
- app-plausible — privacy-first, Elixir
- app-ackee — minimaliste, Node.js + MongoDB
- app-matomo — analytics PHP complet
- app-open-web-analytics — PHP traditionnel
- app-rybbit — TypeScript moderne
- app-litlyx — TypeScript simple
- app-swetrix — TypeScript Plausible-like
- app-vince — Go minimaliste
Propriétaire (SaaS) :
- Google Analytics 4 — leader du marché
- GoatCounter Cloud — service payant officiel (à partir de 5 $/mois)
- Plausible Cloud — payant
- Fathom Analytics — simple
- Simple Analytics — design
- Pirsch — allemand RGPD
- Umami Cloud — service officiel Umami
🔒 Sécurité
- Changer immédiatement le mot de passe admin créé lors du
db create-site. - Activer HTTPS via Let's Encrypt (
GOATCOUNTER_TLS=auto) ou reverse proxy. - GoatCounter a un mode CSRF strict : garder
GOATCOUNTER_ALLOW_ORIGINcohérent avecGOATCOUNTER_DOMAIN. - En production, lier à 127.0.0.1 et exposer via reverse proxy (Nginx, Caddy, Traefik).
- Sauvegardes SQLite : copie du fichier
.db(modeVACUUM INTO 'backup.db'recommandé), idéalement quotidienne. - En PostgreSQL :
pg_dumpquotidien. - Mettre à jour régulièrement — releases fréquentes, suivre le repo.
- Rate limiting : GoatCounter dispose d'un rate limit natif sur
/count, surveiller les logs. - fail2ban sur l'API admin recommandé.
- Restreindre l'accès admin via IP allowlist ou VPN.