espo-deploy/bin/espo-compose-rendern
Gordon Zimm 823cf43135 Ringe als Ordner: docker/<ring>/docker-compose.yml
Statt einer Vorlage fuer alle liegt je Ring eine vollstaendige Compose im Repo.
Eine Freigabe ist damit das Kopieren der Datei in den naechsten Ordner und in
jedem git diff sichtbar. Fuer den Anfang ist nur "0 - intern" gefuellt; die
beiden anderen Ordner erklaeren, dass dort noch kein Stand freigegeben ist.

espo-compose-rendern nimmt jetzt <fqdn> und <ring> und bricht ab, wenn fuer den
Ring kein Stand hinterlegt ist. Die Ringwerte 0/1/2 entsprechen dem Custom Field
espo_ring.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 14:40:48 +02:00

67 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# espo-compose-rendern - schreibt /srv/espo/docker-compose.yml aus dem Stand des jeweiligen Rings.
# Aufruf: espo-compose-rendern <fqdn> <ring> (aus ESPO-10-Deploy; fqdn und ring kommen aus den Custom Fields)
# Idempotent: gleiche Eingabe, gleiche Datei; geschrieben wird nur bei Unterschied.
set -u
BASIS_URL=https://gitea.subcura.net/EspoCRM_Public/espo-deploy/raw/branch/main/docker
ZIEL=/srv/espo/docker-compose.yml
FQDN="${1:-}"
RING="${2:-}"
# 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. Der Ring bestimmt, welcher Stand gilt. Die Ordnernamen im Repo tragen Leerzeichen, daher kodiert.
case "$RING" in
0) ORDNER="0%20-%20intern" ; KLAR="0 - intern" ;;
1) ORDNER="1%20-%20Pilotkunde" ; KLAR="1 - Pilotkunde" ;;
2) ORDNER="2%20-%20Produktivkunde" ; KLAR="2 - Produktivkunde" ;;
*) echo "FEHLER: unbekannter Ring '$RING' (erwartet 0, 1 oder 2)"
echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1 ;;
esac
# 3. Stand des Rings holen - geheimnisfrei und ohne Anmeldung abrufbar.
TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
curl -fsSL "$BASIS_URL/$ORDNER/docker-compose.yml" -o "$TMP/stand.yml" || {
echo "FEHLER: fuer Ring '$KLAR' ist kein Stand hinterlegt oder das Repository ist nicht erreichbar"
echo "ESPO_COMPOSE_ERGEBNIS: FEHLER"; exit 1; }
# 4. Platzhalter ersetzen.
sed "s|__FQDN__|${FQDN}|g" "$TMP/stand.yml" > "$TMP/neu.yml"
# 5. 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
# 6. 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
# 7. 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
# 8. 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 (Ring '$KLAR', FQDN $FQDN)"
echo "ESPO_COMPOSE_ERGEBNIS: OK"