Fehlende Proxy-Manager-Anmeldung: nach Lage erklaeren statt nur melden

"Ich dachte, der nginx legt die an" - eine berechtigte Erwartung, die
seit NPM 2.15 nicht mehr stimmt. Die Meldung sagte zwar, WAS fehlt, aber
nicht, was im jeweiligen Zustand zu tun ist.

npm_api_token sieht jetzt nach, ob data/npm/data/database.sqlite schon
existiert, und unterscheidet:

  keine Datenbank   Zugangsdaten setzen und "up" - der Container legt
                    das Konto daraus selbst an
  Datenbank da      Die Variablen wirken nicht mehr. Konto im Browser
                    anlegen und dieselben Daten mit "config set"
                    eintragen.

Dazu "npm-reset" fuer den sauberen Neuanfang: es legt die Datenbank
beiseite (umbenannt, nicht geloescht), sodass der Container das Konto
beim naechsten Start neu erzeugt. Vorher zeigt es an, was dabei verloren
geht - Proxy-Hosts, Weiterleitungen, Zugriffslisten - und was bleibt:
die Zertifikate. Mit Rueckfrage.

Beide Zweige durchgespielt. In beiden Sprachfassungen dokumentiert.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 19:16:18 +02:00
co-authored by Claude Opus 5
parent 22331ff114
commit ed768f049b
3 changed files with 134 additions and 8 deletions
+23
View File
@@ -1166,6 +1166,28 @@ angelegt worden, wirken die Variablen nicht mehr (die Datenbank ist nicht mehr
leer). Dann einfach die selbst vergebenen Zugangsdaten eintragen – das Skript
meldet sich damit an.
#### Wenn die Anmeldung fehlt
Fehlen die Zugangsdaten, sagt das Skript je nach Lage, was zu tun ist – es
sieht dafür nach, ob `data/npm/data/database.sqlite` schon existiert:
| Lage | Weg |
|---|---|
| **noch keine Datenbank** | `config set NPM_ADMIN_EMAIL …` und `…_PASSWORD …`, dann `up` – der Container legt das Konto selbst an |
| **Datenbank vorhanden** | Konto im Browser anlegen (`cmk-manage.sh browser`), dieselben Daten anschließend mit `config set` eintragen |
Wer lieber sauber neu beginnt:
```bash
sudo ./scripts/cmk-manage.sh npm-reset
```
Das legt die Datenbank beiseite (umbenannt, nicht gelöscht), sodass der
Container beim nächsten `up` das Konto aus `NPM_ADMIN_EMAIL`/`NPM_ADMIN_PASSWORD`
neu anlegt. **Proxy-Hosts, Weiterleitungen und Zugriffslisten sind damit weg**
– die Zertifikate bleiben. Das Kommando zeigt vorher genau das an und fragt
nach. Die Proxy-Hosts lassen sich mit `proxy add` in einem Aufruf neu anlegen.
### 10.2 Proxy-Host anlegen – ohne Browser
Die Weboberfläche lässt sich im Terminal-Browser nur mühsam bedienen; Formulare
@@ -1997,6 +2019,7 @@ Eine Dateiauswahl mit Verzeichnisnavigation ist eingebaut.
| `config list\|get\|set\|edit` | Einstellungen der `.env` anzeigen und ändern |
| `npm-port [PORT]` | Port der Proxy-Manager-Oberfläche setzen/anzeigen |
| `npm-enable [on\|off]` | Proxy Manager ein-/ausschalten (Daten bleiben erhalten) |
| `npm-reset` | Datenbank beiseitelegen, damit das Konto neu entsteht |
| `proxy status\|list\|certs\|add\|del` | Proxy-Hosts über die API anlegen und verwalten |
| `cert …` | selbstsigniertes Zertifikat erzeugen |
| `shell` | Root-Shell im Checkmk-Container |
+23
View File
@@ -1165,6 +1165,28 @@ If the stack has already run and the account was created by hand through the
wizard, the variables no longer take effect (the database is no longer empty).
Simply enter the credentials you chose – the script logs in with those.
#### When the login is missing
If the credentials are absent, the script tells you what to do depending on the
situation – it checks whether `data/npm/data/database.sqlite` already exists:
| Situation | Route |
|---|---|
| **no database yet** | `config set NPM_ADMIN_EMAIL …` and `…_PASSWORD …`, then `up` – the container creates the account itself |
| **database present** | create the account in the browser (`cmk-manage.sh browser`), then enter the same credentials with `config set` |
To start over cleanly:
```bash
sudo ./scripts/cmk-manage.sh npm-reset
```
This moves the database aside (renamed, not deleted) so the container recreates
the account from `NPM_ADMIN_EMAIL`/`NPM_ADMIN_PASSWORD` on the next `up`.
**Proxy hosts, redirections and access lists are gone** – the certificates
remain. The command shows exactly that beforehand and asks for confirmation.
The proxy hosts can be recreated with `proxy add` in a single call.
### 10.2 Creating a proxy host – without a browser
The web interface is painful in a terminal browser, and forms with file uploads
@@ -1995,6 +2017,7 @@ A file chooser with directory navigation is built in.
| `config list\|get\|set\|edit` | show and change settings in `.env` |
| `npm-port [PORT]` | set/show the port of the Proxy Manager interface |
| `npm-enable [on\|off]` | turn the Proxy Manager on/off (data is preserved) |
| `npm-reset` | move the database aside so the account is recreated |
| `proxy status\|list\|certs\|add\|del` | create and manage proxy hosts through the API |
| `cert …` | create a self-signed certificate |
| `shell` | root shell in the Checkmk container |
+88 -8
View File
@@ -165,6 +165,10 @@ KOMMANDOS - Konfiguration
config edit .env im Editor oeffnen
npm-port [PORT] Port der Proxy-Manager-Oberflaeche
(ohne PORT: aktuellen Stand anzeigen)
npm-reset Datenbank des Proxy Managers beiseitelegen,
damit das Konto beim naechsten Start neu
aus NPM_ADMIN_EMAIL/-PASSWORD entsteht
(Zertifikate bleiben erhalten)
npm-enable [on|off] NGINX Proxy Manager ein-/ausschalten.
"off" stoppt und entfernt den Container,
die Daten unter ./data/npm bleiben erhalten
@@ -2587,6 +2591,48 @@ npm_data_summary() {
printf ' Zertifikate : %s (%s)\n' "$le" "$([ -d "$le" ] && du -sh "$le" 2>/dev/null | cut -f1 || echo 'leer')"
}
# Proxy Manager auf Anfang setzen: Datenbank weg, damit der Container das
# Konto beim naechsten Start neu anlegt. Zertifikate bleiben erhalten.
cmd_npm_reset() {
local d="${NPM_DATA_DIR:-$PROJECT_DIR/data/npm/data}"
case "$d" in /*) : ;; *) d="$PROJECT_DIR/${d#./}" ;; esac
if ! npm_db_exists; then
ok "Es gibt noch keine Datenbank - der Container legt das Konto beim Start selbst an."
log "Vorher setzen: $SELF config set NPM_ADMIN_EMAIL <adresse>"
return 0
fi
cat <<EOF
${C_BLD}Was dabei verloren geht${C_RST}
$d/database.sqlite
Darin stehen Konten, Proxy-Hosts, Weiterleitungen und Zugriffslisten.
${C_BLD}Was bleibt${C_RST}
Zertifikate unter ${NPM_LE_DIR:-./data/npm/letsencrypt} und
$d/custom_ssl
Die Proxy-Hosts lassen sich anschliessend mit
$SELF proxy add --domain ...
in einem Aufruf neu anlegen.
EOF
confirm "Datenbank wirklich verwerfen?" || die "Abgebrochen."
[ -n "${NPM_ADMIN_EMAIL:-}" ] && [ -n "${NPM_ADMIN_PASSWORD:-}" ] \
|| warn "NPM_ADMIN_EMAIL/-PASSWORD sind nicht gesetzt - dann entsteht
beim naechsten Start wieder kein Konto. Zuerst setzen!"
local stamp; stamp="$(date +%Y%m%d-%H%M%S)"
if container_running "$NPM_CONTAINER_NAME"; then
log "Stoppe '$NPM_CONTAINER_NAME' ..."
$RUNTIME stop "$NPM_CONTAINER_NAME" >/dev/null 2>&1 || true
fi
mv "$d/database.sqlite" "$d/database.sqlite.alt-$stamp"
ok "Datenbank beiseitegelegt: database.sqlite.alt-$stamp"
log "Jetzt neu starten: $SELF up"
}
cmd_npm_enable() {
local want=""
while [ $# -gt 0 ]; do
@@ -3299,6 +3345,17 @@ EOF
npm_api_base() { printf 'http://127.0.0.1:%s\n' "${NPM_ADMIN_PORT:-81}"; }
# Hat der Proxy Manager schon eine Datenbank? Davon haengt ab, wie das
# Konto entsteht: der Container legt es NUR beim ersten Start mit leerer
# Datenbank an, und nur wenn INITIAL_ADMIN_EMAIL/-PASSWORD gesetzt sind.
# Ist die Datenbank schon da, hilft nur noch der Einrichtungsassistent im
# Browser - und danach muessen dessen Zugangsdaten in die .env.
npm_db_exists() {
local d="${NPM_DATA_DIR:-$PROJECT_DIR/data/npm/data}"
case "$d" in /*) : ;; *) d="$PROJECT_DIR/${d#./}" ;; esac
[ -s "$d/database.sqlite" ]
}
# Sehr einfache Auswertung - kein jq noetig, das fehlt auf vielen Hosts
json_num() { printf '%s' "$1" | tr ',' '\n' | sed -n "s/.*\"$2\"[[:space:]]*:[[:space:]]*\([0-9][0-9]*\).*/\1/p" | head -n1; }
json_str() { printf '%s' "$1" | tr ',' '\n' | sed -n "s/.*\"$2\"[[:space:]]*:[[:space:]]*\"\([^\"]*\)\".*/\1/p" | head -n1; }
@@ -3309,17 +3366,39 @@ json_ids() { printf '%s' "$1" | grep -o '"id":[0-9]*' | sed 's/.*://' ; }
npm_api_token() {
local base; base="$(npm_api_base)"
[ -n "${NPM_ADMIN_EMAIL:-}" ] && [ -n "${NPM_ADMIN_PASSWORD:-}" ] || {
if [ -z "${NPM_ADMIN_EMAIL:-}" ] || [ -z "${NPM_ADMIN_PASSWORD:-}" ]; then
err "Es sind keine Zugangsdaten fuer den Proxy Manager hinterlegt."
cat >&2 <<EOF
In der .env eintragen:
NPM_ADMIN_EMAIL=...
NPM_ADMIN_PASSWORD=...
Beim ERSTEN Start mit leerer Datenbank legt der Container damit das
Konto selbst an. Besteht das Konto schon, hier dessen Daten eintragen.
printf '\n' >&2
if npm_db_exists; then
cat >&2 <<EOF
Der Proxy Manager hat bereits eine Datenbank. Seit Version 2.15 legt
er KEINE Standardzugangsdaten mehr an - admin@example.com/changeme
gibt es nicht. Das Konto entsteht entweder beim allerersten Start
aus NPM_ADMIN_EMAIL/-PASSWORD, oder von Hand im Browser.
Weil die Datenbank schon steht, bleibt:
1) Oberflaeche aufrufen und das Konto anlegen:
$SELF browser
(oder http://127.0.0.1:${NPM_ADMIN_PORT:-81} vom Arbeitsplatz aus)
2) Dieselben Daten hier eintragen:
$SELF config set NPM_ADMIN_EMAIL <adresse>
$SELF config set NPM_ADMIN_PASSWORD <kennwort>
Alternativ ganz neu beginnen - VERWIRFT die Proxy-Konfiguration:
$SELF npm-reset
EOF
else
cat >&2 <<EOF
Der Proxy Manager hat noch keine Datenbank. Dann genuegt es, die
Zugangsdaten zu setzen und den Stack zu starten - der Container legt
das Konto damit selbst an:
$SELF config set NPM_ADMIN_EMAIL <adresse>
$SELF config set NPM_ADMIN_PASSWORD <kennwort>
$SELF up
EOF
fi
return 1
}
fi
local body
body="$(curl -sS --max-time 20 -X POST "$base/api/tokens" \
-H 'Content-Type: application/json' \
@@ -5233,6 +5312,7 @@ main() {
browser) cmd_browser "$@" || true ;;
npm-port) cmd_npm_port "$@" ;;
npm-enable) cmd_npm_enable "$@" ;;
npm-reset) cmd_npm_reset ;;
proxy) cmd_proxy "$@" ;;
config) cmd_config "$@" || true ;;
selftest) cmd_selftest ;;