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
+9
View File
@@ -94,6 +94,15 @@ TZ=Europe/Berlin
# NGINX PROXY MANAGER (HTTPS: Let's Encrypt ODER selbstsigniert)
# =====================================================================
# Ebenfalls vollqualifiziert - siehe Hinweis oben zu Podman!
# Soll der Proxy-Manager-Container ueberhaupt betrieben werden?
# on = wird gebaut und gestartet (Vorgabe)
# off = wird weder angelegt noch gestartet - sinnvoll, wenn die
# HTTPS-Terminierung ein bereits vorhandener NGINX auf einem
# anderen System uebernimmt. Der leitet dann auf Port 5000 weiter.
# Die Daten unter ./data/npm bleiben beim Abschalten erhalten.
# Umschalten ueber das Menue oder: ./scripts/cmk-manage.sh npm-enable off
NPM_ENABLED=on
NPM_IMAGE=docker.io/jc21/nginx-proxy-manager:2
NPM_CONTAINER_NAME=nginx-proxy-manager
NPM_DISABLE_IPV6=true
+73 -1
View File
@@ -127,7 +127,7 @@ werden müssen.
| 80/tcp | NGINX Proxy Manager – HTTP, Let's-Encrypt-Challenge | Internet/LAN |
| 443/tcp | NGINX Proxy Manager – HTTPS | Internet/LAN |
| 81/tcp | NGINX Proxy Manager – **Adminoberfläche** (Vorgabe; per [`npm-port`](#12-adminoberfläche-auf-einen-anderen-port-legen) änderbar) | nur Admin-Netz! |
| 5000/tcp | Checkmk Apache (Backend) | **nur localhost** – nicht freigeben |
| 5000/tcp | Checkmk Apache (Backend) | **nur localhost** – nicht freigeben. Ausnahme: bei abgeschaltetem Proxy Manager ([12.4](#124-proxy-manager-ganz-abschalten-externer-nginx)) nur für die IP des externen Proxys |
| 8000/tcp | Checkmk Agent-Receiver (TLS-registrierte Agents) | überwachte Hosts |
| 6557/tcp | Livestatus (nur bei `CMK_LIVESTATUS_TCP=on`) | verteilte Sites |
@@ -550,6 +550,7 @@ Die wichtigsten Schalter:
| `CMK_LIVESTATUS_TCP` | `on` öffnet Port 6557 für verteilte Überwachung |
| `MAIL_RELAY_HOST` | SMTP-Relay für Benachrichtigungen |
| `TZ` | Zeitzone, z. B. `Europe/Berlin` |
| `NPM_ENABLED` | `on`/`off` – soll der Proxy-Manager-Container überhaupt laufen? Siehe [12.4](#124-proxy-manager-ganz-abschalten-externer-nginx) |
| `NPM_ADMIN_PORT` | Port der Proxy-Manager-Oberfläche (Vorgabe 81) – nur über `npm-port` bzw. das Menü ändern |
| `NPM_ADMIN_URL` | Startseite des Terminal-Browsers; leer = automatisch aus `NPM_ADMIN_PORT` |
| `BACKUP_DIR` | Ablage für Backups/Bundles (Vorgabe `./backups`) |
@@ -1168,6 +1169,75 @@ ein anderer Dienst lauscht.
> überflüssig – dann genügt die Umgebungsvariable. Bis dahin ist der
> Erweiterungspunkt der Weg, der ohne Änderung am Image auskommt.
### 12.4 Proxy Manager ganz abschalten (externer NGINX)
Wer die HTTPS-Terminierung schon anderweitig löst – etwa mit einem NGINX auf
einem vorgelagerten System – braucht den Container gar nicht. Dafür gibt es
einen Schalter:
```bash
sudo ./scripts/cmk-manage.sh npm-enable off # abschalten
sudo ./scripts/cmk-manage.sh npm-enable on # wieder einschalten
./scripts/cmk-manage.sh npm-enable # Stand anzeigen
```
In der Oberfläche steht er unter **Einstellungen → NGINX Proxy Manager →
„Proxy Manager betreiben"**, in der `.env` heißt er `NPM_ENABLED`.
**Was „aus" bedeutet:** Der Container wird gestoppt und entfernt, und bei
`up` gar nicht erst angelegt – `compose` bekommt dann nur noch den
Checkmk-Dienst genannt. Es wird also weder ein Image geladen noch ein
Container gebaut:
```
NPM_ENABLED=off -> docker compose up -d checkmk
NPM_ENABLED=on -> docker compose up -d checkmk nginx-proxy-manager
```
**Die Daten bleiben.** Konfiguration, Datenbank und Zertifikate liegen in den
Bind-Mounts `./data/npm/data` und `./data/npm/letsencrypt`, nicht im Container.
Vor dem Abschalten zeigt das Kommando beides mit Größe an; beim späteren
Einschalten wird die vorhandene Konfiguration samt Zertifikaten unverändert
wieder aufgenommen.
**Was danach zu tun ist:** Der externe Proxy leitet auf Port 5000 dieses Hosts
weiter. Der war bisher nur für localhost gedacht und muss jetzt – möglichst eng
begrenzt – für den Proxy erreichbar sein:
```bash
# firewalld
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=<proxy-ip> port port=5000 protocol=tcp accept'
sudo firewall-cmd --reload
# ufw
sudo ufw allow from <proxy-ip> to any port 5000 proto tcp
```
Im externen NGINX:
```nginx
location / {
proxy_pass http://<checkmk-host>: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;
}
```
Das passende Kommando samt Beispielkonfiguration gibt `npm-enable off` direkt
mit aus.
> **Der Agent-Receiver bleibt davon unberührt.** Die Agents sprechen Port 8000
> dieses Hosts direkt an, nicht den Proxy – der muss also weiterhin für die
> überwachten Systeme erreichbar sein.
> **Bei Quadlet** ([Kapitel 6, Variante B](#variante-b--podman-quadlet-ab-podman-44-ohne-compose))
> entfernt `install.sh --quadlet` die Unit `nginx-proxy-manager.container`,
> solange der Schalter auf `off` steht. Schaltet man ihn später ein, genügt ein
> erneutes `sudo ./install.sh --quadlet`.
---
## 13. Firewall
@@ -1260,6 +1330,7 @@ Eine Dateiauswahl mit Verzeichnisnavigation ist eingebaut.
| `browser [--engine …]` | Terminal-Browser im Container – Proxy Manager lokal bedienen |
| `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) |
| `cert …` | selbstsigniertes Zertifikat erzeugen |
| `shell` | Root-Shell im Checkmk-Container |
| `omd …` | beliebiges `omd`-Kommando im Container |
@@ -1661,6 +1732,7 @@ Checkmk-Werksnotizen (Werks/Release Notes) lesen.
| `podman-compose` nicht gefunden | EPEL aktivieren oder auf Quadlet umstellen (`./install.sh --quadlet`) |
| `This system is not registered with an entitlement server` | RHEL ohne Subskription – `dnf` liefert dann gar keine Pakete. Registrieren, Installations-DVD als Repository einbinden oder auf Rocky/Alma wechseln: [Abschnitt 5.1](#51-unregistriertes-rhel-woher-die-pakete-kommen) |
| `epel-release` lässt sich nicht installieren | EPEL setzt Red Hats Basis-Repositories voraus und ersetzt die Registrierung nicht. Ohne Subskription führt der Quadlet-Weg ohne `podman-compose` zum Ziel: [Kapitel 6, Variante B](#variante-b--podman-quadlet-ab-podman-44-ohne-compose) |
| Proxy-Manager-Container startet nicht mehr mit | Schalter steht auf `off`: `cmk-manage.sh npm-enable on`. Prüfen mit `cmk-manage.sh npm-enable` |
| 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` |
+72 -1
View File
@@ -131,7 +131,7 @@ agents.
| 80/tcp | NGINX Proxy Manager – HTTP, Let's Encrypt challenge | internet/LAN |
| 443/tcp | NGINX Proxy Manager – HTTPS | internet/LAN |
| 81/tcp | NGINX Proxy Manager – **admin interface** (default; changeable via [`npm-port`](#12-moving-the-admin-interface-to-a-different-port)) | admin network only! |
| 5000/tcp | Checkmk Apache (backend) | **localhost only** – do not expose |
| 5000/tcp | Checkmk Apache (backend) | **localhost only** – do not expose. Exception: with the Proxy Manager turned off ([12.4](#124-turning-the-proxy-manager-off-entirely-external-nginx)), open it for the external proxy's IP only |
| 8000/tcp | Checkmk agent receiver (TLS-registered agents) | monitored hosts |
| 6557/tcp | Livestatus (only with `CMK_LIVESTATUS_TCP=on`) | distributed sites |
@@ -553,6 +553,7 @@ The most important settings:
| `CMK_LIVESTATUS_TCP` | `on` opens port 6557 for distributed monitoring |
| `MAIL_RELAY_HOST` | SMTP relay for notifications |
| `TZ` | time zone, e.g. `Europe/Berlin` |
| `NPM_ENABLED` | `on`/`off` – should the Proxy Manager container run at all? See [12.4](#124-turning-the-proxy-manager-off-entirely-external-nginx) |
| `NPM_ADMIN_PORT` | port of the Proxy Manager interface (default 81) – change only via `npm-port` or the menu |
| `NPM_ADMIN_URL` | start page of the terminal browser; empty = derived from `NPM_ADMIN_PORT` |
| `BACKUP_DIR` | location for backups/bundles (default `./backups`) |
@@ -1173,6 +1174,74 @@ listening on the port you want.
> unnecessary – the environment variable will be enough. Until then, the
> extension point is the route that needs no change to the image.
### 12.4 Turning the Proxy Manager off entirely (external NGINX)
If HTTPS termination is already handled elsewhere – for instance by an NGINX on
an upstream system – the container is not needed at all. There is a switch for
that:
```bash
sudo ./scripts/cmk-manage.sh npm-enable off # turn off
sudo ./scripts/cmk-manage.sh npm-enable on # turn back on
./scripts/cmk-manage.sh npm-enable # show the current state
```
In the interface it is under **Einstellungen → NGINX Proxy Manager →
"Proxy Manager betreiben"**; in `.env` it is called `NPM_ENABLED`.
**What "off" means:** the container is stopped and removed, and is not created
by `up` in the first place – `compose` is only told about the Checkmk service.
So no image is pulled and no container is built:
```
NPM_ENABLED=off -> docker compose up -d checkmk
NPM_ENABLED=on -> docker compose up -d checkmk nginx-proxy-manager
```
**The data stays.** Configuration, database and certificates live in the bind
mounts `./data/npm/data` and `./data/npm/letsencrypt`, not inside the
container. Before turning it off, the command shows both with their sizes; when
you turn it back on, the existing configuration and certificates are picked up
unchanged.
**What to do afterwards:** the external proxy forwards to port 5000 of this
host. That port was meant for localhost only so far and now has to be reachable
for the proxy – as narrowly as possible:
```bash
# firewalld
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=<proxy-ip> port port=5000 protocol=tcp accept'
sudo firewall-cmd --reload
# ufw
sudo ufw allow from <proxy-ip> to any port 5000 proto tcp
```
In the external NGINX:
```nginx
location / {
proxy_pass http://<checkmk-host>: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;
}
```
`npm-enable off` prints the matching commands and this example configuration
for you.
> **The agent receiver is unaffected.** Agents talk to port 8000 of this host
> directly, not through the proxy – so it must stay reachable for the monitored
> systems.
> **With Quadlet** ([chapter 6, option B](#option-b--podman-quadlet-podman-44-and-newer-no-compose))
> `install.sh --quadlet` removes the `nginx-proxy-manager.container` unit while
> the switch is `off`. If you turn it on later, simply run
> `sudo ./install.sh --quadlet` again.
---
## 13. Firewall
@@ -1268,6 +1337,7 @@ A file chooser with directory navigation is built in.
| `browser [--engine …]` | terminal browser in a container – operate the Proxy Manager locally |
| `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) |
| `cert …` | create a self-signed certificate |
| `shell` | root shell in the Checkmk container |
| `omd …` | any `omd` command inside the container |
@@ -1672,6 +1742,7 @@ release notes beforehand.
| `podman-compose` not found | enable EPEL or switch to Quadlet (`./install.sh --quadlet`) |
| `This system is not registered with an entitlement server` | RHEL without a subscription – `dnf` then supplies no packages at all. Register, mount the installation DVD as a repository, or switch to Rocky/Alma: [section 5.1](#51-unregistered-rhel-where-the-packages-come-from) |
| `epel-release` cannot be installed | EPEL depends on Red Hat's base repositories and is no substitute for registering. Without a subscription, the Quadlet route without `podman-compose` gets you there: [chapter 6, option B](#option-b--podman-quadlet-podman-44-and-newer-no-compose) |
| Proxy Manager container no longer starts | the switch is `off`: `cmk-manage.sh npm-enable on`. Check with `cmk-manage.sh npm-enable` |
| 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` |
+12 -6
View File
@@ -242,10 +242,10 @@ fi
# systemd
# ---------------------------------------------------------------------
install_compose_unit() {
local compose_bin
detect_compose
compose_bin="${COMPOSE_CMD[*]}"
log "Verwendetes Compose-Kommando: ${COMPOSE_CMD[*]}"
# Die Unit ruft bewusst cmk-manage.sh auf statt compose direkt: nur so
# werden NPM_ENABLED und der Start aller Sites beruecksichtigt.
log "Richte systemd-Unit 'checkmk-stack.service' ein ..."
cat >/etc/systemd/system/checkmk-stack.service <<EOF
[Unit]
@@ -262,10 +262,10 @@ RemainAfterExit=yes
WorkingDirectory=$PROJECT_DIR
EnvironmentFile=$PROJECT_DIR/.env
TimeoutStartSec=0
ExecStart=/bin/sh -c '$compose_bin up -d'
ExecStart=$PROJECT_DIR/scripts/cmk-manage.sh -y up
ExecStartPost=$PROJECT_DIR/scripts/cmk-manage.sh start-all-sites
ExecStop=/bin/sh -c '$compose_bin down'
ExecReload=/bin/sh -c '$compose_bin up -d'
ExecStop=$PROJECT_DIR/scripts/cmk-manage.sh -y down
ExecReload=$PROJECT_DIR/scripts/cmk-manage.sh -y up
[Install]
WantedBy=multi-user.target
@@ -280,6 +280,12 @@ install_quadlet_units() {
[ -d /etc/containers/systemd ] || mkdir -p /etc/containers/systemd
local f
for f in "$PROJECT_DIR"/systemd/quadlet/*.container; do
# Proxy Manager abgeschaltet? Dann auch keine Unit dafuer.
if [ "$(basename "$f")" = "nginx-proxy-manager.container" ] && ! npm_enabled; then
log "NPM_ENABLED=off - ueberspringe nginx-proxy-manager.container"
rm -f /etc/containers/systemd/nginx-proxy-manager.container
continue
fi
sed -e "s|__PROJECT_DIR__|$PROJECT_DIR|g" \
-e "s|__CMK_IMAGE__|${CMK_IMAGE:-docker.io/checkmk/check-mk-raw:2.3.0-latest}|g" \
-e "s|__NPM_IMAGE__|${NPM_IMAGE:-docker.io/jc21/nginx-proxy-manager:2}|g" \
+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" ]; }