Files
wiki/Catalogue-Self-Hosted/apps/app-shlink.md
T
2026-06-09 18:40:21 +02:00

5.4 KiB


🔗 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é)

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

Pages Liées