---
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
