Files
docu/migration/nextcloud-notify-push-freigabe.md
T
root 3b12324d4e Doku: Freigabe-Dokument für notify_push (Linuxserver Docker Mod).
Empfohlener Weg ohne NPM-Änderung; Sidecar als Alternative dokumentiert.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 09:57:38 +02:00

342 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Freigabe: notify_push (Client Push / Rust HPB)
**Status:****Zur Absegnung — noch nicht umgesetzt**
**Erstellt:** 2026-06-28
**Betrifft:** VM 101 ubuntu · Container `nextcloud` · NPM · **kein** NC-Version-Upgrade
Dieses Dokument beschreibt den geplanten Rollout von **notify_push** (High Performance Backend für Files, Rust-Daemon). Ziel: weniger Client-Polling (`index.php/204`, `status.php`) → weniger PHP-FPM-Last.
**Voraussetzungen (bereits erfüllt):**
| Voraussetzung | Status |
|---------------|--------|
| Redis in `config.php` | ✅ |
| PHP-FPM Tuning (12 Worker) | ✅ (2026-06-28) |
| VM RAM 12 GB | ✅ |
| Nginx `/push/`-Block im Nextcloud-Container | ✅ bereits in `default.conf` |
| NPM WebSocket-Header für `cloud.jeanavril.com` | ✅ bereits aktiv |
---
## Kurzfassung
| Was | Empfehlung |
|-----|------------|
| **Deploy-Methode** | **Linuxserver Docker Mod** (nicht separater Sidecar) |
| **Compose-Änderung** | 1 Zeile: `DOCKER_MODS=linuxserver/mods:nextcloud-notify-push` |
| **NPM-Änderung** | **Keine**`/push/` wird im Nextcloud-Container terminiert |
| **App** | `notify_push` v1.3.3 (NC 34 kompatibel) |
| **Erwarteter Effekt** | Deutlich weniger Polling-Requests in Nginx-Logs |
---
## Warum notify_push?
**Problem heute:** Desktop- und Mobile-Clients fragen regelmäßig den Server ab, ob sich Dateien geändert haben (`GET /index.php/204`, `GET /status.php`). Das erzeugt dauerhaft PHP-FPM-Last — unabhängig von der Client-Version.
**Lösung:** Der Rust-Daemon hält WebSocket-Verbindungen offen und **pusht** Änderungen an Clients. Clients pollen seltener (best-effort, Polling bleibt als Fallback).
**Relevanz für euren Incident (28.06.2026):** v1.3.3 enthält Fixes gegen DB-Query-Spitzen bei Cache-Invalidierung — passt zum beobachteten Lastmuster.
Quellen:
- https://github.com/nextcloud/notify_push
- https://apps.nextcloud.com/apps/notify_push (v1.3.3 für NC 34)
- https://nextcloud.com/blog/… (ADA/HPB Files v2 Kontext)
---
## Architektur nach Umsetzung
```
Client (Desktop/Android)
│ wss://cloud.jeanavril.com/push/…
NPM (10.2.2.254) ← TLS, WebSocket-Upgrade (bereits konfiguriert)
│ http://10.2.2.253:80
Nextcloud-Container (10.2.2.253)
├── Nginx location ^~ /push/ → 127.0.0.1:7867
└── notify_push (Rust) ← via Docker Mod, Port 7867 intern
├── Redis (nextcloud-redis-1) ← Pub/Sub
└── MariaDB (nextcloud-db-1)
```
**Kein neuer externer Port.** Der Push-Daemon läuft **im** Nextcloud-Container (Mod), nicht als separater öffentlicher Dienst.
---
## Empfohlene Methode: Linuxserver Docker Mod
Ihr nutzt `lscr.io/linuxserver/nextcloud:latest`. Linuxserver bietet dafür einen **offiziellen Mod** an — der passt besser als ein separater Sidecar-Container:
| | Docker Mod (empfohlen) | Separater Sidecar |
|--|------------------------|-------------------|
| Wartung | offiziell von Linuxserver | manuell (Binary-Version, Netzwerk) |
| Nginx `/push/` | bereits in `default.conf` | NPM Custom Location nötig |
| `trusted_proxies`-Probleme | selten (Push lokal im Container) | häufig (GitHub #663) |
| Compose-Änderung | 1 Env-Variable | neuer Service + Netzwerk |
Mod-Doku: https://github.com/linuxserver/docker-mods/tree/nextcloud-notify-push
---
## Geplante Änderungen (Detail)
### 1. `/opt/stacks/nextcloud/compose.yml`
**Nur** beim Service `nextcloud` unter `environment` ergänzen:
```yaml
nextcloud:
# … bestehende Einträge …
environment:
- PUID=33
- PGID=33
- TZ=Etc/UTC
- DOCKER_MODS=linuxserver/mods:nextcloud-notify-push # NEU
```
**Nicht ändern:** `db`, `redis`, `collabora`, Volumes, Netzwerke, Image-Tag.
### 2. Container neu erstellen (nur `nextcloud`)
```bash
cd /opt/stacks/nextcloud
docker compose pull nextcloud
docker compose up -d --force-recreate nextcloud
```
**Hinweis:** Wie beim PHP-FPM-Tuning reicht `docker restart` **nicht** — Mod wird beim Container-**Erstellen** geladen.
**Erwartete Unterbrechung:** ~1030 s für Nextcloud (Clients reconnecten automatisch).
### 3. App installieren & aktivieren
```bash
docker exec -u abc nextcloud php /app/www/public/occ app:install notify_push
docker exec -u abc nextcloud php /app/www/public/occ app:enable notify_push
```
(Falls App-Store nicht erreichbar: manuell v1.3.3 von https://apps.nextcloud.com/apps/notify_push)
### 4. Setup-Wizard
```bash
docker exec -u abc nextcloud php /app/www/public/occ notify_push:setup https://cloud.jeanavril.com/push
```
Der Wizard prüft automatisch: Erreichbarkeit, WebSocket, Reverse Proxy, Redis.
### 5. Logs prüfen
```bash
docker logs nextcloud 2>&1 | grep -i notify
# Erwartet: "**** Starting notify-push ****"
```
---
## NPM — bewusst keine Änderung
Aktueller Stand (`/opt/stacks/npm/data/nginx/proxy_host/1.conf`):
- Forward: `http://10.2.2.253:80`
- WebSocket-Header: **bereits gesetzt** (`Upgrade`, `Connection`, `http/1.1`)
- Kein separater Custom Location `/push` nötig
Der `/push/`-Pfad wird vom **internen Nginx** im Nextcloud-Container an den Mod-Daemon weitergeleitet (Block existiert bereits):
```nginx
location ^~ /push/ {
proxy_pass http://127.0.0.1:7867/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
```
---
## Bekannte Stolpersteine & Fallbacks
### „push server is not a trusted proxy“
`trusted_proxies` in `config.php` enthält bereits:
- `10.1.1.1`
- `10.2.2.254` (NPM)
Falls `notify_push:setup` den Test dennoch fehlschlägt:
1. IP aus der Fehlermeldung in `trusted_proxies` aufnehmen (oft `127.0.0.1` bei Mod-Setup)
2. Per occ (Beispiel — exakte IP aus Setup-Output nehmen):
```bash
docker exec -u abc nextcloud php /app/www/public/occ config:system:set trusted_proxies 2 --value=127.0.0.1
```
3. Setup erneut ausführen
Quelle: https://github.com/nextcloud/notify_push#push-server-is-not-a-trusted-proxy
### Mod startet nicht
- Redis erreichbar? (`docker exec nextcloud-redis-1 redis-cli ping`)
- Container-Log auf Fehler prüfen
- ggf. `default.conf` neu generieren (nur wenn `/push/`-Block fehlt):
```bash
# Nur wenn Block fehlt — bei uns vorhanden, normalerweise NICHT nötig:
mv /opt/stacks/nextcloud/config/nginx/site-confs/default.conf /opt/stacks/nextcloud/config/nginx/site-confs/default.conf.bak
docker compose up -d --force-recreate nextcloud
```
### App-Store nicht erreichbar
Bekanntes Log-Thema (Timeout zu apps.nextcloud.com). App kann manuell installiert werden — kein Blocker für notify_push selbst.
---
## Was bewusst NICHT geändert wird
| Item | Grund |
|------|-------|
| `config.php` Redis-Einträge | bereits korrekt |
| Separates Redis für `notify_push_redis` | optional, Phase 2 — erst bei Last-Problemen |
| NPM Compose / Custom Locations | nicht nötig mit Mod |
| NC Minor-Update 34.0.1 | separater Schritt |
| Desktop-Client-Updates | optional, nicht Voraussetzung |
---
## Risiken
| Risiko | Einschätzung | Mitigation |
|--------|--------------|------------|
| Kurze Cloud-Unterbrechung beim Recreate | gering | bei wenig Traffic umsetzen |
| Mod-Inkompatibilität nach Image-Update | mittel | Image-Tag pinnen (separates TODO) |
| Setup schlägt fehl (trusted_proxy) | mittel | Fallbacks oben |
| Mehr RAM im Nextcloud-Container | gering | ~2050 MB für Rust-Daemon; VM hat 12 GB |
| Rollback nötig | gering | siehe unten |
---
## Rollback
1. `DOCKER_MODS`-Zeile aus `compose.yml` entfernen
2. `docker compose up -d --force-recreate nextcloud`
3. App deaktivieren: `occ app:disable notify_push`
4. Optional App deinstallieren: `occ app:remove notify_push`
Kein DB-Rollback nötig. Keine NPM-Änderungen rückgängig zu machen.
---
## Verifikation nach Umsetzung
```bash
# 1. Daemon läuft
docker logs nextcloud 2>&1 | grep -i "notify-push"
# 2. Setup OK
docker exec -u abc nextcloud php /app/www/public/occ notify_push:setup https://cloud.jeanavril.com/push
# 3. Metriken (nach Client-Verbindung)
docker exec -u abc nextcloud php /app/www/public/occ notify_push:metrics
# 4. Polling zurückgegangen? (24h beobachten)
docker exec nextcloud tail -f /config/log/nginx/access.log | grep -E 'status\.php|index\.php/204'
```
**Erfolgskriterien:**
- [ ] `notify_push:setup` ohne Fehler
- [ ] Log: „Starting notify-push“
- [ ] `notify_push:metrics` zeigt Verbindungen (sobald Clients online)
- [ ] Weniger `index.php/204` / `status.php` in Access-Log vs. vorher
- [ ] Kein erneuter PHP-FPM-Auslastungs-Incident unter Normal-Last
---
## Empfohlene Reihenfolge
| Schritt | Aktion | Dauer |
|---------|--------|-------|
| A | Optional: VM-Snapshot `pre-notify-push` | 1 min |
| B | `compose.yml`: `DOCKER_MODS` ergänzen | 1 min |
| C | `docker compose up -d --force-recreate nextcloud` | ~30 s |
| D | Log: Mod gestartet? | 1 min |
| E | App installieren + enable | 2 min |
| F | `notify_push:setup https://cloud.jeanavril.com/push` | 2 min |
| G | Bei Fehler: trusted_proxies anpassen | ggf. |
| H | Metriken + Access-Log 24h beobachten | laufend |
**Optional vorher:** VM-Snapshot auf pve1 (`qm snapshot 101 pre-notify-push-YYYYMMDD`).
---
## Umsetzungs-Befehle (nach Freigabe)
```bash
# Auf VM 101 (als jean mit sudo) oder via SSH
# A) compose.yml editieren — DOCKER_MODS Zeile hinzufügen (siehe oben)
# B) Deploy
cd /opt/stacks/nextcloud
sudo docker compose pull nextcloud
sudo docker compose up -d --force-recreate nextcloud
sleep 15
sudo docker logs nextcloud 2>&1 | tail -30
# C) App + Setup
sudo docker exec -u abc nextcloud php /app/www/public/occ app:install notify_push
sudo docker exec -u abc nextcloud php /app/www/public/occ app:enable notify_push
sudo docker exec -u abc nextcloud php /app/www/public/occ notify_push:setup https://cloud.jeanavril.com/push
# D) Metriken
sudo docker exec -u abc nextcloud php /app/www/public/occ notify_push:metrics
```
---
## Alternative (nicht empfohlen): Separater Sidecar-Container
Falls der Docker Mod Probleme macht, wäre ein separater Container mit `ghcr.io/nextcloud/notify_push` möglich — erfordert dann:
- neuen Service in `compose.yml` mit `DATABASE_URL`, `REDIS_URL`, `NEXTCLOUD_URL`
- NPM Custom Location `/push` → Sidecar-IP:7867
- `trusted_proxies` für Sidecar-Subnetz
- Netzwerk-Anbindung an `nextcloud_default` + ggf. `docbr0`
**Für euren Stack nicht empfohlen** — Mod ist der offizielle Linuxserver-Weg und vermeidet die meisten Proxy-Probleme.
---
## Freigabe
| | |
|---|---|
| ☐ | **Freigegeben** — Docker Mod wie beschrieben umsetzen |
| ☐ | **Anpassung** — z. B. Sidecar statt Mod, oder erst Snapshot |
| ☐ | **Abgelehnt / später** |
**Freigegeben von:** _______________
**Datum:** _______________
**Anmerkungen:** _______________
---
## Referenzen
| Thema | URL |
|-------|-----|
| notify_push GitHub | https://github.com/nextcloud/notify_push |
| Linuxserver Mod | https://github.com/linuxserver/docker-mods/tree/nextcloud-notify-push |
| App Store v1.3.3 | https://apps.nextcloud.com/apps/notify_push |
| trusted_proxies Troubleshooting | https://github.com/nextcloud/notify_push#push-server-is-not-a-trusted-proxy |
| Bereits umgesetztes Tuning | [nextcloud-tuning-freigabe.md](nextcloud-tuning-freigabe.md) |
| Gesamt-Roadmap | [nextcloud-optimierung-und-updates.md](nextcloud-optimierung-und-updates.md) |