Betrieb
Backup und Wiederherstellung
Ein vollständiges Backup braucht drei Bestandteile. Fehlt einer, ist die Wiederherstellung unvollständig:
- Datenbank — Konten, Links, Protokolle, Einstellungen, Seiten. Das ist der wesentliche Teil: Hier stecken die Slugs.
storage/app/— Logo, eigenes Theme, aktualisierte Public Suffix List..env— enthältAPP_KEY.
# Datenbank
mysqldump --single-transaction --quick -u <user> -p <db> | gzip > db-$(date +%F).sql.gz
# Ablagen
tar czf storage-$(date +%F).tar.gz -C /var/www/shortlink storage/app
Bei einem Kürzungsdienst ist das Datenbank-Backup die eigentliche Sicherung. Geht die Datenbank verloren, sind nicht „Daten" weg, sondern jede ausgegebene Adresse ist ungültig — jeder gedruckte Flyer, jeder QR-Code, jeder Link in einer alten Mail. Ein Kürzungsdienst hat keine Kopie beim Nutzer, aus der man nachladen könnte: Der Nutzer hat nur die kurze Adresse, und was dahinter stand, wusste ausschließlich dieser Server.
Und schlimmer als „weg" ist „teilweise wiederhergestellt": Ein Backup, das einen Teil der Slugs nicht enthält, gibt sie zur Neuvergabe frei. Der nächste angelegte Link kann einen alten erben.
Ohne APP_KEY sind das gespeicherte SMTP-Passwort und verschlüsselte Sitzungen unlesbar.
Beides lässt sich neu setzen — die Slugs nicht.
Der Knopf in der Oberfläche: Einstellungen → Wartung
Unter Einstellungen → Wartung liegt oben Datenbank herunterladen. Er liefert je Treiber:
| Treiber | Datei | Inhalt |
|---|---|---|
| SQLite | shortlink-datenbank-2026-09-01-1530.sqlite |
die Datenbankdatei selbst, über VACUUM INTO als abgeschlossener Stand |
| MySQL / MariaDB | shortlink-datenbank-2026-09-01-1530.sql |
SQL-Text: DROP TABLE + CREATE TABLE + INSERT, gelesen in einem Snapshot (REPEATABLE READ) |
Wofür er gedacht ist — und wofür nicht. Er ist der Handgriff vor einem Eingriff: vor dem Aufräumen, vor einem Update, vor dem Umschalten des Link-Modus. Er ist kein Ersatz für die regelmäßige Sicherung oben — die läuft ohne Klick und liegt nicht im Download-Ordner eines Arbeitsplatzrechners.
Ohne mysqldump und ohne Shell-Aufruf. Der Dump wird in PHP erzeugt. Der Grund ist
nicht Vorliebe: Auf gehärteten und geteilten Hosts sind exec/shell_exec gesperrt und
mysqldump liegt dort oft gar nicht. Ein Knopf, der bei der Hälfte der Installationen eine
leere Datei liefert, ist schlimmer als keiner — man merkt es erst, wenn man die Sicherung
braucht.
- Nur die Tabellen dieser Installation. Ist
DB_PREFIXgesetzt, werden ausschließlich Tabellen mit diesem Präfix gesichert. In einer geteilten Datenbank bleiben fremde Anwendungen unberührt. Ohne Präfix ist diese Grenze nicht zu erkennen — dann werden alle Tabellen des Schemas gesichert. - Gelesen wird in Blöcken (500 Zeilen) und der Text als Strom ausgeliefert. Der
Speicherbedarf bleibt damit unabhängig von der Größe von
click_logs. - PostgreSQL und SQL Server stehen in
config/database.php, werden hier aber nicht bedient. Der Knopf erscheint dann nicht; stattdessen steht ein Hinweis auf die Werkzeuge des Datenbanksystems.
Die Datei ist selbst ein personenbezogener Datenbestand. Sie enthält Passwort-Hashes, Sitzungen, Klick-Protokolle mit gekürzten IP-Adressen und Versandprotokolle mit Empfängeradressen. Verschlüsselt aufbewahren, nicht in einen geteilten Ordner legen, nach Gebrauch löschen.
Sie enthält die
.envNICHT — und damit nicht denAPP_KEY. Die Spaltentwo_factor_secretundtwo_factor_recovery_codessind mit ihm verschlüsselt. Wer die Datenbank ohne die passende.envzurückspielt, hat eine Installation, in die niemand mit zweitem Faktor mehr hineinkommt: Die Daten sind da, der Schlüssel fehlt. Sichere die.envimmer zusammen mit der Datenbank.
Scheitert die Sicherung, steht der Grund im Protokoll (storage/logs). Die häufigsten
Ursachen sind fehlender Platz und fehlendes Schreibrecht im Temp-Verzeichnis des Servers.
Wiederherstellung
gunzip < db-2026-08-14.sql.gz | mysql -u <user> -p <db>
tar xzf storage-2026-08-14.tar.gz -C /var/www/shortlink
php artisan storage:link
php artisan config:cache
Danach prüfen: Anmeldung, ein Aufruf eines bestehenden Shortlinks (leitet er weiter?), ein passwortgeschützter Link, Test-Mail, Einstellungen → Systemdaten (Schreibrechte), und Einstellungen → Links (steht die Domain-Liste noch?).
Teste die Wiederherstellung, bevor du sie brauchst. Ein Backup, das nie zurückgespielt wurde, ist eine Annahme, keine Sicherung.
Quelle dieser Seite:
docs/betrieb/backup.md
im Repository. Sie wird beim Bauen daraus erzeugt — Änderungen gehören in die
Markdown-Datei, nicht in diese Seite.