7.5 KiB
title: Vince created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, web-analytics, privacy, self-hosted, analytics, go, golang, sqlite, minimal, simple] confidence: medium contested: false sources: [https://selfh.st/apps/?tag=web-analytics]
🐿️ Vince
Analytics web ultra-minimaliste écrit en Go — un binaire unique avec SQLite par défaut, parfait pour les sites personnels et blogs statiques. Source : selfh.st
📋 Métadonnées
| Métadonnée | Valeur |
|---|---|
| Site web | vinceanalytics.com |
| GitHub | github.com/vinceanalytics/vince |
| License | AGPL-3.0 |
| Langage | Go (single binary) / SQLite |
| Étoiles | 73 |
| Dernière MAJ | 2026-03 |
| Catégorie | cat-web-analytics |
📝 Description
Vince est un outil d'analyse web minimaliste écrit en Go qui rejoint la famille des analytics "à la GoatCounter" : single binary, SQLite par défaut, zéro cookie, script ultra-léger et déploiement en 30 secondes. La philosophie est claire : fournir l'essentiel des métriques web (visiteurs, pages vues, top referrers, top pages) sans le superflu, pour les sites qui n'ont pas besoin de funnels avancés ou de session replay.
Vince se distingue par une stack technique minimaliste : pas de Node.js à installer, pas de base de données séparée, pas de runtime tiers. Un binaire Go unique + un fichier SQLite = l'application complète. Le script de tracking est également minimal : une seule balise <script> qui envoie un hit à l'API.
Fonctionnalités principales : tableau de bord par site, multi-sites depuis une instance unique, API REST simple, export CSV, géolocalisation par IP (GeoLite2 optionnel), détection de bots, rate limiting natif, totp 2FA sur l'admin, temps réel limité (rafraîchissement à la demande), tracking des événements custom basique (?event=...).
Vince est AGPL-3.0, ce qui le distingue de app-goatcounter (EUPL). Le projet est plus jeune et plus petit que ses concurrents directs (Umami, Plausible, GoatCounter) en termes d'étoiles et de fonctionnalités, mais c'est un choix solide pour qui veut un analytics sans dépendances lourdes et avec un binaire facile à auditer (code en Go, lecture simple).
Idéal pour les petits sites, blogues Hugo/Jekyll, portfolios, docs statiques et projets personnels qui veulent un analytics fidèle, simple et sans maintenance.
🚀 Installation
Option 1 : Docker Compose (recommandé)
# docker-compose.yml
version: '3.8'
services:
vince:
image: ghcr.io/vinceanalytics/vince:latest
container_name: vince
restart: unless-stopped
ports:
- "8080:8080"
environment:
VINCE_BASE_URL: https://vince.example.com
VINCE_LISTEN: "0.0.0.0:8080"
VINCE_DB: /data/vince.db
VINCE_GEOIP_DB: /data/geoip.mmdb
volumes:
- ./data:/data
networks:
- vince-net
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/"]
interval: 30s
timeout: 5s
retries: 3
networks:
vince-net:
driver: bridge
Lancement :
docker compose up -d
# Accéder à http://localhost:8080
# Créer le premier compte admin via l'UI ou la CLI :
docker compose exec vince vince admin add admin@example.com
Option 2 : Installation manuelle (binaire Go)
# Télécharger depuis les releases GitHub
wget https://github.com/vinceanalytics/vince/releases/download/v0.2.0/vince-0.2.0-linux-amd64.tar.gz
tar xzf vince-0.2.0-linux-amd64.tar.gz
sudo mv vince /usr/local/bin/
# Créer un user et un dossier de données
sudo useradd -r -m -d /var/lib/vince -s /bin/bash vince
sudo -u vince mkdir -p /var/lib/vince/data
# Lancer (en dev)
sudo -u vince vince serve -listen 0.0.0.0:8080 -db /var/lib/vince/data/vince.db
Configuration systemd (/etc/systemd/system/vince.service) :
[Unit]
Description=Vince analytics
After=network.target
[Service]
User=vince
Group=vince
ExecStart=/usr/local/bin/vince serve \
-listen 0.0.0.0:8080 \
-db /var/lib/vince/data/vince.db \
-base-url https://vince.example.com
Restart=on-failure
RestartSec=5
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now vince
⚙️ Configuration
- VINCE_BASE_URL : URL publique (utilisée pour CORS et liens partagés).
- VINCE_LISTEN : adresse d'écoute (par défaut
127.0.0.1:8080). - VINCE_DB : chemin du fichier SQLite (ou URL PostgreSQL).
- VINCE_GEOIP_DB : chemin optionnel vers GeoLite2 (
.mmdb) pour la géolocalisation IP. - Snippet de tracking :
<script async src="https://vince.example.com/v.js"
data-host="vince.example.com"
data-d="votre-site-key"></script>
- CLI :
vince adminpour gérer les utilisateurs,vince servepour démarrer,vince version. - Multi-sites : configurer plusieurs
site-keydepuis l'admin. - Rate limiting :
VINCE_RATE_LIMIT(par défaut : 100 hits/IP/minute). - Authentification : 2FA TOTP disponible sur le compte admin.
- Export : depuis l'UI, bouton "Export CSV" par site et période.
🔄 Alternatives
Open source :
- app-goatcounter — concurrent direct en Go, plus mature
- app-umami — plus complet, base PostgreSQL
- app-plausible — privacy-first, Elixir
- app-ackee — minimaliste Node.js
- app-matomo — analytics PHP complet
- app-open-web-analytics — PHP traditionnel
- app-rybbit — TypeScript moderne
- app-litlyx — TypeScript simple
- app-swetrix — TypeScript Plausible-like
Propriétaire (SaaS) :
- Google Analytics 4 — leader, RGPD complexe
- Plausible Cloud — payant
- Fathom Analytics — simple
- Simple Analytics — design
- Pirsch — allemand RGPD
- Umami Cloud — service officiel
- Counter.dev — minimaliste freemium (philosophie proche de Vince)
🔒 Sécurité
- Changer le mot de passe admin créé lors du premier démarrage.
- Activer 2FA TOTP sur le compte admin (Vince le supporte nativement).
- HTTPS obligatoire : Vince ne fait pas HTTPS natif, il faut un reverse proxy (Caddy, Traefik, Nginx) avec Let's Encrypt devant.
- SQLite : sécuriser le fichier
vince.db(permissions600ou640, ownervince:vince). - Sauvegardes SQLite :
sqlite3 vince.db ".backup '/var/backups/vince-$(date +%F).db'"ou simple copie (avecVACUUM INTO). - Rate limiting natif : surveiller les logs pour détecter des abus.
- CORS : configurer
VINCE_BASE_URLstrictement. - Mettre à jour régulièrement — releases modérées (projet jeune).
- fail2ban sur l'API admin recommandé.
- Ne pas exposer le port 8080 sur Internet, binder sur 127.0.0.1 ou réseau interne Docker.
- GeoIP : si non utilisé, ne pas charger de base GeoLite2 (économie mémoire + surface réduite).