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

5.1 KiB


title: Sink 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/miantiao-me/Sink]

🔗 Sink

Sink est un raccourcisseur d'URL écrit en Rust, conçu pour la vitesse, le no-tracking et le déploiement léger — compatible Cloudflare Pages, Workers et Docker.

📋 Informations Générales

Métadonnée Valeur
Site web https://sink.cool
GitHub https://github.com/miantiao-me/Sink
License AGPL-3.0
Langage principal Rust
Étoiles GitHub 6 775
Dernière MAJ 2026-06-06
Catégorie cat-url-shortener

📝 Description

Sink est un raccourcisseur d'URL moderne écrit en Rust, initialement conçu pour être déployé sur Cloudflare Workers et Cloudflare Pages (KV + D1) pour des performances edge. Il fonctionne également en mode Node.js classique derrière un reverse proxy pour les utilisateurs qui préfèrent Docker et un VPS traditionnel.

Le projet se distingue par sa philosophie no-tracking : pas de cookies, pas de fingerprint, pas d'IP stockée en clair. Les statistiques agrègent les données par jour, pays et référent sans traquer individuellement les visiteurs, ce qui en fait un choix éthique et RGPD-friendly par défaut. L'interface est rapide, sobre, et propose un dashboard minimaliste.

Côté fonctionnalités : slugs personnalisés, links with expiration, protection par mot de passe, QR codes, support des domaines personnalisés (plusieurs possibles), export CSV des clics, et une API REST simple. Le déploiement single-binary Node.js (10 MB) ou Worker Rust (cold start < 5ms) est particulièrement adapté aux RPi et home-labs légers.

🚀 Installation

Docker Compose (recommandé)

services:
  sink:
    image: ghcr.io/miantiao-me/sink:latest
    container_name: sink
    restart: unless-stopped
    networks:
      - web
      - internal
    environment:
      - NEXTAUTH_URL=https://go.example.com
      - NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
      - DATABASE_URL=postgresql://sink:sinkpass@db:5432/sink
      - SUPPORT_URL=
      - DISABLE_REGISTRATION=false
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.sink.rule=Host(`go.example.com`)"
      - "traefik.http.routers.sink.tls.certresolver=letsencrypt"
      - "traefik.http.services.sink.loadbalancer.server.port=3000"
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    networks:
      - internal
    environment:
      - POSTGRES_USER=sink
      - POSTGRES_PASSWORD=sinkpass
      - POSTGRES_DB=sink
    volumes:
      - sink-db:/var/lib/postgresql/data

networks:
  web:
    external: true
  internal:

volumes:
  sink-db:

Déploiement Cloudflare (avancé)

Sink supporte un mode Cloudflare Workers + D1 + KV idéal pour un déploiement edge. Le repo fournit un guide pas à pas et un wrangler.toml d'exemple. Build local : npx wrangler deploy.

Installation manuelle

  1. git clone https://github.com/miantiao-me/Sink.git
  2. Prérequis : Node.js 20+, PostgreSQL 13+ (ou D1 pour Cloudflare).
  3. Copier .env.example vers .env et configurer.
  4. Lancer les migrations et pnpm dev.

⚙️ Configuration

  • NEXTAUTH_SECRET : chaîne aléatoire pour les sessions.
  • DISABLE_REGISTRATION : à true pour usage single-admin.
  • Activer le rate-limiting (Cloudflare WAF ou Traefik middleware).
  • Configurer le MAX_VISITS_PER_LINK si l'instance est publique.
  • Brancher un SMTP (optionnel) pour la récupération de mot de passe.

🔄 Alternatives

Open Source

  • app-chhoto-url — autre Rust minimaliste, ultra-léger.
  • app-shlink — PHP mature, REST API, géoloc GeoLite2.
  • app-kutt — TypeScript moderne, UI soignée, custom domain.
  • app-dub — plateforme marketing complète, plus riche.

Propriétaires (ce que cette app remplace)

  • bit.ly — leader freemium avec tracking agressif.
  • short.io — custom domain, freemium.
  • cutt.ly — analytics détaillées, freemium.
  • ow.ly (Hootsuite) — orienté réseaux sociaux.

🔐 Sécurité

  • No-tracking par défaut : Sink ne logge pas les IP, aligné RGPD.
  • HTTPS strict : service exposé, ne jamais servir en HTTP.
  • Rate limit : le code supporte un middleware à activer côté reverse proxy.
  • Backups Postgres : la base de liens doit être sauvegardée.
  • Migrations Prisma : exécuter pnpm prisma migrate deploy à chaque mise à jour.

📚 Ressources

Pages Liées