Weitere Sites anlegen und entfernen

Bisher liess sich eine zweite Site nur importieren, nicht anlegen - der
Entrypoint des Abbilds macht ausschliesslich die Site aus CMK_SITE_ID.
Absicht war das nicht, es fehlte schlicht.

  site-create NAME [--password PW] [--expose] [--no-start]
  site-delete NAME [--force]

Im Container laeuft "omd create --no-tmpfs"; ohne --no-tmpfs scheitert
es, weil sich dort kein tmpfs einhaengen laesst. Laeuft der Container
nicht im Host-Netz, wird der Apache der Site zusaetzlich auf 0.0.0.0
gebunden - im Host-Netz genuegt 127.0.0.1, und der Proxy kommt trotzdem
hin. Das wird am Container nachgesehen, nicht geraten.

Der eigentliche Punkt sind die Ports. omd vergibt sie selbst weiter, am
laufenden Container nachgemessen:

                 erste   zweite   dritte
  Oberflaeche     5000     5001     5002
  Agent-Receiver  8000     8001     8002
  Livestatus      6557     6558     6559

Die Agents einer zweiten Site sprechen also 8001 an, nicht 8000 - das
faellt sonst erst auf, wenn niemand Daten liefert. "site-create" gibt
deshalb beides fertig aus: den Proxy-Pfad mit der richtigen Portnummer
und den Firewall-Eintrag fuer den Receiver, dazu den Hinweis auf den
Standard-Server, falls er eingerichtet ist.

Beim Loeschen war "omd rm" zuerst wirkungslos: es fragt selbst nach, die
Site blieb stehen, waehrend hier Erfolg gemeldet wurde. Jetzt mit dem
globalen -f, und danach wird nachgesehen, ob sie wirklich weg ist. Die
Standard-Site ist geschuetzt - der Entrypoint legt sie ohnehin wieder
an.

