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:
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:
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:
Prüfe, ob alle drei Container laufen:
Bei einem Fehler zeigen die Protokolle die Ursache:
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:
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:
- Einen frei wählbaren Namen, zum Beispiel
Mein Shlink - Als URL
https://<short-domain> - 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:
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:
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 mitdocker compose up -dneu. - 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¶
- Offizielle Shlink-Dokumentation
- Offizielle Docker-Installation
- Offizieller Shlink Web Client
- Video: Shlink in Docker auf Ubuntu Server
- Video: Self-Hosted Link Shortener
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.