#!/bin/bash # espo-compose-rendern - erzeugt /srv/espo/docker-compose.yml aus der versionierten Vorlage. # Einziger kundenspezifischer Wert ist der FQDN; er kommt aus dem Custom Field espo_fqdn. # Aufruf: espo-compose-rendern (von ESPO-10 und ESPO-30) # Idempotent: gleiche Eingabe, gleiche Datei; geschrieben wird nur bei Unterschied. set -u VORLAGE_URL=https://gitea.subcura.net/EspoCRM_Public/espo-deploy/raw/branch/main/compose/docker-compose.vorlage.yml ZIEL=/srv/espo/docker-compose.yml FQDN="${1:-}" # 1. Ohne gueltigen FQDN waeren Site-URL und WebSocket-Adresse falsch - hier abbrechen, nicht spaeter raten. if ! printf '%s' "$FQDN" | grep -Eq '^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$'; then echo "FEHLER: kein gueltiger FQDN uebergeben ('$FQDN')" echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1 fi # 2. Vorlage holen - geheimnisfrei und ohne Anmeldung abrufbar. TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT curl -fsSL "$VORLAGE_URL" -o "$TMP/vorlage.yml" || { echo "FEHLER: Vorlage nicht abrufbar ($VORLAGE_URL)" echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1; } # 3. Platzhalter ersetzen. sed "s|__FQDN__|${FQDN}|g" "$TMP/vorlage.yml" > "$TMP/neu.yml" # 4. Kein Platzhalter darf uebrig bleiben, sonst startete Docker mit einer unfertigen Datei. OFFEN="$(grep -oE '__[A-Z][A-Z0-9_]*__' "$TMP/neu.yml" | sort -u | tr '\n' ' ')" if [ -n "$OFFEN" ]; then echo "FEHLER: unersetzte Platzhalter: $OFFEN" echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1 fi # 5. Die drei EspoCRM-Dienste teilen ueber volumes_from denselben Code - verschiedene Images waeren ein Fehler. if [ "$(grep -E '^[[:space:]]+image: espocrm' "$TMP/neu.yml" | sort -u | wc -l)" -ne 1 ]; then echo "FEHLER: die EspoCRM-Dienste verwenden verschiedene Images" echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1 fi # 6. Nur bei Unterschied schreiben, damit wiederholte Laeufe nichts anfassen. install -d -m 0755 /srv/espo if [ -f "$ZIEL" ] && cmp -s "$TMP/neu.yml" "$ZIEL"; then STATUS=UNVERAENDERT else install -m 0644 "$TMP/neu.yml" "$ZIEL" STATUS=GEAENDERT fi # 7. Docker selbst pruefen lassen, sobald die Geheimnisdateien liegen - startet nichts. if [ -r /srv/espo/secrets/db_password ]; then docker compose -f "$ZIEL" config -q || { echo "FEHLER: Compose-Datei nicht gueltig" echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1; } fi echo "$ZIEL $STATUS (FQDN $FQDN)" echo "ESPO_COMPOSE_ERGEBNIS: OK"