From 9c812fcac5d6d7abe8743200e8348a781a8aad06 Mon Sep 17 00:00:00 2001 From: Gordon Zimm Date: Wed, 23 Sep 2026 10:16:44 +0200 Subject: [PATCH] ESPO-01 (Grundeinrichtung) und ESPO-02 (Docker) als versionierte Task-Skripte Co-Authored-By: Claude Opus 5 --- rmm-tasks/ESPO-01-Grundeinrichtung.sh | 75 +++++++++++++++++++++++++++ rmm-tasks/ESPO-02-Docker.sh | 57 ++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100755 rmm-tasks/ESPO-01-Grundeinrichtung.sh create mode 100755 rmm-tasks/ESPO-02-Docker.sh diff --git a/rmm-tasks/ESPO-01-Grundeinrichtung.sh b/rmm-tasks/ESPO-01-Grundeinrichtung.sh new file mode 100755 index 0000000..b63f554 --- /dev/null +++ b/rmm-tasks/ESPO-01-Grundeinrichtung.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# ESPO-01-Grundeinrichtung – schliesst die Basis-VM ab. +# Laeuft als root ueber einen RMM-Bash-Task, ist idempotent und kann jederzeit wiederholt werden. +# %companyname% wird vom RMM vor der Ausfuehrung durch den Kundennamen ersetzt. +# Quelle: EspoCRM_Public/espo-deploy, rmm-tasks/ – Aenderungen dort, danach in den Task kopieren. +set -u +FEHLER=0 + +# 1. Hostname aus dem Kundennamen ableiten (klein, nur a-z 0-9 und Bindestrich), damit die +# Flotte im RMM und in Logs eindeutig benannt ist. +KUNDE=$(printf '%s' "%companyname%" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/-\+/-/g; s/^-//; s/-$//') +SOLL="crm-${KUNDE}" +IST=$(hostnamectl --static) +if [ -z "$KUNDE" ]; then + echo "FEHLER: Kundenname leer - Hostname nicht gesetzt"; FEHLER=1 +elif [ "$IST" != "$SOLL" ]; then + hostnamectl set-hostname "$SOLL" && sed -i "s/\b${IST}\b/${SOLL}/g" /etc/hosts + echo "Hostname: $IST -> $SOLL" +else + echo "Hostname: $SOLL (unveraendert)" +fi + +# 2. Hinweis auf das Initialpasswort aus dem Konsolen-Login entfernen - er hat nach der +# Erstanmeldung keinen Zweck mehr und steht sonst dauerhaft am Anmeldebildschirm. +if grep -q "Initialpasswort" /etc/issue; then + sed -i '/Initialpasswort/d; /beim ersten Anmelden/d' /etc/issue + echo "/etc/issue: Hinweis auf das Initialpasswort entfernt" +else + echo "/etc/issue: kein Hinweis vorhanden" +fi + +# 3. Pruefen, dass das Konto ein gueltiges Passwort hat (Status P) - sonst ist die +# Erstinbetriebnahme unvollstaendig. +if [ "$(passwd -S administrator | awk '{print $2}')" = "P" ]; then + echo "Konto administrator: Passwort gesetzt" +else + echo "FEHLER: Konto administrator hat kein gueltiges Passwort"; FEHLER=1 +fi + +# 4. SSH haerten: keine Root-Anmeldung, wenige Fehlversuche, kurze Anmeldefrist. +install -d -m 755 /etc/ssh/sshd_config.d +cat > /etc/ssh/sshd_config.d/10-espo.conf <<'CONF' +PermitRootLogin no +MaxAuthTries 3 +LoginGraceTime 20 +CONF +if sshd -t; then systemctl reload ssh && echo "SSH: PermitRootLogin no, MaxAuthTries 3"; else echo "FEHLER: sshd-Konfiguration ungueltig"; FEHLER=1; fi + +# 5. Journal begrenzen, damit Logs das Wurzeldateisystem nicht fuellen koennen. +install -d -m 755 /etc/systemd/journald.conf.d +printf '[Journal]\nSystemMaxUse=500M\n' > /etc/systemd/journald.conf.d/10-espo.conf +systemctl restart systemd-journald && echo "journald: SystemMaxUse=500M" + +# 6. needrestart daran hindern, containerd automatisch neu zu starten - das wuerde die +# laufenden Container mitreissen. docker ist ab Werk schon ausgenommen. +install -d -m 755 /etc/needrestart/conf.d +printf '# containerd nicht automatisch neu starten (Container haengen daran).\n$nrconf{override_rc}{qr(^containerd)} = 0;\n' > /etc/needrestart/conf.d/10-espo.conf +echo "needrestart: containerd ausgenommen" + +# 7. Zeitzone sicherstellen. +if [ "$(timedatectl show -p Timezone --value)" != "Europe/Berlin" ]; then + timedatectl set-timezone Europe/Berlin && echo "Zeitzone auf Europe/Berlin gesetzt" +else + echo "Zeitzone: Europe/Berlin" +fi + +# 8. Automatische Sicherheitsupdates nur pruefen, nicht aendern - sie sind Ubuntu-Standard. +if grep -qs '"1"' /etc/apt/apt.conf.d/20auto-upgrades; then + echo "unattended-upgrades: aktiv" +else + echo "WARNUNG: unattended-upgrades nicht aktiv"; FEHLER=1 +fi + +# 9. Ergebniszeile fuer Monitor und Custom Field. +if [ "$FEHLER" -eq 0 ]; then echo "ESPO01_ERGEBNIS: OK"; exit 0; else echo "ESPO01_ERGEBNIS: FEHLER"; exit 1; fi diff --git a/rmm-tasks/ESPO-02-Docker.sh b/rmm-tasks/ESPO-02-Docker.sh new file mode 100755 index 0000000..861a1d4 --- /dev/null +++ b/rmm-tasks/ESPO-02-Docker.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# ESPO-02-Docker – installiert Docker in gepinnter Version und setzt die Daemon-Grundlagen. +# Laeuft als root ueber einen RMM-Bash-Task, idempotent. +# Firewallregeln (ufw, DOCKER-USER) kommen in einem eigenen Task, weil dafuer die Adresse +# der OPNsense als Parameter gebraucht wird. +set -u +FEHLER=0 + +# Gepinnte Staende - hier wird der Flottenstand gesetzt, nicht auf der VM entschieden. +DOCKER_VERSION="5:29.8.1-1~ubuntu.24.04~noble" +CONTAINERD_VERSION="2.3.5-1~ubuntu.24.04~noble" +COMPOSE_VERSION="5.5.1-1~ubuntu.24.04~noble" +BUILDX_VERSION="0.37.1-1~ubuntu.24.04~noble" + +# 1. Paketquelle von Docker einrichten (Schluessel und deb822-Quelle), falls noch nicht vorhanden. +install -m 0755 -d /etc/apt/keyrings +if [ ! -s /etc/apt/keyrings/docker.asc ]; then + curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc || { echo "FEHLER: Schluessel nicht ladbar"; exit 1; } + chmod a+r /etc/apt/keyrings/docker.asc +fi +cat > /etc/apt/sources.list.d/docker.sources </dev/null + +# 3. Daemon-Grundlagen: Logrotation (der Standardtreiber rotiert nicht) und veroeffentlichte +# Ports ohne Adressangabe nur auf die Loopback-Adresse binden. +install -d -m 755 /etc/docker +cat > /etc/docker/daemon.json <<'CONF' +{ + "log-driver": "local", + "log-opts": { "max-size": "20m", "max-file": "5" }, + "ip": "127.0.0.1", + "live-restore": true +} +CONF +systemctl enable --now docker >/dev/null 2>&1 +systemctl restart docker || { echo "FEHLER: docker startet nicht"; exit 1; } + +# 4. Ergebnis zeigen und pruefen. +docker --version +docker compose version +docker info --format 'Logtreiber: {{.LoggingDriver}} Live-Restore: {{.LiveRestoreEnabled}}' +[ "$(docker info --format '{{.LoggingDriver}}')" = "local" ] || { echo "FEHLER: Logtreiber nicht gesetzt"; FEHLER=1; } + +if [ "$FEHLER" -eq 0 ]; then echo "ESPO02_ERGEBNIS: OK"; exit 0; else echo "ESPO02_ERGEBNIS: FEHLER"; exit 1; fi