Terminal-Browser: nicht erreichbare Startseite wird vorab gemeldet

Symptom war ein scheinbar haengender Browsh: Logo, "Waiting for Firefox
to connect...", danach schwarz. Ursache ist nicht der Browser - Browsh
laeuft (Strg+Q kehrt ins Menue zurueck) - sondern die Startseite. Auf
http://127.0.0.1:81 antwortet nichts, solange der Proxy-Manager-Container
nicht laeuft, und ein Terminal-Browser zeigt dann keine Fehlerseite,
sondern gar nichts.

cmd_browser prueft die Startseite deshalb vorher und nennt die Ursache
statt stumm zu starten. Unterschieden werden: Proxy Manager
abgeschaltet (NPM_ENABLED=off), Container fehlt, Container gestoppt,
Container laeuft aber antwortet nicht, tote Checkmk-Oberflaeche auf
Port 5000 und externe Adressen. Jeweils mit dem passenden naechsten
Kommando. Ueberspringen mit --no-check; in der Oberflaeche erscheint
dieselbe Diagnose als Dialog mit der Wahl, trotzdem zu starten.

Dabei gefunden und behoben - an drei Stellen dieselbe Falle:
curl gibt mit -w '%{http_code}' im Fehlerfall selbst schon "000" aus.
Das zusaetzliche "|| echo 000" haengte einen zweiten Wert an, sodass
der Vergleich nie zutraf. Betroffen waren die neue Erreichbarkeits-
pruefung sowie http_code() und die Registry-Erreichbarkeit im
Zugangsdaten-Test ("image test") - dort waere ein nicht erreichbarer
Endpunkt als "unerwartete Antwort" statt als "nicht erreichbar"
gemeldet worden. Jetzt wird der Fehler der Zuweisung abgefangen.

