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>
67 lines
2.8 KiB
Bash
Executable File
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"
|