feat(setup): Systemcheck und Upload-Paket fuer klassisches Webhosting

Auf Shared Hosting gibt es keine Kommandozeile - ohne Anzeige laesst
sich dort nicht feststellen, ob etwa gd fehlt, die PHP-Version zu alt
ist oder data/ nicht beschreibbar ist. Der Setup-Assistent prueft das
jetzt und listet es auf; im Dashboard meldet sich die Pruefung spaeter
nur noch, wenn etwas nicht stimmt. Fehlende Pflichtbausteine sind
Fehler, fehlende Kuer (intl, imagick, cURL) nur Hinweise mit Angabe,
was dadurch entfaellt.

build-release.sh erzeugt das Upload-Paket: Abhaengigkeiten ohne
Entwicklungspakete, ohne Tests und Docker-Dateien. Dabei faellt eine
16 MB grosse Schriftart aus endroid/qr-code weg, die ausschliesslich
fuer Beschriftungen unter dem QR-Code gebraucht wird - die erzeugt
diese Anwendung nicht. Das Paket schrumpft damit von 18 MB auf 1 MB.
Sollte spaeter doch eine Beschriftung dazukommen, erkennt das Skript
das und behaelt die Datei.

Die Variante ohne eigenen Webroot (alles liegt im Domainverzeichnis,
die .htaccess im Stammverzeichnis leitet nach public/ um) war bisher
gebaut, aber nie erprobt. Sie ist jetzt gegen eine Hoster-Simulation
getestet: Ersteinrichtung, Kurzlinks, Weiterleitung, QR-Codes,
Statistik und die Sperren fuer src/, vendor/, data/ und .env.
This commit is contained in:
2026-08-10 15:32:13 +02:00
parent fa92817a88
commit c65c02cda5
9 changed files with 462 additions and 8 deletions
+32
View File
@@ -10,10 +10,42 @@
*/
use App\Repository\LinkRepository;
use App\Service\SystemCheck;
use App\Support\ShortDomain;
$fallbackBase = rtrim($config->baseUrl(), '/');
?>
<?php if (($systemProblems ?? []) !== []):
$hatFehler = false;
foreach ($systemProblems as $problem) {
if ($problem['status'] === SystemCheck::ERROR) {
$hatFehler = true;
}
}
?>
<section class="card check-result check-result--<?= $hatFehler ? 'error' : 'warn' ?>">
<div class="check-result__head">
<span class="check-result__icon" aria-hidden="true"><?= $hatFehler ? '×' : '!' ?></span>
<div>
<h2>Hinweise zum Server</h2>
<p class="check-result__summary">
<?= $hatFehler
? 'Es fehlt etwas, das die Anwendung braucht.'
: 'Alles läuft – einzelne Zusatzfunktionen stehen aber nicht zur Verfügung.' ?>
</p>
</div>
</div>
<ul class="check-list">
<?php foreach ($systemProblems as $problem): ?>
<li class="check-list__item check-list__item--<?= $problem['status'] === SystemCheck::ERROR ? 'error' : 'warn' ?>">
<span class="check-list__icon" aria-hidden="true"><?= $problem['status'] === SystemCheck::ERROR ? '×' : '!' ?></span>
<span class="check-list__label"><?= $e($problem['label']) ?></span>
<span class="check-list__text"><?= $e($problem['text']) ?></span>
</li>
<?php endforeach; ?>
</ul>
</section>
<?php endif; ?>
<div class="page-head">
<div>
<h1>Übersicht</h1>
+40
View File
@@ -6,8 +6,22 @@
* @var array<string,string> $errors
* @var int $minLength
* @var string $tokenPath
* @var list<array{label:string,status:string,text:string,required:bool}> $systemChecks
* @var string $systemStatus
*/
use App\Service\SystemCheck;
$symbol = static fn (string $status): string => match ($status) {
SystemCheck::OK => '✓',
SystemCheck::WARNING => '!',
default => '×',
};
$cssClass = static fn (string $status): string => match ($status) {
SystemCheck::OK => 'ok',
SystemCheck::WARNING => 'warn',
default => 'error',
};
?>
<div class="card card--narrow">
<div class="card__head">
@@ -83,3 +97,29 @@
(<code>ADMIN_USER</code> und <code>ADMIN_PASSWORD_HASH</code>). Details stehen in der README.
</p>
</div>
<section class="card check-result check-result--<?= $e($cssClass($systemStatus)) ?>">
<details <?= $systemStatus === SystemCheck::OK ? '' : 'open' ?>>
<summary>
Systemvoraussetzungen –
<?= $systemStatus === SystemCheck::OK
? 'alles vorhanden'
: ($systemStatus === SystemCheck::WARNING ? 'mit Einschränkungen nutzbar' : 'es fehlt etwas') ?>
</summary>
<ul class="check-list">
<?php foreach ($systemChecks as $check): ?>
<li class="check-list__item check-list__item--<?= $e($cssClass($check['status'])) ?>">
<span class="check-list__icon" aria-hidden="true"><?= $e($symbol($check['status'])) ?></span>
<span class="check-list__label"><?= $e($check['label']) ?></span>
<span class="check-list__text"><?= $e($check['text']) ?></span>
</li>
<?php endforeach; ?>
</ul>
<p class="muted small">
Dass diese Seite überhaupt erscheint, belegt bereits, dass <code>mod_rewrite</code> arbeitet
und die <code>.htaccess</code> ausgewertet wird.
</p>
</details>
</section>