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:
+188
-6
@@ -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 ;;
|
||||
|
||||
Reference in New Issue
Block a user