In der Oberflaeche unter "Sites im Container verwalten": anlegen mit
Namens- und Kennwortabfrage, entfernen mit Rueckfrage.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-20 22:20:21 +02:00
co-authored by Claude Opus 5
parent 4456f8c3ea
commit 7d9ed10e09
3 changed files with 360 additions and 28 deletions
+220 -5
View File
@@ -75,6 +75,8 @@ KOMMANDOS - Sites
site-start SITE Site starten
site-stop SITE Site stoppen
start-all-sites alle vorhandenen Sites starten (fuer Autostart nach Reboot)
site-create NAME weitere Site im Container anlegen (eigene Ports)
site-delete NAME Site samt Daten entfernen
KOMMANDOS - Backup / Restore / Migration
backup [Optionen] Backup einer/aller Sites als .tar.gz-Bundle erzeugen
@@ -1883,6 +1885,169 @@ cmd_site_stop() {
# Wird vom systemd-Unit nach dem Start aufgerufen: alle Sites hochfahren.
# (Der Container-Entrypoint startet nur CMK_SITE_ID.)
# =====================================================================
# Weitere Sites anlegen und entfernen
#
# Der Entrypoint des Abbilds legt nur die Site aus CMK_SITE_ID an. Eine
# zweite entsteht mit "omd create" im Container - mit --no-tmpfs, denn
# ein tmpfs laesst sich dort nicht einhaengen.
#
# Die Ports vergibt omd selbst weiter: die zweite Site bekommt 5001
# statt 5000, den Agent-Receiver auf 8001 statt 8000 und Livestatus auf
# 6558. Das ist beim Proxy und bei der Firewall zu beachten - die
# Agents dieser Site sprechen 8001 an, nicht 8000.
# =====================================================================
# Einen Wert aus der site.conf lesen
site_conf_get() { # site schluessel
ct sh -c "sed -n \"s/^CONFIG_$2='\\(.*\\)'\$/\\1/p\" /omd/sites/$1/etc/omd/site.conf" 2>/dev/null
}
# Laeuft der Checkmk-Container im Host-Netz? Dann genuegt 127.0.0.1,
# denn der Proxy Manager liegt im selben Netz.
cmk_host_network() {
[ "$($RUNTIME container inspect -f '{{.HostConfig.NetworkMode}}' "$CMK_CONTAINER_NAME" 2>/dev/null)" = host ]
}
cmd_site_create() {
local name="" pass="" expose="" nostart=""
while [ $# -gt 0 ]; do
case "$1" in
--password) pass="$2"; shift 2 ;;
--expose) expose=1; shift ;;
--no-start) nostart=1; shift ;;
--help|-h)
cat <<EOF
Eine weitere Site im laufenden Container anlegen.
$SELF site-create zweite
$SELF site-create kunde2 --password geheim123
--password PW Kennwort fuer cmkadmin (sonst erzeugt omd eines und
zeigt es an)
--expose Apache der Site auf 0.0.0.0 binden. Noetig nur, wenn
der Container NICHT im Host-Netz laeuft - sonst
genuegt 127.0.0.1, und der Proxy kommt trotzdem hin.
--no-start nur anlegen, nicht starten
Die Ports vergibt omd selbst: die naechste Site bekommt 5001, den
Agent-Receiver auf 8001 und Livestatus auf 6558.
EOF
return 0 ;;
-*) die "Unbekannte Option fuer 'site-create': $1" ;;
*) name="$1"; shift ;;
esac
done
[ -n "$name" ] || die "Name fehlt: $SELF site-create <name>"
case "$name" in
*[!a-zA-Z0-9_]*) die "Ein Site-Name darf nur Buchstaben, Ziffern und _ enthalten." ;;
esac
[ "${#name}" -le 16 ] || die "Ein Site-Name darf hoechstens 16 Zeichen lang sein."
container_running "$CMK_CONTAINER_NAME" \
|| die "Der Container '$CMK_CONTAINER_NAME' laeuft nicht.
Starten: $SELF up"
if ct test -d "/omd/sites/$name" 2>/dev/null; then
die "Die Site '$name' gibt es schon. ('$SELF sites' zeigt alle)"
fi
local -a a=(omd create --no-tmpfs)
if [ -n "$pass" ]; then a+=(--admin-password "$pass"); fi
a+=("$name")
log "Lege Site '$name' an ..."
# Die Ausgabe von omd enthaelt das erzeugte Kennwort - sie gehoert
# dem Benutzer vor die Augen.
ct "${a[@]}" || die "'omd create' ist fehlgeschlagen."
# Ohne Host-Netz waere die Site von aussen nicht erreichbar
if [ -n "$expose" ] || ! cmk_host_network; then
log "Binde den Apache der Site auf 0.0.0.0 ..."
ct omd config "$name" set APACHE_TCP_ADDR 0.0.0.0 >/dev/null 2>&1 || true
fi
if [ -z "$nostart" ]; then
log "Starte Site '$name' ..."
ct omd start "$name" >/dev/null 2>&1 || warn "Die Site liess sich nicht starten."
fi
local port recv ls ip
port="$(site_conf_get "$name" APACHE_TCP_PORT)"
recv="$(site_conf_get "$name" AGENT_RECEIVER_PORT)"
ls="$(site_conf_get "$name" LIVESTATUS_TCP_PORT)"
ip="$(primary_ip)"
echo
ok "Site '$name' angelegt."
printf ' %-22s %s\n' "Oberflaeche (direkt)" "http://127.0.0.1:${port:-?}/$name/"
printf ' %-22s %s\n' "Agent-Receiver" "${recv:-?}"
printf ' %-22s %s\n' "Livestatus (falls an)" "${ls:-?}"
cat <<EOF
${C_BLD}Damit sie von aussen erreichbar wird${C_RST}
1) Pfad im Proxy anlegen - dann liegt sie neben der ersten Site:
$SELF proxy edit --domain <name-oder-id> --location /$name=127.0.0.1:${port:-5001}
$SELF proxy reload
Danach: https://${ip:-<ip>}/$name/
2) Die Agents dieser Site sprechen Port ${recv:-8001} an, nicht 8000.
In der Firewall ergaenzen:
$SELF config set FW_EXTRA_PORTS "${recv:-8001}/tcp=Agent-Receiver $name"
sudo $SELF firewall open --apply
3) Nach einem Neustart des Containers startet nur die Standard-Site.
Alle starten: $SELF start-all-sites
EOF
if grep -qsF "$NPM_DEF_START" "$(npm_custom_conf_path)" 2>/dev/null; then
log "Der Standard-Server fuer den IP-Zugang muss danach nachgezogen werden:
$SELF proxy default --domain <name> --restart"
fi
echo
return 0
}
cmd_site_delete() {
local name="" force=""
while [ $# -gt 0 ]; do
case "$1" in
--force) force=1; shift ;;
-*) die "Unbekannte Option fuer 'site-delete': $1" ;;
*) name="$1"; shift ;;
esac
done
[ -n "$name" ] || die "Name fehlt: $SELF site-delete <name>"
container_running "$CMK_CONTAINER_NAME" \
|| die "Der Container '$CMK_CONTAINER_NAME' laeuft nicht."
ct test -d "/omd/sites/$name" 2>/dev/null || die "Die Site '$name' gibt es nicht."
if [ "$name" = "${CMK_SITE_ID:-cmk}" ] && [ -z "$force" ]; then
die "'$name' ist die Standard-Site aus CMK_SITE_ID.
Der Entrypoint legt sie beim naechsten Start ohnehin neu an.
Wenn es wirklich sein soll: $SELF site-delete $name --force"
fi
warn "Die Site '$name' und ALLE ihre Daten werden entfernt."
printf ' Vorher ein Backup: %s backup --site %s\n' "$SELF" "$name"
confirm "Site '$name' wirklich loeschen?" || die "Abgebrochen."
log "Stoppe und entferne Site '$name' ..."
ct omd stop "$name" >/dev/null 2>&1 || true
# "omd rm" fragt selbst nach; das globale -f ueberspringt die Rueckfrage.
# Ohne das bleibt die Site stehen, waehrend hier Erfolg gemeldet wuerde.
ct omd -f rm --kill "$name" >/dev/null 2>&1 || true
if ct test -d "/omd/sites/$name" 2>/dev/null; then
err "Die Site '$name' ist noch da - 'omd rm' hat nicht durchgegriffen."
log "Von Hand nachsehen: $SELF omd -f rm --kill $name"
return 1
fi
ok "Site '$name' entfernt."
log "Einen Proxy-Pfad dafuer gibt es womoeglich noch:
$SELF proxy edit --domain <name> --del-location /$name"
return 0
}
cmd_start_all_sites() {
local tries=0
while ! container_running "$CMK_CONTAINER_NAME"; do
@@ -5604,16 +5769,51 @@ gui_backups_menu() {
done
}
gui_site_create() {
local name pass
name="$(ui_input "Weitere Site anlegen" \
"Name der neuen Site (Buchstaben, Ziffern, _ - hoechstens 16 Zeichen).
Sie bekommt eigene Ports: die naechste freie ab 5001 fuer die
Oberflaeche, ab 8001 fuer den Agent-Receiver. Beides muss danach im
Proxy bzw. in der Firewall nachgezogen werden - der Befehl sagt genau,
wie." "")" || return 0
[ -n "$name" ] || return 0
case "$name" in
*[!a-zA-Z0-9_]*) ui_msg "Ungueltig" "Erlaubt sind nur Buchstaben, Ziffern und _"; return 0 ;;
esac
if [ "${#name}" -gt 16 ]; then
ui_msg "Ungueltig" "Hoechstens 16 Zeichen."; return 0
fi
pass="$(ui_password "Weitere Site anlegen" "Kennwort fuer cmkadmin (leer = omd erzeugt eines):")" || return 0
local -a a=(site-create "$name")
if [ -n "$pass" ]; then a+=(--password "$pass"); fi
local f rc=0
f="$(mktemp)"
( NO_COLOR=1 cmd_site_create "${a[@]}" ) >"$f" 2>&1 || rc=$?
if [ "$rc" -eq 0 ]; then
ui_text "Site '$name' angelegt" "$f"
else
ui_text "Anlegen fehlgeschlagen" "$f"
fi
rm -f "$f"
return 0
}
gui_sites_menu() {
gui_need_container || return 0
while :; do
local sel
sel="$(ui_menu "Sites" "Sites im Container '$CMK_CONTAINER_NAME'" \
list "Sites anzeigen" \
start "Site starten" \
stop "Site stoppen" \
all "alle Sites starten" \
back "zurueck")" || return 0
list "Sites anzeigen" \
neu "Weitere Site anlegen (eigene Ports)" \
start "Site starten" \
stop "Site stoppen" \
all "alle Sites starten" \
loesch "Site samt Daten entfernen" \
back "zurueck")" || return 0
case "$sel" in
list) local f; f="$(mktemp)"; ( cmd_sites ) >"$f" 2>&1 || true; ui_text "Sites" "$f"; rm -f "$f" ;;
start) local s; s="$(gui_pick_site)" || continue; [ -n "$s" ] || continue
@@ -5621,6 +5821,19 @@ gui_sites_menu() {
stop) local s2; s2="$(gui_pick_site)" || continue; [ -n "$s2" ] || continue
ui_run "Site stoppen" bash -c "cd '$PROJECT_DIR' && '$SELF' $SELF_ENV site-stop '$s2'" ;;
all) ui_run "Alle Sites starten" bash -c "cd '$PROJECT_DIR' && '$SELF' $SELF_ENV start-all-sites" ;;
neu) gui_site_create || true ;;
loesch) local s3; s3="$(gui_pick_site)" || continue; [ -n "$s3" ] || continue
if [ "$s3" = "${CMK_SITE_ID:-cmk}" ]; then
ui_msg "Standard-Site" "'$s3' ist die Site aus CMK_SITE_ID.
Der Entrypoint legt sie beim naechsten Start ohnehin neu an -
loeschen bringt hier nichts."
continue
fi
ui_yesno "Site entfernen" "Die Site '$s3' und ALLE ihre Daten entfernen?
Vorher ein Backup: backup --site $s3" || continue
ui_run "Site entfernen" bash -c "cd '$PROJECT_DIR' && '$SELF' $SELF_ENV -y site-delete '$s3'" ;;
back) return 0 ;;
esac
done
@@ -7964,6 +8177,8 @@ main() {
site-start) cmd_site_start "$@" ;;
site-stop) cmd_site_stop "$@" ;;
start-all-sites) cmd_start_all_sites ;;
site-create) cmd_site_create "$@" ;;
site-delete|site-rm) cmd_site_delete "$@" ;;
backup) cmd_backup "$@" || true ;;
list) cmd_list || true ;;
prune) cmd_prune "$@" || true ;;