Aktualisierungsweg gangbar machen
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>
This commit is contained in:
+16
-1
@@ -112,6 +112,21 @@ MONITOR_UNIT="$NAME-monitor.service"
|
|||||||
NGINX_SITE="/etc/nginx/sites-available/$NAME"
|
NGINX_SITE="/etc/nginx/sites-available/$NAME"
|
||||||
ENV_PREFIX="TESM_"
|
ENV_PREFIX="TESM_"
|
||||||
[[ "$APP" == "tesm-license" ]] && ENV_PREFIX="TESM_LICENSE_"
|
[[ "$APP" == "tesm-license" ]] && ENV_PREFIX="TESM_LICENSE_"
|
||||||
|
# Bei einer Aktualisierung gilt zuerst, was schon eingerichtet ist. Sonst
|
||||||
|
# verschiebt ein Update ohne Portangaben die Anwendung: eine benannte Instanz
|
||||||
|
# faellt auf 8080/8443 zurueck, auch wenn sie seit der Installation auf Port 80
|
||||||
|
# lief -- und ein Reverse Proxy davor zeigt dann ins Leere. Dieselbe Regel wie
|
||||||
|
# beim Secure-Flag weiter unten: eine Aktualisierung nimmt nichts weg, was
|
||||||
|
# nicht ausdruecklich neu gesetzt wird.
|
||||||
|
ENV_FILE="/etc/tesm/$NAME.env"
|
||||||
|
if [[ -z "$PORT" && -f "$ENV_FILE" ]]; then
|
||||||
|
PORT="$(sed -n "s/^${ENV_PREFIX}BIND=127\.0\.0\.1:\([0-9]\{1,5\}\)$/\1/p" "$ENV_FILE" | head -1)"
|
||||||
|
fi
|
||||||
|
if [[ -f "$NGINX_SITE" ]]; then
|
||||||
|
[[ -z "$HTTP_PORT" ]] && HTTP_PORT="$(sed -n 's/^[[:space:]]*listen[[:space:]]\([0-9]\{1,5\}\);.*/\1/p' "$NGINX_SITE" | head -1)"
|
||||||
|
[[ -z "$HTTPS_PORT" ]] && HTTPS_PORT="$(sed -n 's/^[[:space:]]*listen[[:space:]]\([0-9]\{1,5\}\)[[:space:]]\+ssl.*/\1/p' "$NGINX_SITE" | head -1)"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -z "$PORT" ]]; then
|
if [[ -z "$PORT" ]]; then
|
||||||
PORT=5000
|
PORT=5000
|
||||||
[[ "$APP" == "tesm-license" ]] && PORT=5001
|
[[ "$APP" == "tesm-license" ]] && PORT=5001
|
||||||
@@ -134,7 +149,7 @@ fi
|
|||||||
# Browser sendet das Cookie dann weiter nur ueber HTTPS, die Anwendung setzt es
|
# Browser sendet das Cookie dann weiter nur ueber HTTPS, die Anwendung setzt es
|
||||||
# aber ohne das Flag neu, und beide reden aneinander vorbei.
|
# aber ohne das Flag neu, und beide reden aneinander vorbei.
|
||||||
COOKIE_SECURE=0
|
COOKIE_SECURE=0
|
||||||
if [[ -f "/etc/tesm/$NAME.env" ]] && grep -q "^${ENV_PREFIX}COOKIE_SECURE=1" "/etc/tesm/$NAME.env"; then
|
if [[ -f "$ENV_FILE" ]] && grep -q "^${ENV_PREFIX}COOKIE_SECURE=1" "$ENV_FILE"; then
|
||||||
COOKIE_SECURE=1
|
COOKIE_SECURE=1
|
||||||
fi
|
fi
|
||||||
[[ $HTTPS -eq 1 ]] && COOKIE_SECURE=1
|
[[ $HTTPS -eq 1 ]] && COOKIE_SECURE=1
|
||||||
|
|||||||
+22
-6
@@ -14,15 +14,31 @@ set -euo pipefail
|
|||||||
|
|
||||||
APP="${1:-}"
|
APP="${1:-}"
|
||||||
TAG="${2:-latest}"
|
TAG="${2:-latest}"
|
||||||
BASE="${TESM_RELEASE_BASE:-https://gitea.example.invalid}"
|
|
||||||
OWNER="${TESM_RELEASE_OWNER:-wis}"
|
# Alles nach dem Tag geht unveraendert an install.sh weiter. Ohne das liesse
|
||||||
REPO="${TESM_RELEASE_REPO:-tesm}"
|
# 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" ]] || {
|
[[ "$APP" == "tesm" || "$APP" == "tesm-license" ]] || {
|
||||||
echo "Verwendung: update.sh <tesm|tesm-license> [tag]" >&2
|
echo "Verwendung: update.sh <tesm|tesm-license> [tag] [install.sh-Argumente ...]" >&2
|
||||||
|
echo "Beispiel : update.sh tesm latest --instance opus" >&2
|
||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
REPO="${TESM_RELEASE_REPO:-$APP}"
|
||||||
|
|
||||||
WORK="$(mktemp -d /tmp/tesm-update-XXXXXX)"
|
WORK="$(mktemp -d /tmp/tesm-update-XXXXXX)"
|
||||||
trap 'rm -rf "$WORK"' EXIT # anders als im Vorgaenger wird aufgeraeumt
|
trap 'rm -rf "$WORK"' EXIT # anders als im Vorgaenger wird aufgeraeumt
|
||||||
|
|
||||||
@@ -50,7 +66,7 @@ if file "$SRC/deploy/install.sh" | grep -q CRLF; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
read -r -p "Version $TAG fuer $APP installieren? [j/N] " answer
|
read -r -p "Version $TAG fuer $APP${EXTRA[0]+ (${EXTRA[*]})} installieren? [j/N] " answer
|
||||||
[[ "$answer" =~ ^[jJyY]$ ]] || exit 0
|
[[ "$answer" =~ ^[jJyY]$ ]] || exit 0
|
||||||
|
|
||||||
exec sudo bash "$SRC/deploy/install.sh" --app "$APP" --yes
|
exec sudo bash "$SRC/deploy/install.sh" --app "$APP" --yes ${EXTRA[0]+"${EXTRA[@]}"}
|
||||||
|
|||||||
@@ -103,6 +103,44 @@ Aktualisierung ist, und tut dann zusätzlich:
|
|||||||
Eine bereits eingerichtete HTTPS-Konfiguration bleibt erhalten, auch ohne
|
Eine bereits eingerichtete HTTPS-Konfiguration bleibt erhalten, auch ohne
|
||||||
`--https`.
|
`--https`.
|
||||||
|
|
||||||
|
### Ohne Quellbaum: `update.sh`
|
||||||
|
|
||||||
|
Liegt kein entpacktes Release vor, holt `update.sh` es selbst -- es lädt das
|
||||||
|
Release-Asset, entpackt es und ruft dessen `install.sh` auf:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo bash /opt/tesm/deploy/update.sh tesm
|
||||||
|
sudo bash /opt/tesm-license/deploy/update.sh tesm-license
|
||||||
|
```
|
||||||
|
|
||||||
|
Alles nach dem Tag geht unverändert an `install.sh` weiter -- das ist der Weg,
|
||||||
|
eine **benannte Instanz** zu aktualisieren:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo bash /opt/tesm-opus/deploy/update.sh tesm latest --instance opus
|
||||||
|
```
|
||||||
|
|
||||||
|
Ohne `--instance` entstünde daneben eine zweite Installation namens `tesm`, mit
|
||||||
|
eigener Datenbank und eigener nginx-Site. Die Ports einer bestehenden
|
||||||
|
Installation bleiben erhalten, auch wenn sie von den Vorgaben abweichen: eine
|
||||||
|
Aktualisierung verschiebt nichts, was nicht ausdrücklich neu gesetzt wird.
|
||||||
|
|
||||||
|
Ohne Tag wird `latest` **über die API aufgelöst**, nicht in die URL geschrieben:
|
||||||
|
Gitea liefert unter einem Tag-Namen sonst ein automatisch erzeugtes
|
||||||
|
Quell-Archiv mit HTTP 200 statt des echten Anhangs -- und das enthält kein
|
||||||
|
Release, sondern den Repositoriumsstand.
|
||||||
|
|
||||||
|
Die Bezugsquelle ist voreingestellt und lässt sich über die Umgebung umlenken,
|
||||||
|
etwa auf eine Spiegelung:
|
||||||
|
|
||||||
|
| Variable | Vorgabe |
|
||||||
|
|---|---|
|
||||||
|
| `TESM_RELEASE_BASE` | `https://gitea.int.eertmoed.net` |
|
||||||
|
| `TESM_RELEASE_OWNER` | `alientim` |
|
||||||
|
| `TESM_RELEASE_REPO` | der Anwendungsname (`tesm` bzw. `tesm-license`) |
|
||||||
|
|
||||||
|
Der erwartete Anhang heisst `<repo>-<tag>.tar.gz`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. HTTPS
|
## 4. HTTPS
|
||||||
|
|||||||
@@ -166,6 +166,13 @@ class SysOps:
|
|||||||
input=stdin,
|
input=stdin,
|
||||||
capture_output=True,
|
capture_output=True,
|
||||||
text=True,
|
text=True,
|
||||||
|
# Kodierung festnageln. "text=True" allein nimmt die Locale des
|
||||||
|
# Prozesses -- unter systemd ist die haeufig C/ASCII, und dann
|
||||||
|
# bricht das Lesen ab, sobald ein Werkzeug einen Umlaut
|
||||||
|
# ausgibt. Der Fehler entsteht im Leser-Thread von subprocess,
|
||||||
|
# also weit weg von der Zeile, die ihn ausgeloest hat.
|
||||||
|
encoding="utf-8",
|
||||||
|
errors="replace",
|
||||||
timeout=timeout or self.timeout,
|
timeout=timeout or self.timeout,
|
||||||
check=False,
|
check=False,
|
||||||
)
|
)
|
||||||
@@ -197,6 +204,8 @@ class SysOps:
|
|||||||
[binary, *command[1:]],
|
[binary, *command[1:]],
|
||||||
capture_output=True,
|
capture_output=True,
|
||||||
text=True,
|
text=True,
|
||||||
|
encoding="utf-8",
|
||||||
|
errors="replace",
|
||||||
timeout=timeout,
|
timeout=timeout,
|
||||||
check=False,
|
check=False,
|
||||||
)
|
)
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user