Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Docker 19.10.2026 · 10 min Lesezeit

YOURLS mit Docker Compose und MariaDB selbst hosten: eigener URL-Shortener mit API, Backup und Update

YOURLS ist ein schlanker, quelloffener URL-Shortener in PHP. Diese Anleitung zeigt die Installation mit dem offiziellen Docker-Image und MariaDB, die Einrichtung über install.php, Kurzlinks per API mit Signatur-Token, Klickstatistik, ein Backup mit mariadb-dump samt echtem Restore, das Update von 1.10.4 auf 1.10.6 und typische Fehlerbilder.

Mit KI erstellt – redaktionelle Prüfung ausstehend

WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Illustration: Laptop mit Dashboard für Kurzlinks, daneben die Überschrift YOURLS selbst hosten

Kurzlinks für Newsletter, Flyer, QR-Codes oder Support-Mails landen bei Cloud-Diensten, die jeden Klick auswerten und Links nach Ablauf eines Tarifs abschalten können. YOURLS (Your Own URL Shortener) ist ein schlanker, quelloffener URL-Shortener in PHP unter MIT-Lizenz: Kurzlinks mit eigener Domain, Klickstatistik, Plugins und eine HTTP-API. Das Projekt hat auf GitHub gut 12.000 Sterne, aktuell ist Version 1.10.6 vom 30.08.2026. Diese Anleitung installiert YOURLS mit dem offiziellen Docker-Image und MariaDB, richtet die API mit Signatur-Token ein, sichert die Datenbank, stellt sie nach einem Totalverlust wieder her und zeigt ein echtes Update von 1.10.4 auf 1.10.6.

Voraussetzungen

YOURLS ist genügsam: Apache mit PHP im App-Container und eine MariaDB. Für ein Team oder eine Firmen-Kurzdomain reicht ein kleiner Server.

  • Linux-Server (x86_64 oder ARM64) mit 1 bis 2 vCPU, 2 GB RAM und 5 GB freiem Speicher
  • Docker Engine mit Compose-Plugin (docker compose version)
  • eine eigene, möglichst kurze Domain oder Subdomain, etwa kurz.example.de, mit DNS-Eintrag auf den Server
  • ein Reverse Proxy mit TLS (Caddy, Nginx, Traefik oder Nginx Proxy Manager) für den Betrieb im Internet
  • Grundkenntnisse in Shell und Compose

Eckdaten

PunktWert
App-Imageyourls:1.10.6-apache (offizielles Docker-Hub-Image, Apache 2.4 mit PHP 8.5)
Datenbankmariadb:11.8.9
PortContainer 8080 (HTTP)
Volumesyourls_user auf /var/www/html/user (config.php, Plugins), db_data auf /var/lib/mysql
Pflicht-VariablenYOURLS_SITE, YOURLS_USER, YOURLS_PASS, YOURLS_DB_HOST, YOURLS_DB_USER, YOURLS_DB_PASS
LizenzMIT

Das Tag latest zeigt ebenfalls auf 1.10.6 mit Apache. Schreiben Sie trotzdem die Version fest, damit ein Update eine bewusste Entscheidung bleibt.

Schritt 1: Projektordner, compose.yaml und .env

sudo mkdir -p /opt/yourls && cd /opt/yourls

Die compose.yaml:

services:
  yourls:
    image: yourls:${YOURLS_TAG:-1.10.6-apache}
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "8080:8080"
    environment:
      YOURLS_SITE: ${YOURLS_SITE}
      YOURLS_USER: ${YOURLS_USER}
      YOURLS_PASS: ${YOURLS_PASS}
      YOURLS_DB_HOST: db
      YOURLS_DB_NAME: yourls
      YOURLS_DB_USER: yourls
      YOURLS_DB_PASS: ${DB_PASS}
    volumes:
      - yourls_user:/var/www/html/user

  db:
    image: mariadb:11.8.9
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: yourls
      MARIADB_USER: yourls
      MARIADB_PASSWORD: ${DB_PASS}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASS}
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 10

volumes:
  yourls_user:
  db_data:

Die .env erzeugen Sie mit Zufallswerten:

cat > .env <<EOF
YOURLS_TAG=1.10.6-apache
YOURLS_SITE=https://kurz.example.de
YOURLS_USER=admin
YOURLS_PASS=$(openssl rand -hex 12)
DB_PASS=$(openssl rand -hex 16)
DB_ROOT_PASS=$(openssl rand -hex 16)
EOF
chmod 600 .env

