docs: initial project documentation for 0012.de webspace

Document hosting setup, external monitoring architecture, landing page
concept, env template, and phased todo checklist for the wint.global
Classic 1.0 counterpart to boka.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Frank Schwenk
2026-06-11 22:25:56 +02:00
commit 54d29d3afa
16 changed files with 803 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# 01 — Bootstrap, `.env`, Deployment
**Priorität:** high
**Abhängigkeiten:** keine
**Blockiert:** 02, 03, 04, 05, 06
## Ziel
Lokales Repo mit dem Webspace verbinden und eine deploybare Grundstruktur anlegen.
## Checkliste
- [ ] `.env.example` nach `.env` kopieren
- [ ] Plesk-User/Passwort, FTP, später SMTP in `.env` eintragen (nicht committen)
- [ ] In Plesk Document Root prüfen (typisch `httpdocs/`)
- [ ] PHP-Version notieren (Cron-Screenshot: 8.5.x)
- [ ] Verzeichnis `public/` als Quelle für `httpdocs/` festlegen
- [ ] Erstes Test-Deployment: `public/index.php` mit `phpinfo()` oder „hello“ — danach wieder entfernen
- [ ] HTTPS für `0012.de` prüfen (Let's Encrypt in Plesk)
- [ ] Optional: Deploy-Skript (`scripts/deploy.sh` rsync/lftp) — nur wenn gewünscht
## Akzeptanzkriterien
- FTP-Login funktioniert
- `https://0012.de/` liefert eine Testseite
- `.env` liegt lokal, ist in `.gitignore`
## Notizen
- Temporäre URL aus Kundenbereich nutzen, falls DNS noch propagiert
- Firewall: Port 8443 (Plesk), 21/22 (FTP/SFTP je nach Anbieter)
+45
View File
@@ -0,0 +1,45 @@
# 02 — E-Mail & SMTP
**Priorität:** high
**Abhängigkeiten:** 01
**Blockiert:** 03 (Alarmierung)
## Ziel
Mail-Infrastruktur auf 0012.de für Monitoring-Alerts, Skript-Versand und spätere Fremddomains.
## Checkliste
### Postfächer auf 0012.de
- [ ] Postfach `monitor@0012.de` (oder `alerts@0012.de`) anlegen
- [ ] Passwort in `.env` → `SMTP_USER`, `SMTP_PASSWORD`
- [ ] `ALERT_EMAIL` auf persönliche Adresse setzen
- [ ] `SMTP_FROM=monitor@0012.de` setzen
- [ ] Test: Webmail-Login auf `ha01s019.org-dns.com`
### SMTP für Skripte
- [ ] Port 587 + STARTTLS testen (von lokalem Rechner / boka)
- [ ] SPF für `0012.de` in Plesk DNS prüfen/setzen
- [ ] DKIM in Plesk aktivieren (Deliverability)
- [ ] DMARC optional: `_dmarc.0012.de` mit `p=none` zum Start
### Relay von boka (später)
- [ ] Entscheiden: dediziertes Relay-Postfach `relay@0012.de` vs. App-spezifische Absender
- [ ] In Plesk: ausgehende Mail-Limits / Relay-Regeln prüfen (Hoster-Doku)
- [ ] boka-Apps: zentraler SMTP-Block in Docker/env (Host, Port, User, Pass)
### Cron-Benachrichtigungen Plesk
- [ ] Geplante Aufgaben: „Nur Fehler“ für PHP-Fatal-Errors — ergänzt App-eigene Alerts, ersetzt sie nicht
## Akzeptanzkriterien
- Testmail von PHP (`mail()` oder PHPMailer) an `ALERT_EMAIL` kommt an
- SPF/DKIM ohne Hard-Fail in Mail-Header-Test (mail-tester.com o. ä.)
## Referenz
- [`../HOSTING.md`](../HOSTING.md) — SMTP-Host `ha01s019.org-dns.com`
+48
View File
@@ -0,0 +1,48 @@
# 03 — Monitoring Pull (Phase 1)
**Priorität:** high
**Abhängigkeiten:** 01, 02, 05
**Siehe auch:** [`../MONITORING.md`](../MONITORING.md)
## Ziel
`monitor.php` auf dem Webspace: externe HTTPS-/SSL-Checks, Retry, E-Mail-Alarm.
## Checkliste
### Implementierung
- [ ] `config/` — lädt `.env` (oder `config.php` außerhalb `httpdocs`)
- [ ] `public/monitor.php` — CLI/Cron-tauglich, kein Browser-Output nötig
- [ ] URL-Liste aus MONITORING.md Mindestliste konfigurierbar (`config/targets.php`)
- [ ] Pro URL: HTTP-Status, Timeout ~10s, optional erwarteter Code (200, 301, 401)
- [ ] SSL-Ablauf: Warnung wenn &lt; 14 Tage
- [ ] Retry: bei Fehler 2 Min warten, zweiter Versuch — Alarm nur wenn beide scheitern
- [ ] Ergebnisse nach `data/last-checks.json` schreiben (für Landing Page)
- [ ] Bei Alarm: E-Mail an `ALERT_EMAIL` via SMTP
- [ ] Optional: Telegram wenn `TELEGRAM_*` gesetzt
### Mindest-URLs (Start)
- [ ] `https://schwenk.online`
- [ ] `https://gitea.schwenk.online`
- [ ] `https://pics.schwenk.online`
- [ ] `https://medis.schwenk.online`
- [ ] `https://portainer.schwenk.online`
- [ ] Eine `bsc-gp.de`-Subdomain (z. B. score)
- [ ] `https://vfb.red`
### Sicherheit
- [ ] `data/` nicht öffentlich (`.htaccess` oder außerhalb Document Root)
- [ ] Keine Secrets in `last-checks.json`
## Akzeptanzkriterien
- Manueller Aufruf / „Jetzt ausführen“ in Plesk läuft fehlerfrei
- Simulierter Down (falsche URL) löst Mail nach Retry aus
- `last-checks.json` aktualisiert sich
## Geschätzter Aufwand
~1h (laut MONITORING.md Phase 1)
+55
View File
@@ -0,0 +1,55 @@
# 04 — Monitoring Push (boka → Webspace)
**Priorität:** medium
**Abhängigkeiten:** 01, 03 (ingest + stale-Check)
**Siehe auch:** [`../MONITORING.md`](../MONITORING.md) Ebene 2
## Ziel
Interne Metriken von boka an 0012.de pushen; Alarm wenn kein Push seit 15 Min.
## Checkliste
### Webspace
- [ ] `public/ingest.php` — POST JSON, Token-Prüfung (`MONITOR_INGEST_TOKEN`)
- [ ] Payload speichern: `data/boka-status.json` + Timestamp
- [ ] In `monitor.php`: wenn `last_push` &gt; 15 Min → Alarm „boka silent“
- [ ] Schwellen optional: `disk_percent > 85`, `containers_unhealthy > 0`
- [ ] Backup-Heartbeat-Feld `backup_last_success` — Alarm wenn &gt; 25h alt (wenn Backups existieren)
### boka
- [ ] Skript `~/server/scripts/push-status.sh` (oder Pfad laut boka-Repo)
- [ ] Sammelt: load, disk %, mem, `docker ps` running/unhealthy
- [ ] POST an `MONITOR_INGEST_URL` mit curl
- [ ] Crontab: `*/5 * * * *`
- [ ] Nach erfolgreichem Backup: Push mit aktualisiertem `backup_last_success`
### Token
- [ ] Starkes Token generieren (`openssl rand -hex 32`)
- [ ] Identisch in boka (env/cron) und 0012 `.env`
## Beispiel-Payload
```json
{
"token": "...",
"load": [1.2, 0.8, 0.5],
"disk_percent": 55,
"mem_available_mb": 4700,
"containers_running": 38,
"containers_unhealthy": 0,
"backup_last_success": "2026-06-10T03:00:00+02:00"
}
```
## Akzeptanzkriterien
- Push von boka aktualisiert JSON auf Webspace
- Absichtlich gestoppter Cron auf boka → Mail nach 15+ Min
## Hinweis
Skript auf boka kann in **boka-Repo** liegen; hier nur `ingest.php` + Doku-Link.
+41
View File
@@ -0,0 +1,41 @@
# 05 — Plesk Cron (Geplante Aufgaben)
**Priorität:** high
**Abhängigkeiten:** 01, 03 (Skript muss existieren)
**Referenz:** Plesk → Websites & Domains → Geplante Aufgaben
## Ziel
Monitoring automatisch alle 5–10 Minuten ausführen.
## Checkliste
- [ ] Aufgabe anlegen: **PHP-Skript ausführen**
- [ ] Skriptpfad: `httpdocs/monitor.php` (Pfad nach Deployment verifizieren)
- [ ] PHP-Version: höchste stabile (z. B. 8.5.7)
- [ ] **Aktiv** angehakt
- [ ] Ausführen: **Cron-Stil**
- [ ] Expression: `*/10 * * * *` (Pull-Checks alle 10 Min)
- [ ] Beschreibung: z. B. „0012 external monitoring pull“
- [ ] Benachrichtigen: **Nur Fehler** (PHP-Crash → Plesk-Mail)
- [ ] **Jetzt ausführen** — Exit-Code / Log prüfen
- [ ] Optional zweite Aufgabe für leichtgewichtigen Heartbeat-Only-Check (`*/5`) — nur wenn von monitor.php getrennt
## Cron-Referenz
```
*/10 * * * * monitor.php (HTTPS/SSL + stale push check)
```
Plesk nutzt System-Timezone des Servers.
## Akzeptanzkriterien
- Aufgabe läuft scheduled ohne manuellen Klick
- `data/last-checks.json` Timestamp bewegt sich
## Fehlerbehebung
- Skriptpfad relativ zu Domain-Root in Plesk
- `max_execution_time` bei vielen URLs erhöhen
- Bei Timeout: URLs batching oder Interval vergrößern
+30
View File
@@ -0,0 +1,30 @@
# 06 — Landing Page 0012.de (Status Beacon)
**Priorität:** medium
**Abhängigkeiten:** 03 (liefert `last-checks.json`)
**Konzept:** [`../SITE.md`](../SITE.md)
## Ziel
Öffentliche, minimale Startseite — Live-Status aus Monitoring-Daten, kein Leer-Domain-Eindruck.
## Checkliste
- [ ] `public/index.php` — liest `data/last-checks.json` + `data/boka-status.json`
- [ ] Raster: ~12 Kacheln, Farbe nach Status (ok / warn / down)
- [ ] boka-Heartbeat-Zeile („last push X min ago“)
- [ ] Dark-Theme CSS inline oder eine `assets/style.css`
- [ ] Graceful fallback wenn JSON fehlt („Monitoring not initialized“)
- [ ] Keine sensiblen Daten (Tokens, interne Fehlerdetails)
- [ ] Optional: `public/status.json` read-only API
- [ ] Meta: `noindex` erwägen (Ops-Seite, keine SEO)
## Akzeptanzkriterien
- `https://0012.de/` zeigt aktuellen Status nach Cron-Lauf
- Seite lädt ohne JavaScript
- Mobile lesbar
## Nicht im Scope
- Blog, CMS, WordPress
+39
View File
@@ -0,0 +1,39 @@
# 07 — Mail-Hosting für externe Domains
**Priorität:** medium
**Abhängigkeiten:** 02
**Blockiert durch:** Entscheidung welche Domains
## Ziel
Domains ohne eigenen Mailserver über 0012.de / wint.global betreiben.
## Checkliste
### Pro Domain
- [ ] Domain-Liste festlegen (welche brauchen Mail?)
- [ ] Domain in Plesk als **Alias** oder **zusätzliche Domain** am Subscription — Hoster-Regeln prüfen („DNS nur mit Paketbezug“)
- [ ] MX-Records auf `0012.de` oder Hoster-Vorgabe (`mail.0012.de` / `ha01s019.org-dns.com`)
- [ ] SPF: `v=spf1 include:... ~all` passend zum Hoster
- [ ] DKIM für jede sendende Domain
- [ ] Postfächer anlegen (z. B. `kontakt@fremddomain.de`)
- [ ] Test: senden/empfangen von extern (Gmail)
### Relay vs. natives Hosting
| Modell | Wann |
|--------|------|
| Volles Hosting | Domain bei wint oder NS zeigt auf wint |
| Nur Relay | boka sendet nur über SMTP mit From `@domain` — erfordert SPF/DKIM für diese Domain |
- [ ] Modell pro Domain dokumentieren in `HOSTING.md` oder `docs/mail-domains.md`
## Risiken
- Shared-Hosting-Limits (Anzahl Postfächer, Send-Rate)
- Domains außerhalb wint: DNS beim Registrar manuell
## Akzeptanzkriterien
- Mindestens eine Fremddomain empfängt und sendet zuverlässig
+26
View File
@@ -0,0 +1,26 @@
# 08 — Monitoring Phase 2
**Priorität:** medium
**Abhängigkeiten:** 03, 04
**Siehe auch:** [`../MONITORING.md`](../MONITORING.md)
## Ziel
Erweiterte Checks und Schwellenwerte.
## Checkliste
- [ ] API-Health: bringtake, medis, affen (`/health`-Endpoints)
- [ ] Antwortzeit &gt; 5s → Warnung
- [ ] Content-Marker (title/fixed string) gegen „200 but broken“
- [ ] HTTP→HTTPS-Redirect-Check
- [ ] DNS-Auflösung (`gethostbyname`) — unexpected IP
- [ ] TCP: Gitea SSH 2222, RustDesk 21115–21117 falls genutzt
- [ ] SSL pro Subdomain einzeln
- [ ] Backup-Heartbeat-Schwellen aktiv (25h)
- [ ] Weitere URLs aus MONITORING.md medium-Liste nach und nach
## Akzeptanzkriterien
- API down bei laufendem Frontend → Alarm
- Latenz-Warnung testbar (künstlich verzögerte Antwort)
+24
View File
@@ -0,0 +1,24 @@
# 09 — Monitoring Phase 3 (optional)
**Priorität:** low
**Abhängigkeiten:** 08
**Siehe auch:** [`../MONITORING.md`](../MONITORING.md)
## Ziel
Nice-to-have: breitere Abdeckung, Dashboard, Hardening-Checks.
## Checkliste
- [ ] Restliche ~25 Domains (Stichproben vs. vollständige Liste entscheiden)
- [ ] Security Headers (HSTS, X-Frame-Options) — informativ, kein Paging
- [ ] TLS-Version-Check
- [ ] Port-Scan light: 22, 80, 443, 2222 offen; **5432 geschlossen**
- [ ] Einfaches Uptime-Dashboard (SQLite auf Webspace)
- [ ] Incident-Historie auf Landing Page oder `/history`
## Bewusst skipped (Homelab)
- Blacklist/Malware-API
- Synthetic Login
- WHOIS-Ablauf (Registrar-Mail reicht)
+30
View File
@@ -0,0 +1,30 @@
# Aufgaben — Übersicht
Nummerierte Todos für den 0012.de-Webspace. Abhängigkeiten beachten.
| # | Datei | Priorität | Kurzbeschreibung |
|---|-------|-----------|------------------|
| 01 | [01-bootstrap-env-deploy.md](01-bootstrap-env-deploy.md) | **high** | `.env`, Repo-Struktur, erstes FTP-Deployment |
| 02 | [02-email-smtp.md](02-email-smtp.md) | **high** | Postfächer, SMTP für Alerts und Relay |
| 03 | [03-monitoring-pull-phase1.md](03-monitoring-pull-phase1.md) | **high** | `monitor.php`, HTTPS/SSL-Checks, Alarm |
| 04 | [04-monitoring-push-boka.md](04-monitoring-push-boka.md) | **medium** | Push von boka → `ingest.php` |
| 05 | [05-plesk-cron.md](05-plesk-cron.md) | **high** | Geplante Aufgaben in Plesk |
| 06 | [06-site-0012-landing.md](06-site-0012-landing.md) | **medium** | Status-Beacon Landing Page |
| 07 | [07-mail-domains-external.md](07-mail-domains-external.md) | **medium** | MX für Domains ohne Mailserver |
| 08 | [08-monitoring-phase2.md](08-monitoring-phase2.md) | **medium** | API-Health, Latenz, Backup-Heartbeat |
| 09 | [09-monitoring-phase3.md](09-monitoring-phase3.md) | **low** | Rest-Domains, Dashboard, Header-Checks |
## Empfohlene Reihenfolge
```
01 → 02 → 05 → 03 → 06
↘ 04 (parallel zu 03, braucht ingest.php)
07 (wenn Domains feststehen)
08 → 09
```
## Querverweise
- Architektur Monitoring: [`../MONITORING.md`](../MONITORING.md)
- Hosting-Details: [`../HOSTING.md`](../HOSTING.md)
- Landing-Konzept: [`../SITE.md`](../SITE.md)