Shlink – Pour raccourcir ses liens à l’épée

Les services de raccourcissement d’URL comme Bitly ou TinyURL sont pratiques, mais ils impliquent de céder ses données et celles des personnes qui vont utiliser les liens à des plateformes externes. C’est en cherchant des alternatives que j’ai découvert et adopté Shlink, un outil libre, moderne et auto-hébergeable.

Présentation

Shlink est un raccourcisseur d’URL open source écrit en PHP. Il permet de créer des liens courts personnalisés, de générer des QR codes rapidement, d’obtenir des statistiques détaillées sur les clics et de gérer plusieurs domaines de redirection.
Son API REST complète, son interface web (qui n’est pas directement intégrée, nous le verrons plus tard) et sa ligne de commande en font un outil très pratique, adapté aussi bien à un usage individuel qu’à une intégration dans des systèmes existants (il existe par exemple un plugin WordPress).

Ses principaux atouts, pour moi, sont qu’il est auto-hébergeable, open source et qu’on peut importer (et exporter) ses URL raccourcies depuis d’autres outils via des formats spécifiques ou un simple CSV. Il n’y a donc aucune dépendance vis-à-vis d’un service tiers, et les données restent sous contrôle.

Par défaut, les URLs raccourcies sont composées du nom de domaine suivi de quelques caractères aléatoires, mais on peut personnaliser tout cela en y mettant ce qu’on souhaite, y compris des émojis 😉

Mon déploiement avec Docker

Plusieurs méthodes d’installation sont disponibles et décrites dans la documentation officielle, mais j’ai choisi de le déployer avec Docker Compose, une solution simple à maintenir et facilement reproductible.

Voici la configuration que j’utilise (adaptée à partir de celle présente dans la documentation officielle) :

services:
  shlink:
    image: 'shlinkio/shlink:stable'
    container_name: shlink
    restart: always
    environment:
      - GEOLITE_LICENSE_KEY=cle-api
      - IS_HTTPS_ENABLED=true
      - DEFAULT_DOMAIN=sh.example.com
      - TIMEZONE=Europe/Paris
      - DB_DRIVER=postgres
      - DB_HOST=db
      - DB_PORT=5432
      - DB_USER=shlink
      - DB_PASSWORD=password
      - DB_NAME=shlink_db
    ports:
      - '8080:8080'
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:15
    container_name: shlink_db
    restart: always
    environment:
      - POSTGRES_USER=shlink
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=shlink_db
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U shlink -d shlink_db"]
      interval: 5s
      timeout: 5s
      retries: 5
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

L’application repose sur deux conteneurs : Shlink lui-même et une base PostgreSQL. Dans mon cas, le tout fonctionne derrière un reverse proxy qui gère le chiffrement HTTPS et redirige le trafic vers le service sur le port 8080.

J’ai ajouté la section « healthcheck » pour corriger des soucis que j’avais lors du lancement de ce Docker Compose. En effet, le conteneur de Shlink démarrait bien avant que la base de données ne soit prête à répondre, ce qui provoquait une erreur au démarrage.

Pour gérer des domaines supplémentaires, il faut penser à les ajouter dans la configuration du reverse proxy et à générer un certificat.

L’interface web

Plus tôt, je vous avais parlé d’une interface web. Cette dernière n’est pas directement disponible avec Shlink : il s’agit d’un service à part, qui communique avec Shlink via son API. Il est bien entendu possible de l’auto-héberger, mais pour l’instant je me contente de la version mise à disposition par les éditeurs :

https://app.shlink.io

Cette interface tourne entièrement dans le navigateur. Pour l’utiliser avec son serveur, il suffit de renseigner son URL, la clé API, et c’est parti ! La clé est stocké dans le navigateur.

L’interface web, très complète, permet de créer des liens, de les modifier, de les supprimer, de consulter le nombre de clics et plein d’autres statistiques sur les appareils qui ont cliqué ! On peut ainsi connaître la part de smartphones, de PC ou de Mac qui ont accédé à nos liens, quels navigateurs sont utilisés, et même depuis quel site les gens ont cliqué sur notre lien (Referrer).

Ici, le referrer est vide car le lien était distribué sous forme de QR Code.

Mon usage et conclusion

Je ne peux pas dire que j’utilise Shlink tous les jours, mais quand j’en ai besoin, je suis très content de cet outil. Mettre en place un lien raccourci est très rapide, générer un QR Code se fait en deux clics dans la foulée, et je sais si ce lien a servi. C’est d’ailleurs cet aspect que j’utilise le plus.

Raccourcir ses URLs est très pratique, mais j’avoue être très friand des statistiques que j’obtiens. Quand on passe du temps à préparer de la documentation, à rédiger un document « important », à partager une information « urgente », j’aime bien savoir si ces liens sont vraiment utilisés, et à quel point.

Je ne peux que vous inviter à tester, c’est léger et facile à mettre ne place.