200 lines
7.5 KiB
Markdown
200 lines
7.5 KiB
Markdown
---
|
|
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](https://selfh.st/apps/?tag=web-analytics)
|
|
|
|
## 📋 Métadonnées
|
|
|
|
| Métadonnée | Valeur |
|
|
| :--- | :--- |
|
|
| **Site web** | [vinceanalytics.com](https://vinceanalytics.com/) |
|
|
| **GitHub** | [github.com/vinceanalytics/vince](https://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é)
|
|
|
|
```yaml
|
|
# 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 :
|
|
|
|
```bash
|
|
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)
|
|
|
|
```bash
|
|
# 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`) :
|
|
|
|
```ini
|
|
[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
|
|
```
|
|
|
|
```bash
|
|
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** :
|
|
|
|
```html
|
|
<script async src="https://vince.example.com/v.js"
|
|
data-host="vince.example.com"
|
|
data-d="votre-site-key"></script>
|
|
```
|
|
|
|
- **CLI** : `vince admin` pour gérer les utilisateurs, `vince serve` pour démarrer, `vince version`.
|
|
- **Multi-sites** : configurer plusieurs `site-key` depuis 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` (permissions `600` ou `640`, owner `vince:vince`).
|
|
- **Sauvegardes SQLite** : `sqlite3 vince.db ".backup '/var/backups/vince-$(date +%F).db'"` ou simple copie (avec `VACUUM INTO`).
|
|
- **Rate limiting** natif : surveiller les logs pour détecter des abus.
|
|
- **CORS** : configurer `VINCE_BASE_URL` strictement.
|
|
- 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).
|
|
|
|
## 📚 Ressources
|
|
|
|
- [Site officiel](https://vinceanalytics.com/)
|
|
- [Documentation](https://vinceanalytics.com/docs)
|
|
- [GitHub vinceanalytics/vince](https://github.com/vinceanalytics/vince)
|
|
- [Démo live](https://demo.vinceanalytics.com)
|
|
- [API reference](https://vinceanalytics.com/docs/api)
|
|
|
|
## 🔗 Pages Liées
|
|
|
|
- [[cat-web-analytics]]
|
|
- [[recettes-docker-compose]]
|
|
- [[app-goatcounter]]
|
|
- [[app-umami]]
|
|
- [[app-plausible]]
|