Drei Verbesserungen an den Update-Skripten
1. Gewartet wird jetzt auf ALLE vier Container, nicht nur auf espocrm. "health: starting" im Bericht war keine Aussage. Scheitert es, nennt die Fehlermeldung, welcher Container in welchem Zustand haengt. Gilt fuer ESPO-03, ESPO-10 und ESPO-12. 2. ESPO-10 raeumt alte Images weg: Es bleiben genau zwei je Anwendung, das laufende und das vorherige - fuer EspoCRM wie fuer MariaDB. Das vorherige muss bleiben, sonst zeigt die von ESPO-12 zurueckgerollte Compose auf einen Tag, der lokal nicht mehr liegt. Alles aeltere fuellte bisher nur das docker-lv; Docker raeumt von sich aus nichts weg. 3. ESPO-10 zeigt einen eigenen Abschnitt "Datenbank" mit Image, Version und Digest, analog zum Abschnitt "Instanz", sowie die Images auf der VM. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
e63d1b432b
commit
5c15ac3f0b
@ -14,6 +14,25 @@ WARTE_MAX=900
|
|||||||
FQDN="${1:-}"
|
FQDN="${1:-}"
|
||||||
RING="${2:-}"
|
RING="${2:-}"
|
||||||
|
|
||||||
|
# Wartet, bis alle vier Container "healthy" melden - "starting" ist keine Aussage.
|
||||||
|
alle_gesund() {
|
||||||
|
local c
|
||||||
|
for c in espocrm-db espocrm espocrm-daemon espocrm-websocket; do
|
||||||
|
[ "$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null)" = "healthy" ] || return 1
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Nennt die Container, die noch nicht gesund sind - fuer die Fehlermeldung.
|
||||||
|
nicht_gesund() {
|
||||||
|
local c z=""
|
||||||
|
for c in espocrm-db espocrm espocrm-daemon espocrm-websocket; do
|
||||||
|
[ "$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null)" = "healthy" ] \
|
||||||
|
|| z="$z $c=$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null || echo fehlt)"
|
||||||
|
done
|
||||||
|
printf '%s' "${z# }"
|
||||||
|
}
|
||||||
|
|
||||||
fehler() { echo "FEHLER: $*"; echo "ESPO03_ERGEBNIS: FEHLER"; exit 1; }
|
fehler() { echo "FEHLER: $*"; echo "ESPO03_ERGEBNIS: FEHLER"; exit 1; }
|
||||||
|
|
||||||
# 1. Vorbedingungen - lieber hier abbrechen als auf halbem Weg.
|
# 1. Vorbedingungen - lieber hier abbrechen als auf halbem Weg.
|
||||||
@ -65,11 +84,10 @@ START_AUSGABE="$(docker compose -f /srv/espo/docker-compose.yml up -d --quiet-pu
|
|||||||
# 7. Auf die Anwendung warten. Der erste Lauf installiert und baut das Schema auf, das dauert.
|
# 7. Auf die Anwendung warten. Der erste Lauf installiert und baut das Schema auf, das dauert.
|
||||||
ENDE=$(( SECONDS + WARTE_MAX ))
|
ENDE=$(( SECONDS + WARTE_MAX ))
|
||||||
while [ "$SECONDS" -lt "$ENDE" ]; do
|
while [ "$SECONDS" -lt "$ENDE" ]; do
|
||||||
[ "$(docker inspect -f '{{.State.Health.Status}}' espocrm 2>/dev/null)" = "healthy" ] && break
|
alle_gesund && break
|
||||||
sleep 10
|
sleep 10
|
||||||
done
|
done
|
||||||
[ "$(docker inspect -f '{{.State.Health.Status}}' espocrm 2>/dev/null)" = "healthy" ] \
|
alle_gesund || fehler "nach ${WARTE_MAX}s nicht alle Container gesund: $(nicht_gesund) - 'docker logs <name>' ansehen"
|
||||||
|| fehler "espocrm nach ${WARTE_MAX}s nicht gesund - 'docker logs espocrm' ansehen"
|
|
||||||
|
|
||||||
# 8. Ergebnis zeigen. Die Datenbankabfragen laufen im Container und lesen das Passwort dort aus der Secret-Datei,
|
# 8. 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.
|
# damit es weder im Skript noch in der Prozessliste der VM auftaucht.
|
||||||
|
|||||||
@ -18,6 +18,25 @@ WARTE_MAX=900
|
|||||||
FQDN="${1:-}"
|
FQDN="${1:-}"
|
||||||
RING="${2:-}"
|
RING="${2:-}"
|
||||||
|
|
||||||
|
# Wartet, bis alle vier Container "healthy" melden - "starting" ist keine Aussage.
|
||||||
|
alle_gesund() {
|
||||||
|
local c
|
||||||
|
for c in espocrm-db espocrm espocrm-daemon espocrm-websocket; do
|
||||||
|
[ "$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null)" = "healthy" ] || return 1
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Nennt die Container, die noch nicht gesund sind - fuer die Fehlermeldung.
|
||||||
|
nicht_gesund() {
|
||||||
|
local c z=""
|
||||||
|
for c in espocrm-db espocrm espocrm-daemon espocrm-websocket; do
|
||||||
|
[ "$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null)" = "healthy" ] \
|
||||||
|
|| z="$z $c=$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null || echo fehlt)"
|
||||||
|
done
|
||||||
|
printf '%s' "${z# }"
|
||||||
|
}
|
||||||
|
|
||||||
fehler() { echo "FEHLER: $*"; echo "ESPO10_ERGEBNIS: FEHLER"; exit 1; }
|
fehler() { echo "FEHLER: $*"; echo "ESPO10_ERGEBNIS: FEHLER"; exit 1; }
|
||||||
|
|
||||||
# 1. Vorbedingungen - lieber hier abbrechen als auf halbem Weg.
|
# 1. Vorbedingungen - lieber hier abbrechen als auf halbem Weg.
|
||||||
@ -37,6 +56,9 @@ fi
|
|||||||
# 3. Ausgangsstand festhalten, damit der Bericht ein Vorher und ein Nachher hat.
|
# 3. Ausgangsstand festhalten, damit der Bericht ein Vorher und ein Nachher hat.
|
||||||
VORHER_IMAGE="$(docker inspect -f '{{.Config.Image}}' espocrm 2>/dev/null)"
|
VORHER_IMAGE="$(docker inspect -f '{{.Config.Image}}' espocrm 2>/dev/null)"
|
||||||
VORHER_VERSION="$(docker exec espocrm php -r '$v=""; foreach (["/var/www/html/application/Espo/Resources/defaults/config.php","/var/www/html/data/config.php","/var/www/html/data/config-internal.php"] as $f) { $a=@include $f; if (is_array($a) && !empty($a["version"])) { $v=$a["version"]; } } echo $v;' 2>/dev/null)"
|
VORHER_VERSION="$(docker exec espocrm php -r '$v=""; foreach (["/var/www/html/application/Espo/Resources/defaults/config.php","/var/www/html/data/config.php","/var/www/html/data/config-internal.php"] as $f) { $a=@include $f; if (is_array($a) && !empty($a["version"])) { $v=$a["version"]; } } echo $v;' 2>/dev/null)"
|
||||||
|
VORHER_ESPO_ID="$(docker inspect -f '{{.Image}}' espocrm 2>/dev/null)"
|
||||||
|
VORHER_DB_ID="$(docker inspect -f '{{.Image}}' espocrm-db 2>/dev/null)"
|
||||||
|
VORHER_DB_IMAGE="$(docker inspect -f '{{.Config.Image}}' espocrm-db 2>/dev/null)"
|
||||||
echo "Vorher: Image ${VORHER_IMAGE:-unbekannt}, Version ${VORHER_VERSION:-unbekannt}"
|
echo "Vorher: Image ${VORHER_IMAGE:-unbekannt}, Version ${VORHER_VERSION:-unbekannt}"
|
||||||
|
|
||||||
# 4. Erst der Rueckweg, dann das Update. Ohne Snapshot wird nichts angefasst.
|
# 4. Erst der Rueckweg, dann das Update. Ohne Snapshot wird nichts angefasst.
|
||||||
@ -70,23 +92,45 @@ START_AUSGABE="$(docker compose -f /srv/espo/docker-compose.yml up -d --quiet-pu
|
|||||||
# 7. Auf die Anwendung warten. Waehrend der Migration meldet app-check absichtlich nicht gesund.
|
# 7. Auf die Anwendung warten. Waehrend der Migration meldet app-check absichtlich nicht gesund.
|
||||||
ENDE=$(( SECONDS + WARTE_MAX ))
|
ENDE=$(( SECONDS + WARTE_MAX ))
|
||||||
while [ "$SECONDS" -lt "$ENDE" ]; do
|
while [ "$SECONDS" -lt "$ENDE" ]; do
|
||||||
[ "$(docker inspect -f '{{.State.Health.Status}}' espocrm 2>/dev/null)" = "healthy" ] && break
|
alle_gesund && break
|
||||||
sleep 10
|
sleep 10
|
||||||
done
|
done
|
||||||
[ "$(docker inspect -f '{{.State.Health.Status}}' espocrm 2>/dev/null)" = "healthy" ] \
|
alle_gesund || fehler "nach ${WARTE_MAX}s nicht alle Container gesund: $(nicht_gesund) - 'docker logs <name>' ansehen"
|
||||||
|| fehler "espocrm nach ${WARTE_MAX}s nicht gesund - 'docker logs espocrm' ansehen, Snapshot '$SNAPSHOT' steht bereit"
|
|
||||||
|
|
||||||
# 8. Ergebnis zeigen.
|
# 8. Ergebnis zeigen.
|
||||||
echo "--- Container"
|
echo "--- Container"
|
||||||
docker compose -f /srv/espo/docker-compose.yml ps --format 'table {{.Name}}\t{{.Status}}'
|
docker compose -f /srv/espo/docker-compose.yml ps --format 'table {{.Name}}\t{{.Status}}'
|
||||||
echo "--- Instanz"
|
echo "--- Instanz"
|
||||||
NACHHER_IMAGE="$(docker inspect -f '{{.Config.Image}}' espocrm 2>/dev/null)"
|
NACHHER_IMAGE="$(docker inspect -f '{{.Config.Image}}' espocrm 2>/dev/null)"
|
||||||
|
NACHHER_ESPO_ID="$(docker inspect -f '{{.Image}}' espocrm 2>/dev/null)"
|
||||||
NACHHER_VERSION="$(docker exec espocrm php -r '$v=""; foreach (["/var/www/html/application/Espo/Resources/defaults/config.php","/var/www/html/data/config.php","/var/www/html/data/config-internal.php"] as $f) { $a=@include $f; if (is_array($a) && !empty($a["version"])) { $v=$a["version"]; } } echo $v;' 2>/dev/null)"
|
NACHHER_VERSION="$(docker exec espocrm php -r '$v=""; foreach (["/var/www/html/application/Espo/Resources/defaults/config.php","/var/www/html/data/config.php","/var/www/html/data/config-internal.php"] as $f) { $a=@include $f; if (is_array($a) && !empty($a["version"])) { $v=$a["version"]; } } echo $v;' 2>/dev/null)"
|
||||||
echo "Image: ${VORHER_IMAGE:-unbekannt} -> ${NACHHER_IMAGE:-unbekannt}"
|
echo "Image: ${VORHER_IMAGE:-unbekannt} -> ${NACHHER_IMAGE:-unbekannt}"
|
||||||
echo "Version: ${VORHER_VERSION:-unbekannt} -> ${NACHHER_VERSION:-unbekannt}"
|
echo "Version: ${VORHER_VERSION:-unbekannt} -> ${NACHHER_VERSION:-unbekannt}"
|
||||||
echo "Digest: $(docker image inspect --format '{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}{{.Id}}{{end}}' "$NACHHER_IMAGE" 2>/dev/null)"
|
echo "Digest: $(docker image inspect --format '{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}{{.Id}}{{end}}' "$NACHHER_IMAGE" 2>/dev/null)"
|
||||||
|
echo "--- Datenbank"
|
||||||
|
NACHHER_DB_IMAGE="$(docker inspect -f '{{.Config.Image}}' espocrm-db 2>/dev/null)"
|
||||||
|
NACHHER_DB_ID="$(docker inspect -f '{{.Image}}' espocrm-db 2>/dev/null)"
|
||||||
|
echo "Image: ${VORHER_DB_IMAGE:-unbekannt} -> ${NACHHER_DB_IMAGE:-unbekannt}"
|
||||||
|
echo "Version: $(docker exec espocrm-db sh -c 'mariadb -u root -p"$(cat /run/secrets/db_root_password)" -N -B -e "select version()"' 2>/dev/null | tr -d '\r')"
|
||||||
|
echo "Digest: $(docker image inspect --format '{{if .RepoDigests}}{{index .RepoDigests 0}}{{else}}{{.Id}}{{end}}' "$NACHHER_DB_IMAGE" 2>/dev/null)"
|
||||||
|
|
||||||
|
# Alte Images wegraeumen: Es bleiben genau zwei je Anwendung - das laufende und das vorherige.
|
||||||
|
# Das vorherige muss bleiben, sonst zeigt die zurueckgerollte Compose nach ESPO-12 auf einen Tag,
|
||||||
|
# der lokal nicht mehr liegt. Alles aeltere ist nur Platzverbrauch auf dem docker-lv.
|
||||||
|
aufraeumen() { # aufraeumen <repository> <behalten-id-1> <behalten-id-2>
|
||||||
|
local repo="$1" a="$2" b="$3" id
|
||||||
|
docker image ls --no-trunc --format '{{.ID}} {{.Repository}}' 2>/dev/null \
|
||||||
|
| awk -v r="$repo" '$2 == r {print $1}' | sort -u | while read -r id; do
|
||||||
|
[ "$id" = "$a" ] || [ "$id" = "$b" ] || docker rmi "$id" >/dev/null 2>&1 || true
|
||||||
|
done
|
||||||
|
}
|
||||||
|
aufraeumen espocrm "$NACHHER_ESPO_ID" "$VORHER_ESPO_ID"
|
||||||
|
aufraeumen mariadb "$NACHHER_DB_ID" "$VORHER_DB_ID"
|
||||||
|
echo "--- Images auf der VM (behalten: laufendes und vorheriges)"
|
||||||
|
docker image ls --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}' 2>/dev/null \
|
||||||
|
| grep -E 'REPOSITORY|^espocrm|^mariadb' | sed 's/^/ /'
|
||||||
echo "--- Rueckweg"
|
echo "--- Rueckweg"
|
||||||
lvs --noheadings -o lv_name,lv_attr,origin,data_percent "$VG/$SNAPSHOT" 2>/dev/null | sed 's/^ */ /'
|
lvs --noheadings -o lv_name,lv_attr,origin,lv_size,data_percent "$VG/$SNAPSHOT" 2>/dev/null | sed 's/^ */ /'
|
||||||
echo "--- Naechster Schritt von Hand"
|
echo "--- Naechster Schritt von Hand"
|
||||||
echo "Instanz pruefen (Anmeldung, ein Datensatz, E-Mail, WebSocket). Erst danach ESPO-11 ausfuehren,"
|
echo "Instanz pruefen (Anmeldung, ein Datensatz, E-Mail, WebSocket). Erst danach ESPO-11 ausfuehren,"
|
||||||
echo "das den Snapshot verwirft. Solange er besteht, kostet jeder Schreibvorgang zusaetzliche Zeit,"
|
echo "das den Snapshot verwirft. Solange er besteht, kostet jeder Schreibvorgang zusaetzliche Zeit,"
|
||||||
|
|||||||
@ -14,6 +14,25 @@ SNAPSHOT=srv-vor-update
|
|||||||
COMPOSE=/srv/espo/docker-compose.yml
|
COMPOSE=/srv/espo/docker-compose.yml
|
||||||
WARTE_MAX=900
|
WARTE_MAX=900
|
||||||
|
|
||||||
|
# Wartet, bis alle vier Container "healthy" melden - "starting" ist keine Aussage.
|
||||||
|
alle_gesund() {
|
||||||
|
local c
|
||||||
|
for c in espocrm-db espocrm espocrm-daemon espocrm-websocket; do
|
||||||
|
[ "$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null)" = "healthy" ] || return 1
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Nennt die Container, die noch nicht gesund sind - fuer die Fehlermeldung.
|
||||||
|
nicht_gesund() {
|
||||||
|
local c z=""
|
||||||
|
for c in espocrm-db espocrm espocrm-daemon espocrm-websocket; do
|
||||||
|
[ "$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null)" = "healthy" ] \
|
||||||
|
|| z="$z $c=$(docker inspect -f '{{.State.Health.Status}}' "$c" 2>/dev/null || echo fehlt)"
|
||||||
|
done
|
||||||
|
printf '%s' "${z# }"
|
||||||
|
}
|
||||||
|
|
||||||
fehler() { echo "FEHLER: $*"; echo "ESPO12_ERGEBNIS: FEHLER"; exit 1; }
|
fehler() { echo "FEHLER: $*"; echo "ESPO12_ERGEBNIS: FEHLER"; exit 1; }
|
||||||
|
|
||||||
# Bringt den Dienst wieder hoch, wenn der Rueckweg abgebrochen wird - eine stehende Instanz
|
# Bringt den Dienst wieder hoch, wenn der Rueckweg abgebrochen wird - eine stehende Instanz
|
||||||
@ -79,11 +98,10 @@ START_AUSGABE="$(docker compose -f "$COMPOSE" up -d --quiet-pull 2>&1)" || {
|
|||||||
# 7. Auf die Anwendung warten.
|
# 7. Auf die Anwendung warten.
|
||||||
ENDE=$(( SECONDS + WARTE_MAX ))
|
ENDE=$(( SECONDS + WARTE_MAX ))
|
||||||
while [ "$SECONDS" -lt "$ENDE" ]; do
|
while [ "$SECONDS" -lt "$ENDE" ]; do
|
||||||
[ "$(docker inspect -f '{{.State.Health.Status}}' espocrm 2>/dev/null)" = "healthy" ] && break
|
alle_gesund && break
|
||||||
sleep 10
|
sleep 10
|
||||||
done
|
done
|
||||||
[ "$(docker inspect -f '{{.State.Health.Status}}' espocrm 2>/dev/null)" = "healthy" ] \
|
alle_gesund || fehler "nach ${WARTE_MAX}s nicht alle Container gesund: $(nicht_gesund) - 'docker logs <name>' ansehen"
|
||||||
|| fehler "espocrm nach ${WARTE_MAX}s nicht gesund - 'docker logs espocrm' ansehen"
|
|
||||||
|
|
||||||
# 8. Ergebnis zeigen.
|
# 8. Ergebnis zeigen.
|
||||||
echo "--- Container"
|
echo "--- Container"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user