feat(deploy): Update und Sicherung fuer beide Installationsarten (#031)
Prüfung / pruefung (push) Canceled after 0s
Prüfung / pruefung (push) Canceled after 0s
deploy/update.sh und deploy/backup.sh konnten nur Docker. Beide erkennen die Installationsart jetzt selbst und beherrschen auch die Installation als Dienst: npm ci, prisma migrate deploy, bauen, systemctl restart - und pg_dump ueber DATABASE_URL fuer die Sicherung. Beim Durchspielen gegen einen laufenden Stapel zwei Fehler gefunden: 1. Die Zustandspruefung des Web-Containers konnte nie gelingen. Next bindet im Standalone-Modus an die Adresse aus HOSTNAME, und Docker setzt dort den Containernamen - der Server lauschte nur auf der Container-IP. Der Dienst web blieb dauerhaft auf "health: starting". Behoben mit ENV HOSTNAME=0.0.0.0; geprueft wird jetzt ueber 127.0.0.1. 2. Eine fehlgeschlagene Sicherung hielt die Aktualisierung nicht auf. Jetzt bricht sie ab, bevor etwas veraendert wird, und nennt die Auswege. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+42
-8
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Sichert Datenbank und hochgeladene PDFs von ProxLedger.
|
||||
# Sichert Datenbank, hochgeladene PDFs und die Konfiguration von ProxLedger.
|
||||
# Erkennt selbst, ob die Installation mit Docker oder als Dienst im Container läuft.
|
||||
#
|
||||
# ./backup.sh /pfad/zum/sicherungsordner
|
||||
#
|
||||
@@ -13,17 +14,50 @@ set -o pipefail
|
||||
ZIEL="${1:-/var/backups/proxledger}"
|
||||
AUFBEWAHRUNG_TAGE="${AUFBEWAHRUNG_TAGE:-30}"
|
||||
STAND=$(date +%Y%m%d-%H%M%S)
|
||||
COMPOSE_VERZEICHNIS="${COMPOSE_VERZEICHNIS:-/opt/proxledger}"
|
||||
VERZEICHNIS="${COMPOSE_VERZEICHNIS:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
|
||||
|
||||
mkdir -p "$ZIEL"
|
||||
cd "$COMPOSE_VERZEICHNIS"
|
||||
cd "$VERZEICHNIS"
|
||||
|
||||
echo "Sichere Datenbank …"
|
||||
docker compose exec -T postgres pg_dump -U "${POSTGRES_USER:-proxledger}" "${POSTGRES_DB:-proxledger}" \
|
||||
| gzip > "${ZIEL}/datenbank-${STAND}.sql.gz"
|
||||
# Siehe deploy/update.sh – der Dienst ist das eindeutigere Merkmal.
|
||||
if systemctl cat proxledger.service >/dev/null 2>&1; then
|
||||
ART="dienst"
|
||||
else
|
||||
ART="docker"
|
||||
fi
|
||||
|
||||
echo "Sichere hochgeladene Dateien …"
|
||||
docker compose run --rm -T --entrypoint tar web -czf - /data/uploads > "${ZIEL}/uploads-${STAND}.tar.gz" 2>/dev/null || true
|
||||
echo "Sichere ProxLedger (${ART}) nach ${ZIEL} …"
|
||||
|
||||
if [ "$ART" = "docker" ]; then
|
||||
echo "Sichere Datenbank …"
|
||||
docker compose exec -T postgres pg_dump -U "${POSTGRES_USER:-proxledger}" "${POSTGRES_DB:-proxledger}" \
|
||||
| gzip > "${ZIEL}/datenbank-${STAND}.sql.gz"
|
||||
|
||||
echo "Sichere hochgeladene Dateien …"
|
||||
docker compose run --rm -T --entrypoint tar web -czf - /data/uploads > "${ZIEL}/uploads-${STAND}.tar.gz" 2>/dev/null || true
|
||||
else
|
||||
# DATABASE_URL steht in der .env; pg_dump versteht sie direkt.
|
||||
# shellcheck disable=SC1091
|
||||
set -o allexport
|
||||
. ./.env
|
||||
set +o allexport
|
||||
|
||||
[ -n "${DATABASE_URL:-}" ] || {
|
||||
echo "DATABASE_URL fehlt in der .env – ohne sie keine Sicherung." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "Sichere Datenbank …"
|
||||
pg_dump "$DATABASE_URL" | gzip > "${ZIEL}/datenbank-${STAND}.sql.gz"
|
||||
|
||||
echo "Sichere hochgeladene Dateien …"
|
||||
UPLOADS="${UPLOAD_DIR:-${VERZEICHNIS}/data/uploads}"
|
||||
if [ -d "$UPLOADS" ]; then
|
||||
tar -czf "${ZIEL}/uploads-${STAND}.tar.gz" -C "$(dirname "$UPLOADS")" "$(basename "$UPLOADS")"
|
||||
else
|
||||
echo " (kein Upload-Verzeichnis unter ${UPLOADS})"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Sichere Konfiguration …"
|
||||
cp .env "${ZIEL}/env-${STAND}.txt"
|
||||
|
||||
@@ -181,4 +181,5 @@ printf ' 3. Für den Betrieb über HTTPS einen Reverse Proxy davorsetzen (Beisp
|
||||
echo
|
||||
gelb "APP_URL in /opt/proxledger/.env auf die endgültige Adresse setzen, sobald der Reverse Proxy steht."
|
||||
printf ' Logs ansehen: pct exec %s -- docker compose -f /opt/proxledger/docker-compose.yml logs -f\n' "$CTID"
|
||||
printf ' Aktualisieren: pct exec %s -- bash -c "cd /opt/proxledger && git pull && docker compose up -d --build"\n' "$CTID"
|
||||
printf ' Aktualisieren: pct exec %s -- bash -c "bash /opt/proxledger/deploy/update.sh"\n' "$CTID"
|
||||
printf ' Sichern: pct exec %s -- bash -c "bash /opt/proxledger/deploy/backup.sh /var/backups/proxledger"\n' "$CTID"
|
||||
|
||||
+85
-17
@@ -1,7 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
# ProxLedger aktualisieren (Docker-Installation).
|
||||
# ProxLedger aktualisieren – erkennt selbst, ob die Installation mit Docker
|
||||
# oder als Dienst im Container (Node + PostgreSQL direkt) läuft.
|
||||
#
|
||||
# bash deploy/update.sh # Quelltext holen, neu bauen, migrieren, neu starten
|
||||
# bash deploy/update.sh # sichern, holen, bauen, migrieren, neu starten
|
||||
# bash deploy/update.sh --ohne-sicherung
|
||||
#
|
||||
# Vor dem Aktualisieren wird gesichert – das dauert Sekunden und erspart schlechte Abende.
|
||||
@@ -23,38 +24,105 @@ fehler() {
|
||||
SICHERN="ja"
|
||||
[ "${1:-}" = "--ohne-sicherung" ] && SICHERN="nein"
|
||||
|
||||
command -v docker >/dev/null 2>&1 || fehler "Docker nicht gefunden."
|
||||
[ -f .env ] || fehler "Keine .env gefunden – wird dieses Skript im richtigen Verzeichnis ausgeführt?"
|
||||
# Wohin gesichert wird. Der Standardort gehört root; wer anders arbeitet, setzt SICHERUNG_ZIEL.
|
||||
SICHERUNG_ZIEL="${SICHERUNG_ZIEL:-/var/backups/proxledger}"
|
||||
|
||||
# ---------------------------------------------------------------- Art der Installation
|
||||
#
|
||||
# Der systemd-Dienst ist das eindeutigere Merkmal: Die docker-compose.yml liegt auch im
|
||||
# Quelltext der Dienst-Installation, ein Dienst namens proxledger aber nur dort.
|
||||
installationsart() {
|
||||
if systemctl cat proxledger.service >/dev/null 2>&1; then
|
||||
printf 'dienst'
|
||||
elif command -v docker >/dev/null 2>&1 && [ -f docker-compose.yml ]; then
|
||||
printf 'docker'
|
||||
fi
|
||||
}
|
||||
|
||||
ART=$(installationsart)
|
||||
[ -n "$ART" ] || fehler "Keine Installation gefunden – weder der Dienst proxledger noch Docker mit docker-compose.yml."
|
||||
|
||||
blau "Installationsart: ${ART}"
|
||||
|
||||
# ---------------------------------------------------------------- Sicherung
|
||||
if [ "$SICHERN" = "ja" ]; then
|
||||
blau "Sicherung anlegen …"
|
||||
bash deploy/backup.sh
|
||||
blau "Sicherung anlegen nach ${SICHERUNG_ZIEL} …"
|
||||
if ! bash deploy/backup.sh "$SICHERUNG_ZIEL"; then
|
||||
fehler "Die Sicherung ist fehlgeschlagen – deshalb wird nicht aktualisiert.
|
||||
Häufigste Ursache: fehlende Rechte am Zielordner. Mögliche Wege:
|
||||
sudo bash deploy/update.sh
|
||||
SICHERUNG_ZIEL=/pfad/mit/rechten bash deploy/update.sh
|
||||
bash deploy/update.sh --ohne-sicherung (nur wenn anderweitig gesichert ist)"
|
||||
fi
|
||||
gruen "Sicherung abgeschlossen."
|
||||
else
|
||||
printf '\033[1;33m! Ohne Sicherung – auf eigenes Risiko.\033[0m\n'
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------- Quelltext
|
||||
if [ -d .git ]; then
|
||||
blau "Neuen Stand holen …"
|
||||
git pull --ff-only
|
||||
else
|
||||
printf '\033[1;33m! Kein Git-Verzeichnis – der Quelltext bleibt wie er ist.\033[0m\n'
|
||||
fi
|
||||
|
||||
blau "Abbilder neu bauen …"
|
||||
docker compose build --pull
|
||||
# ---------------------------------------------------------------- Aktualisieren
|
||||
if [ "$ART" = "docker" ]; then
|
||||
[ -f .env ] || fehler "Keine .env gefunden – wird dieses Skript im richtigen Verzeichnis ausgeführt?"
|
||||
|
||||
blau "Datenbank migrieren …"
|
||||
docker compose run --rm migrate
|
||||
blau "Abbilder neu bauen …"
|
||||
docker compose build --pull
|
||||
|
||||
blau "Dienste neu starten …"
|
||||
docker compose up -d
|
||||
blau "Datenbank migrieren …"
|
||||
docker compose run --rm migrate
|
||||
|
||||
# Kurz warten und nachsehen, ob das Dashboard wieder antwortet.
|
||||
blau "Dienste neu starten …"
|
||||
docker compose up -d
|
||||
else
|
||||
command -v npm >/dev/null 2>&1 || fehler "npm nicht gefunden – gehört zur Installation als Dienst."
|
||||
[ -f .env ] || fehler "Keine .env gefunden (erwartet in ${VERZEICHNIS})."
|
||||
|
||||
# Die .env trägt APP_SECRET; ein git pull fasst sie nicht an, aber sicher ist sicher.
|
||||
cp .env "/tmp/proxledger-env-$(date +%s).sicherung"
|
||||
|
||||
blau "Abhängigkeiten installieren …"
|
||||
npm ci
|
||||
|
||||
blau "Datenbank migrieren …"
|
||||
npx prisma generate
|
||||
npx prisma migrate deploy
|
||||
|
||||
blau "Anwendung bauen …"
|
||||
npm run build
|
||||
npm run build:worker
|
||||
|
||||
blau "Dienste neu starten …"
|
||||
systemctl restart proxledger proxledger-worker
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------- Prüfen
|
||||
blau "Warte auf das Dashboard …"
|
||||
for versuch in $(seq 1 30); do
|
||||
if docker compose exec -T web wget -qO- http://localhost:3000/api/gesundheit >/dev/null 2>&1; then
|
||||
PORT="${PORT:-3000}"
|
||||
|
||||
for versuch in $(seq 1 45); do
|
||||
if [ "$ART" = "docker" ]; then
|
||||
erreichbar=$(docker compose exec -T web wget -qO- "http://127.0.0.1:3000/api/gesundheit" >/dev/null 2>&1 && echo ja || echo nein)
|
||||
else
|
||||
erreichbar=$(curl -fsS -o /dev/null --max-time 2 "http://localhost:${PORT}/api/gesundheit" && echo ja || echo nein)
|
||||
fi
|
||||
|
||||
if [ "$erreichbar" = "ja" ]; then
|
||||
gruen "ProxLedger läuft wieder (nach ${versuch} s)."
|
||||
docker compose ps
|
||||
[ "$ART" = "docker" ] && docker compose ps
|
||||
[ "$ART" = "dienst" ] && systemctl --no-pager --lines=0 status proxledger proxledger-worker | grep -E "●|Active:"
|
||||
exit 0
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
fehler "Das Dashboard antwortet nicht. Protokoll ansehen: docker compose logs -n 50 web"
|
||||
if [ "$ART" = "docker" ]; then
|
||||
fehler "Das Dashboard antwortet nicht. Protokoll ansehen: docker compose logs -n 50 web"
|
||||
else
|
||||
fehler "Das Dashboard antwortet nicht. Protokoll ansehen: journalctl -u proxledger -n 50"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user