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:
@@ -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)
|
||||
@@ -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`
|
||||
@@ -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 < 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)
|
||||
@@ -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` > 15 Min → Alarm „boka silent“
|
||||
- [ ] Schwellen optional: `disk_percent > 85`, `containers_unhealthy > 0`
|
||||
- [ ] Backup-Heartbeat-Feld `backup_last_success` — Alarm wenn > 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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 > 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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user