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:
@@ -396,31 +396,46 @@ Rückweg immer nutzbar.
|
||||
**Sichern:**
|
||||
|
||||
```bash
|
||||
./deploy/backup.sh /var/backups/proxledger
|
||||
bash /opt/proxledger/deploy/backup.sh /var/backups/proxledger
|
||||
```
|
||||
|
||||
Das Skript sichert Datenbank, hochgeladene PDFs und die `.env`. Für regelmäßige Sicherungen in die
|
||||
Crontab eintragen:
|
||||
Das Skript sichert Datenbank, hochgeladene PDFs und die `.env` – und erkennt selbst, ob die
|
||||
Installation mit Docker oder als Dienst im Container läuft. Für regelmäßige Sicherungen in die Crontab:
|
||||
|
||||
```
|
||||
30 2 * * * /opt/proxledger/deploy/backup.sh /var/backups/proxledger
|
||||
```
|
||||
|
||||
**Zurückspielen:**
|
||||
**Zurückspielen** (Docker):
|
||||
|
||||
```bash
|
||||
gunzip -c datenbank-20260917-023000.sql.gz | docker compose exec -T postgres psql -U proxledger proxledger
|
||||
```
|
||||
|
||||
Bei der Installation als Dienst stattdessen:
|
||||
|
||||
```bash
|
||||
gunzip -c datenbank-20260917-023000.sql.gz | psql "$DATABASE_URL"
|
||||
```
|
||||
|
||||
**Aktualisieren:**
|
||||
|
||||
```bash
|
||||
cd /opt/proxledger
|
||||
git pull
|
||||
docker compose up -d --build
|
||||
bash /opt/proxledger/deploy/update.sh
|
||||
```
|
||||
|
||||
Migrationen laufen dabei automatisch.
|
||||
Ein Befehl für beide Installationsarten. Der Reihe nach: sichern, neuen Stand holen, bauen,
|
||||
migrieren, neu starten – und zum Schluss prüfen, ob das Dashboard wieder antwortet. Schlägt die
|
||||
Sicherung fehl, bricht das Skript ab, **bevor** etwas verändert wird.
|
||||
|
||||
| Aufruf | Wirkung |
|
||||
|---|---|
|
||||
| `bash deploy/update.sh` | der übliche Weg |
|
||||
| `SICHERUNG_ZIEL=/pfad bash deploy/update.sh` | anderer Ort für die Sicherung |
|
||||
| `bash deploy/update.sh --ohne-sicherung` | nur, wenn anderweitig gesichert ist |
|
||||
|
||||
Beim LXC-Weg nach Art der Helper-Scripts geht es auch über das Skript auf dem Proxmox-Host – dort
|
||||
erkennt das Gerüst eine vorhandene Installation und bietet die Aktualisierung an.
|
||||
|
||||
> `APP_SECRET` unbedingt mitsichern: Ohne diesen Wert sind alle Sitzungen ungültig. Und beachte, dass eine
|
||||
> Sicherung die Zugangsdaten für SMTP und Webhook im Klartext enthält – sie gehört entsprechend geschützt.
|
||||
|
||||
@@ -14,10 +14,15 @@ Maschinenkennung, nicht an einem Token.
|
||||
## Sichern
|
||||
|
||||
```bash
|
||||
bash deploy/backup.sh # Datenbank und Uploads
|
||||
bash deploy/backup.sh /var/backups/proxledger
|
||||
```
|
||||
|
||||
Beim LXC-Weg reicht zusätzlich die gewohnte Proxmox-Sicherung des Containers.
|
||||
Das Skript erkennt selbst, ob die Installation mit Docker oder als Dienst läuft, und sichert in beiden
|
||||
Fällen Datenbank, Uploads und `.env`. Beim LXC-Weg reicht zusätzlich die gewohnte Proxmox-Sicherung
|
||||
des Containers.
|
||||
|
||||
Vor jeder Aktualisierung läuft es ohnehin automatisch – [`deploy/update.sh`](../../deploy/update.sh)
|
||||
ruft es als Erstes auf und bricht ab, wenn es fehlschlägt.
|
||||
|
||||
## Zurückspielen
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# #031 Update- und Sicherungsskript für beide Installationsarten
|
||||
**Status:** erledigt
|
||||
**Meilenstein:** v0.20.0
|
||||
**Labels:** deployment
|
||||
**Geschätzt:** 2 h **Tatsächlich:** 0 h 45 min
|
||||
|
||||
## Ziel
|
||||
`deploy/update.sh` und `deploy/backup.sh` konnten nur Docker. Die Installation als Dienst (Node und
|
||||
PostgreSQL direkt im LXC) ging leer aus – dort half nur der Weg über das Gerüst der community-scripts.
|
||||
|
||||
## Aufgaben
|
||||
- [x] Beide Skripte erkennen die Installationsart selbst (systemd-Dienst oder Docker)
|
||||
- [x] Dienst-Weg: `npm ci`, `prisma migrate deploy`, bauen, `systemctl restart`
|
||||
- [x] Sicherung für den Dienst-Weg: `pg_dump` über `DATABASE_URL`, Uploads aus `UPLOAD_DIR`
|
||||
- [x] Fehlgeschlagene Sicherung bricht die Aktualisierung ab – **vor** jeder Änderung
|
||||
- [x] Hinweis am Ende von `deploy/lxc-installer.sh` auf die Skripte umgestellt
|
||||
- [x] Handbuch und Betriebsdoku angepasst
|
||||
- [x] Docker-Weg vollständig durchgespielt
|
||||
|
||||
## Zwei Fehler beim Durchspielen gefunden
|
||||
1. **Die Zustandsprüfung des Web-Containers konnte nie gelingen.** Next bindet im Standalone-Modus an
|
||||
die Adresse aus `HOSTNAME` – und Docker setzt darin den Containernamen. Der Server lauschte also
|
||||
nur auf der Container-IP, nicht auf `127.0.0.1`. Der Dienst `web` blieb dauerhaft auf
|
||||
„health: starting“; von außen war er trotzdem erreichbar, deshalb fiel es bisher nicht auf.
|
||||
Behoben mit `ENV HOSTNAME=0.0.0.0` im Dockerfile; die Prüfungen verwenden jetzt `127.0.0.1`
|
||||
statt `localhost` (das löst im Container auch auf `::1` auf).
|
||||
2. **Die Sicherung scheiterte stumm an fehlenden Rechten** (`/var/backups` gehört root) und die
|
||||
Aktualisierung lief trotzdem weiter. Jetzt bricht sie ab und nennt die drei Auswege.
|
||||
|
||||
## Prüfung
|
||||
Vollständiger Durchlauf gegen einen laufenden Stapel: Sicherung (Datenbank 6,3 KB mit 25 Tabellen,
|
||||
Uploads, `.env`), Abbilder gebaut, migriert, neu gestartet, Dashboard nach zwei Sekunden wieder da.
|
||||
Danach stand `web` zum ersten Mal auf **healthy**.
|
||||
@@ -34,4 +34,5 @@ Details und Architektur: [../architektur.md](../architektur.md). Zeiten werden a
|
||||
| [#028](028-passkeys.md) | Anmeldung mit Passkeys | erledigt | v0.18.0 | 4 h | 0 h 45 min |
|
||||
| [#029](029-betriebsdokumentation.md) | Einrichtungsdokumentation | erledigt | v0.19.0 | 3 h | 0 h 40 min |
|
||||
| [#030](030-netbird-reverse-proxy.md) | netbird Reverse Proxy in die Anleitung | erledigt | v0.19.1 | 1 h | 0 h 20 min |
|
||||
| | **Summe** | | | **147 h** | **15 h 23 min** |
|
||||
| [#031](031-update-skript-beide-varianten.md) | Update- und Sicherungsskript für beide Varianten | erledigt | v0.20.0 | 2 h | 0 h 45 min |
|
||||
| | **Summe** | | | **149 h** | **16 h 08 min** |
|
||||
|
||||
Reference in New Issue
Block a user