Einführung
In diesem Tutorial geht es um die Installation des selbst gehosteten URL-Shorteners Shlink als Docker Container
Mehr Informationen zu Shlink erhälst Du in der Shlink Dokumentation
Voraussetzungen
- (Cloud-)Server mit Debian
- Docker bereits installiert
- Docker Compose muss unter
/usr/local/bin/docker-compose
installiert sein - Bei Bedarf kann ein Reverse Proxy verwendet werden, um u. a. mehrere Domains zu verwenden und die Aufrufe zu verschlüsseln (der Dienst selbst bietet keine Verschlüsselung)
- Falls eine öffentlich erreichbare (Sub-)Domain verwendet werden soll, müssen die DNS-Einstellungen dementsprechend angepasst sein
Schritt 1 - Verzeichnisstruktur erstellen
Zunächst erstellen wir die Verzeichnisse für die Konfigurations- und Datenbankdateien
mkdir -p /opt/shlink/db_data/
Schritt 2 - docker-compose.yml erstellen
In der docker-compose.yml
legen wir alle Einstellungen für unsere Docker Container fest
nano /opt/shlink/docker-compose.yml
Dabei müssen wir einige Variablen beachten, welche wir noch anpassen müssen:
DEFAULT_DOMAIN
: Hier müssen wir die Domain angeben, über welche die Shlink Instanz erreichbar sein wirdIS_HTTPS_ENABLED
: Falls ein Reverse Proxy mit TLS Termination vorgeschaltet ist (Technologie um https verwenden zu können), muss hiertrue
eingetragen werden, sonstfalse
GEOLITE_LICENSE_KEY
: Hier muss der Geolite Lizenzschlüssel eingetragen werden, welchen wir in dem nächsten Schritt erhalten werdenDB_PASSWORD
: Hier muss ein am besten zufällig generiertes sicheres Passwort eingetragen werdenMARIADB_ROOT_PASSWORD
: Hier muss ein am besten zufällig generiertes sicheres Passwort eingetragen werden
Für die Variablen unter Ports gilt Folgendes:
127.0.0.1
: Hier wird die „bind address“ eingetragen, also die Adresse, über die der Dienst erreichbar sein soll127.0.0.1
bedeutet dabei, dass der Service nur local erreichbar ist, dies würde man verwenden, falls ein Reverse Proxy vorgeschaltet ist0.0.0.0
bedeutet dabei, dass der Service global erreichbar ist, solange der entsprechende Port freigegeben ist
8080
: Hier wird der „bind port“ eingetragen, also der Port, über den der Dienst erreichbar sein soll80
würde verwendet, wenn Du den Service direkt über http erreichen willst8080
oder ein anderer nicht standardisierter Port, würde verwendet, um diesen in der Reverse Porxy Konfiguration zu hinterlegen
Shlink bietet noch einige weitere Variablen, an welche Du in der Shlink Dokumentation findest
docker-compose.yml
:
version: "3"
services:
shlink:
image: shlinkio/shlink:stable
restart: always
environment:
- TZ="Europe/Berlin"
- DEFAULT_DOMAIN=<DEFAULT_DOMAIN>
- IS_HTTPS_ENABLED=<true/false>
- GEOLITE_LICENSE_KEY=<GEOLITE_LICENSE_KEY>
- DB_DRIVER=maria
- DB_USER=shlink
- DB_NAME=shlink
- DB_PASSWORD=<DB_PASSWORD>
- DB_HOST=database
depends_on:
- database
ports:
- <127.0.0.1>:<8080>:8080
database:
image: mariadb:10.8
restart: always
environment:
- MARIADB_ROOT_PASSWORD=<MARIADB_ROOT_PASSWORD>
- MARIADB_DATABASE=shlink
- MARIADB_USER=shlink
- MARIADB_PASSWORD=<DB_PASSWORD>
volumes:
- /opt/shlink/db_data:/var/lib/mysql
Schritt 3 - GeoLite2 Lizenzschlüssel beantragen
- Damit wir den IP-Adressen eine reale Adresse zuordnen können, benötigen wir eine entsprechende Datenbank
- Der Anbieter MAXMIND stellt neben kommerziellen Diensten die Datenbank
GeoLite2
kostenlos zur Verfügung - Damit wir diesen nutzen können, benötigen wir einen ebenfalls kostenlosen Lizenzschlüssel
Diesen erhältst Du durch folgende Schritte:
- Erstelle einen Account für GeoLite2
- Generiere einen Lizenzschlüssel
Vergiss nicht, diesen Schlüssel auch in die Variable einzutragen!
Schritt 4 - Service starten
Zum Starten der Docker Container nutzen wir:
docker-compose up -d
Zum Stoppen der Docker Container nutzen wir:
docker-compose down
Den Status der Container können wir mit dem folgenden Befehl sehen:
docker-compose ps
- Hier sollte bei
Status
alles aufUp
stehen!
Um einen tieferen Einblick zu erhalten, kannst Du die Logs mit folgendem Befehl sehen:
docker-compose logs
Hinweis
Du solltest Deine Shlink Instanz jetzt erreichen können
Wenn Du Deine URL aufrufst und keine Weiterleitung durch die Variable DEFAULT_BASE_URL_REDIRECT
festgelegt hast, sollte eine 404 Seite erscheinen
Nun kannst Du per CLI (Konsolenbefehl), Rest API oder Webclient neue Short-Codes
also URL-Abkürzungen erstellen, verwalten und dessen Statistik einsehen
Schritt 5 - Konsolenbefehle (Optional)
Durch diesen Konsolenbefehl kannst Du direkt mit Deiner Instanz interagieren
docker-compose exec shlink shlink <Argumente>
Durch das Weglassen von Argumenten bekommst Du eine Hilfe mit allen verfügbaren Befehlen angezeigt
Schritt 6 - Rest API (Optional)
Shlink stellt eine Rest-API zur Verfügung, durch welche Du Deine Instanz neben den Konsolenbefehlen steuern kannst. Dafür wird ein API Key benötigt, welchen Du durch einen Konsolenbefehl erzeugen kannst:
docker-compose exec shlink shlink api-key:generate
Eine Auflistung der API-Endpoints findest Du hier
Schritt 7 - Shlink Webclient (Optional)
- Bestimmt hast Du Dich gefragt, ob Du jetzt immer umständlich alles über die Konsole oder die Rest API steuern musst
- Auch hier bietet Shlink eine schlaue Hilfe
- Über den Shlink Webclient kannst Du
Short-Codes
also URL-Abkürzungen erstellen, verwalten und dessen Statistik einsehen
- Um diesen zu nutzen, kannst Du einfach die offizielle WebApp verwenden
- Auch wenn Deine Daten sicher sind, da sie ausschließlich in dem Browser verarbeitet werden, kannst Du auch diesen selber hosten
- Dazu kannst Du einfach folgenden Teil Deiner
docker-compose.yml
hinzufügen - Beachte dabei, dass Du erneut die
Bind-Adresse
und denBind-Port
so einstellst, sodass Du den Webclient entweder direkt oder per Reverse Proxy erreichen kannst
- Dazu kannst Du einfach folgenden Teil Deiner
shlink-web-client:
image: shlinkio/shlink-web-client
restart: always
volumes:
- /opt/shlink/servers.json:/usr/share/nginx/html/servers.json
ports:
- <127.0.0.1>:<8081>:80
Hinweis
Falls du die offizielle WebApp verwenden willst und/oder deinen eigenen Webclient durch https sichern willst, musst du deiner Shlink Instanz ebenfalls einen Reverse Proxy mit TLS Termination vorschalten, da du aus Sicherheitsgründen keine http Seiten über https Seiten aufrufen kannst.
Mehr Informationen dazu gibt es hier
Zusammenfassung
Du hast nun eine voll funktionsfähige Shlink Instanz, mit der Du Abkürzungen für Deine URLs erstellen kannst Shlink bietet daneben noch viele weitere praktische Features Gucke Dir dazu einfach die Shlink Dokumentation an oder probiere Dich an dem CLI (Konsolenbefehl), Rest API oder Webclient
Für weitere Hilfe kannst Du
- den Shlink Troubleshooting Guide verwenden
- auf der Diskussionsseite des Projekts um Hilfe bitten