Rechtstexte und B2C-Vertragsabläufe absichern

This commit is contained in:
2026-08-22 14:31:56 +02:00
parent d320a4fd7a
commit a31a235422
58 changed files with 2502 additions and 316 deletions
+44 -6
View File
@@ -1,6 +1,6 @@
# Deployment und Go-Live
Stand: 2026-08-06
Stand: 2026-08-22
Dieses Dokument beschreibt, wie die Anwendung auf den Netcup-Webspace
(Plesk) ausgerollt und in Betrieb genommen wird. Es ergänzt
@@ -54,6 +54,8 @@ die `.htaccess` gesperrt.
Zusätzlich sperrt die `.htaccess` `var|database|scripts|docs|app|lib`,
die Vendor-Verzeichnisse `TCPDF|PHPMailer|DataTables`, Dotfile-Ordner
sowie Konfigurationsdateien und `.sql`/`.md`/`.jsonc`/`.sh`/`.log`-Dateien.
Im Ordner `legal/` sind ausschließlich datierte `.txt`-Fassungen von AGB,
Datenschutz, AVV und Widerrufsbelehrung als dauerhafte Downloads erlaubt.
Sie erzwingt außerdem HTTPS — ohne Redirect käme ein Nutzer per `http` an
und bekäme eine Session-Cookie ohne `secure`-Flag.
@@ -135,7 +137,7 @@ den CSV-Import. Beide sind per `.htaccess` von außen gesperrt.
### 6. Migrationen einspielen
Es gibt 24 versionierte Migrationen in `database/migrations/`, angewendet
Es gibt 30 versionierte Migrationen in `database/migrations/`, angewendet
über `scripts/migrate.php`. Das Skript ist idempotent und wendet nur
fehlende Migrationen an.
@@ -173,6 +175,8 @@ PayPal-Verbuchung und — kritisch — die Backups.
| --- | --- | --- |
| Zahlungserinnerungen | `/httpdocs/scripts/send-payment-reminders.php` | täglich, z. B. 07:00 |
| PayPal-Mailabruf | `/httpdocs/scripts/fetch-paypal-payments.php` | alle 1530 Minuten |
| Technische Löschfristen | `/httpdocs/scripts/purge-expired-operational-data.php` | stündlich |
| Beendete Verträge löschen | `/httpdocs/scripts/purge-ended-contracts.php` | täglich |
| Datenbank-Backup | Shell-Befehl, siehe `docs/betrieb-backup-monitoring.md` | täglich nachts |
Zum Backup-Task: Das Zielverzeichnis muss **außerhalb** von `httpdocs`
@@ -181,8 +185,10 @@ liegen (z. B. `/backups` auf Vhost-Ebene), sonst wären die Dumps
Ort übertragen — ein Backup, das nur auf demselben Webspace liegt,
schützt nicht gegen den Ausfall des Anbieters.
Vor der Scharfschaltung beide PHP-Tasks einmal manuell auslösen.
`send-payment-reminders.php` unterstützt dafür `--dry-run`.
Vor der Scharfschaltung die Aufgaben mit Lösch- oder Buchungswirkung zuerst
manuell mit `--dry-run` auslösen. Dies unterstützen
`send-payment-reminders.php`, `fetch-paypal-payments.php`,
`purge-expired-operational-data.php` und `purge-ended-contracts.php`.
## Mailversand und DNS
@@ -227,6 +233,12 @@ Details zur Funktionsweise stehen in `docs/billing.md`. Für den Go-Live:
echte Zahlungseingang ist dessen erster Test. Danach in Dolibarr
kontrollieren, ob die Rechnung korrekt angelegt und validiert wurde.
Der Link „Zahlungsmethode verwalten“ startet technisch ausschließlich einen
Stripe-Flow zur Aktualisierung der Zahlungsart. Im Stripe-Dashboard dürfen der
öffentliche No-Code-Portal-Login und Tarifwechsel außerhalb der Anwendung nicht
zusätzlich freigeschaltet werden; Bestellungen und Kündigungen sollen nur über
die dokumentierten Abläufe der Kaffeeliste erfolgen.
## PayPal-Postfach
Für die automatische Verbuchung weitergeleiteter PayPal-Zahlungsmails
@@ -299,6 +311,16 @@ frisches Backup ziehen.
Vor der Umstellung auf `app.kaffeeliste.de`:
Zuerst aus dem Projektverzeichnis ausführen:
```
php scripts/check-production-readiness.php
```
Der Check blockiert unter anderem bei fehlender B2C-Telefonnummer,
unsicherer Basis-URL, fehlenden Zahlungs-/Abrechnungsschlüsseln, zu offenen
Rechten der Secret-Dateien oder einer nicht angewendeten Legal-Migration.
- [ ] Kompletter Funktionsdurchlauf auf Staging erfolgreich
(Registrierung, Mailversand, Mitglieder, Striche, Einzahlungen,
CSV-Import, PDF-Export, Jahresauswertung, Stripe im Testmodus)
@@ -308,8 +330,24 @@ Vor der Umstellung auf `app.kaffeeliste.de`:
- [ ] Backup-Task läuft und ein Restore wurde einmal testweise
eingespielt (`docs/betrieb-backup-monitoring.md`)
- [ ] Stripe-Live-Keys und Produktiv-Webhook eingetragen
- [ ] Impressum, AGB und Datenschutzerklärung inhaltlich freigegeben
- [ ] Auftragsverarbeitungsvertrag (AVV) für Kunden vorbereitet
- [ ] `LEGAL_PHONE`, `LEGAL_EMAIL` und `LEGAL_TICKET_URL` zeigen auf
tatsächlich betreute Kontaktwege; Tickets werden werktags regelmäßig
bearbeitet
- [ ] Impressum, AGB, Datenschutz, AVV und Widerrufsbelehrung inhaltlich
anwaltlich für B2B und B2C freigegeben
- [ ] Kündigungs- und Widerrufsformular erzeugen beim Kunden und bei
`LEGAL_EMAIL` eine E-Mail; die Textbestätigung lässt sich speichern
- [ ] Offene Rechtserklärungen werden täglich im Back-Office geprüft;
Rückzahlungen nach Widerruf werden manuell über Stripe fristgerecht
bearbeitet (die Anwendung beendet das Abo, erstattet aber nicht automatisch)
- [ ] Stripe Checkout läuft auf Deutsch, zeigt Endpreis und Monatslaufzeit;
Test von Neubuchung, Tarifwechsel und Kündigung zum Periodenende
- [ ] Webserver-Access-Logs werden spätestens nach sieben Tagen gelöscht oder
anonymisiert; TLS/HSTS ist auf allen öffentlichen Domains aktiv
- [ ] Täglicher Task `php scripts/purge-ended-contracts.php` ist eingerichtet;
ein Vorlauf mit `--dry-run` wurde kontrolliert
- [ ] Stündlicher Task `php scripts/purge-expired-operational-data.php` ist
eingerichtet; ein Vorlauf mit `--dry-run` wurde kontrolliert
- [ ] Frische Produktivdatenbank ohne Testdaten
## Bewusst offen