Drei Punkte sind wichtig. YOURLS_SITE ist die öffentliche Adresse ohne abschließenden Schrägstrich, klein geschrieben; YOURLS baut daraus jeden Kurzlink. Das Volume auf user/ enthält die beim ersten Start erzeugte config.php samt zufälligem Cookie-Schlüssel, von dem das Signatur-Token abhängt. Und das Datenbankpasswort wirkt nur beim allerersten Start der MariaDB, spätere Änderungen in der .env ändern das Passwort in der Datenbank nicht. Hinter einem Reverse Proxy binden Sie den Port besser an 127.0.0.1:8080:8080.

Verifizieren: docker compose config --quiet gibt nichts aus, die Datei ist also gültig.

Schritt 2: Stack starten und YOURLS installieren

docker compose up -d
docker compose ps
docker compose logs yourls | tail -5

Beim ersten Start kopiert der Container YOURLS nach /var/www/html und meldet Complete! YOURLS has been successfully copied to /var/www/html. Die App wartet dank Healthcheck, bis MariaDB bereit ist. Ein Aufruf von /admin/ leitet anschließend mit HTTP 307 auf /admin/install.php um. Dort genügt ein Klick auf Install YOURLS. Ohne Browser geht es auch per curl:

curl -s -X POST -d install=1 http://localhost:8080/admin/install.php \
  | sed -e 's/<[^>]*>/ /g' | grep -E "created|successfully"

Im Test meldete YOURLS die Tabellen yourls_url, yourls_options und yourls_log sowie YOURLS tables successfully created. Die Wurzel der Domain antwortet ohne eigene Startseite mit 403, das ist normal.

Verifizieren: In der Datenbank steht die Version:

docker compose exec db sh -c 'mariadb -uyourls -p"$MARIADB_PASSWORD" yourls \
  -e "select option_name, option_value from yourls_options"'

Erwartet werden version 1.10.6 und db_version 507.

Melden Sie sich unter https://kurz.example.de/admin/ mit YOURLS_USER und YOURLS_PASS an. Die Instanz ist standardmäßig privat (YOURLS_PRIVATE ist im Container-Config wahr), nur angemeldete Benutzer dürfen kürzen. Ins Feld Enter the URL tragen Sie das Ziel ein, unter Custom short URL optional ein eigenes Kürzel.

YOURLS-Adminoberfläche mit sechs Kurzlinks, Klickzahlen und Formular zum Kürzen neuer Adressen
Die Adminoberfläche von YOURLS 1.10.6 mit Kurzlinks und Klickzahlen aus dem Test.

Bindestriche in Kürzeln entfernt YOURLS ohne Plugin: Aus nl-oktober wurde im Test nloktober. Wer Bindestriche braucht, aktiviert unter Manage Plugins das mitgelieferte Plugin Hyphens in URLs. Die Kürzel sind standardmäßig klein geschrieben (YOURLS_URL_CONVERT 36); legen Sie das vor dem ersten Link fest und ändern Sie es danach nicht mehr.

Verifizieren: curl -sI http://localhost:8080/IHRKUERZEL liefert HTTP/1.1 301 und den Ziel-Link im Location-Header. Unbekannte Kürzel leiten mit 302 auf die Startadresse um.

Schritt 4: API mit Signatur-Token nutzen

Die API liegt unter /yourls-api.php und akzeptiert GET oder POST. Benutzer und Passwort funktionieren, gehören aber nicht in Skripte. Auf der Seite Tools finden Sie ein geheimes Signatur-Token, das nur für die API gilt und keine Anmeldung an der Oberfläche erlaubt.

YOURLS-Seite Tools mit maskiertem Signatur-Token für API-Aufrufe ohne Passwort
Seite Tools: Hier steht das Signatur-Token (im Bild maskiert) samt Beispiel für zeitlich begrenzte Signaturen.
SIG='IHR_SIGNATUR_TOKEN'
curl -s "http://localhost:8080/yourls-api.php" \
  -d signature=$SIG -d action=shorturl \
  -d url=https://example.org/handbuch -d keyword=handbuch -d format=json

Die Antwort enthält "status":"success" und das Feld shorturl. Weitere Aktionen sind expand, url-stats, stats und db-stats. Ein zweiter Versuch mit derselben Ziel-URL scheitert, weil YOURLS_UNIQUE_URLS standardmäßig aktiv ist. Achtung bei Skripten: Version 1.10.4 antwortete darauf mit HTTP 400, Version 1.10.6 im Test mit HTTP 409 und already exists in database.

