223 lines
11 KiB
Markdown
223 lines
11 KiB
Markdown
# Go-Live-Checkliste fuer Netcup Webspace
|
|
|
|
Diese Checkliste ist fuer den ersten echten Betrieb auf Netcup Webspace gedacht.
|
|
Sie baut auf [DEPLOY.md](/config/workspace/kaffeeliste-neustart/DEPLOY.md),
|
|
[RUNBOOK.md](/config/workspace/kaffeeliste-neustart/RUNBOOK.md) und
|
|
[docs/production-blueprint.md](/config/workspace/kaffeeliste-neustart/docs/production-blueprint.md)
|
|
auf, ist aber absichtlich strenger und operativer.
|
|
|
|
## 1. Go-Live-Scope festziehen
|
|
|
|
- [ ] Entscheiden, ob der erste Livegang ein geschlossener Pilot oder ein oeffentliches SaaS-Launch ist.
|
|
- [ ] Fuer einen oeffentlichen Launch Registrierung absichern oder vorerst deaktivieren.
|
|
Das Repo nennt Mail-Verifikation, Passwort-Reset und Rate-Limits selbst als offene Punkte vor echtem Go-Live.
|
|
- [ ] Falls diese Punkte noch fehlen: nur mit eingeladenen Testkunden oder manuell freigeschalteten Mandanten live gehen.
|
|
- [ ] Einen Release-Owner und einen Restore-Owner benennen.
|
|
- [ ] Ein Wartungsfenster fuer den Erststart und fuer kuenftige Releases definieren.
|
|
|
|
## 2. Environment-Modell festlegen
|
|
|
|
Empfehlung fuer Netcup Webspace:
|
|
|
|
- [ ] `local`: Entwicklung lokal.
|
|
- [ ] `staging`: echte Netcup-Subdomain wie `staging.example.tld`, eigene DB, eigene `.env`.
|
|
- [ ] `production`: produktive Domain, eigene DB, eigene `.env`.
|
|
|
|
Pragmatisches Verzeichnislayout ohne Root-Zwang:
|
|
|
|
- [ ] `staging` unter `/apps/kaffeekasse-stage/current`
|
|
- [ ] `production` unter `/apps/kaffeekasse/current`
|
|
- [ ] Offsite- oder Backup-Artefakte nicht im Webroot ablegen.
|
|
|
|
Wichtig fuer dieses Repo:
|
|
|
|
- [ ] `public/` bleibt der einzige Webroot.
|
|
- [ ] `.env` wird aus dem Projektwurzelverzeichnis geladen.
|
|
- [ ] Der Browser-Installer schreibt `.env` in das Projektwurzelverzeichnis und `storage/installed.lock` in `storage/`.
|
|
- [ ] `bin/cron.php` schreibt `storage/cron.lock`.
|
|
- [ ] Deshalb muessen Projektwurzel und `storage/` mindestens fuer den Deployment-User, besser auch fuer den Webspace-User, sauber beschreibbar sein.
|
|
|
|
## 3. Netcup vorbereiten
|
|
|
|
- [ ] Domain oder Subdomain im CCP/WCP anlegen.
|
|
- [ ] DNS frueh setzen und Aufloesung pruefen.
|
|
- [ ] In Plesk/WCP pro Environment eine eigene Site mit eigenem Document Root anlegen.
|
|
- [ ] Document Root fuer jedes Environment auf `.../current/public` setzen.
|
|
- [ ] Pro Environment eine eigene MySQL-Datenbank und einen eigenen DB-User anlegen.
|
|
- [ ] PHP-Version im WCP fest auf 8.3 oder 8.4 pinnen und nicht auf "System Default" lassen.
|
|
- [ ] Dieselbe PHP-Hauptversion fuer Web und CLI verwenden.
|
|
|
|
## 4. Secrets und Konfiguration vorbereiten
|
|
|
|
Pflichtwerte laut App:
|
|
|
|
- [ ] `APP_URL`
|
|
- [ ] `APP_ENV`
|
|
- [ ] `APP_DEBUG=0`
|
|
- [ ] `APP_TIMEZONE`
|
|
- [ ] `APP_KEY`
|
|
- [ ] `DB_HOST`
|
|
- [ ] `DB_PORT`
|
|
- [ ] `DB_NAME`
|
|
- [ ] `DB_USER`
|
|
- [ ] `DB_PASS`
|
|
- [ ] `RFID_SHARED_SECRET`
|
|
|
|
Empfehlung:
|
|
|
|
- [ ] `staging` und `production` nie dieselben Secrets oder dieselbe DB teilen.
|
|
- [ ] Admin-Zugang fuer die Plattform separat dokumentieren und im Passwortsafe ablegen.
|
|
- [ ] Wenn der Browser-Installer verwendet wird: danach `.env` sichern und offsite ablegen.
|
|
- [ ] Wenn `.env` manuell gepflegt wird: `.env` vor dem ersten Deploy lokal erzeugen und erst dann hochladen.
|
|
|
|
## 5. Erstes Staging-Deployment
|
|
|
|
- [ ] Lokal oder in CI `scripts/build-release.sh` ausfuehren.
|
|
- [ ] Release-Artefakt sicher ablegen. Es ist Teil des Rollback-Pfads.
|
|
- [ ] Artefakt per FTPES oder SFTP nach Netcup hochladen.
|
|
- [ ] Paket in den festen Environment-Pfad entpacken.
|
|
- [ ] Pruefen, dass `.env`, `storage/uploads`, `storage/logs` und `storage/cache` nicht versehentlich ueberschrieben oder geloescht wurden.
|
|
Das Build-Skript schliesst diese Pfade aus dem Release aus.
|
|
- [ ] Falls der Browser-Installer genutzt wird: `/install` nur auf `staging` einmal durchlaufen.
|
|
- [ ] Falls manuell installiert wird: `.env` hochladen und danach
|
|
`/usr/local/php83/bin/php /apps/kaffeekasse-stage/current/bin/migrate.php`
|
|
oder die zu eurer PHP-Version passende Binary ausfuehren.
|
|
- [ ] Pruefen, dass `storage/installed.lock` angelegt wurde.
|
|
|
|
## 6. Staging-Smoketest vor Production
|
|
|
|
- [ ] Startseite laden.
|
|
- [ ] `/admin/login` erfolgreich testen.
|
|
- [ ] Einen Test-Mandanten anlegen.
|
|
- [ ] Tenant-Login pruefen.
|
|
- [ ] Eine Testbuchung und eine Test-Einzahlung anlegen.
|
|
- [ ] `/usr/local/php83/bin/php /apps/kaffeekasse-stage/current/bin/healthcheck.php` ausfuehren und JSON pruefen.
|
|
- [ ] `/usr/local/php83/bin/php /apps/kaffeekasse-stage/current/bin/cron.php` manuell ausfuehren.
|
|
- [ ] Pruefen, dass `cron.lock` nach dem Lauf wieder verschwindet.
|
|
|
|
## 7. SSL und HTTPS
|
|
|
|
- [ ] Erst SSL ausrollen, wenn DNS sauber auf Netcup zeigt.
|
|
- [ ] Im WCP fuer jede produktive Domain ein Let's-Encrypt-Zertifikat ausstellen.
|
|
- [ ] `www` nur dann mit absichern, wenn `www` auch wirklich genutzt werden soll.
|
|
- [ ] Fuer den ersten Go-Live kein Wildcard-Zertifikat verwenden, wenn es nicht zwingend noetig ist.
|
|
Bei Netcup werden Wildcard-Zertifikate nicht automatisch erneuert.
|
|
- [ ] HTTPS fuer die produktive Domain erzwingen.
|
|
- [ ] Nach Aktivierung pruefen, dass alle Logins und Formulare nur noch ueber HTTPS laufen.
|
|
- [ ] Session-Cookies unter HTTPS pruefen, weil `secure` in der App vom HTTPS-Kontext abhaengt.
|
|
|
|
## 8. Backup-Strategie produktionsreif machen
|
|
|
|
Minimum:
|
|
|
|
- [ ] Taegliches DB-Backup einrichten.
|
|
- [ ] Vor jedem Release ein frisches manuelles DB-Backup ziehen.
|
|
- [ ] `.env` offsite sichern.
|
|
- [ ] `storage/uploads` offsite sichern.
|
|
- [ ] Letztes stabiles Release-Artefakt offsite sichern.
|
|
|
|
Netcup-spezifisch:
|
|
|
|
- [ ] Falls euer Tarif den Backup Manager anbietet: wiederkehrendes Backup in WCP aktivieren.
|
|
- [ ] Backups regelmaessig herunterladen oder an einen zweiten Ort kopieren.
|
|
- [ ] Backup Manager nicht als einzigen Disaster-Recovery-Pfad betrachten.
|
|
Netcup dokumentiert, dass diese Backups nur auf demselben Hosting wiederhergestellt werden sollen.
|
|
|
|
## 9. Cron sauber einrichten
|
|
|
|
- [ ] In WCP eine geplante Aufgabe fuer `bin/cron.php` alle 5 Minuten anlegen.
|
|
- [ ] Dieselbe PHP-Version verwenden wie fuer die Website.
|
|
- [ ] Den Task vor dem Speichern mit "Run Now" testen.
|
|
- [ ] Wenn WCP auf eurem Tarif mit chroot oder relativen Pfaden zickt: den final funktionierenden Befehl direkt dokumentieren.
|
|
- [ ] Eine zweite geplante Aufgabe fuer `bin/healthcheck.php` einrichten, mindestens stuendlich oder taeglich.
|
|
- [ ] Task-Ausgaben in eine Mail oder Logdatei laufen lassen, statt sie still zu verwerfen.
|
|
|
|
Wichtige Einschraenkung dieses Repos:
|
|
|
|
- [ ] `bin/healthcheck.php` liefert JSON, setzt aber bei DB-Problemen derzeit keinen expliziten Exit-Code ungleich 0.
|
|
- [ ] Fuer Alarmierung deshalb nicht nur auf "Errors only" bei Scheduled Tasks vertrauen.
|
|
- [ ] Zusaetzlich einen externen HTTPS-Uptime-Check auf Startseite oder Login-Seite einrichten.
|
|
|
|
## 10. Monitoring-Minimum fuer den Start
|
|
|
|
- [ ] Externes Uptime-Monitoring auf die produktive HTTPS-URL aktivieren.
|
|
- [ ] Plesk-/PHP-Error-Logs in die Regelbetriebsroutine aufnehmen.
|
|
- [ ] Nach dem Go-Live taeglich Audit-Ereignisse fuer fehlgeschlagene Logins und Access-Denied pruefen.
|
|
- [ ] Wachstum der Tabellen `consumption_events`, `ledger_entries` und `audit_events` beobachten.
|
|
- [ ] Offene RFID-Ereignisse aus dem Cron-Output beobachten, falls RFID pilotiert wird.
|
|
- [ ] Einen klaren Empfaenger fuer Alarmmails hinterlegen.
|
|
|
|
## 11. Release-Prozess fuer echte Produktion festlegen
|
|
|
|
Empfohlener erster Produktionsprozess auf Netcup Webspace:
|
|
|
|
- [ ] Aenderungen auf `staging` komplett durchtesten.
|
|
- [ ] Release-Artefakt mit Zeitstempel bauen.
|
|
- [ ] Direkt vor dem Produktionsdeploy DB-Backup erstellen.
|
|
- [ ] `.env` und persistente `storage/`-Inhalte zusatzlich sichern.
|
|
- [ ] Release nach `production` hochladen.
|
|
- [ ] `bin/migrate.php` ausfuehren.
|
|
- [ ] `bin/healthcheck.php` ausfuehren.
|
|
- [ ] Admin-Login, Tenant-Login und Testbuchung sofort pruefen.
|
|
- [ ] Den naechsten automatischen Cron-Lauf beobachten.
|
|
- [ ] Erst danach das Release als "stabil" markieren.
|
|
|
|
Wichtige Einschraenkung dieses Repos:
|
|
|
|
- [ ] `bin/migrate.php` spielt nur `database/schema.sql` erneut ein.
|
|
- [ ] Das aktuelle `schema.sql` arbeitet mit `CREATE TABLE IF NOT EXISTS` und ist damit fuer Erstinstallation geeignet, aber kein vollwertiges inkrementelles Migrationssystem.
|
|
- [ ] Vor dem ersten Release mit DB-Schema-Aenderungen eine klare Migrationskonvention festlegen, zum Beispiel versionierte SQL-Dateien plus Runbook-Schritt.
|
|
|
|
## 12. Fallback und Restore vorher ueben
|
|
|
|
Rollback fuer einen fehlgeschlagenen Release:
|
|
|
|
- [ ] Letztes stabiles Release-Artefakt erneut deployen.
|
|
- [ ] Wenn noetig DB-Backup vom Start des Releases einspielen.
|
|
- [ ] `.env` und `storage/uploads` wiederherstellen.
|
|
- [ ] `bin/healthcheck.php` ausfuehren.
|
|
- [ ] Admin-Login, Tenant-Login und Testbuchung pruefen.
|
|
|
|
Restore fuer echten Ausfall:
|
|
|
|
- [ ] Zielreihenfolge dokumentieren: Code, `.env`, Uploads, DB, Healthcheck, Smoke-Test.
|
|
- [ ] Restore nicht nur theoretisch planen, sondern einmal auf `staging` ueben.
|
|
- [ ] Ziel-RTO und Ziel-RPO festlegen, auch wenn sie anfangs noch pragmatisch sind.
|
|
- [ ] Ansprechpartner und Zugangsdaten fuer Restore ausserhalb des Repos dokumentieren.
|
|
|
|
## 13. Finale Go-Live-Freigabe
|
|
|
|
Nur live schalten, wenn alles abgehakt ist:
|
|
|
|
- [ ] Production-Domain zeigt auf Netcup und loest korrekt auf.
|
|
- [ ] SSL ist gueltig und HTTPS wird erzwungen.
|
|
- [ ] `public/` ist einziger Webroot.
|
|
- [ ] `.env`, Backups, Dumps und `.git` sind nicht oeffentlich erreichbar.
|
|
- [ ] DB-Backup von heute existiert.
|
|
- [ ] Cron laeuft erfolgreich.
|
|
- [ ] Externes Monitoring prueft die Seite.
|
|
- [ ] Admin-Login und ein Test-Tenant funktionieren.
|
|
- [ ] Restore wurde mindestens einmal auf `staging` geprobt.
|
|
- [ ] Es gibt eine bewusste Entscheidung, ob offene Registrierung bereits verantwortbar ist.
|
|
|
|
## Quellen
|
|
|
|
- Repo-intern:
|
|
[DEPLOY.md](/config/workspace/kaffeeliste-neustart/DEPLOY.md),
|
|
[RUNBOOK.md](/config/workspace/kaffeeliste-neustart/RUNBOOK.md),
|
|
[docs/production-blueprint.md](/config/workspace/kaffeeliste-neustart/docs/production-blueprint.md),
|
|
[app/bootstrap.php](/config/workspace/kaffeeliste-neustart/app/bootstrap.php),
|
|
[config/app.php](/config/workspace/kaffeeliste-neustart/config/app.php),
|
|
[app/Services/SetupService.php](/config/workspace/kaffeeliste-neustart/app/Services/SetupService.php),
|
|
[bin/migrate.php](/config/workspace/kaffeeliste-neustart/bin/migrate.php),
|
|
[bin/cron.php](/config/workspace/kaffeeliste-neustart/bin/cron.php),
|
|
[bin/healthcheck.php](/config/workspace/kaffeeliste-neustart/bin/healthcheck.php),
|
|
[scripts/build-release.sh](/config/workspace/kaffeeliste-neustart/scripts/build-release.sh)
|
|
- Offizielle Doku:
|
|
https://www.netcup.com/en/helpcenter/documentation/web-hosting/php-shell
|
|
https://www.netcup.com/en/helpcenter/documentation/web-hosting/scheduled-tasks
|
|
https://www.netcup.com/en/helpcenter/documentation/web-hosting/enabling-ssl-tls
|
|
https://www.netcup.com/en/helpcenter/documentation/web-hosting/backup-manager
|
|
https://docs.plesk.com/en-US/obsidian/customer-guide/scheduling-tasks.65207/
|
|
https://www.plesk.com/kb/docs/managing-web-hosting-changing-the-document-root-directory/
|