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
+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 ;;