Drei Fehler, die erst beim Aktualisieren auffallen -- also genau dann, wenn niemand sie sehen will: * update.sh zeigte auf "gitea.example.invalid" und den Besitzer "wis". Auf keinem Host konnte das funktionieren, und die Doku erwaehnte die Variablen nicht, mit denen man es haette umlenken koennen. Die Vorgaben zeigen jetzt dorthin, wo die Releases liegen; das Repository heisst wie die Anwendung. * update.sh gab nichts an install.sh weiter. Eine benannte Instanz war damit nicht aktualisierbar: ohne --instance entsteht neben "tesm-opus" eine zweite Installation namens "tesm", mit eigener Datenbank und eigener nginx-Site. * install.sh setzte bei einer Instanz die Ports auf 8080/8443 zurueck, auch wenn sie seit der Installation auf Port 80 lief. Ein Reverse Proxy davor haette danach ins Leere gezeigt. Bestehende Ports werden jetzt aus Umgebungsdatei und nginx-Site uebernommen -- dieselbe Regel wie beim Secure-Flag: eine Aktualisierung nimmt nichts weg, was nicht ausdruecklich neu gesetzt wird. Zwei Tests fuehren dazu die echten Zeilen aus den Skripten aus, statt sie nachzubauen. Beide fallen ohne die Korrektur durch. Ausserdem: die vier subprocess-Aufrufe im Textmodus nageln die Kodierung auf UTF-8 fest. "text=True" allein nimmt die Locale des Prozesses -- unter systemd haeufig C/ASCII --, und das Lesen bricht ab, sobald ein Werkzeug einen Umlaut ausgibt. Der Fehler entstand im Leser-Thread von subprocess und damit weit weg von seiner Ursache; im Testlauf war er als Warnung sichtbar. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
73 lines
3.0 KiB
Bash
73 lines
3.0 KiB
Bash
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# Bootstrapper: laedt ein Release herunter und ruft dessen install.sh auf.
|
|
# Enthaelt selbst keinerlei Installationslogik.
|
|
#
|
|
# Zwei Fallen des Vorgaengers sind hier bewusst vermieden:
|
|
# * Der Tag "latest" wird ueber die API aufgeloest, nie direkt in die
|
|
# Download-URL geschrieben. Gitea liefert sonst mit HTTP 200 ein
|
|
# automatisch erzeugtes Quell-Snapshot statt des echten Release-Assets.
|
|
# * Nach dem Entpacken wird geprueft, dass ein install.sh existiert -- faengt
|
|
# denselben Fehler ein zweites Mal ab.
|
|
# =============================================================================
|
|
set -euo pipefail
|
|
|
|
APP="${1:-}"
|
|
TAG="${2:-latest}"
|
|
|
|
# Alles nach dem Tag geht unveraendert an install.sh weiter. Ohne das liesse
|
|
# sich eine benannte Instanz nicht aktualisieren: install.sh leitet den Namen
|
|
# aus "--instance" ab, und ohne den Schalter entstuende neben "tesm-opus" eine
|
|
# zweite Installation namens "tesm" -- mit eigener Datenbank, eigener
|
|
# nginx-Site und demselben Port.
|
|
shift $(( $# > 2 ? 2 : $# ))
|
|
EXTRA=("$@")
|
|
# Bezugsquelle. Die Vorgaben zeigen dorthin, wo die Releases tatsaechlich
|
|
# liegen -- ein Platzhalter wie "gitea.example.invalid" macht das Skript auf
|
|
# jedem Host unbrauchbar, und genau das war hier der Fall.
|
|
#
|
|
# Das Repository heisst wie die Anwendung; getrennte Repositorien, getrennte
|
|
# Releases. Der Anhang heisst "<repo>-<tag>.tar.gz", siehe unten.
|
|
BASE="${TESM_RELEASE_BASE:-https://gitea.int.eertmoed.net}"
|
|
OWNER="${TESM_RELEASE_OWNER:-alientim}"
|
|
|
|
[[ "$APP" == "tesm" || "$APP" == "tesm-license" ]] || {
|
|
echo "Verwendung: update.sh <tesm|tesm-license> [tag] [install.sh-Argumente ...]" >&2
|
|
echo "Beispiel : update.sh tesm latest --instance opus" >&2
|
|
exit 2
|
|
}
|
|
|
|
REPO="${TESM_RELEASE_REPO:-$APP}"
|
|
|
|
WORK="$(mktemp -d /tmp/tesm-update-XXXXXX)"
|
|
trap 'rm -rf "$WORK"' EXIT # anders als im Vorgaenger wird aufgeraeumt
|
|
|
|
if [[ "$TAG" == "latest" ]]; then
|
|
echo "==> Ermittle aktuellen Release-Tag ..."
|
|
TAG="$(curl -fsS "$BASE/api/v1/repos/$OWNER/$REPO/releases/latest" \
|
|
| python3 -c 'import json,sys; print(json.load(sys.stdin)["tag_name"])')"
|
|
echo " $TAG"
|
|
fi
|
|
|
|
ASSET="$REPO-$TAG.tar.gz"
|
|
echo "==> Lade $ASSET ..."
|
|
curl -fsSL -o "$WORK/$ASSET" "$BASE/$OWNER/$REPO/releases/download/$TAG/$ASSET"
|
|
|
|
echo "==> Entpacke ..."
|
|
tar -xzf "$WORK/$ASSET" -C "$WORK"
|
|
SRC="$(find "$WORK" -maxdepth 2 -name install.sh -path '*/deploy/*' -printf '%h/..\n' | head -1)"
|
|
[[ -n "$SRC" ]] || { echo "Im Paket fehlt deploy/install.sh -- Download unbrauchbar." >&2; exit 1; }
|
|
SRC="$(cd "$SRC" && pwd)"
|
|
|
|
echo "==> Pruefe auf CRLF (Windows-Buildmaschinen) ..."
|
|
if file "$SRC/deploy/install.sh" | grep -q CRLF; then
|
|
echo "Das Paket enthaelt CRLF-Zeilenenden. Beim Paketieren fehlte" >&2
|
|
echo "'git -c core.autocrlf=false archive'." >&2
|
|
exit 1
|
|
fi
|
|
|
|
read -r -p "Version $TAG fuer $APP${EXTRA[0]+ (${EXTRA[*]})} installieren? [j/N] " answer
|
|
[[ "$answer" =~ ^[jJyY]$ ]] || exit 0
|
|
|
|
exec sudo bash "$SRC/deploy/install.sh" --app "$APP" --yes ${EXTRA[0]+"${EXTRA[@]}"}
|