# Checkmk im Container – Docker (Debian) & Podman (RHEL) mit NGINX Proxy Manager Vollständige, produktionstaugliche Container-Installation von **Checkmk** mit **NGINX Proxy Manager** als HTTPS-Terminierung (Let's Encrypt *oder* selbstsigniert), inklusive Werkzeugen für **Backup**, **Restore** und die **Migration bestehender Sites von einer Direktinstallation** – ohne dass die Agents neu eingerichtet werden müssen. --- ## Inhaltsverzeichnis 1. [Überblick & Architektur](#1-überblick--architektur) 2. [Verzeichnisstruktur](#2-verzeichnisstruktur) 3. [Voraussetzungen & Ports](#3-voraussetzungen--ports) 4. [Installation auf Debian/Ubuntu (Docker)](#4-installation-auf-debianubuntu-docker) 5. [Installation auf RHEL/Rocky/Alma/Fedora (Podman)](#5-installation-auf-rhelrockyalmafedora-podman) 6. [Autostart nach einem Neustart des Hosts (Podman)](#6-autostart-nach-einem-neustart-des-hosts-podman) 7. [Konfiguration (`.env`)](#7-konfiguration-env) 8. [Erststart](#8-erststart) 9. [HTTPS einrichten – Let's Encrypt oder selbstsigniert](#9-https-einrichten--lets-encrypt-oder-selbstsigniert) 10. [Firewall](#10-firewall) 11. [Verwaltung: `cmk-manage.sh` (CLI und ncurses-Oberfläche)](#11-verwaltung-cmk-managesh) 12. [Backup](#12-backup) 13. [Restore](#13-restore) 14. [Migration einer Direktinstallation (`migrate_creator.sh`)](#14-migration-einer-direktinstallation-migrate_creatorsh) 15. [Mehrere Sites in einem Container](#15-mehrere-sites-in-einem-container) 16. [Checkmk aktualisieren](#16-checkmk-aktualisieren) 17. [Fehlersuche](#17-fehlersuche) 18. [Sicherheitshinweise](#18-sicherheitshinweise) 19. [Deinstallation](#19-deinstallation) --- ## 1. Überblick & Architektur ``` Internet / LAN | :80 :443 :81 | +-----------------------------------+ | NGINX Proxy Manager (Container) | network_mode: host | - Let's Encrypt ODER self-signed | | - Weboberfläche auf Port 81 | +-----------------------------------+ | http://127.0.0.1:5000 v +-----------------------------------+ | Checkmk / OMD (Container) | network_mode: host | :5000 Web-GUI (Apache) | | :8000 Agent-Receiver | <-- Agents (cmk-agent-ctl) | :6557 Livestatus (optional) | +-----------------------------------+ | Bind-Mount: ./data/checkmk/sites -> /omd/sites ``` **Bewusste Entwurfsentscheidungen** | Punkt | Umsetzung | Grund | |---|---|---| | Checkmk im Host-Netzwerk | `network_mode: host`, **keine** `ports:`-Angaben | Agents, SNMP-Traps, ICMP und der Agent-Receiver arbeiten ohne NAT; die Quell-IP der überwachten Hosts bleibt erhalten | | NGINX Proxy Manager ebenfalls im Host-Netzwerk | `network_mode: host` | erreicht das Checkmk-Backend direkt über `127.0.0.1:5000`; kein Bridge-Netz, keine `host-gateway`-Tricks nötig – funktioniert unter Docker **und** Podman identisch | | Keine Named Volumes | ausschließlich **Bind-Mounts** nach `./data/` | alle Daten liegen sichtbar im Projektverzeichnis, einfach zu sichern, zu kopieren und zu prüfen | | Eine Compose-Datei für beides | `docker compose` und `podman-compose` | identische Bedienung auf Debian und RHEL | | `:Z` an den Bind-Mounts | SELinux-Relabeling | nötig unter RHEL; unter Debian/Docker wirkungslos (kein Fehler) | --- ## 2. Verzeichnisstruktur ``` . ├── README.md ├── docker-compose.yml # für Docker UND Podman ├── .env.example # Vorlage -> .env ├── install.sh # Installation Docker (Debian) / Podman (RHEL) │ ├── scripts/ │ ├── cmk-manage.sh # Stack, Backup, Restore, Import + ncurses-GUI │ ├── migrate_creator.sh # -> auf den QUELLSERVER kopieren │ └── lib/ │ └── common.sh # gemeinsame Funktionen + TUI-Helfer │ ├── systemd/ │ ├── checkmk-stack.service.example # Compose-basierte Unit (Autostart) │ └── quadlet/ │ ├── checkmk.container # Podman-Quadlet (Alternative) │ └── nginx-proxy-manager.container │ ├── data/ # ALLE Nutzdaten (Bind-Mounts) │ ├── checkmk/sites/ # -> /omd/sites (komplette OMD-Sites) │ └── npm/ │ ├── data/ # -> /data (NPM-Konfiguration/DB) │ ├── letsencrypt/ # -> /etc/letsencrypt (Zertifikate) │ └── custom-certs/ # selbstsignierte Zertifikate zum Hochladen │ └── backups/ # Backups und Migrations-Bundles (*.tar.gz) ``` --- ## 3. Voraussetzungen & Ports * 64-Bit-Linux, mind. 2 CPU-Kerne, 4 GB RAM (Empfehlung: 4 Kerne, 8 GB) * Plattenplatz: Faustregel 1 GB je 100 überwachte Hosts und Jahr, plus Backups * root-Rechte * Ausgehender Internetzugang für den Image-Download ### Belegte Ports (Host-Netzwerk!) | Port | Dienst | Erreichbar von | |---|---|---| | 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** | nur Admin-Netz! | | 5000/tcp | Checkmk Apache (Backend) | **nur localhost** – nicht freigeben | | 8000/tcp | Checkmk Agent-Receiver (TLS-registrierte Agents) | überwachte Hosts | | 6557/tcp | Livestatus (nur bei `CMK_LIVESTATUS_TCP=on`) | verteilte Sites | > **Wichtig:** Da beide Container im Host-Netzwerk laufen, dürfen die Ports 80, > 443 und 81 auf dem Host nicht bereits belegt sein (z. B. durch einen > installierten Apache/NGINX). Prüfen mit `ss -tlnp | grep -E ':(80|81|443|5000)\b'`. --- ## 4. Installation auf Debian/Ubuntu (Docker) ```bash # Projekt an den gewünschten Ort legen sudo mkdir -p /opt/checkmk-stack sudo cp -r ./* ./.env.example /opt/checkmk-stack/ cd /opt/checkmk-stack # Docker CE + Compose-Plugin installieren, Projekt vorbereiten sudo ./install.sh --with-systemd ``` `install.sh` erledigt dabei: 1. Docker-Repository von `download.docker.com` einbinden (GPG-Key + Sources-Liste) 2. `docker-ce`, `docker-ce-cli`, `containerd.io`, `docker-buildx-plugin`, `docker-compose-plugin` installieren 3. `dialog`, `openssl`, `tar`, `curl` installieren (für die ncurses-Oberfläche) 4. `systemctl enable --now docker` 5. Verzeichnisse unter `data/` und `backups/` anlegen, `.env` aus `.env.example` erzeugen 6. optional die systemd-Unit `checkmk-stack.service` einrichten Anschließend: ```bash sudo $EDITOR /opt/checkmk-stack/.env # mindestens CMK_PASSWORD und CMK_SITE_ID sudo ./scripts/cmk-manage.sh up sudo ./scripts/cmk-manage.sh status ``` Unter Docker sorgt bereits `restart: unless-stopped` dafür, dass die Container nach einem Reboot wieder starten (der Docker-Daemon startet sie). Die systemd-Unit ist trotzdem sinnvoll, weil sie zusätzlich **alle** Sites startet (siehe [Kapitel 15](#15-mehrere-sites-in-einem-container)). --- ## 5. Installation auf RHEL/Rocky/Alma/Fedora (Podman) Auf Red-Hat-Systemen steht Docker nicht zur Verfügung – hier wird **Podman** verwendet. Die Compose-Datei ist dieselbe. ```bash sudo mkdir -p /opt/checkmk-stack sudo cp -r ./* ./.env.example /opt/checkmk-stack/ cd /opt/checkmk-stack sudo ./install.sh --with-systemd ``` `install.sh` installiert dabei: 1. `podman`, `tar`, `dialog`, `openssl` 2. `podman-compose` – in dieser Reihenfolge versucht: Distributions-Repository → EPEL → `pip3 install podman-compose` 3. richtet die systemd-Unit ein (bei Podman **immer**, siehe nächstes Kapitel) Manuell entspricht das: ```bash sudo dnf install -y podman podman-compose tar dialog openssl # Falls podman-compose nicht im Repo ist: sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm sudo dnf install -y podman-compose ``` Starten: ```bash sudo $EDITOR /opt/checkmk-stack/.env sudo ./scripts/cmk-manage.sh up # nutzt automatisch podman-compose sudo ./scripts/cmk-manage.sh status ``` ### SELinux Die Bind-Mounts sind in `docker-compose.yml` mit `:Z` versehen, Podman setzt dadurch automatisch den Kontext `container_file_t`. Falls Zugriffe dennoch scheitern: ```bash sudo semanage fcontext -a -t container_file_t "/opt/checkmk-stack/data(/.*)?" sudo restorecon -Rv /opt/checkmk-stack/data sudo ausearch -m avc -ts recent # AVC-Meldungen prüfen ``` --- ## 6. Autostart nach einem Neustart des Hosts (Podman) > **Das ist bei Podman der wichtigste Unterschied zu Docker:** Podman hat > *keinen Daemon*. Die Angabe `restart: unless-stopped` in der Compose-Datei > wirkt deshalb **nicht** über einen Reboot hinweg. Der Autostart muss über > systemd erfolgen. Es gibt zwei erprobte Wege. ### Variante A – Compose-basierte systemd-Unit (empfohlen, identisch zu Docker) Wird von `./install.sh --with-systemd` automatisch erzeugt und aktiviert. Manuell: ```bash sudo tee /etc/systemd/system/checkmk-stack.service >/dev/null <<'EOF' [Unit] Description=Checkmk + NGINX Proxy Manager (Container-Stack) Wants=network-online.target After=network-online.target [Service] Type=oneshot RemainAfterExit=yes WorkingDirectory=/opt/checkmk-stack EnvironmentFile=/opt/checkmk-stack/.env TimeoutStartSec=0 ExecStart=/bin/sh -c '/usr/bin/podman-compose up -d' ExecStartPost=/opt/checkmk-stack/scripts/cmk-manage.sh start-all-sites ExecStop=/bin/sh -c '/usr/bin/podman-compose down' [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now checkmk-stack.service sudo systemctl status checkmk-stack.service ``` Prüfen, dass es einen Reboot übersteht: ```bash sudo systemctl is-enabled checkmk-stack # -> enabled sudo reboot # nach dem Neustart: sudo podman ps sudo /opt/checkmk-stack/scripts/cmk-manage.sh status ``` `ExecStartPost` ruft `start-all-sites` auf. Das ist nötig, weil der Checkmk-Entrypoint nur die in `CMK_SITE_ID` eingetragene Site startet – bei mehreren Sites blieben die übrigen sonst gestoppt. ### Variante B – Podman-Quadlet (ab Podman 4.4, ohne Compose) Quadlet erzeugt aus einfachen Beschreibungsdateien echte systemd-Units. Vorteil: kein `podman-compose` nötig, saubere Abhängigkeiten, natives Podman. ```bash sudo ./install.sh --quadlet ``` Das schreibt (mit den Werten aus der `.env`) nach `/etc/containers/systemd/`: * `checkmk.container` * `nginx-proxy-manager.container` Danach: ```bash sudo systemctl daemon-reload sudo systemctl start checkmk nginx-proxy-manager sudo systemctl status checkmk ``` Die Units werden durch `WantedBy=multi-user.target default.target` beim Systemstart automatisch aktiviert – ein separates `systemctl enable` ist bei Quadlet nicht nötig (und auch nicht möglich, da die Units generiert werden). Vorlagen liegen unter [systemd/quadlet/](systemd/quadlet/). ### Variante C – rootless Podman (optional, erhöhter Aufwand) ```bash sudo ./install.sh --rootless sudo loginctl enable-linger checkmk # Dienstbenutzer # Unit als Benutzer-Unit: mkdir -p ~/.config/systemd/user cp systemd/checkmk-stack.service.example ~/.config/systemd/user/checkmk-stack.service systemctl --user daemon-reload systemctl --user enable --now checkmk-stack ``` `--rootless` setzt `net.ipv4.ip_unprivileged_port_start=80`, damit die Ports 80/443 ohne root gebunden werden dürfen. `loginctl enable-linger` sorgt dafür, dass die Benutzer-Units auch ohne Anmeldung nach einem Reboot starten. > Hinweis: Im rootless-Betrieb werden die UIDs der Site-Benutzer über > User-Namespaces abgebildet. Die Dateien unter `data/checkmk/sites` gehören > dann Subordinate-UIDs (z. B. `165536`). Das ist normal, erschwert aber die > Arbeit mit den Dateien vom Host aus. Für Migrationen wird der **rootful** > Betrieb empfohlen. --- ## 7. Konfiguration (`.env`) ```bash cp .env.example .env chmod 600 .env $EDITOR .env ``` Die wichtigsten Schalter: | Variable | Bedeutung | |---|---| | `CMK_RUNTIME` | leer = automatische Erkennung, sonst `docker` oder `podman` | | `CMK_IMAGE_REPO` | `checkmk/check-mk-raw` (frei) oder `checkmk/check-mk-enterprise` | | `CMK_IMAGE_TAG` | **Version** – bei einer Migration muss sie zur Quell-Site passen! | | `CMK_SITE_ID` | Site, die der Container anlegt bzw. beim Start hochfährt | | `CMK_PASSWORD` | Startpasswort für den Benutzer `cmkadmin` (nur bei Neuanlage) | | `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` | | `BACKUP_DIR` | Ablage für Backups/Bundles (Vorgabe `./backups`) | | `CERT_DOMAIN`, `CERT_DAYS` | Vorgaben für selbstsignierte Zertifikate | --- ## 8. Erststart ```bash sudo ./scripts/cmk-manage.sh up sudo ./scripts/cmk-manage.sh status ``` Ausgabe (Beispiel): ``` Container checkmk läuft nginx-proxy-manager läuft Sites im Container SITE VERSION STATUS cmk 2.3.0p23.cre läuft Zugang Checkmk (direkt) : http://10.0.0.5:5000/cmk/ Checkmk (über Proxy) : https:///cmk/ Agent-Receiver : 10.0.0.5:8000 NGINX Proxy Manager : http://10.0.0.5:81/ (Erstlogin: admin@example.com / changeme) ``` Anmeldung an Checkmk: Benutzer `cmkadmin`, Passwort aus `CMK_PASSWORD`. --- ## 9. HTTPS einrichten – Let's Encrypt oder selbstsigniert ### 9.1 NGINX Proxy Manager vorbereiten 1. `http://:81` aufrufen 2. Erstanmeldung: **admin@example.com** / **changeme** 3. Sofort E-Mail-Adresse und Passwort ändern (wird beim ersten Login erzwungen) ### 9.2 Proxy-Host für Checkmk anlegen **Hosts → Proxy Hosts → Add Proxy Host** | Feld | Wert | |---|---| | Domain Names | `checkmk.example.com` (bzw. der interne Name) | | Scheme | `http` | | Forward Hostname / IP | `127.0.0.1` | | Forward Port | `5000` | | Block Common Exploits | ein | | Websockets Support | **ein** (für die Livedaten der Oberfläche) | Reiter **Advanced** (empfohlen, damit Checkmk die echte Client-IP sieht und große Agent-Uploads funktionieren): ```nginx client_max_body_size 0; proxy_read_timeout 300s; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ``` ### 9.3 Variante A – Let's Encrypt (öffentlich erreichbarer Server) Voraussetzungen: der DNS-Name zeigt öffentlich auf diesen Server und **Port 80 ist aus dem Internet erreichbar** (HTTP-01-Challenge). Im Proxy-Host, Reiter **SSL**: * SSL Certificate → **Request a new SSL Certificate** * *Force SSL* ein * *HTTP/2 Support* ein * *HSTS Enabled* nach Bedarf * E-Mail-Adresse angeben, Nutzungsbedingungen bestätigen → **Save** Die Erneuerung übernimmt der Proxy Manager automatisch; die Zertifikate liegen im Bind-Mount `data/npm/letsencrypt/` und sind damit im Projektverzeichnis gesichert. Bei interner DNS-Zone ohne öffentlichen Zugang: **DNS-Challenge** verwenden (SSL → *Use a DNS Challenge* → Provider auswählen, API-Token hinterlegen). ### 9.4 Variante B – Selbstsigniertes Zertifikat (interne Umgebung) Erzeugen: ```bash sudo ./scripts/cmk-manage.sh cert \ --domain checkmk.intern.example \ --alt 10.0.0.5 --alt checkmk \ --days 3650 ``` Ergebnis in `data/npm/custom-certs/checkmk.intern.example/`: * `privkey.pem` – privater Schlüssel * `fullchain.pem` – Zertifikat (mit SAN für alle angegebenen Namen/IPs) Einbinden: 1. **SSL Certificates → Add SSL Certificate → Custom** 2. Name vergeben, `privkey.pem` als *Certificate Key*, `fullchain.pem` als *Certificate* hochladen 3. Im Proxy-Host unter **SSL** dieses Zertifikat auswählen, *Force SSL* und *HTTP/2* aktivieren > Damit die Checkmk-Agents und Browser dem Zertifikat vertrauen, muss > `fullchain.pem` auf den Clients als vertrauenswürdiges Zertifikat installiert > werden (Windows: Computerzertifikate → Vertrauenswürdige Stammzertifizierungsstellen; > Linux: `/usr/local/share/ca-certificates/` + `update-ca-certificates`). > Für die reine Agent-Kommunikation über Port 8000 ist das **nicht** nötig – > dort verwendet Checkmk eine eigene, site-interne CA. Die ncurses-Oberfläche bietet denselben Ablauf unter *„Selbstsigniertes Zertifikat erzeugen“*. --- ## 10. Firewall **firewalld (RHEL/Rocky/Alma):** ```bash sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --permanent --add-port=8000/tcp # Agent-Receiver sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 port port=81 protocol=tcp accept' sudo firewall-cmd --reload ``` **ufw (Debian/Ubuntu):** ```bash sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 8000/tcp sudo ufw allow from 10.0.0.0/24 to any port 81 proto tcp sudo ufw enable ``` Port **5000 bleibt geschlossen** – der Zugriff erfolgt ausschließlich über den Proxy. Port **81** nur aus dem Administrationsnetz freigeben. --- ## 11. Verwaltung: `cmk-manage.sh` Das Skript ist gleichzeitig Kommandozeilenwerkzeug **und** ncurses-Oberfläche. ### 11.1 ncurses-Oberfläche (wie im Midnight Commander) ```bash sudo ./scripts/cmk-manage.sh gui ``` ``` ┌──────────────── Checkmk Stack Manager ─────────────────┐ │ Projekt : /opt/checkmk-stack │ │ Runtime : podman Standard-Site: cmk │ │ Backups : /opt/checkmk-stack/backups │ │ │ │ status Status von Containern und Sites │ │ stack Stack steuern (Start/Stop/Logs/Update) │ │ backup Backup erstellen │ │ restore Backup wiederherstellen │ │ import Site von Direktinstallation importieren │ │ manage Backups verwalten (Liste/Details/Löschen) │ │ sites Sites im Container verwalten │ │ cert Selbstsigniertes Zertifikat erzeugen │ │ env Konfiguration (.env) ansehen/bearbeiten │ │ shell Root-Shell im Checkmk-Container │ │ quit Beenden │ │ < OK > │ └────────────────────────────────────────────────────────┘ ``` Bedienung: Pfeiltasten, **Leertaste** markiert in Auswahllisten (z. B. mehrere Sites für ein Backup), **Enter** bestätigt, **ESC/Cancel** geht zurück. Es wird `dialog` bevorzugt; ist nur `whiptail` vorhanden, wird dieses genutzt. Eine Dateiauswahl mit Verzeichnisnavigation ist eingebaut. ### 11.2 Kommandozeile ```bash ./scripts/cmk-manage.sh --help ``` | Kommando | Wirkung | |---|---| | `up` / `down` / `restart` / `pull` | Stack steuern | | `status` | Container, Sites, Zugangsadressen | | `logs [-f]` | Container-Logs | | `sites` | Sites im Container auflisten | | `site-start SITE` / `site-stop SITE` | einzelne Site steuern | | `start-all-sites` | alle Sites starten (wird von systemd aufgerufen) | | `backup …` | Backup als `.tar.gz`-Bundle | | `list` / `verify` / `prune --keep N` | Backups verwalten | | `restore …` | Backup zurückspielen | | `import …` | Migrations-Bundle einspielen | | `cert …` | selbstsigniertes Zertifikat erzeugen | | `shell` | Root-Shell im Checkmk-Container | | `omd …` | beliebiges `omd`-Kommando im Container | Globale Optionen: `--env-file DATEI`, `-y/--yes` (keine Rückfragen, z. B. für Cronjobs), `-v/--verbose`. --- ## 12. Backup Backups werden mit `omd backup` erstellt und als **Bundle** verpackt: ``` cmkbackup___.tar.gz └── cmkbundle/ ├── MANIFEST Site, Version, Quelle, Prüfsumme … ├── INFO.txt lesbare Zusammenfassung ├── site.tar.gz das eigentliche omd-Backup └── site.tar.gz.sha256 ``` Dadurch weiß das Restore-/Import-Werkzeug immer, **welche Site** und **welche Checkmk-Version** im Archiv steckt, und kann die Integrität prüfen. ```bash # eine Site sudo ./scripts/cmk-manage.sh backup --site cmk # alle Sites, ohne Logdateien, mit Kennzeichnung sudo ./scripts/cmk-manage.sh backup --all --no-logs --label vor-update # konsistentestes Backup: Site wird kurz gestoppt sudo ./scripts/cmk-manage.sh backup --site cmk --stop # ohne Performance-Daten (deutlich kleiner) sudo ./scripts/cmk-manage.sh backup --site cmk --no-rrds --dir /mnt/nas/checkmk ``` Auflisten und prüfen: ```bash ./scripts/cmk-manage.sh list ./scripts/cmk-manage.sh verify --file backups/cmkbackup_cmk_2.3.0p23.cre_20260820-030000.tar.gz ./scripts/cmk-manage.sh prune --keep 7 ``` ### Nächtliches Backup per Cron ```bash sudo crontab -e ``` ```cron 15 2 * * * /opt/checkmk-stack/scripts/cmk-manage.sh -y backup --all --no-logs >>/var/log/cmk-backup.log 2>&1 30 3 * * 0 /opt/checkmk-stack/scripts/cmk-manage.sh -y prune --keep 14 >>/var/log/cmk-backup.log 2>&1 ``` --- ## 13. Restore ```bash # Einfachster Fall: Site existiert nicht mehr sudo ./scripts/cmk-manage.sh restore --file backups/cmkbackup_cmk_2.3.0p23.cre_20260820-030000.tar.gz # Vorhandene Site überschreiben (laufende Prozesse beenden) sudo ./scripts/cmk-manage.sh restore --file backups/… --reuse --kill # Unter anderem Namen zurückspielen (z. B. für einen Test) sudo ./scripts/cmk-manage.sh restore --file backups/… --as-site test ``` Ablauf des Skripts: 1. Archivstruktur und SHA256-Prüfsumme kontrollieren 2. prüfen, ob die **Checkmk-Version des Backups im Container vorhanden** ist 3. bei vorhandener Site Rückfrage/`--reuse`, Site stoppen 4. Archiv in den Container kopieren und `omd restore` ausführen 5. `TMPFS` der Site abschalten (im Container nicht nutzbar) 6. Site starten und Hinweise ausgeben > **`--as-site` ändert den Site-Namen** – registrierte Agents zeigen dann ins > Leere und müssten neu registriert werden. Für eine Migration also **nicht** > verwenden. Ein rohes `omd backup`-Archiv (ohne Bundle-Hülle) wird ebenfalls akzeptiert; der Site-Name wird dann aus dem Archiv gelesen. --- ## 14. Migration einer Direktinstallation (`migrate_creator.sh`) Ziel: eine bestehende Checkmk-Installation auf Blech/VM in den Container übernehmen – **ohne die Agents anzufassen**. ### 14.1 Warum die Agents weiterlaufen Ein `omd backup` enthält die komplette Site inklusive `etc/ssl` (site-eigene CA und Zertifikate der registrierten Agents), `etc/check_mk` (Regeln, Hosts, Passwörter) und der Monitoring-Historie. Wird die Site **unter demselben Namen** wiederhergestellt und ist der Server unter **derselben IP-Adresse** erreichbar, dann * finden Push-/Pull-Agents (`cmk-agent-ctl`) ihre Registrierung wieder, * bleibt die TLS-Verbindung zum Agent-Receiver auf **Port 8000** gültig, * stimmen alle URLs (`https:////check_mk/…`) weiterhin, * bleiben Performance-Daten und Historie erhalten. Voraussetzung ist deshalb, dass das Zielsystem die **IP des Quellservers übernimmt** (bzw. der DNS-Name darauf umgestellt wird) – das ist im geplanten Vorgehen ohnehin so. ### 14.2 Schritt 1 – Skript auf den Quellserver kopieren ```bash scp scripts/migrate_creator.sh root@alt-server:/root/ ssh root@alt-server 'chmod +x /root/migrate_creator.sh' ``` Das Skript ist **eigenständig** – es braucht auf dem Quellserver nur `bash`, `tar` und `omd` (für die Oberfläche zusätzlich `dialog` oder `whiptail`). ### 14.3 Schritt 2 – Bundle auf dem Quellserver erzeugen Vorhandene Sites anzeigen: ```bash sudo ./migrate_creator.sh --list ``` ``` SITE VERSION STATUS GROESSE prod 2.3.0p23.cre laeuft 4.7 GiB test 2.3.0p23.cre gestoppt 318.2 MiB ``` **Mit Oberfläche** (Sites per Leertaste auswählen): ```bash sudo ./migrate_creator.sh --gui ``` Der Dialog fragt nacheinander ab: Sites → Optionen (Site stoppen, RRDs/Logs auslassen) → Zielverzeichnis → Kennzeichnung → optionale Übertragung per `scp`. **Mit Parametern:** ```bash # eine Site, Site während des Backups stoppen (konsistenteste Variante) sudo ./migrate_creator.sh --site prod --stop --out /var/tmp # alle Sites, ohne Logs, direkt auf das Zielsystem übertragen sudo ./migrate_creator.sh --all --no-logs \ --scp root@10.0.0.5:/opt/checkmk-stack/backups/ ``` Ergebnis: ``` /var/tmp/cmkmigrate_prod_2.3.0p23.cre_20260820-101500.tar.gz ``` Das Bundle enthält zusätzlich zum omd-Backup ein `MANIFEST` mit Site-Name, Checkmk-Version, Quell-Hostname, **Quell-IP-Adressen**, Quell-Betriebssystem und SHA256-Prüfsumme sowie ein Verzeichnis `siteinfo/` mit `omd config show`, `omd status` und der IP-Konfiguration des Altsystems zur späteren Kontrolle. ### 14.4 Schritt 3 – Zielsystem auf die richtige Version bringen `omd restore` kann eine Site **nur wiederherstellen, wenn genau deren Checkmk-Version im Zielsystem installiert ist.** Im Container kommt die Version aus dem Image – also muss der Image-Tag passen: ```bash grep CMK_VERSION <(tar -xzOf backups/cmkmigrate_prod_*.tar.gz cmkbundle/MANIFEST) # CMK_VERSION=2.3.0p23.cre -> Image-Tag: 2.3.0p23 sudo $EDITOR .env # CMK_IMAGE_TAG=2.3.0p23 sudo ./scripts/cmk-manage.sh up ``` Das Import-Skript prüft das selbst und bricht mit einer entsprechenden Meldung ab, wenn die Version fehlt. > **Edition beachten:** `.cre` = Raw Edition → `checkmk/check-mk-raw`. > Bei `.cee` / `.cce` / `.cme` wird das entsprechende Enterprise-/Cloud-Image > benötigt (`CMK_IMAGE_REPO=checkmk/check-mk-enterprise`, Zugang über die > Checkmk-Subskription). ### 14.5 Schritt 4 – Bundle importieren Mit Oberfläche: ```bash sudo ./scripts/cmk-manage.sh gui # -> "import" ``` Mit Parametern: ```bash sudo ./scripts/cmk-manage.sh import \ --file backups/cmkmigrate_prod_2.3.0p23.cre_20260820-101500.tar.gz \ --set-default-site ``` Das Skript 1. erkennt das Migrations-Bundle und zeigt Quell-Host und Quell-IP an, 2. **warnt, wenn die IP dieses Hosts von der Quell-IP abweicht** (dann müssten die Agents nachgeführt werden), 3. prüft Prüfsumme, Version und Edition, 4. fragt bei bereits vorhandener Site nach (`--reuse` überschreibt), 5. führt `omd restore` unter dem **unveränderten Site-Namen** aus, 6. setzt auf Wunsch `CMK_SITE_ID` in der `.env` (`--set-default-site`), damit der Container die Site auch nach einem Reboot automatisch startet, 7. startet die Site und gibt die nächsten Schritte aus. ### 14.6 Schritt 5 – Umschalten und kontrollieren ```bash # 1) Alten Server abschalten bzw. dessen Site stoppen (kein Doppel-Monitoring!) ssh root@alt-server 'omd stop prod' # 2) Zielsystem auf die IP/den DNS-Namen des Altsystems umstellen # (statische IP übernehmen oder DNS-Eintrag umbiegen) # 3) Container neu erstellen, falls CMK_SITE_ID geändert wurde sudo ./scripts/cmk-manage.sh up sudo ./scripts/cmk-manage.sh status # 4) Kontrolle in Checkmk sudo ./scripts/cmk-manage.sh omd su prod OMD[prod]:~$ cmk -O # Konfiguration aktivieren OMD[prod]:~$ omd status OMD[prod]:~$ exit ``` Danach in der Oberfläche prüfen: * **Monitor → All hosts** – melden sich die Agents wieder? * Bei TLS-Agents: der Service *„Check_MK Agent“* darf keine Registrierungsfehler melden. * Ein Agent lässt sich vom überwachten Host aus testen mit `cmk-agent-ctl status` – dort muss die Site `prod` mit dem Zielserver und „Connection: TLS“ erscheinen. ### 14.7 Checkliste Migration - [ ] `migrate_creator.sh` auf den Quellserver kopiert - [ ] Bundle erzeugt (möglichst mit `--stop`) - [ ] Bundle auf das Zielsystem kopiert (`backups/`) - [ ] `CMK_IMAGE_TAG` auf die Quellversion gesetzt, Stack neu erstellt - [ ] `import --set-default-site` ausgeführt, Site läuft - [ ] Alte Site gestoppt / alter Server abgeschaltet - [ ] IP bzw. DNS auf das Zielsystem umgestellt - [ ] Ports 80/443/8000 in der Firewall offen - [ ] Proxy-Host im NGINX Proxy Manager mit Zertifikat eingerichtet - [ ] Agents melden sich, `cmk -O` ausgeführt - [ ] Backup des neuen Systems eingerichtet (Cron) --- ## 15. Mehrere Sites in einem Container Der Checkmk-Entrypoint legt beim Start nur die Site aus `CMK_SITE_ID` an und startet auch nur diese. Weitere Sites (z. B. mehrere importierte) existieren im Bind-Mount, werden aber nach einem Neustart nicht automatisch hochgefahren. Deshalb: ```bash sudo ./scripts/cmk-manage.sh start-all-sites ``` Dieses Kommando wird von der systemd-Unit (`ExecStartPost`) bzw. der Quadlet-Unit automatisch nach dem Containerstart ausgeführt und startet alle vorhandenen Sites. > **Empfehlung:** Für sauber getrennte Umgebungen lieber je Site ein eigenes > Projektverzeichnis mit eigener `.env` betreiben. Da beide Container im > Host-Netzwerk laufen, kann pro Host allerdings nur **ein** Checkmk-Container > die Ports 5000/8000 belegen – für echte Mehrfachinstanzen dann getrennte > Hosts oder eine Bridge-Netzwerk-Variante verwenden. --- ## 16. Checkmk aktualisieren Da `/omd/sites` ein Bind-Mount ist, überleben die Daten den Austausch des Images. Die Checkmk-Software selbst steckt im Image unter `/omd/versions`. ```bash # 1) IMMER zuerst sichern sudo ./scripts/cmk-manage.sh backup --all --label vor-update # 2) neuen Tag eintragen sudo $EDITOR .env # z.B. CMK_IMAGE_TAG=2.3.0p28 # 3) Image holen und Container neu erstellen sudo ./scripts/cmk-manage.sh pull sudo ./scripts/cmk-manage.sh up # 4) Site aktualisieren (interaktiv, Konflikte bestätigen) sudo ./scripts/cmk-manage.sh omd stop cmk sudo ./scripts/cmk-manage.sh omd update cmk sudo ./scripts/cmk-manage.sh omd start cmk ``` Bei einem Versionssprung (z. B. 2.2 → 2.3) unbedingt vorher die Checkmk-Werksnotizen (Werks/Release Notes) lesen. --- ## 17. Fehlersuche | Symptom | Ursache / Lösung | |---|---| | `Port 80/443 already in use` | Auf dem Host läuft bereits ein Webserver: `ss -tlnp \| grep ':80'` → `systemctl disable --now apache2 nginx httpd` | | Nach Reboot laufen die Container nicht (Podman) | systemd-Unit fehlt: `./install.sh --with-systemd` bzw. `--quadlet`, danach `systemctl is-enabled checkmk-stack` | | `omd restore`: *version is not installed* | `CMK_IMAGE_TAG` in der `.env` auf die Version aus dem `MANIFEST` setzen und `up` ausführen | | Import bricht mit Editions-Warnung ab | Enterprise-Backup benötigt das Enterprise-Image (`CMK_IMAGE_REPO`) | | Proxy zeigt `502 Bad Gateway` | Checkmk-Container läuft nicht oder Weiterleitung nicht auf `127.0.0.1:5000` gesetzt: `./scripts/cmk-manage.sh status`, `curl -I http://127.0.0.1:5000/` | | Let's Encrypt schlägt fehl | Port 80 aus dem Internet nicht erreichbar oder DNS falsch; Alternative: DNS-Challenge oder selbstsigniertes Zertifikat | | Agents melden sich nach der Migration nicht | Site-Name geändert (`--as-site`), IP nicht übernommen oder Port 8000 blockiert; auf dem Agent prüfen: `cmk-agent-ctl status` | | Permission denied auf `data/` unter RHEL | SELinux: `restorecon -Rv /opt/checkmk-stack/data`, `:Z` an den Mounts prüfen | | `podman-compose` nicht gefunden | EPEL aktivieren oder auf Quadlet umstellen (`./install.sh --quadlet`) | | TUI startet nicht | `dialog` installieren: `apt-get install -y dialog` bzw. `dnf install -y dialog` | | Site startet nicht, `tmp`-Fehler | `./scripts/cmk-manage.sh omd config set TMPFS off`, danach Site starten | Nützliche Kommandos: ```bash ./scripts/cmk-manage.sh logs -f # Container-Logs ./scripts/cmk-manage.sh omd status cmk # Dienste der Site ./scripts/cmk-manage.sh shell # Root-Shell im Container docker exec -it checkmk omd su cmk # bzw. podman exec … ``` --- ## 18. Sicherheitshinweise * `CMK_PASSWORD` sofort nach der Installation in der Oberfläche ändern und aus der `.env` entfernen (wird nur bei der Neuanlage ausgewertet); `chmod 600 .env` ist gesetzt. * Standardzugang des Proxy Managers (`admin@example.com` / `changeme`) beim ersten Login zwingend ändern. * Port **81** (Adminoberfläche) nur aus dem Administrationsnetz erreichbar machen, Port **5000** gar nicht nach außen öffnen. * Backups enthalten **alle** Passwörter und Zertifikate der Site – verschlüsselt ablegen bzw. Zugriffsrechte eng fassen (`chmod 700 backups`). * Regelmäßig `./scripts/cmk-manage.sh pull` + `up` für Sicherheitsupdates der Images einplanen. * Host-Netzwerk bedeutet: der Container teilt sich den Netzwerk-Stack des Hosts. Es gibt keine zusätzliche Netzwerkisolierung – die Absicherung erfolgt über die Firewall des Hosts. --- ## 19. Deinstallation ```bash sudo ./scripts/cmk-manage.sh down # systemd sudo systemctl disable --now checkmk-stack.service sudo rm -f /etc/systemd/system/checkmk-stack.service # bzw. Quadlet sudo rm -f /etc/containers/systemd/checkmk.container \ /etc/containers/systemd/nginx-proxy-manager.container sudo systemctl daemon-reload # Images entfernen docker image rm checkmk/check-mk-raw:2.3.0-latest jc21/nginx-proxy-manager:2 # podman image rm … # Daten (ACHTUNG: löscht die komplette Überwachung!) sudo rm -rf /opt/checkmk-stack/data ``` --- ## Lizenz / Hinweise Dieses Projekt enthält lediglich Konfiguration und Hilfsskripte. Checkmk (Raw Edition, GPLv2) und NGINX Proxy Manager (MIT) unterliegen den Lizenzbedingungen der jeweiligen Hersteller.