Proxy-Host bearbeiten, ohne den Rest zu verlieren

Aendern ging bisher nur ueber "proxy add --update", und das schreibt den
Eintrag vollstaendig neu: wer den Port aendern wollte, verlor still die
zusaetzlichen Pfade und die erweiterte Konfiguration, weil die Nutzlast
aus Vorgaben zusammengesetzt wird.

Die Schnittstelle des Proxy Managers arbeitet als Patch - ein PUT mit
nur einem Feld aendert auch nur dieses; an einem laufenden NPM 2.15.1
nachgemessen. Darauf setzt "proxy edit" auf: angegeben wird, was sich
aendern soll, alles Uebrige bleibt unberuehrt.

  proxy edit --id 3 --forward-port 5001
  proxy edit --domain checkmk.example.local --cert self
  proxy edit --id 3 --location /grafana=127.0.0.1:3000
  proxy edit --id 3 --del-location /grafana

Dazu Ziel, Schema, Name, Zertifikat, erweiterte Konfiguration, die vier
Schalter und ein/aus. Ohne Angabe wird nur der Stand gezeigt. In der
Oberflaeche liegt dasselbe unter "Proxy-Host bearbeiten", mit den
aktuellen Werten vorbelegt.

Pfade kennt die Schnittstelle nur als Ganzes, sie werden deshalb gelesen,
geaendert und zurueckgeschrieben. Das an "}" aufzuteilen geht nicht:
"advanced_config" darf nginx-Bloecke mit geschweiften Klammern und
maskierte Anfuehrungszeichen enthalten. Dafuer gibt es jetzt json_raw
und json_split_array, die die Verschachtelung mitzaehlen und
Zeichenketten erkennen. "proxy show" liest die Pfade ebenfalls darueber.

Zwei Fehler kamen dabei ans Licht:

  - NPM_CODE wurde in npm_api gesetzt, aber npm_api wird fast immer in
    einer Kommandoersetzung aufgerufen - also in einer Subshell. Der
    HTTP-Code kam nie beim Aufrufer an; unter "set -u" brach das Skript
    im Fehlerpfad sogar ab, statt den Fehler zu zeigen. Betraf auch
    "proxy add" und das Anlegen von Zertifikaten. Der Code wird jetzt
    zusaetzlich abgelegt und mit npm_code gelesen.
  - Der Proxy Manager schaltet ohne Zertifikat http2_support und
    ssl_forced von sich aus ab. Das blieb unbemerkt; jetzt wird nach dem
    Schreiben verglichen und eine Abweichung gemeldet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 20:27:55 +02:00
co-authored by Claude Opus 5
parent 8782c6d5c7
commit 59304ae02d
3 changed files with 609 additions and 15 deletions
+50
View File
@@ -1224,6 +1224,7 @@ erzwingen, HTTP/2 und Websockets einschalten und den empfohlenen
| `proxy add …` | Proxy-Host anlegen (`--update` ersetzt einen vorhandenen) |
| `proxy show --domain X` | Einzelheiten samt zusätzlicher Pfade |
| `proxy del --id N` | Proxy-Host löschen |
| `proxy edit --id N …` | vorhandenen Proxy-Host ändern – nur die angegebenen Felder |
| `proxy default --domain X` | HTTPS über die blanke IP ermöglichen (spiegelt X in einen Standard-Server) |
| `proxy default --off` | diese Spiegelung wieder entfernen |
@@ -1523,6 +1524,55 @@ Die saubere Alternative bleibt ein Name: ein DNS-Eintrag oder eine Zeile in der
`hosts`-Datei der Clients genügt, damit der Browser SNI sendet und der
Proxy-Host ganz normal greift.
### 10.9 Einen Proxy-Host ändern
`proxy add --update` schreibt den Eintrag **vollständig** neu – wer damit nur
den Port ändern will, verliert unbeabsichtigt die Pfade und die erweiterte
Konfiguration. Dafür gibt es `proxy edit`: angegeben wird nur, was sich ändern
soll, alles Übrige bleibt unangetastet.
```bash
./scripts/cmk-manage.sh proxy edit --id 3 --forward-port 5001
./scripts/cmk-manage.sh proxy edit --domain checkmk.example.local --cert self
./scripts/cmk-manage.sh proxy edit --id 3 --location /grafana=127.0.0.1:3000
./scripts/cmk-manage.sh proxy edit --id 3 --del-location /grafana
./scripts/cmk-manage.sh proxy edit --id 3 # nur ansehen
```
Der Eintrag wird über `--id` oder `--domain` gewählt.
| Option | Ändert |
|---|---|
| `--rename NAME` | den Domainnamen |
| `--forward-host HOST`, `--forward-port PORT` | das Weiterleitungsziel |
| `--scheme http\|https` | wie der Proxy das Ziel anspricht |
| `--cert self\|letsencrypt\|none\|ID` | das Zertifikat |
| `--advanced 'TEXT'` | die erweiterte nginx-Konfiguration (`\n` trennt Zeilen) |
| `--force-ssl`, `--http2`, `--websockets`, `--block-exploits` | jeweils `on`/`off` |
| `--enable`, `--disable` | den Eintrag ein- oder ausschalten |
| `--location /pfad=host:port` | einen Pfad hinzufügen oder ersetzen |
| `--del-location /pfad` | einen Pfad entfernen |
Zwei Dinge sind dabei zu wissen:
- **Pfade** kennt die Schnittstelle nur als Ganzes. `--location` und
`--del-location` lesen deshalb den Bestand, ändern den einen Eintrag und
schreiben die Liste zurück. Hatte ein ersetzter Pfad eine eigene erweiterte
Konfiguration, wird das vorher gesagt.
- Der Proxy Manager **biegt manches still zurecht**: ohne Zertifikat schaltet
er `http2_support` und `ssl_forced` von sich aus ab. `proxy edit` vergleicht
danach, was gespeichert wurde, und meldet eine Abweichung – sonst sucht man
den Fehler später an der falschen Stelle.
In der Oberfläche liegt dasselbe unter **Proxy-Hosts → Proxy-Host bearbeiten**;
dort sind die Felder mit den aktuellen Werten vorbelegt, und die Schalter
stehen als Auswahlliste bereit.
> Wurde der Standard-Server für den IP-Zugang eingerichtet
> ([Kapitel 10.8](#108-https-über-die-blanke-ip)), spiegelt er einen Stand von
> vorher. Nach inhaltlichen Änderungen neu schreiben – `proxy edit` erinnert
> daran.
---
## 11. Proxy Manager lokal einrichten (Terminal-Browser)