Schalter: NGINX Proxy Manager abschaltbar (externer NGINX)

Wer die HTTPS-Terminierung bereits mit einem NGINX auf einem anderen
System loest, braucht den Container nicht. NPM_ENABLED=off sorgt dafuer,
dass er gar nicht erst angelegt wird: compose bekommt dann nur noch den
Checkmk-Dienst genannt.

    NPM_ENABLED=off  ->  compose up -d checkmk
    NPM_ENABLED=on   ->  compose up -d checkmk nginx-proxy-manager

Das gilt auch fuer "pull" - abgeschaltet wird nicht einmal das Image
geladen. Beim Abschalten wird ein vorhandener Container gestoppt UND
entfernt, damit ihn weder eine Restart-Regel noch ein Reboot wieder
hochzieht.

Die Daten bleiben in jedem Fall erhalten: Konfiguration, Datenbank und
Zertifikate liegen in den Bind-Mounts unter ./data/npm, nicht im
Container. Vor dem Abschalten werden beide Verzeichnisse mit Groesse
angezeigt; beim Einschalten wird die vorhandene Konfiguration samt
Zertifikaten unveraendert wieder aufgenommen.

Bedienung:
  - Menuepunkt "Proxy Manager betreiben" unter Einstellungen -> npm
  - cmk-manage.sh npm-enable [on|off]   (ohne Argument: Stand anzeigen)
  - config set NPM_ENABLED off

"npm-enable off" gibt gleich die noetige Firewall-Regel und eine
Beispielkonfiguration fuer den externen NGINX aus - Port 5000 muss dann
fuer dessen IP erreichbar sein. Der Agent-Receiver auf Port 8000 ist
davon nicht betroffen, den sprechen die Agents ohnehin direkt an.

Damit der Schalter auch nach einem Reboot gilt, ruft die von install.sh
erzeugte systemd-Unit jetzt cmk-manage.sh auf statt compose direkt.
Bei Quadlet wird die Unit nginx-proxy-manager.container uebersprungen
und entfernt, solange der Schalter auf "off" steht.

