Liefert eine fremde Stelle das Zertifikat in ein Verzeichnis und
ersetzt es dort beim Erneuern - gleicher Dateiname, neuer Inhalt -,
passt der uebliche Weg nicht: der Proxy Manager kopiert hochgeladene
Zertifikate nach /data/custom_ssl/npm-<id>/ und bekommt von einer
ersetzten Datei nichts mit.
Das Verzeichnis wird deshalb schreibgeschuetzt als /certs in den
Container gehaengt (neuer Mount in der compose-Datei, Vorgabe
./data/npm/external-certs), und "cert external" ersetzt die beiden
Dateien unter custom_ssl durch Verweise darauf. Am Abbild
jc21/nginx-proxy-manager:2 nachgemessen: nginx liefert danach das
externe Zertifikat, und ein Austausch der Datei wirkt - allerdings erst
nach einem Neuladen.
Genau das ist der Haken, und er ist belegt: ohne Neuladen liefert nginx
weiterhin das alte Zertifikat. Dafuer gibt es
cert external --refresh vergleicht den SHA256-Fingerabdruck mit
dem zuletzt gesehenen und laedt nur bei
Aenderung neu
cert external --watch on traegt das als taeglichen cron-Eintrag ein
Vor dem Umstellen wird geprueft, ob beide Dateien lesbar sind, ob
Zertifikat und Schluessel zusammengehoeren (Vergleich der oeffentlichen
Schluessel - das faengt auch EC-Schluessel) und wie lange es noch gilt.
Beide Faelle sind durchgespielt: ein fremder Schluessel wird abgelehnt,
ein in fuenf Tagen ablaufendes Zertifikat gemeldet.
"cert external --off --id N" nimmt es zurueck und legt wieder eigene
Kopien an. In der Oberflaeche ist aus dem Menuepunkt "Zertifikat" ein
kleines Menue geworden.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
81 lines
3.7 KiB
YAML
81 lines
3.7 KiB
YAML
# =====================================================================
|
|
# Checkmk + NGINX Proxy Manager
|
|
# Funktioniert identisch mit: docker compose | podman-compose
|
|
#
|
|
# - Beide Dienste laufen im Host-Netzwerk -> keine "ports:"-Definition
|
|
# - Ausschliesslich Bind-Mounts nach ./data -> keine named volumes
|
|
# =====================================================================
|
|
|
|
services:
|
|
|
|
# -------------------------------------------------------------------
|
|
# Checkmk (OMD) - im Host-Netzwerk
|
|
# Port 5000 = Web-GUI (wird vom NGINX Proxy Manager als Backend genutzt)
|
|
# Port 8000 = Agent-Receiver (cmk-agent-ctl / TLS-registrierte Agents)
|
|
# Port 6557 = Livestatus (nur wenn CMK_LIVESTATUS_TCP=on)
|
|
# -------------------------------------------------------------------
|
|
checkmk:
|
|
# Vollqualifizierter Name! Wird aus der .env genommen und ggf. von
|
|
# "cmk-manage.sh image ..." dort eingetragen. Kurze Namen wuerde Podman
|
|
# ueber unqualified-search-registries aufloesen (auf RHEL zuerst
|
|
# registry.access.redhat.com) und das Image nicht finden.
|
|
image: ${CMK_IMAGE:-docker.io/checkmk/check-mk-raw:2.3.0-latest}
|
|
container_name: ${CMK_CONTAINER_NAME:-checkmk}
|
|
hostname: ${CMK_HOSTNAME:-checkmk}
|
|
network_mode: host
|
|
restart: unless-stopped
|
|
stop_grace_period: 120s
|
|
environment:
|
|
CMK_SITE_ID: ${CMK_SITE_ID:-cmk}
|
|
CMK_PASSWORD: ${CMK_PASSWORD:-}
|
|
CMK_LIVESTATUS_TCP: ${CMK_LIVESTATUS_TCP:-off}
|
|
MAIL_RELAY_HOST: ${MAIL_RELAY_HOST:-}
|
|
TZ: ${TZ:-Europe/Berlin}
|
|
volumes:
|
|
# Kompletter OMD-Datenbestand als Bind-Mount im Projektverzeichnis
|
|
- ${CMK_DATA_DIR:-./data/checkmk/sites}:/omd/sites:Z
|
|
- /etc/localtime:/etc/localtime:ro
|
|
ulimits:
|
|
nofile:
|
|
soft: 65536
|
|
hard: 65536
|
|
# ---------------------------------------------------------------
|
|
# Optional: tmpfs fuer das Site-tmp-Verzeichnis (Performance).
|
|
# Bewusst deaktiviert, weil uid/gid der Site nach einem Import
|
|
# abweichen koennen und das tmpfs dann falsch gemountet waere.
|
|
# Bei einer frisch angelegten Site ist uid/gid=1000 korrekt:
|
|
# ---------------------------------------------------------------
|
|
# tmpfs:
|
|
# - /opt/omd/sites/${CMK_SITE_ID:-cmk}/tmp:uid=1000,gid=1000
|
|
|
|
# -------------------------------------------------------------------
|
|
# NGINX Proxy Manager - ebenfalls Host-Netzwerk
|
|
# Port 80 = HTTP + Let's-Encrypt HTTP-01 Challenge
|
|
# Port 443 = HTTPS
|
|
# Port 81 = Admin-Oberflaeche (unbedingt per Firewall einschraenken!)
|
|
# -------------------------------------------------------------------
|
|
nginx-proxy-manager:
|
|
image: ${NPM_IMAGE:-docker.io/jc21/nginx-proxy-manager:2}
|
|
container_name: ${NPM_CONTAINER_NAME:-nginx-proxy-manager}
|
|
network_mode: host
|
|
restart: unless-stopped
|
|
environment:
|
|
DISABLE_IPV6: ${NPM_DISABLE_IPV6:-true}
|
|
TZ: ${TZ:-Europe/Berlin}
|
|
# Legt das erste Administratorkonto an - aber NUR beim allerersten
|
|
# Start mit leerer Datenbank. Ohne diese beiden Werte zeigt der
|
|
# Proxy Manager stattdessen einen Einrichtungsassistenten, und die
|
|
# REST-API laesst sich nicht ohne Weiteres nutzen.
|
|
INITIAL_ADMIN_EMAIL: ${NPM_ADMIN_EMAIL:-}
|
|
INITIAL_ADMIN_PASSWORD: ${NPM_ADMIN_PASSWORD:-}
|
|
volumes:
|
|
- ${NPM_DATA_DIR:-./data/npm/data}:/data:Z
|
|
- ${NPM_LE_DIR:-./data/npm/letsencrypt}:/etc/letsencrypt:Z
|
|
# Verzeichnis fuer ein von aussen geliefertes Zertifikat. Wird es
|
|
# dort ersetzt, zeigen die Dateien unter /data/custom_ssl darauf -
|
|
# siehe "cmk-manage.sh cert external". Schreibgeschuetzt, denn der
|
|
# Container hat dort nichts zu suchen.
|
|
- ${CERT_EXTERNAL_DIR:-./data/npm/external-certs}:/certs:ro
|
|
depends_on:
|
|
- checkmk
|