Die Vorlage ist fuer alle Kunden identisch und traegt genau einen Platzhalter (__FQDN__); bin/espo-compose-rendern setzt ihn ein und schreibt /srv/espo/docker-compose.yml. Keine .env mehr: alles ausser den Geheimnissen steht in der Compose selbst. Inhalt der Vorlage: Bind-Mounts unter /srv/espo, Datei-Secrets fuer die beiden MariaDB-Passwoerter, Record-IDs als uuid4/36 ueber configs (in allen drei EspoCRM-Diensten, weil configs nicht ueber volumes_from vererbt werden), adminUpgradeDisabled, WebSocket ueber wss://<fqdn>/wss, Healthchecks mit Startfenstern fuer den Migrationslauf. ESPO-02 setzt keine abweichende Bindeadresse mehr - die Ports muessen fuer den Reverse Proxy erreichbar sein. Stattdessen beschraenkt eine DOCKER-USER-Regel den Zugang auf das eigene Subnetz, das die VM selbst ermittelt; eine systemd-Unit setzt sie nach jedem Docker-Start neu. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
58 lines
2.4 KiB
Bash
Executable File
58 lines
2.4 KiB
Bash
Executable File
#!/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 <fqdn> (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"
|