Zum Inhalt

Shlink als eigenen URL-Kürzer per Docker installieren

Veröffentlicht am 22. August 2026 · Geschätzte Lesezeit: 4 Minuten

Shlink erzeugt kurze Links unter deiner eigenen Domain und zählt auf Wunsch deren Aufrufe. Der Server verwaltet die Links, während eine getrennte Weboberfläche die Bedienung übernimmt. Mit vorhandener Domain und Reverse-Proxy dauert die Einrichtung etwa 25 Minuten.

Voraussetzungen

  • Ein Linux-Server mit Docker und Docker Compose
  • Eine eigene Domain oder Subdomain, zum Beispiel go.example.de
  • Ein vorhandener HTTPS-Reverse-Proxy und ein passender DNS-Eintrag
  • Die lokalen Ports 8080 und 8081 frei

1. Arbeitsordner und Zugangswerte anlegen

Führe diesen Befehl auf dem Docker-Server aus, um den Projektordner anzulegen:

mkdir -p ~/shlink && cd ~/shlink

Erstelle anschließend eine .env-Datei mit einem zufälligen Datenbankpasswort. Ersetze <short-domain> durch deine Domain ohne https:// und ohne Pfad:

printf 'POSTGRES_PASSWORD=%s\nDEFAULT_DOMAIN=%s\n' "$(openssl rand -hex 24)" '<short-domain>' > .env

Schütze die Datei vor anderen Benutzern des Servers:

chmod 600 .env

2. Compose-Datei erstellen

Lege im Ordner ~/shlink eine Datei namens compose.yaml an:

services:
  db:
    image: postgres:16-alpine
    container_name: shlink-db
    restart: unless-stopped
    environment:
      POSTGRES_DB: shlink
      POSTGRES_USER: shlink
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - shlink-db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U shlink -d shlink"]
      interval: 10s
      timeout: 5s
      retries: 5

  shlink:
    image: shlinkio/shlink:stable
    container_name: shlink
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "8080:8080"
    environment:
      DEFAULT_DOMAIN: ${DEFAULT_DOMAIN}
      IS_HTTPS_ENABLED: "true"
      DB_DRIVER: postgres
      DB_NAME: shlink
      DB_USER: shlink
      DB_PASSWORD: ${POSTGRES_PASSWORD}
      DB_HOST: db

  shlink-web:
    image: shlinkio/shlink-web-client:stable
    container_name: shlink-web
    restart: unless-stopped
    ports:
      - "8081:8080"

volumes:
  shlink-db-data:
    name: shlink-db-data

Die Datenbank liegt dauerhaft im Volume shlink-db-data. Der API-Schlüssel wird bewusst nicht in der Compose-Datei oder in der Weboberfläche des Containers vorbelegt.

3. Container starten

Starte Datenbank, Shlink und Weboberfläche auf dem Docker-Server:

docker compose up -d

Prüfe, ob alle drei Container laufen:

docker compose ps

Bei einem Fehler zeigen die Protokolle die Ursache:

docker compose logs --tail=100

4. HTTPS-Reverse-Proxy einrichten

Leite in deinem Reverse-Proxy https://<short-domain> an http://<server-ip>:8080 weiter. Ersetze <short-domain> durch denselben Wert aus der .env-Datei und <server-ip> durch die IP des Docker-Servers. Aktiviere ein gültiges TLS-Zertifikat und erzwinge HTTPS.

Domain und HTTPS müssen stimmen

Die öffentlich verwendete Domain muss exakt DEFAULT_DOMAIN entsprechen. Veröffentliche Port 8080 nicht zusätzlich direkt im Router und verwende für echte Kurzlinks kein unverschlüsseltes HTTP.

5. API-Schlüssel erzeugen

Erzeuge den ersten API-Schlüssel direkt im Shlink-Container:

docker exec -it shlink shlink api-key:generate

Kopiere den ausgegebenen Schlüssel an einen sicheren Ort. Er ist ein Zugangsschlüssel zur Verwaltung deiner Kurzlinks und gehört weder in eine veröffentlichte Anleitung noch in ein Bildschirmfoto.

6. Weboberfläche verbinden

Öffne im Heimnetz http://<server-ip>:8081. Füge dort einen neuen Server hinzu und trage diese Werte ein:

  1. Einen frei wählbaren Namen, zum Beispiel Mein Shlink
  2. Als URL https://<short-domain>
  3. Den soeben erzeugten API-Schlüssel

Erstelle anschließend einen Kurzlink für eine ungefährliche Testadresse. Öffne den angezeigten Kurzlink in einem privaten Browserfenster und prüfe, ob die Weiterleitung funktioniert.

Weboberfläche intern lassen

Port 8081 sollte nur im Heimnetz oder über ein VPN erreichbar sein. Wer Zugriff auf den Browser und den gespeicherten API-Schlüssel hat, kann deine Links verwalten.

7. Datenbank sichern

Führe den folgenden Befehl im Ordner ~/shlink aus. Er schreibt einen vollständigen SQL-Export mit Datum und Uhrzeit in den aktuellen Ordner:

docker compose exec -T db pg_dump -U shlink -d shlink > shlink-backup-$(date +%F-%H%M).sql

Sichere außerdem die Dateien compose.yaml und .env verschlüsselt an einem anderen Ort. Prüfe vor einem Update zuerst, ob der SQL-Export nicht leer ist:

ls -lh shlink-backup-*.sql

PostgreSQL nicht unkontrolliert aktualisieren

Ändere die Hauptversion im Image-Namen nicht ohne Migrationsplan. Ein normales Shlink-Update ersetzt keine Datenbanksicherung.

8. Typische Fehler beheben

  • Weboberfläche meldet keine Verbindung: Prüfe die öffentliche Shlink-URL und ob der Reverse-Proxy Port 8080 erreicht.
  • Kurzlink zeigt auf HTTP: Kontrolliere IS_HTTPS_ENABLED: "true" und starte den Container nach Änderungen mit docker compose up -d neu.
  • Domain nicht erreichbar: Prüfe den DNS-Eintrag und das TLS-Zertifikat.
  • API-Schlüssel bekannt geworden: Erzeuge einen neuen Schlüssel und widerrufe den alten über Shlink, bevor du ihn in der Weboberfläche ersetzt.
  • Keine Standortdaten in Statistiken: Dafür ist zusätzlich ein GeoLite-Lizenzschlüssel nötig; für den normalen Betrieb ist er nicht erforderlich.

9. Quellen und Videos

Fertig

Dein eigener URL-Kürzer ist jetzt über HTTPS erreichbar und wird über die interne Weboberfläche verwaltet. Erstelle zum Abschluss einen zweiten Testlink, öffne ihn und prüfe danach in Shlink, ob der Aufruf in den Statistiken erscheint.