From cb6e4e7dcbb2d85227d993503230506557346774 Mon Sep 17 00:00:00 2001
From: Clemens Creutzburg
Date: Sat, 21 Mar 2026 20:18:41 +0100
Subject: [PATCH] Add guided installer for SaaS application setup
- Updated README.md to include instructions for guided installation on webspace without shell access.
- Enhanced installationshandbuch.md with detailed steps for using the guided installer.
- Modified saas-app/README.md to summarize the installation process using the new installer.
- Generated SQL migration bundle now includes timestamp for better tracking.
- Introduced public/install/index.php as the entry point for the guided installer.
- Updated public/index.php to reflect changes in installation steps and added links to the installer.
- Refactored migration bundle generation and SQL execution scripts for improved error handling and modularity.
- Implemented session-based CSRF protection in the installer.
- Added form handling for environment variable configuration and migration execution in the installer.
- Created a user-friendly HTML interface for the installer with status messages and error handling.
---
README.md | 3 +
docs/installationshandbuch.md | 30 +-
saas-app/README.md | 17 +-
.../migrations/generated/all-migrations.sql | 2 +-
saas-app/public/README.md | 1 +
saas-app/public/index.php | 31 +-
saas-app/public/install.php | 453 ++++++++++++++++++
saas-app/public/install/index.php | 5 +
scripts/build-migration-bundle.php | 56 +--
scripts/check-prerequisites.php | 2 +
scripts/install-saas.php | 29 +-
scripts/run-sql-migrations.php | 53 +-
scripts/support.php | 195 ++++++++
13 files changed, 741 insertions(+), 136 deletions(-)
create mode 100644 saas-app/public/install.php
create mode 100644 saas-app/public/install/index.php
diff --git a/README.md b/README.md
index b116f09..a8518ff 100644
--- a/README.md
+++ b/README.md
@@ -29,6 +29,9 @@ Archivbestand erhalten.
Setup, Hosting und Betriebsablauf.
3. Arbeite anschliessend in [saas-app/README.md](saas-app/README.md) weiter.
+Auf Webspace ohne Shell ist der bevorzugte Einstieg die gefuehrte Installation
+unter `saas-app/public/install/`.
+
## Hilfsskripte
- `scripts/check-prerequisites.php` prueft lokale Voraussetzungen.
diff --git a/docs/installationshandbuch.md b/docs/installationshandbuch.md
index f22d1a0..833cfda 100644
--- a/docs/installationshandbuch.md
+++ b/docs/installationshandbuch.md
@@ -4,6 +4,23 @@ Diese Anleitung beschreibt den vorgesehenen Weg fuer die SaaS-Version in
`saas-app/`. Sie ist auf Webspace-Betrieb ohne Docker und ohne dauerhafte
Worker ausgelegt.
+## Empfohlener Weg Auf Webspace
+
+Wenn auf dem Hosting keine Shell- oder CLI-Ausfuehrung moeglich ist, nutze den
+gefuehrten Installer im Public-Pfad:
+
+- `https://deine-domain.tld/install/`
+
+Der Installer kann:
+
+- die `.env` speichern
+- das SQL-Bundle erzeugen
+- Migrationen direkt per PHP ausfuehren, wenn `pdo_sqlsrv` verfuegbar ist
+- sich nach erfolgreicher Einrichtung sperren
+
+Die CLI-Skripte unter `scripts/*.php` bleiben als Alternative fuer lokale
+Vorbereitung oder Server mit Shell-Zugriff erhalten.
+
## Voraussetzungen
- PHP 8.2 oder neuer
@@ -14,7 +31,7 @@ Worker ausgelegt.
- optional: SMTP-Zugang fuer Mails
- optional: OIDC-Provider fuer SSO
-## Installation lokal
+## Installation Lokal
1. Repository klonen.
2. Mit `php scripts/check-prerequisites.php` die Voraussetzungen pruefen.
@@ -26,7 +43,7 @@ Worker ausgelegt.
8. Einen ersten Benutzer und eine Mitgliedszuordnung anlegen.
9. Spaeter Composer und das eigentliche Laravel-Bootstrap nachziehen.
-## Migrationen ausfuehren
+## Migrationen Ausfuehren
Die aktuellen Dateien unter `saas-app/database/migrations/` sind SQL-Skizzen in
PHP-Dateien, keine Laravel-Migrationsklassen. Deshalb gibt es aktuell bewusst
@@ -70,9 +87,10 @@ eigene Umgebung angepasst werden:
1. Den Inhalt von `saas-app/` auf den Zielserver hochladen.
2. Das Document-Root auf `public/` zeigen lassen.
-3. Schreibrechte fuer spaetere Storage-, Cache- und Queue-Bereiche sicherstellen.
-4. `.env` serverseitig hinterlegen.
-5. Die Anwendung einmal per Browser aufrufen und die Grundseiten pruefen.
+3. Schreibrechte fuer `saas-app/`, `.env`, `.installer.lock` und `database/migrations/generated/` sicherstellen.
+4. Den Installer unter `/install/` aufrufen und die Einrichtung durchfuehren.
+5. Nach erfolgreicher Einrichtung den Installer sperren.
+6. Die Anwendung einmal per Browser aufrufen und die Grundseiten pruefen.
## Cron- und Batch-Betrieb
@@ -89,7 +107,7 @@ Typische Aufgaben:
Empfehlung: pro Aufgabe einen klar benannten Cron-Eintrag anlegen und die
Ausgabe in Logdateien schreiben.
-## Migration aus dem Legacy-System
+## Migration Aus Dem Legacy-System
Wenn Daten aus der alten Root-Anwendung uebernommen werden sollen, folgt die
Reihenfolge:
diff --git a/saas-app/README.md b/saas-app/README.md
index 3886871..3c7cfd7 100644
--- a/saas-app/README.md
+++ b/saas-app/README.md
@@ -19,14 +19,19 @@ Die komplette Installationsanleitung steht im Repo unter
Kurzfassung:
+1. Webserver auf `public/` ausrichten.
+2. Im Browser `https://deine-domain.tld/install/` aufrufen.
+3. `.env`, DB-Zugang und Tenancy-Werte ueber den Installer speichern.
+4. SQL-Bundle erzeugen und wenn moeglich Migrationen direkt ausfuehren.
+5. Installer sperren.
+6. Einen ersten Mandanten und erste Benutzer anlegen.
+7. Cron-Jobs fuer Queue, Import, Export und Benachrichtigungen einrichten.
+
+Alternative mit PHP-CLI:
+
1. `php ../scripts/check-prerequisites.php`
2. `php ../scripts/install-saas.php`
-3. `.env` aus `.env.example` ableiten und anpassen.
-4. Datenbank und Tenancy-Werte konfigurieren.
-5. SQL-Migrationen ueber das erzeugte Bundle ausfuehren.
-6. Einen ersten Mandanten und erste Benutzer anlegen.
-7. Den Webserver auf `public/` ausrichten.
-8. Cron-Jobs fuer Queue, Import, Export und Benachrichtigungen einrichten.
+3. `php ../scripts/run-sql-migrations.php --server=... --database=...`
## Migrationen
diff --git a/saas-app/database/migrations/generated/all-migrations.sql b/saas-app/database/migrations/generated/all-migrations.sql
index a4c29d1..0212ece 100644
--- a/saas-app/database/migrations/generated/all-migrations.sql
+++ b/saas-app/database/migrations/generated/all-migrations.sql
@@ -1,5 +1,5 @@
-- Generated migration bundle for Kaffeeliste SaaS
--- Generated at 2026-03-21T18:18:09+00:00
+-- Generated at 2026-03-21T19:14:14+00:00
SET XACT_ABORT ON;
BEGIN TRANSACTION;
diff --git a/saas-app/public/README.md b/saas-app/public/README.md
index 63f6fd1..ed3a932 100644
--- a/saas-app/public/README.md
+++ b/saas-app/public/README.md
@@ -3,6 +3,7 @@ Dieses Verzeichnis ist fuer den Webserver-Document-Root vorgesehen.
Aktuell enthaelt es bereits:
- `index.php` als Preview-Einstieg fuer die neue SaaS-Struktur
+- `install/index.php` als gefuehrten Einmal-Installer fuer Webspace
- `.htaccess` fuer einen einfachen Front-Controller-Pfad auf Apache
Sobald die Zielanwendung als vollwertiges Laravel-Projekt gebootstrapped ist,
diff --git a/saas-app/public/index.php b/saas-app/public/index.php
index ee4a36a..7565637 100644
--- a/saas-app/public/index.php
+++ b/saas-app/public/index.php
@@ -38,11 +38,11 @@ $modules = [
];
$installSteps = [
- '1. `php scripts/check-prerequisites.php` ausfuehren.',
- '2. `php scripts/prepare-saas-env.php` fuer die lokale `.env` verwenden.',
- '3. `saas-app\.env` mit echten DB-, Mail-, Tenancy- und OIDC-Werten fuellen.',
- '4. `php scripts/install-saas.php` fuer die SQL-Bundle-Erzeugung verwenden.',
- '5. Optional `php scripts/run-sql-migrations.php --server= --database= --username= --password=` fuer die direkte SQL-Ausfuehrung nutzen.',
+ '1. Den Webserver auf `saas-app/public/` zeigen lassen.',
+ '2. Den Installer unter `/install/` oeffnen.',
+ '3. `.env`, DB-, Mail-, Tenancy- und OIDC-Werte im Formular speichern.',
+ '4. SQL-Bundle erzeugen und optional Migrationen direkt im Installer ausfuehren.',
+ '5. Den Installer danach sperren.',
'6. Ersten Tenant, ersten Benutzer und erste Member-Zuordnung anlegen.',
];
@@ -289,6 +289,7 @@ function renderList(array $items): void
StartInstallationMigrationen
+ Installer
@@ -297,13 +298,13 @@ function renderList(array $items): void
Installation
Die Installationsschritte laufen jetzt ueber interne Preview-Seiten.
- Der Link zeigt nicht mehr auf docs/installationshandbuch.md,
- sondern auf eine im Public-Bereich erreichbare Anleitung. Das ist noetig,
- weil Dateien ausserhalb von saas-app/public/ im Browser nicht
- direkt verlinkt werden sollten.
+ Der bevorzugte Webspace-Weg laeuft jetzt ueber den gefuehrten Installer
+ unter /install/. Das ist noetig, weil Dateien ausserhalb von
+ saas-app/public/ im Browser nicht direkt verlinkt werden
+ sollten und Shell-Zugriff auf vielen Hostings fehlt.
@@ -314,11 +315,11 @@ function renderList(array $items): void
Die Migrationen werden ueber ein SQL-Bundle erzeugt und ausgefuehrt.
Aktuell gibt es hier keine lauffaehige Laravel-artisan migrate-Strecke.
- Die Migrationsdateien liefern SQL und werden deshalb ueber Skripte zu
- einer ausfuehrbaren Datei zusammengefuehrt.
+ Die Migrationsdateien liefern SQL und werden deshalb im Installer oder
+ ueber PHP-Skripte zu einer ausfuehrbaren Datei zusammengefuehrt.
+ Diese Seite fuehrt die Erstinstallation ueber den Webspace: `.env` schreiben,
+ SQL-Bundle erzeugen und optional die Migrationen direkt ueber PHP ausfuehren.
+ Nach erfolgreicher Einrichtung sollte der Installer gesperrt bleiben.
+