diff --git a/rmm-tasks/ESPO-01-Grundeinrichtung.sh b/rmm-tasks/ESPO-01-Grundeinrichtung.sh index a185b2a..0826d85 100755 --- a/rmm-tasks/ESPO-01-Grundeinrichtung.sh +++ b/rmm-tasks/ESPO-01-Grundeinrichtung.sh @@ -1,21 +1,13 @@ #!/bin/bash # ESPO-01-Grundeinrichtung – schliesst die Basis-VM ab. # Laeuft als root, ist idempotent und kann jederzeit wiederholt werden. -# Aufruf: bash ESPO-01-Grundeinrichtung.sh "" "" -# Der RMM-Task ist nur ein duenner Ausloeser, der dieses Skript holt und mit %companyname% -# und dem Wert des Custom Field espo_zustand aufruft. +# Aufruf: bash ESPO-01-Grundeinrichtung.sh "" +# Der RMM-Task ist nur ein duenner Ausloeser, der dieses Skript holt und mit %companyname% aufruft. +# Ob der Lauf erlaubt ist, entscheidet der Task selbst per If/Then auf espo_zustand. set -u KUNDE_ROH="${1:-}" -ZUSTAND="${2:-}" FEHLER=0 -# 0. Zustandsriegel: Die Einrichtung laeuft nur an einer Instanz, die im RMM als NEU gefuehrt wird. -# Das Custom Field espo_zustand steuert damit zentral, was laufen darf. -if [ "$ZUSTAND" != "NEU" ]; then - echo "FEHLER: espo_zustand ist '${ZUSTAND:-leer}', erwartet NEU - Abbruch ohne Aenderung" - echo "ESPO01_ERGEBNIS: FEHLER"; exit 1 -fi - # 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' "$KUNDE_ROH" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/-\+/-/g; s/^-//; s/-$//') diff --git a/rmm-tasks/ESPO-02-Docker.sh b/rmm-tasks/ESPO-02-Docker.sh index f0a124d..f26145a 100755 --- a/rmm-tasks/ESPO-02-Docker.sh +++ b/rmm-tasks/ESPO-02-Docker.sh @@ -1,19 +1,11 @@ #!/bin/bash # ESPO-02-Docker - installiert Docker in gepinnter Version, setzt die Daemon-Grundlagen und # beschraenkt den Zugang zu veroeffentlichten Container-Ports auf das eigene Subnetz. -# Aufruf: bash ESPO-02-Docker.sh "" (Zustand = Wert des Custom Field espo_zustand) # Laeuft als root ueber einen RMM-Task, idempotent. +# Ob der Lauf erlaubt ist, entscheidet der Task selbst per If/Then auf espo_zustand. set -u -ZUSTAND="${1:-}" FEHLER=0 -# 0. Zustandsriegel: Die Einrichtung laeuft nur an einer Instanz, die im RMM als NEU gefuehrt wird. -# Das Custom Field espo_zustand steuert damit zentral, was laufen darf. -if [ "$ZUSTAND" != "NEU" ]; then - echo "FEHLER: espo_zustand ist '${ZUSTAND:-leer}', erwartet NEU - Abbruch ohne Aenderung" - echo "ESPO02_ERGEBNIS: FEHLER"; exit 1 -fi - # 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" diff --git a/rmm-tasks/ESPO-03-First-Deploy.sh b/rmm-tasks/ESPO-03-First-Deploy.sh index d3c3e5b..e699023 100755 --- a/rmm-tasks/ESPO-03-First-Deploy.sh +++ b/rmm-tasks/ESPO-03-First-Deploy.sh @@ -1,6 +1,7 @@ #!/bin/bash # ESPO-03-First-Deploy - richtet EspoCRM auf einer vorbereiteten VM zum ersten Mal ein. -# Aufruf: ESPO-03-First-Deploy.sh +# Aufruf: ESPO-03-First-Deploy.sh +# Ob der Lauf erlaubt ist, entscheidet der Task selbst per If/Then auf espo_zustand. # Laeuft nur auf einer VM OHNE vorhandene Instanz. Fuer Aktualisierungen ist der Update-Weg zustaendig; # dieses Skript fasst eine bestehende Instanz nicht an, damit keine Migration ohne geprueftes Backup startet. set -u @@ -9,32 +10,28 @@ BASIS_URL=https://gitea.subcura.net/EspoCRM_Public/espo-deploy/raw/branch/main WARTE_MAX=900 FQDN="${1:-}" RING="${2:-}" -ZUSTAND="${3:-}" fehler() { echo "FEHLER: $*"; echo "ESPO03_ERGEBNIS: FEHLER"; exit 1; } -# 1. Zustandsriegel: Der First Deploy laeuft nur an einer Instanz, die im RMM als NEU gefuehrt wird. -[ "$ZUSTAND" = "NEU" ] || fehler "espo_zustand ist '${ZUSTAND:-leer}', erwartet NEU - Abbruch ohne Aenderung" - -# 2. Vorbedingungen - lieber hier abbrechen als auf halbem Weg. +# 1. Vorbedingungen - lieber hier abbrechen als auf halbem Weg. [ "$(id -u)" -eq 0 ] || fehler "nicht als root gestartet" command -v docker >/dev/null || fehler "Docker fehlt - erst ESPO-02 ausfuehren" docker info >/dev/null 2>&1 || fehler "Docker laeuft nicht - erst ESPO-02 pruefen" [ -n "$FQDN" ] || fehler "kein FQDN uebergeben" [ -n "$RING" ] || fehler "kein Ring uebergeben" -# 3. Rueckfallpruefung: Der Zustand im RMM ist von Hand aenderbar, eine vorhandene Instanz ist es nicht. +# 2. Sicherung gegen einen zweiten Lauf: Eine vorhandene Instanz ist eine Tatsache, kein Feldwert. for C in espocrm espocrm-db espocrm-daemon espocrm-websocket; do docker ps -a --format '{{.Names}}' | grep -qx "$C" && fehler "Container '$C' existiert bereits - hier ist der Update-Weg zustaendig" done [ -e /srv/espo/docker-compose.yml ] && fehler "/srv/espo/docker-compose.yml existiert bereits - hier ist der Update-Weg zustaendig" [ -e /srv/espo/data/config.php ] && fehler "EspoCRM ist bereits installiert (data/config.php) - hier ist der Update-Weg zustaendig" -# 4. Verzeichnisse anlegen. Die Eigentuemer setzen die Images beim ersten Start selbst. +# 3. Verzeichnisse anlegen. Die Eigentuemer setzen die Images beim ersten Start selbst. install -d -m 0755 /srv/espo /srv/espo/bin /srv/espo/mariadb /srv/espo/data /srv/espo/custom /srv/espo/client-custom install -d -m 0700 /srv/espo/secrets -# 5. Geheimnisse auf der VM erzeugen - sie stehen in keinem Skript, keiner Ausgabe und keinem Repository. +# 4. Geheimnisse auf der VM erzeugen - sie stehen in keinem Skript, keiner Ausgabe und keinem Repository. # Ohne abschliessenden Zeilenumbruch, damit die _FILE-Auswertung der Images genau diesen Wert sieht. umask 077 for G in db_root_password db_password; do @@ -44,18 +41,18 @@ for G in db_root_password db_password; do done umask 022 -# 6. Grundeinstellungen bereitlegen, bevor EspoCRM zum ersten Mal startet. +# 5. Grundeinstellungen bereitlegen, bevor EspoCRM zum ersten Mal startet. curl -fsSL "$BASIS_URL/docker/config-override.php" -o /srv/espo/data/config-override.php || fehler "config-override.php nicht abrufbar" -# 7. Compose aus dem Stand des Rings schreiben. +# 6. Compose aus dem Stand des Rings schreiben. curl -fsSL "$BASIS_URL/bin/espo-compose-rendern" -o /srv/espo/bin/espo-compose-rendern || fehler "Render-Skript nicht abrufbar" chmod 0755 /srv/espo/bin/espo-compose-rendern /srv/espo/bin/espo-compose-rendern "$FQDN" "$RING" || fehler "Compose konnte nicht geschrieben werden" -# 8. Starten. Die Images werden dabei zum ersten Mal geholt. +# 7. Starten. Die Images werden dabei zum ersten Mal geholt. docker compose -f /srv/espo/docker-compose.yml up -d || fehler "Start fehlgeschlagen" -# 9. Auf die Anwendung warten. Der erste Lauf installiert und baut das Schema auf, das dauert. +# 8. Auf die Anwendung warten. Der erste Lauf installiert und baut das Schema auf, das dauert. ENDE=$(( SECONDS + WARTE_MAX )) while [ "$SECONDS" -lt "$ENDE" ]; do [ "$(docker inspect -f '{{.State.Health.Status}}' espocrm 2>/dev/null)" = "healthy" ] && break @@ -64,7 +61,7 @@ done [ "$(docker inspect -f '{{.State.Health.Status}}' espocrm 2>/dev/null)" = "healthy" ] \ || fehler "espocrm nach ${WARTE_MAX}s nicht gesund - 'docker logs espocrm' ansehen" -# 10. Ergebnis zeigen. Die Datenbankabfragen laufen im Container und lesen das Passwort dort aus der Secret-Datei, +# 9. Ergebnis zeigen. Die Datenbankabfragen laufen im Container und lesen das Passwort dort aus der Secret-Datei, # damit es weder im Skript noch in der Prozessliste der VM auftaucht. echo "--- Container" docker compose -f /srv/espo/docker-compose.yml ps --format 'table {{.Name}}\t{{.Status}}'