142 lines
5.4 KiB
Markdown
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
|