Files
2026-06-09 18:40:21 +02:00

142 lines
5.4 KiB
Markdown

---
title: Shlink
created: 2026-06-08
updated: 2026-06-08
type: app
tags: [catalogue, url-shortener, self-hosted]
confidence: high
contested: false
sources: [https://selfh.st/apps/?tag=42, https://github.com/shlinkio/shlink]
---
# 🔗 Shlink
> **Shlink** est le raccourcisseur d'URL PHP de référence pour l'auto-hébergement : mature, conteneurisé, REST API complète, support natif de la géolocalisation et des QR codes.
## 📋 Informations Générales
| Métadonnée | Valeur |
| :--- | :--- |
| **Site web** | https://shlink.io |
| **GitHub** | https://github.com/shlinkio/shlink |
| **License** | MIT |
| **Langage principal** | PHP |
| **Étoiles GitHub** | 5 095 |
| **Dernière MAJ** | 2026-06-07 |
| **Catégorie** | [[cat-url-shortener]] |
## 📝 Description
Shlink est une application PHP (Symfony) qui s'est imposée comme **la** référence du raccourcissement d'URL auto-hébergé moderne. Sa philosophie est claire : un backend headless robuste avec une **API REST** complète, et un front-end web séparé (`shlink-web-client`) pour l'administration. Cette séparation permet de consommer Shlink depuis des scripts, des bots ou des sites tiers sans dépendre de l'UI.
Fonctionnalités principales : support multi-domaine (un serveur Shlink peut servir plusieurs domaines courts), slugs personnalisés, expiration, protection par mot de passe, QR codes dynamiques, géolocalisation IP via **MaxMind GeoLite2**, suivi des référents, devices, browsers, et respect du header `Do-Not-Track`. Le système d'API keys permet de générer des tokens à scope limité (lecture seule, admin, domaine précis).
L'écosystème autour de Shlink est riche : clients mobiles (Android/iOS), intégrations Home Assistant, webhooks, exports CSV, plugins de tracking UTM. C'est le choix **le plus recommandé** pour un usage personnel, en famille ou en petite équipe qui veut une stack stable, bien documentée, avec un projet qui a fait ses preuves depuis 2018.
## 🚀 Installation
### Docker Compose (recommandé)
```yaml
services:
shlink:
image: shlinkio/shlink:stable
container_name: shlink
restart: unless-stopped
networks:
- web
- internal
environment:
- DEFAULT_DOMAIN=go.example.com
- IS_HTTPS_ENABLED=true
- GEOLITE_LICENSE_KEY=${GEOLITE_KEY}
- MERCURE_URL= # optionnel
labels:
- "traefik.enable=true"
- "traefik.http.routers.shlink.rule=Host(`go.example.com`)"
- "traefik.http.routers.shlink.tls.certresolver=letsencrypt"
- "traefik.http.services.shlink.loadbalancer.server.port=8080"
volumes:
- shlink-data:/etc/shlink/data
shlink-ui:
image: shlinkio/shlink-web-client:stable
container_name: shlink-ui
restart: unless-stopped
networks:
- web
- internal
environment:
- SHLINK_SERVER_URL=https://go.example.com/rest
- SHLINK_API_KEY=${SHLINK_API_KEY}
labels:
- "traefik.enable=true"
- "traefik.http.routers.shlink-ui.rule=Host(`go-admin.example.com`)"
- "traefik.http.routers.shlink-ui.tls.certresolver=letsencrypt"
depends_on:
- shlink
networks:
web:
external: true
internal:
volumes:
shlink-data:
```
### Installation manuelle (LAMP)
1. `composer create-project shlinkio/shlink shlink`
2. Configurer Apache/Nginx + PHP 8.2+ + base MariaDB/SQLite/Postgres.
3. Lancer `php vendor/bin/shlink init` puis `php vendor/bin/shlink api-key:generate`.
4. Configurer le virtual host pour `/rest/v3/...`.
## ⚙️ Configuration
- Créer une clé API : `docker exec shlink shlink api-key:generate`.
- Récupérer une licence **MaxMind GeoLite2** gratuite sur maxmind.com pour la géolocalisation.
- Configurer un cron pour le téléchargement quotidien de la base GeoLite2.
- Définir `DEFAULT_DOMAIN` sur le domaine court.
- Brancher un web service pour les **webhooks** d'événements (visite, création).
## 🔄 Alternatives
### Open Source
- [[app-yourls]] — pionnier PHP, écosystème de plugins.
- [[app-kutt]] — TypeScript moderne, UI plus intégrée.
- [[app-dub]] — plateforme marketing, plus riche.
- [[app-sink]] — Rust, edge-ready, no-tracking.
- [[app-polr]] — autre PHP historique.
### Propriétaires (ce que cette app remplace)
- **bit.ly** — leader freemium, analytics fermés.
- **short.io** — custom domain, freemium.
- **rebrand.ly** — link management orienté marque.
- **cutt.ly** — analytics détaillées, freemium.
## 🔐 Sécurité
- **API key** : générer une clé par usage, ne jamais la commiter, rotation annuelle.
- **HTTPS strict** : `IS_HTTPS_ENABLED=true` pour la génération d'URL absolues correctes.
- **Rate limit** : utiliser un middleware Traefik ou Cloudflare pour bloquer les abus.
- **Backups SQLite/Postgres** : la base de liens est petite mais critique.
- **GeoLite2 update** : planifier un cron `shlink geoip:download` toutes les semaines.
## 📚 Ressources
- Site officiel : https://shlink.io
- Code source : https://github.com/shlinkio/shlink
- Documentation : https://shlink.io/documentation
- API reference : https://api-spec.shlink.io
- Web client : https://github.com/shlinkio/shlink-web-client
- Communauté : https://github.com/shlinkio/shlink/discussions
- Clients mobiles : https://shlink.io/apps
## Pages Liées
- [[cat-url-shortener|URL Shortener]] — Catégorie complète
- [[app-kutt]] — Voisin moderne TS
- [[app-yourls]] — Pionnier PHP
- [[recettes-docker-compose]] — Templates Docker