Falsche Zugangsdaten beantwortet YOURLS mit HTTP 403: bei Benutzer und Passwort mit Invalid username or password, bei einem falschen Token mit Please log in.

Verifizieren: curl -s "http://localhost:8080/yourls-api.php?signature=$SIG&action=url-stats&shorturl=handbuch&format=json" liefert "statusCode":"200" und den Zähler clicks.

Schritt 5: Klickstatistik auswerten

Jeder Aufruf eines Kurzlinks erhöht den Zähler, im Test auch Aufrufe per curl ohne Browser-Kennung. Hängen Sie ein Pluszeichen an das Kürzel (/sedv+), öffnet YOURLS die Statistikseite mit Verlauf, Herkunftsländern und Verweisen.

YOURLS-Statistikseite eines Kurzlinks mit Diagramm der Aufrufe der letzten 24 Stunden
Statistikseite eines Kurzlinks: fünf Aufrufe in den letzten 24 Stunden.

Ein Fallstrick betrifft Docker: Als IP sah YOURLS im Test bei allen Links das Gateway des Docker-Netzes (172.18.0.1), nicht den Besucher. Hinter einem Reverse Proxy liest YOURLS die echte Adresse aus X-Forwarded-For erst, wenn Sie die Proxy-Adressen per Plugin über den Filter get_ip_trusted_proxies als vertrauenswürdig eintragen. Ohne diesen Schritt sind Länder-Statistik und Flood-Schutz wenig aussagekräftig.

Verifizieren: Die API-Aktion stats mit filter=top&limit=5 listet die meistgeklickten Links mit Summe total_clicks.

Schritt 6: Backup mit mariadb-dump

Alle Links und Klicks liegen in MariaDB. Die Programmdateien kommen aus dem Image, das Volume yourls_user enthält config.php (mit Cookie-Schlüssel) und eventuelle Plugins. Sichern Sie beides:

cd /opt/yourls && mkdir -p backup
docker compose exec -T db sh -c 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" \
  --single-transaction --routines --databases yourls' \
  | gzip > backup/yourls-db-$(date +%F).sql.gz
docker compose cp yourls:/var/www/html/user backup/user-$(date +%F)
cp .env backup/

--single-transaction erzeugt einen konsistenten Stand ohne Sperren, --databases schreibt CREATE DATABASE in den Dump, damit der Restore auch eine gelöschte Datenbank wieder anlegt. Planen Sie das per Cron oder systemd-Timer und kopieren Sie die Dateien auf ein anderes System.

Verifizieren: zcat backup/yourls-db-*.sql.gz | grep -c "INSERT INTO" muss größer als null sein, und ein bekanntes Kürzel muss im Dump auftauchen.

Schritt 7: Restore nach Totalverlust

Im Test legten wir einen Marker-Link marker an, sicherten die Datenbank und löschten sie danach komplett mit DROP DATABASE yourls. Ein Aufruf des Markers ergab daraufhin HTTP 503 mit Fatal error Incorrect DB config, or could not connect to DB und [1049] Unknown database 'yourls'. So stellen Sie wieder her:

docker compose stop yourls
zcat backup/yourls-db-DATUM.sql.gz | docker compose exec -T db \
  sh -c 'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD"'
docker compose start yourls

Stoppen Sie die App vorher, damit während des Imports keine Klicks in halbfertige Tabellen geschrieben werden. Der Import endete im Test mit Exit-Code 0, alle neun Links waren zurück, und der Marker leitete wieder mit 301 auf sein Ziel weiter. Auch die Klickzähler stimmten mit dem Stand vor der Löschung überein. Bei einem Umzug auf einen neuen Server spielen Sie zusätzlich die gesicherte config.php per docker compose cp in das Volume, sonst erzeugt der Container einen neuen Cookie-Schlüssel und damit ein neues Signatur-Token.

Verifizieren: curl -sI http://localhost:8080/marker zeigt wieder 301 und die erwartete Location.

Schritt 8: Update auf eine neue Version

Getestet haben wir den Weg von 1.10.4 auf 1.10.6. Vor dem Update sichern Sie wie in Schritt 6, dann ändern Sie das Tag und ziehen das neue Image:

