Erste Schritte

Aktualisieren

Entpacke ein Archiv nie über eine laufende Installation. Drei Dinge gehen dabei schief, und keines meldet sich:

Falle Was passiert
Entfernte Dateien bleiben liegen Entpacken fügt hinzu und überschreibt, es löscht nicht. Klassen und Templates, die es nicht mehr gibt, bleiben stehen — und entfallene config/-Dateien werden weiterhin geladen
storage/ und bootstrap/cache/ werden angefasst Beide liegen im Archiv, weil eine NEUE Installation sie braucht. Über eine bestehende gelegt, setzen sie deren Zugriffsrechte zurück — als root entpackt auch den Eigentümer
Gecachte Konfiguration überlebt bootstrap/cache/config.php stammt von der alten Fassung und ignoriert alles Geänderte

Der kürzeste Weg

Derselbe Aufruf wie bei der Installation — das Skript erkennt den Zustand des Ziels selbst:

curl -fLO https://gitlab.com/mankeldor/fileshare/-/raw/main/fileshare-setup.sh
sh fileshare-setup.sh /pfad/zu/deiner/installation --dry-run
sh fileshare-setup.sh /pfad/zu/deiner/installation

Es holt das neueste Release, prüft die Prüfsumme und übergibt an das update.sh aus dem neu geladenen Paket — nicht an eine ältere Fassung, die auf dem Server herumliegt.

Aus einem bereits entpackten Paket

tar -xzf fileshare-v3.3.1.tar.gz
cd fileshare-v3.3.1

sh update.sh /pfad/zu/deiner/installation --dry-run
sh update.sh /pfad/zu/deiner/installation

Was es tut, in dieser Reihenfolge:

  1. Prüft, dass das Ziel wirklich eine Fileshare-Installation ist (artisan, composer.json, app/Support/Installer.php, .env). Gleich wird mit --delete abgeglichen; ein vertippter Pfad würde sonst ein fremdes Verzeichnis ausräumen.
  2. Sichert Datenbank, .env und Programmstand nach ../fileshare-backup-<zeitstempel>/. Scheitert die Sicherung, bricht es ab, bevor etwas angefasst wurde. --skip-backup überstimmt das.
  3. Schaltet den Wartungsmodus ein — noch mit der alten Fassung, deren vendor/ vollständig ist.
  4. Ersetzt die Dateien und entfernt die, die es nicht mehr gibt. Unangetastet bleiben .env, storage/, public/storage, bootstrap/cache/ und vendor/.
  5. composer install, fileshare:check, migrate --force, Caches, queue:restart, Wartungsmodus aus.

Scheitert etwas nach Schritt 4, bleibt die Installation im Wartungsmodus — ein halb ausgetauschter Stand darf nicht ausgeliefert werden. Das Skript schreibt hin, wie du zurückkommst.

Zwischen Schritt 4 und composer install steht neuer Code auf altem vendor/. Jeder Artisan-Aufruf in diesem Fenster kann mit „class not found" abbrechen — deshalb die feste Reihenfolge.

Von Hand

mysqldump --single-transaction --quick -u <user> -p <db> | gzip > db-$(date +%F).sql.gz
cp .env ~/env-$(date +%F).bak

cd /pfad/zu/deiner/installation
php artisan down --retry=60
rsync --archive --delete \
      --exclude='/.env' --exclude='/storage/' \
      --exclude='/public/storage' --exclude='/bootstrap/cache/' --exclude='/vendor/' \
      ~/fileshare-v3.3.1/ ./
composer install --no-dev --optimize-autoloader
php artisan fileshare:check
php artisan migrate --force
php artisan config:cache && php artisan route:cache && php artisan view:cache
php artisan queue:restart
php artisan up

Migrationen laufen vorwärts. Es gibt keinen Weg zurück außer der Sicherung aus der ersten Zeile.

Aus der Oberfläche heraus

Einstellungen → Systemdaten zeigt oben die Fassung dieser Installation und, sofern die Prüfung eingeschaltet ist, ob es eine neuere gibt. Dann erscheint ein Knopf Paket bereitstellen: Er lädt das Release-Archiv, hält es gegen die veröffentlichte SHA256-Prüfsumme und entpackt es nach storage/app/private/updates/.

Eingespielt wird dabei nichts. Danach zeigt die Seite den einen Befehl, der noch fehlt — mit dem Pfad dieser Installation schon eingesetzt:

sh storage/app/private/updates/3.3.1/update.sh /pfad/zu/dieser/installation

Mit --dry-run angehängt zeigt er vorher, was sich ändern würde.

Damit der Webserver den Programmcode überschreiben könnte, den er selbst ausführt, müssten app/, config/ und vendor/ für ihn beschreibbar sein. Jede Schreiblücke im System wäre damit ein Weg, eigenen Code auszuführen. Der Code bleibt deshalb unbeschreibbar; die Oberfläche nimmt den mühsamen Teil ab, der riskante bleibt ein Befehl im Terminal.

Bereitgestellte Pakete räumt fileshare:cleanup ab, sobald sie eingespielt sind — Maßstab ist die Fassung, nicht das Alter.

Danach

Die .env bleibt unangetastet. Die mitgelieferte .env.example lohnt einen Blick — dort stehen neue Schlüssel, bevor du sie vermisst:

diff <(grep -oE '^[A-Z0-9_]+' .env | sort -u) \
     <(grep -oE '^[A-Z0-9_]+' .env.example | sort -u)

Fehlt ein Schlüssel, gilt der Vorgabewert aus config/.

Quelle dieser Seite: docs/aktualisieren.md im Repository. Sie wird beim Bauen daraus erzeugt — Änderungen gehören in die Markdown-Datei, nicht in diese Seite.