1b74ddc0c9
gates / gates (push) Successful in 33s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
32 lines
2.8 KiB
Bash
32 lines
2.8 KiB
Bash
#!/bin/bash
|
|
# g4.sh <label> <docker-version> [containerd-version] — runs INSIDE 9202. Steps the engine to one exact
|
|
# version and measures: container downtime (front-door probes every 0.5 s), restarts, controller reaction.
|
|
export DEBIAN_FRONTEND=noninteractive LC_ALL=C
|
|
L=$1 V=$2 C=${3:-}
|
|
PL=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' paperless-webserver | awk '{print $1}')
|
|
CT=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' felhom-controller | awk '{print $1}')
|
|
echo "### $L: -> docker $V ${C:+containerd $C} live-restore=$(docker info -f '{{.LiveRestoreEnabled}}' 2>/dev/null) from $(docker version -f '{{.Server.Version}}' 2>/dev/null)"
|
|
before=$(for c in $(docker ps -q); do docker inspect -f '{{.Name}}={{.State.StartedAt}}' $c; done | sort)
|
|
( while [ ! -f /tmp/g4-stop ]; do
|
|
p=$(curl -s -o /dev/null -m 1 -w '%{http_code}' http://$PL:8000/ 2>/dev/null)
|
|
k=$(curl -s -o /dev/null -m 1 -w '%{http_code}' http://$CT:8080/api/health 2>/dev/null)
|
|
echo "$(date +%s.%N) $p $k"; sleep 0.5; done ) > /tmp/g4-probe-$L.txt &
|
|
PP=$!
|
|
sleep 3
|
|
T0=$(date +%s.%N)
|
|
pk="docker-ce=5:$V-1~debian.13~trixie docker-ce-cli=5:$V-1~debian.13~trixie docker-ce-rootless-extras=5:$V-1~debian.13~trixie"
|
|
[ -n "$C" ] && pk="$pk containerd.io=$C-1~debian.13~trixie"
|
|
apt-get install -y -q --allow-downgrades -o Dpkg::Options::=--force-confold $pk > /tmp/g4-apt-$L.log 2>&1
|
|
echo "apt_rc=$? apt_seconds=$(awk -v a=$T0 -v b=$(date +%s.%N) 'BEGIN{printf "%.1f", b-a}')"
|
|
for i in $(seq 1 120); do
|
|
h=$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' felhom-controller paperless-webserver paperless-postgres paperless-redis filebrowser traefik 2>/dev/null | sort -u | tr '\n' ' ')
|
|
case "$h" in "healthy running "|"healthy ") break;; esac; sleep 1; done
|
|
echo "all healthy at +$(awk -v a=$T0 -v b=$(date +%s.%N) 'BEGIN{printf "%.1f", b-a}')s ($h)"
|
|
sleep 3; touch /tmp/g4-stop; wait $PP; rm -f /tmp/g4-stop
|
|
echo "server now $(docker version -f '{{.Server.Version}}') containerd $(dpkg-query -W -f='${Version}' containerd.io)"
|
|
awk -v t0=$T0 '{ if ($2=="000") pd+=0.5; if ($3=="000") kd+=0.5; if ($2=="000" && !pf) pf=$1-t0; if ($2!="000" && pd>0 && !pl) pl=$1-t0 } END { printf "paperless front door: %.1fs NO ANSWER (first at +%.1fs, back by +%.1fs); controller: %.1fs NO ANSWER\n", pd, pf, pl, kd }' /tmp/g4-probe-$L.txt
|
|
after=$(for c in $(docker ps -aq); do docker inspect -f '{{.Name}}={{.State.StartedAt}}' $c; done | sort)
|
|
echo "containers restarted: $(diff <(echo "$before") <(echo "$after") | grep -c '^>') of $(echo "$before" | wc -l)"
|
|
echo "controller log since step (warnings/errors/boot):"
|
|
docker logs --since "$(date -u -d @${T0%.*} +%FT%TZ)" felhom-controller 2>&1 | grep -E "\[(WARN|ERROR)\]|starting felhom-controller|boot sweep|recover|app_(start|stop)" | head -8 | cut -c1-220
|