Verifiziert mit einem compose-Stub, dass in beiden Schalterstellungen
genau die erwarteten Dienste uebergeben werden, sowie ueber das Menue.
Dokumentiert als Abschnitt 12.4 in beiden Sprachfassungen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 15:11:55 +02:00
co-authored by Claude Opus 5
parent 3dd59fb973
commit 4bbd1de4f6
6 changed files with 363 additions and 14 deletions
+188 -6
View File
@@ -120,6 +120,11 @@ KOMMANDOS - Konfiguration
config edit .env im Editor oeffnen
npm-port [PORT] Port der Proxy-Manager-Oberflaeche
(ohne PORT: aktuellen Stand anzeigen)
npm-enable [on|off] NGINX Proxy Manager ein-/ausschalten.
"off" stoppt und entfernt den Container,
die Daten unter ./data/npm bleiben erhalten
(fuer den Fall, dass ein anderer NGINX die
HTTPS-Terminierung uebernimmt)
KOMMANDOS - Lokale Bedienung ohne externen Zugriff
browser [Optionen] Terminal-Browser im Container starten, um den
@@ -968,17 +973,44 @@ cmd_image() {
# =====================================================================
# Stack-Kommandos
# =====================================================================
# Welche compose-Dienste sollen laufen? Der Proxy Manager ist abschaltbar,
# damit ein bereits vorhandener NGINX auf einem anderen System genutzt
# werden kann. Abgeschaltet wird sein Container gar nicht erst angelegt.
compose_services() {
if npm_enabled; then
printf '%s\n' checkmk nginx-proxy-manager
else
printf '%s\n' checkmk
fi
}
cmd_up() {
[ -f "$PROJECT_DIR/.env" ] || die "Keine .env vorhanden. Bitte: cp .env.example .env && \$EDITOR .env"
log "Starte Stack (${RUNTIME}) ..."
compose up -d
local -a svc=(); mapfile -t svc < <(compose_services)
if npm_enabled; then
log "Starte Stack (${RUNTIME}) ..."
else
log "Starte Stack (${RUNTIME}) - ohne NGINX Proxy Manager (NPM_ENABLED=off) ..."
fi
compose up -d "${svc[@]}"
npm_enabled || npm_teardown_container
ok "Stack gestartet."
cmd_status
}
cmd_down() { log "Stoppe Stack ..."; compose down; ok "Stack gestoppt."; }
cmd_restart() { compose down || true; compose up -d; ok "Stack neu gestartet."; }
cmd_pull() { compose pull; ok "Images aktualisiert. Danach: $0 up"; }
cmd_restart() {
compose down || true
local -a svc=(); mapfile -t svc < <(compose_services)
compose up -d "${svc[@]}"
npm_enabled || npm_teardown_container
ok "Stack neu gestartet."
}
cmd_pull() {
local -a svc=(); mapfile -t svc < <(compose_services)
compose pull "${svc[@]}"
ok "Images aktualisiert. Danach: $SELF up"
}
cmd_logs() { compose logs "$@"; }
cmd_shell() { require_cmk_running; $RUNTIME exec -it "$CMK_CONTAINER_NAME" bash; }
cmd_omd() { require_cmk_running; $RUNTIME exec -it "$CMK_CONTAINER_NAME" omd "$@"; }
@@ -991,6 +1023,10 @@ cmd_status() {
printf '\n%sContainer%s\n' "$C_BLD" "$C_RST"
local c
for c in "$CMK_CONTAINER_NAME" "$NPM_CONTAINER_NAME"; do
if [ "$c" = "$NPM_CONTAINER_NAME" ] && ! npm_enabled; then
printf ' %-24s %s\n' "$c" "${C_YEL}abgeschaltet (NPM_ENABLED=off)${C_RST}"
continue
fi
if container_exists "$c"; then
printf ' %-24s %s\n' "$c" \
"$(container_running "$c" && echo "${C_GRN}laeuft${C_RST}" || echo "${C_RED}gestoppt${C_RST}")"
@@ -1013,9 +1049,14 @@ cmd_status() {
printf '\n%sZugang%s\n' "$C_BLD" "$C_RST"
local ip; ip="$(primary_ip)"
printf ' Checkmk (direkt) : http://%s:5000/%s/\n' "$ip" "$CMK_SITE_ID"
printf ' Checkmk (ueber Proxy) : https://<FQDN>/%s/\n' "$CMK_SITE_ID"
printf ' Agent-Receiver : %s:8000\n' "$ip"
printf ' NGINX Proxy Manager : http://%s:%s/ (Erstlogin: admin@example.com / changeme)\n\n' "$ip" "${NPM_ADMIN_PORT:-81}"
if npm_enabled; then
printf ' Checkmk (ueber Proxy) : https://<FQDN>/%s/\n' "$CMK_SITE_ID"
printf ' NGINX Proxy Manager : http://%s:%s/ (Erstlogin: admin@example.com / changeme)\n\n' "$ip" "${NPM_ADMIN_PORT:-81}"
else
printf ' NGINX Proxy Manager : abgeschaltet\n'
printf ' Externer Proxy weiterleiten auf http://%s:5000\n\n' "$ip"
fi
}
# =====================================================================
@@ -1416,6 +1457,134 @@ cmd_import() {
fi
}
# =====================================================================
# NGINX Proxy Manager ein-/ausschalten
#
# Wer bereits einen NGINX auf einem anderen System betreibt, braucht den
# Container nicht. Abgeschaltet wird er weder gebaut noch gestartet -
# "compose up" bekommt dann nur noch den Checkmk-Dienst genannt.
#
# Die Daten unter ./data/npm bleiben in jedem Fall erhalten: sie liegen
# in Bind-Mounts, nicht im Container. Ein spaeteres Einschalten nimmt
# die vorhandene Konfiguration samt Zertifikaten wieder auf.
# =====================================================================
# Container entfernen (nicht die Daten!), damit ihn keine Restart-Regel
# und kein Reboot wieder hochzieht.
npm_teardown_container() {
container_exists "$NPM_CONTAINER_NAME" || return 0
if container_running "$NPM_CONTAINER_NAME"; then
log "Stoppe '$NPM_CONTAINER_NAME' ..."
$RUNTIME stop "$NPM_CONTAINER_NAME" >/dev/null 2>&1 || true
fi
log "Entferne den Container '$NPM_CONTAINER_NAME' (die Daten bleiben)."
$RUNTIME rm -f "$NPM_CONTAINER_NAME" >/dev/null 2>&1 || true
}
npm_data_summary() {
local d="${NPM_DATA_DIR:-$PROJECT_DIR/data/npm/data}"
case "$d" in /*) : ;; *) d="$PROJECT_DIR/${d#./}" ;; esac
local le="${NPM_LE_DIR:-$PROJECT_DIR/data/npm/letsencrypt}"
case "$le" in /*) : ;; *) le="$PROJECT_DIR/${le#./}" ;; esac
printf ' Konfiguration/DB : %s (%s)\n' "$d" "$([ -d "$d" ] && du -sh "$d" 2>/dev/null | cut -f1 || echo 'leer')"
printf ' Zertifikate : %s (%s)\n' "$le" "$([ -d "$le" ] && du -sh "$le" 2>/dev/null | cut -f1 || echo 'leer')"
}
cmd_npm_enable() {
local want=""
while [ $# -gt 0 ]; do
case "$1" in
on|an|true|1|yes|ja) want=on; shift ;;
off|aus|false|0|no|nein) want=off; shift ;;
-h|--help)
cat <<'EOF'
cmk-manage.sh npm-enable [on|off]
Schaltet den NGINX Proxy Manager ein oder aus. Ohne Angabe wird der
aktuelle Stand gezeigt.
off Container wird gestoppt und entfernt und bei "up" nicht mehr
angelegt. Die Daten unter ./data/npm bleiben erhalten.
Sinnvoll, wenn die HTTPS-Terminierung ein anderer NGINX uebernimmt -
der leitet dann auf http://<dieser-host>:5000 weiter.
on Container wird wieder gebaut und gestartet, mit der vorhandenen
Konfiguration und den vorhandenen Zertifikaten.
EOF
return 0 ;;
*) die "Unbekanntes Argument fuer npm-enable: $1 (on|off)" ;;
esac
done
if [ -z "$want" ]; then
printf '\n%sNGINX Proxy Manager%s\n' "$C_BLD" "$C_RST"
printf ' Schalter : %s\n' "$(npm_enabled && echo 'ein (NPM_ENABLED=on)' || echo 'aus (NPM_ENABLED=off)')"
if container_exists "$NPM_CONTAINER_NAME"; then
printf ' Container : %s\n' "$(container_running "$NPM_CONTAINER_NAME" && echo laeuft || echo gestoppt)"
else
printf ' Container : nicht vorhanden\n'
fi
printf '\n%sVorhandene Daten%s\n' "$C_BLD" "$C_RST"
npm_data_summary
echo
return 0
fi
if [ "$want" = off ]; then
npm_enabled || { ok "Der Proxy Manager ist bereits abgeschaltet."; return 0; }
printf '\n%sDiese Daten bleiben erhalten%s\n' "$C_BLD" "$C_RST"
npm_data_summary
echo
confirm "Den NGINX Proxy Manager jetzt abschalten?" || die "Abgebrochen."
env_set NPM_ENABLED off
NPM_ENABLED=off
npm_teardown_container
ok "Abgeschaltet. Bei 'up' wird der Container nicht mehr angelegt."
local ip; ip="$(primary_ip)"
cat <<EOF
${C_BLD}Weiterleitung vom externen NGINX${C_RST}
Ziel : http://$ip:5000
Agent-Receiver : $ip:8000 (muss fuer die Agents erreichbar bleiben)
Port 5000 ist bisher nur fuer localhost gedacht. Er muss jetzt fuer den
externen Proxy erreichbar sein - moeglichst eng begrenzt:
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=<proxy-ip> port port=5000 protocol=tcp accept'
ufw allow from <proxy-ip> to any port 5000 proto tcp
Im externen NGINX (Beispiel):
location / {
proxy_pass http://$ip:5000;
proxy_set_header Host \$host;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
client_max_body_size 0;
proxy_read_timeout 300s;
}
EOF
return 0
fi
# --- einschalten ---
if npm_enabled && container_running "$NPM_CONTAINER_NAME"; then
ok "Der Proxy Manager laeuft bereits."
return 0
fi
env_set NPM_ENABLED on
NPM_ENABLED=on
log "Starte den NGINX Proxy Manager ..."
if compose up -d nginx-proxy-manager; then
ok "Eingeschaltet."
printf '\n%sVorhandene Daten wurden uebernommen%s\n' "$C_BLD" "$C_RST"
npm_data_summary
printf '\n Oberflaeche: http://%s:%s/\n\n' "$(primary_ip)" "${NPM_ADMIN_PORT:-81}"
else
err "Der Container konnte nicht gestartet werden."
log "Pruefen: $SELF logs nginx-proxy-manager"
return 1
fi
}
# =====================================================================
# Admin-Port des NGINX Proxy Managers
#
@@ -1544,6 +1713,10 @@ EOF
valid_port "$port" || die "'$port' ist keine gueltige Portnummer (1-65535)."
npm_enabled || warn "Der NGINX Proxy Manager ist abgeschaltet (NPM_ENABLED=off).
Die Einstellung wird gespeichert, wirkt aber erst nach dem Einschalten:
$SELF npm-enable on"
case "$port" in
80|443) die "Port $port wird vom Proxy Manager bereits fuer HTTP/HTTPS genutzt." ;;
5000) die "Port 5000 gehoert der Checkmk-Oberflaeche." ;;
@@ -1621,6 +1794,7 @@ checkmk|CMK_CONTAINER_NAME|text|Containername Checkmk||
checkmk|CMK_HOSTNAME|text|Hostname im Container||
checkmk|CMK_LIVESTATUS_TCP|choice|Livestatus ueber TCP (Port 6557)|off:on|
checkmk|MAIL_RELAY_HOST|text|SMTP-Relay fuer Benachrichtigungen||1
npm|NPM_ENABLED|choice|Proxy Manager betreiben|on:off|
npm|NPM_ADMIN_PORT|port|Port der Adminoberflaeche||
npm|NPM_IMAGE|text|Image des Proxy Managers||
npm|NPM_CONTAINER_NAME|text|Containername Proxy Manager||
@@ -1716,6 +1890,9 @@ settings_post_set() {
NPM_ADMIN_PORT)
# Der nginx-Zusatzblock muss mitgezogen werden
cmd_npm_port "$val" ;;
NPM_ENABLED)
# Container entsprechend entfernen bzw. starten
cmd_npm_enable "$val" ;;
CMK_IMAGE|CMK_SITE_ID|CMK_CONTAINER_NAME|NPM_IMAGE|NPM_CONTAINER_NAME|TZ|CMK_LIVESTATUS_TCP|NPM_DISABLE_IPV6|CMK_DATA_DIR|NPM_DATA_DIR|NPM_LE_DIR)
log "Wirksam nach: $SELF up (Container werden neu erstellt)" ;;
esac
@@ -1755,6 +1932,8 @@ cmd_config() {
fi
if [ "$key" = NPM_ADMIN_PORT ]; then
cmd_npm_port "$val"
elif [ "$key" = NPM_ENABLED ]; then
cmd_npm_enable "$val"
else
env_set "$key" "$val" "$opt"
ok "$key=$val"
@@ -2329,6 +2508,8 @@ gui_settings_edit() {
if [ "$key" = NPM_ADMIN_PORT ]; then
ui_run "Admin-Port setzen" bash -c "cd '$PROJECT_DIR' && '$SELF' -y npm-port '$new'"
elif [ "$key" = NPM_ENABLED ]; then
ui_run "Proxy Manager ${new}schalten" bash -c "cd '$PROJECT_DIR' && '$SELF' -y npm-enable '$new'"
else
env_set "$key" "$new" "$opt"
local hint=""
@@ -2510,6 +2691,7 @@ main() {
image) cmd_image "$@" ;;
browser) cmd_browser "$@" ;;
npm-port) cmd_npm_port "$@" ;;
npm-enable) cmd_npm_enable "$@" ;;
config) cmd_config "$@" ;;
help|-h|--help) usage ;;
*) err "Unbekanntes Kommando: $cmd"; echo; usage; exit 1 ;;
+9
View File
@@ -43,6 +43,7 @@ load_env() {
NPM_CONTAINER_NAME="${NPM_CONTAINER_NAME:-nginx-proxy-manager}"
CMK_SITE_ID="${CMK_SITE_ID:-cmk}"
CMK_IMAGE="${CMK_IMAGE:-docker.io/checkmk/check-mk-raw:2.3.0-latest}"
NPM_ENABLED="${NPM_ENABLED:-on}"
NPM_ADMIN_PORT="${NPM_ADMIN_PORT:-81}"
# Leer = automatisch aus dem Admin-Port ableiten
NPM_ADMIN_URL="${NPM_ADMIN_URL:-http://127.0.0.1:$NPM_ADMIN_PORT}"
@@ -133,6 +134,14 @@ compose() {
# ---------------------------------------------------------------------
# Container-Helfer
# ---------------------------------------------------------------------
# Ist der NGINX Proxy Manager eingeschaltet? (on/true/1/yes = ja)
npm_enabled() {
case "$(printf '%s' "${NPM_ENABLED:-on}" | tr 'A-Z' 'a-z')" in
on|true|1|yes|ja|y) return 0 ;;
*) return 1 ;;
esac
}
container_exists() { $RUNTIME container inspect "$1" >/dev/null 2>&1; }
container_running() { [ "$($RUNTIME container inspect -f '{{.State.Running}}' "$1" 2>/dev/null)" = "true" ]; }