#!/usr/bin/env bash # Läuft im Debian-13-Container (von install-lxc.sh per `pct exec` aufgerufen): # # im-container.sh installieren --url http://10.0.10.50:3000 # im-container.sh aktualisieren # # Erwartet das Paket unter /root/proxdeploy-paket.tar.gz. set -euo pipefail # Über SSH/pct exec reisen die Locales des Aufrufers mit; im frischen Container gibt es sie nicht. export LC_ALL=C.UTF-8 LANG=C.UTF-8 unset LANGUAGE NODE_VERSION="24.21.0" BASIS="/opt/proxdeploy" ENV_DATEI="/etc/proxdeploy/proxdeploy.env" PAKET="/root/proxdeploy-paket.tar.gz" fehler() { echo "✗ $*" >&2; exit 1; } schritt() { echo "◐ $*"; } fertig() { echo "✓ $*"; } node_installieren() { case "$(uname -m)" in x86_64) arch=x64 ;; aarch64) arch=arm64 ;; *) fehler "Architektur $(uname -m) wird nicht unterstützt." ;; esac if [ -x /opt/node/bin/node ] && [ "$(/opt/node/bin/node --version)" = "v$NODE_VERSION" ]; then return; fi schritt "Node.js $NODE_VERSION" local datei="node-v$NODE_VERSION-linux-$arch.tar.xz" tmp tmp="$(mktemp -d)" curl -fsSL -o "$tmp/$datei" "https://nodejs.org/dist/v$NODE_VERSION/$datei" curl -fsSL -o "$tmp/SHASUMS256.txt" "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt" (cd "$tmp" && grep " $datei\$" SHASUMS256.txt | sha256sum -c --quiet) || fehler "Prüfsumme von $datei stimmt nicht." rm -rf /opt/node && mkdir -p /opt/node tar -xJf "$tmp/$datei" -C /opt/node --strip-components=1 rm -rf "$tmp" fertig "Node.js $(/opt/node/bin/node --version)" } paket_auspacken() { [ -f "$PAKET" ] || fehler "$PAKET fehlt." local version ziel version="$(tar -xzOf "$PAKET" ./VERSION)" ziel="$BASIS/versionen/$version" rm -rf "$ziel" && mkdir -p "$ziel" tar -xzf "$PAKET" -C "$ziel" chown -R root:root "$ziel" ln -sfn "$ziel" "$BASIS/aktuell" rm -f "$PAKET" # Die letzten drei Fassungen behalten – für ein Zurück per Symlink. find "$BASIS/versionen" -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -rn | tail -n +4 | cut -d' ' -f2- | xargs -r rm -rf echo "$version" } dienste_schreiben() { cat > /etc/systemd/system/proxdeploy-migrate.service < "/etc/systemd/system/proxdeploy-$dienst.service" </dev/null; then return 0; fi sleep 2 done journalctl -u proxdeploy-app -u proxdeploy-migrate --no-pager -n 30 >&2 fehler "Die app antwortet nicht." } installieren() { local url="" while [ $# -gt 0 ]; do case "$1" in --url) url="$2"; shift 2 ;; *) fehler "Unbekannte Option $1" ;; esac done [ -n "$url" ] || fehler "--url fehlt." [ -f "$ENV_DATEI" ] && fehler "ProxDeploy ist hier schon eingerichtet – zum Aktualisieren: install-lxc.sh --aktualisieren " schritt "Pakete (PostgreSQL, curl)" export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get install -y -qq --no-install-recommends ca-certificates curl xz-utils openssl postgresql >/dev/null fertig "PostgreSQL $(psql --version | awk '{print $3}')" node_installieren schritt "Benutzer und Datenbank" id proxdeploy >/dev/null 2>&1 || useradd --system --home-dir /var/lib/proxdeploy --create-home --shell /usr/sbin/nologin proxdeploy local db_passwort admin_passwort db_passwort="$(openssl rand -hex 24)" admin_passwort="$(openssl rand -base64 18 | tr -d '/+=' | cut -c1-20)" su postgres -c "psql -q -v ON_ERROR_STOP=1" < "$ENV_DATEI" </dev/null 2>&1 auf_gesundheit_warten # Der erste Admin ist angelegt – das Passwort hat in der Datei nichts mehr zu suchen. sed -i '/^ADMIN_PASSWORT=/d' "$ENV_DATEI" fertig "ProxDeploy $version läuft" cat </dev/null || echo –)" systemctl stop proxdeploy-app proxdeploy-worker version="$(paket_auspacken)" dienste_schreiben # migrate bleibt nach dem ersten Lauf „aktiv“ – für die neue Fassung ausdrücklich neu starten. systemctl restart proxdeploy-migrate systemctl start proxdeploy-app proxdeploy-worker auf_gesundheit_warten fertig "ProxDeploy $alt → $version" } case "${1:-}" in installieren) shift; installieren "$@" ;; aktualisieren) shift; aktualisieren "$@" ;; *) fehler "Aufruf: $0 installieren --url URL | aktualisieren" ;; esac