Alle vier Diagnosezweige im Terminal durchgespielt, der
Zugangsdaten-Test zur Gegenprobe erneut gegen Docker Hub gelaufen.
Dokumentiert als Abschnitt 11.3 in beiden Sprachfassungen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 15:32:39 +02:00
co-authored by Claude Opus 5
parent 2d645bcc0b
commit c98caaaf35
4 changed files with 169 additions and 11 deletions
+2
View File
@@ -14,3 +14,5 @@ backups/*
images/*
!images/.gitkeep
backup-jobs.conf
scripts/.h.sh
scripts/.harness.sh
+39 -3
View File
@@ -1007,7 +1007,42 @@ vollqualifiziert, damit Podman sie nicht bei `registry.access.redhat.com` sucht.
In der ncurses-Oberfläche liegt alles unter **„Terminal-Browser (Proxy Manager
lokal bedienen)"**.
### 11.3 Grenze: Datei-Upload
### 11.3 Schwarzes Fenster: die Startseite antwortet nicht
Bleibt nach `Starting Browsh …` / `Waiting for Firefox to connect…` alles
schwarz, liegt es fast immer daran, dass **auf der Startseite nichts
antwortet** – nicht am Browser. Ein Terminal-Browser zeigt in dem Fall keine
Fehlerseite, sondern gar nichts. Dass Browsh selbst läuft, merkt man daran,
dass `Strg+Q` noch ins Menü zurückführt.
Das Skript prüft die Startseite deshalb vorher und nennt die Ursache:
```
[ WARN ] Auf http://127.0.0.1:81 antwortet nichts.
Ein Terminal-Browser zeigt dann nur eine schwarze Seite.
Das ist die Oberflaeche des NGINX Proxy Managers.
Er ist abgeschaltet (NPM_ENABLED=off):
./scripts/cmk-manage.sh npm-enable on
Trotzdem starten? [j/N]
```
Unterschieden werden:
| Lage | Meldung |
|---|---|
| Proxy Manager abgeschaltet | Hinweis auf `npm-enable on` |
| Container fehlt oder gestoppt | Hinweis auf `up` |
| Container läuft, antwortet aber nicht | Hinweis auf `logs` und `npm-port` |
| Checkmk-Oberfläche (Port 5000) tot | Hinweis auf `up` bzw. `sites` |
| externe Adresse | Hinweis auf den Netzzugang des Hosts |
Mit `--no-check` lässt sich die Prüfung überspringen. In der Oberfläche
erscheint dieselbe Diagnose als Dialog mit der Wahl, trotzdem zu starten oder
im Menü eine andere Startseite einzugeben.
### 11.4 Grenze: Datei-Upload
Ein Terminal-Browser kann keinen Dateiauswahl-Dialog des Betriebssystems
öffnen. Für **Let's Encrypt** ist das egal (dort werden nur Formularfelder
@@ -1066,7 +1101,7 @@ sudo ./scripts/cmk-manage.sh browser --engine shell
> E-Mail-Adresse und Kennwort. Das geht am einfachsten im Browser
> (`cmk-manage.sh browser`); danach funktioniert die API mit den neuen Daten.
### 11.4 Alternative: SSH-Tunnel
### 11.5 Alternative: SSH-Tunnel
Falls SSH auf die Maschine möglich ist, ist der Tunnel der bequemste Weg –
dann bedient man die Oberfläche im gewohnten Browser:
@@ -1833,8 +1868,9 @@ Checkmk-Werksnotizen (Werks/Release Notes) lesen.
| Adminoberfläche aus dem LAN nicht erreichbar | Port 81 gesperrt. Auf einen freien Port legen: `cmk-manage.sh npm-port 10443` und in der Firewall freigeben |
| Nach `npm-port` antwortet der neue Port nicht | Proxy Manager wurde nicht neu gestartet: `cmk-manage.sh restart`; Datei prüfen: `data/npm/data/nginx/custom/http.conf` |
| `cmk-manage.sh` bricht mit „CMK_RUNTIME … ist nicht installiert" ab | wird nur noch gewarnt und selbst gesucht; sauber setzen mit `config set CMK_RUNTIME auto` |
| Browser bleibt schwarz, „Waiting for Firefox to connect…" | Die Startseite antwortet nicht – meist läuft der Proxy Manager nicht. Das Skript meldet das jetzt vorab, siehe [Kapitel 11.3](#113-schwarzes-fenster-die-startseite-antwortet-nicht) |
| Proxy-Manager-Oberfläche im Browser leer / nur Textfragmente | Textbrowser ohne JavaScript verwendet. `cmk-manage.sh browser --engine browsh` (bzw. `carbonyl`) nehmen |
| Selbstsigniertes Zertifikat lässt sich im Terminal-Browser nicht hochladen | Datei-Dialoge gibt es dort nicht – Upload über die API, siehe [Kapitel 11.3](#113-grenze-datei-upload) |
| Selbstsigniertes Zertifikat lässt sich im Terminal-Browser nicht hochladen | Datei-Dialoge gibt es dort nicht – Upload über die API, siehe [Kapitel 11.4](#114-grenze-datei-upload) |
| `browser` meldet „braucht ein echtes Terminal" | Aufruf aus Pipe/Skript. Direkt auf der Konsole oder per SSH aufrufen; nur der Bau geht headless mit `--build-only` |
| Menüpunkt bricht mit einer Fehlermeldung in die Shell ab | behoben: fehlende Container, Sites oder Backups werden jetzt als Dialog gemeldet, die Oberfläche bleibt offen |
| `job auto on` meldet fehlende Rechte | `/etc/cron.d/` braucht root: mit `sudo` aufrufen, oder die ausgegebenen Zeilen selbst übernehmen |
+40 -3
View File
@@ -1014,7 +1014,43 @@ so that Podman does not look for them at `registry.access.redhat.com`.
In the ncurses interface everything lives under *"Terminal-Browser (Proxy
Manager lokal bedienen)"*.
### 11.3 Limitation: file upload
### 11.3 Blank screen: the start page does not answer
If everything stays black after `Starting Browsh …` /
`Waiting for Firefox to connect…`, it is almost always because **nothing
answers on the start page** – not because of the browser. A terminal browser
shows no error page in that case, just nothing. You can tell that Browsh itself
is running because `Ctrl+Q` still returns you to the menu.
The script therefore checks the start page beforehand and names the cause:
```
[ WARN ] Auf http://127.0.0.1:81 antwortet nichts.
Ein Terminal-Browser zeigt dann nur eine schwarze Seite.
Das ist die Oberflaeche des NGINX Proxy Managers.
Er ist abgeschaltet (NPM_ENABLED=off):
./scripts/cmk-manage.sh npm-enable on
Trotzdem starten? [j/N]
```
("nothing answers on …", "a terminal browser then shows only a black page",
"it is switched off", "start anyway?") The cases it distinguishes:
| Situation | Message |
|---|---|
| Proxy Manager switched off | points to `npm-enable on` |
| container missing or stopped | points to `up` |
| container runs but does not answer | points to `logs` and `npm-port` |
| Checkmk interface (port 5000) dead | points to `up` or `sites` |
| external address | points to the host's network access |
`--no-check` skips the check. In the interface the same diagnosis appears as a
dialog offering to start anyway or to pick a different start page from the
menu.
### 11.4 Limitation: file upload
A terminal browser cannot open the operating system's file chooser. For
**Let's Encrypt** that does not matter (only form fields are filled in), but
@@ -1073,7 +1109,7 @@ sudo ./scripts/cmk-manage.sh browser --engine shell
> address and password. That is easiest in the browser
> (`cmk-manage.sh browser`); afterwards the API works with the new credentials.
### 11.4 Alternative: SSH tunnel
### 11.5 Alternative: SSH tunnel
If SSH access to the machine is possible, a tunnel is the most convenient
route – you then use the interface in your usual browser:
@@ -1843,8 +1879,9 @@ release notes beforehand.
| Admin interface unreachable from the LAN | port 81 blocked. Move it to a free port: `cmk-manage.sh npm-port 10443` and open that in the firewall |
| New port does not answer after `npm-port` | the Proxy Manager was not restarted: `cmk-manage.sh restart`; check the file `data/npm/data/nginx/custom/http.conf` |
| `cmk-manage.sh` aborts with "CMK_RUNTIME … ist nicht installiert" | it now only warns and detects the runtime itself; set it cleanly with `config set CMK_RUNTIME auto` |
| Browser stays black, "Waiting for Firefox to connect…" | The start page does not answer – usually the Proxy Manager is not running. The script now reports this beforehand, see [chapter 11.3](#113-blank-screen-the-start-page-does-not-answer) |
| Proxy Manager interface blank / only text fragments | a text browser without JavaScript was used. Use `cmk-manage.sh browser --engine browsh` (or `carbonyl`) |
| Self-signed certificate cannot be uploaded in the terminal browser | there are no file dialogs there – upload via the API, see [chapter 11.3](#113-limitation-file-upload) |
| Self-signed certificate cannot be uploaded in the terminal browser | there are no file dialogs there – upload via the API, see [chapter 11.4](#114-limitation-file-upload) |
| `browser` reports "braucht ein echtes Terminal" (needs a real terminal) | called from a pipe/script. Call it on the console or over SSH; only the build runs headless, with `--build-only` |
| A menu entry drops out to the shell with an error | fixed: missing containers, sites or backups are now reported in a dialog and the interface stays open |
| `job auto on` reports missing permissions | `/etc/cron.d/` needs root: call it with `sudo`, or add the printed lines yourself |
+88 -5
View File
@@ -702,7 +702,9 @@ http_code() { # url [netrc] [extra-header]
local -a a=(-sS -o /dev/null -w '%{http_code}' --max-time 30)
[ -n "$netrc" ] && a+=(--netrc-file "$netrc")
[ -n "$hdr" ] && a+=(-H "$hdr")
curl "${a[@]}" "$url" 2>/dev/null || echo "000"
local code
code="$(curl "${a[@]}" "$url" 2>/dev/null)" || code=000
printf '%s\n' "${code:-000}"
}
test_result() { # status text [detail]
@@ -744,7 +746,8 @@ test_registry_login() { # reg repo user pass needs_login -> 0 = alles gut
# 1) Erreichbarkeit
local hdrf; hdrf="$(mktemp)"
local code
code="$(curl -sS -o /dev/null -D "$hdrf" -w '%{http_code}' --max-time 30 "https://$api/v2/" 2>/dev/null || echo 000)"
code="$(curl -sS -o /dev/null -D "$hdrf" -w '%{http_code}' --max-time 30 "https://$api/v2/" 2>/dev/null)" || code=000
code="${code:-000}"
if [ "$code" = "000" ]; then
test_result fail "nicht erreichbar" "Netzwerk/Proxy/DNS pruefen: https://$api/v2/"
rm -f "$hdrf"; return 1
@@ -2343,9 +2346,66 @@ browser_ensure_tools() {
image_exists_local "$img" || browser_build_tools
}
# Antwortet die Startseite ueberhaupt? Ein Terminal-Browser zeigt sonst
# nur eine schwarze Seite - ohne jede Fehlermeldung.
browser_url_reachable() {
command -v curl >/dev/null 2>&1 || return 0 # ohne curl nicht pruefbar
local code
# ACHTUNG: curl gibt bei einem Fehler selbst schon "000" aus. Ein
# zusaetzliches "|| echo 000" wuerde einen zweiten Wert anhaengen und
# jeden Vergleich verfaelschen - deshalb den Zuweisungsfehler abfangen.
code="$(curl -sS -o /dev/null -w '%{http_code}' --max-time 6 -L "$1" 2>/dev/null)" || code=000
[ -n "$code" ] && [ "$code" != "000" ]
}
# Erklaert, warum nichts antwortet, und nennt den passenden naechsten Schritt
browser_diagnose_url() { # url -> mehrzeiliger Text auf stdout
local url="$1" host port
host="$(printf '%s' "$url" | sed -E 's|^[a-z]+://([^/:]+).*|\1|')"
port="$(printf '%s' "$url" | sed -nE 's|^[a-z]+://[^/:]+:([0-9]+).*|\1|p')"
printf 'Auf %s antwortet nichts.\n' "$url"
printf 'Ein Terminal-Browser zeigt dann nur eine schwarze Seite.\n\n'
case "$host" in
127.0.0.1|localhost|::1)
if [ "${port:-81}" = "${NPM_ADMIN_PORT:-81}" ]; then
printf 'Das ist die Oberflaeche des NGINX Proxy Managers.\n'
if ! npm_enabled; then
printf 'Er ist abgeschaltet (NPM_ENABLED=off):\n'
printf ' %s npm-enable on\n' "$SELF"
elif ! container_exists "$NPM_CONTAINER_NAME"; then
printf 'Sein Container existiert nicht:\n'
printf ' %s up\n' "$SELF"
elif ! container_running "$NPM_CONTAINER_NAME"; then
printf 'Sein Container ist gestoppt:\n'
printf ' %s up\n' "$SELF"
else
printf 'Der Container laeuft, antwortet aber nicht auf Port %s.\n' "${port:-81}"
printf ' %s logs %s\n' "$SELF" "$NPM_CONTAINER_NAME"
printf ' %s npm-port (eingestellten Port pruefen)\n' "$SELF"
fi
elif [ "${port:-}" = 5000 ]; then
printf 'Das ist die Checkmk-Oberflaeche.\n'
if ! container_running "$CMK_CONTAINER_NAME"; then
printf 'Der Checkmk-Container laeuft nicht:\n %s up\n' "$SELF"
else
printf 'Der Container laeuft - Site gestartet?\n %s sites\n' "$SELF"
fi
else
printf 'Auf diesem Host lauscht nichts auf Port %s.\n' "${port:-80}"
printf ' ss -tlnp | grep %s\n' "${port:-80}"
fi ;;
*)
printf 'Externe Adressen brauchen Netzzugang vom Host aus\n'
printf '(der Container nutzt dessen Netzwerk direkt).\n'
printf ' curl -I %s\n' "$url" ;;
esac
}
cmd_browser() {
local engine="${BROWSER_ENGINE:-browsh}"
local url="" build="" build_only="" pull="" mono=""
local url="" build="" build_only="" pull="" mono="" nocheck=""
while [ $# -gt 0 ]; do
case "$1" in
-e|--engine) engine="$2"; shift 2 ;;
@@ -2354,6 +2414,7 @@ cmd_browser() {
--build-only) build=1; build_only=1; shift ;;
--pull) pull=1; shift ;;
--monochrome) mono=1; shift ;;
--no-check) nocheck=1; shift ;;
-h|--help)
cat <<'EOF'
cmk-manage.sh browser - Terminal-Browser im Container
@@ -2370,6 +2431,7 @@ cmk-manage.sh browser - Terminal-Browser im Container
--build-only Werkzeug-Image nur bauen (ohne Terminal, z.B. im Skript)
--pull Image der gewaehlten Engine neu laden
--monochrome nur bei browsh: einfarbige Darstellung
--no-check Startseite nicht vorab auf Erreichbarkeit pruefen
Bedienung browsh: Strg+L Adresszeile, Strg+T neuer Tab,
Strg+W Tab schliessen, Strg+Q beenden
@@ -2437,6 +2499,15 @@ EOF
Dafuer: $SELF browser --engine browsh" ;;
esac
# Nicht erreichbare Startseite ist die haeufigste Ursache fuer eine
# scheinbar haengende, schwarze Anzeige.
if [ -z "$nocheck" ] && ! browser_url_reachable "$url"; then
echo
warn "$(browser_diagnose_url "$url")"
echo
confirm "Trotzdem starten?" || die "Abgebrochen."
fi
log "Starte $engine im Host-Netzwerk -> $url"
[ "$engine" = browsh ] && log "Beenden mit Strg+Q, Adresszeile mit Strg+L."
@@ -3201,8 +3272,20 @@ Oberflaeche des Proxy Managers darstellen." \
[ -n "$u" ] && NPM_ADMIN_URL="$u" ;;
build) ui_run "Werkzeug-Image bauen" bash -c "cd '$PROJECT_DIR' && '$SELF' browser --build-only" || true ;;
back) return 0 ;;
*) gui_run_interactive cmd_browser --engine "$sel" \
--url "${NPM_ADMIN_URL:-http://127.0.0.1:81}" ;;
*) local burl="${NPM_ADMIN_URL:-http://127.0.0.1:81}"
if ! browser_url_reachable "$burl"; then
if ui_yesno "Startseite antwortet nicht" \
"$(browser_diagnose_url "$burl")
Trotzdem starten?
<Nein> kehrt ins Menue zurueck - dort laesst sich unter
'Andere Startseite eingeben' auch eine andere Adresse waehlen."; then
gui_run_interactive cmd_browser --engine "$sel" --url "$burl" --no-check
fi
continue
fi
gui_run_interactive cmd_browser --engine "$sel" --url "$burl" ;;
esac
done
}