sed -i 's/^YOURLS_TAG=.*/YOURLS_TAG=1.10.6-apache/' .env
docker compose pull yourls
docker compose up -d
docker compose exec yourls grep YOURLS_VERSION /var/www/html/includes/version.php

Der Container übernimmt die vorhandene config.php aus dem Volume, die Datenbank blieb bei db_version 507, die Option version stand anschließend auf 1.10.6, und alle Links leiteten weiter. Zwei Dinge sollten Sie einplanen: Bestehende Sitzungen waren nach dem Update ungültig, alle Benutzer müssen sich neu anmelden. Und das Signatur-Token auf der Seite Tools war ein anderes, länger als vorher; Aufrufe mit dem alten Token scheiterten mit Please log in. Das fällt in die Sicherheitshärtung von 1.10.5, die laut Changelog MD5 beim passwortlosen API-Zugang ablöst, ohne bestehende Installationen zu brechen; im Test war das alte Token trotzdem ungültig. Tragen Sie das neue Token deshalb direkt nach dem Update in alle Skripte und Integrationen ein. 1.10.6 selbst korrigiert nur die Versionsangabe von 1.10.5.

Verifizieren: Die Fußzeile der Adminoberfläche zeigt YOURLS v 1.10.6, ein API-Aufruf mit dem neuen Token liefert 200.

Troubleshooting

Alle folgenden Meldungen haben wir im Test absichtlich ausgelöst.

  • [2002] php_network_getaddresses: getaddrinfo for db failed: Der Datenbank-Container läuft nicht oder heißt anders als YOURLS_DB_HOST. Prüfen Sie docker compose ps und starten Sie db.
  • [1045] Access denied for user 'yourls': Das Passwort in der .env passt nicht mehr zur Datenbank, meist nach einer nachträglichen Änderung von DB_PASS. Alten Wert zurücksetzen oder das Passwort in MariaDB per ALTER USER ändern.
  • [1049] Unknown database 'yourls' und HTTP 503: Datenbank fehlt. Restore wie in Schritt 7.
  • Kurzlinks zeigen auf http://localhost:8080/: YOURLS_SITE ist falsch gesetzt. Im Test mit falschem Wert erhielt ein neuer Link die Adresse http://localhost:8080/1, und CSS wurde von localhost geladen. Wert korrigieren, docker compose up -d; bereits erzeugte Kürzel bleiben gültig, weil nur das Kürzel gespeichert wird.
  • API antwortet 403 Please log in: falsches oder nach einem Update veraltetes Signatur-Token. Neues Token von der Seite Tools übernehmen.
  • Doppelte Ziel-URL abgelehnt: HTTP 409 ab 1.10.5, vorher 400. Bei Bedarf YOURLS_UNIQUE_URLS=false setzen.
  • Alle Klicks mit derselben IP: Docker-Gateway oder Proxy, siehe Schritt 5.

Häufige Fragen

Brauche ich die Variante fpm statt apache?

Nur wenn bereits ein Webserver mit FastCGI davor steht. Die fpm-Variante darf laut Image-Dokumentation nie direkt per Port veröffentlicht werden. Für einen eigenständigen Dienst ist apache einfacher.

Kann ich YOURLS öffentlich nutzbar machen?

Technisch ja, über YOURLS_PRIVATE=false. Ein offener Shortener wird aber schnell für Spam und Phishing missbraucht. Für Firmen bleibt die private Instanz die richtige Wahl.

YOURLS ist das älteste und schlankste Projekt mit klassischer PHP-Oberfläche und großem Plugin-Angebot. Kutt bietet eine moderne Oberfläche mit Benutzerkonten, Shlink setzt auf API und mehrere Domains.

Wo stelle ich die Zeitzone ein?

Über die Variable YOURLS_HOURS_OFFSET als Abstand zu GMT, für Deutschland im Winter 1.

Fazit

YOURLS ist in wenigen Minuten einsatzbereit und braucht kaum Ressourcen. Die Installation über install.php, Kurzlinks per API, Statistik, Backup und Restore funktionierten im Test ohne Umwege. Planen Sie zwei Dinge bewusst ein: die echte Besucher-IP hinter Docker und einem Proxy, und das neue Signatur-Token nach dem Update auf 1.10.5 oder neuer. Wer beides im Griff hat und die Datenbank regelmäßig sichert, betreibt einen verlässlichen Kurzlink-Dienst unter eigener Domain.

Weiterführende Anleitungen und Quellen

YOURLSURL-ShortenerDocker ComposeMariaDBSelfhostingBackupREST-API