Backups und Upgrades
Was Sie sichern sollten
| Was | Wo (Beispiel-compose.yml) | Wie |
|---|---|---|
| Die Datenbank | das Volume pgdata | pg_dump, nächtlich |
| Hochgeladene Dateien | das Volume uploads oder Ihr S3-Bucket | Volume kopieren; bei S3 Bucket-Versionierung oder Replikation |
| Konfiguration | .env und compose.yml | eine Kopie in Ihrem Passwort-Manager oder Secret-Store aufbewahren |
Bewahren Sie APP_ENCRYPTION_KEY getrennt von den Datenbank-Backups auf: Backup und Schlüssel zusammen legen die
darin verschlüsselten Secrets offen.
Die Datenbank sichern
Ein konsistenter Dump, während die App weiterläuft:
cd /srv/sol2flow
docker compose exec -T db pg_dump -U sol2flow -Fc sol2flow > "backup/sol2flow-$(date +%F).dump"
Führen Sie ihn nächtlich aus (cron oder ein systemd-Timer), kopieren Sie die Dumps vom Server weg und löschen Sie alte nach einiger Zeit.
Die Dateien sichern
Mit dem lokalen Treiber archivieren Sie das Volume uploads:
docker run --rm -v sol2flow_uploads:/data:ro -v "$PWD/backup":/backup alpine \
tar czf "/backup/uploads-$(date +%F).tar.gz" -C /data .
(Das Volume heißt <project>_uploads; docker volume ls zeigt es an.) Bei S3 schalten Sie die Versionierung für den
Bucket ein oder replizieren ihn in einen anderen.
Wiederherstellen
-
Stoppen Sie die App, lassen Sie die Datenbank laufen:
docker compose stop app. -
Stellen Sie die Datenbank in eine leere Datenbank wieder her:
docker compose exec -T db dropdb -U sol2flow sol2flowdocker compose exec -T db createdb -U sol2flow sol2flowdocker compose exec -T db pg_restore -U sol2flow -d sol2flow --no-owner < backup/sol2flow-2026-09-27.dump -
Stellen Sie die Dateien im Volume
uploads(oder im Bucket) vom selben Zeitpunkt wieder her und übergeben Sie sie dem Benutzer der App (uid 1001):docker run --rm -v sol2flow_uploads:/data -v "$PWD/backup":/backup alpine \sh -c 'tar xzf /backup/uploads-2026-09-27.tar.gz -C /data && chown -R 1001:1001 /data' -
Starten Sie mit demselben
APP_ENCRYPTION_KEYundAUTH_SECRETwie zuvor:docker compose up -d.
Testen Sie ab und zu eine Wiederherstellung auf einem Ersatzrechner. Ein Backup, das Sie nie wiederhergestellt haben, ist eine Hoffnung, kein Backup.
Upgrade
-
Lesen Sie das Änderungsprotokoll für die Versionen zwischen Ihrer und der neuen; dort stehen alle manuellen Schritte.
-
Sichern Sie die Datenbank.
-
Setzen Sie die neue Version in der
.env(SOL2FLOW_VERSION=1.3.0), dann:docker compose pulldocker compose up -ddocker compose logs -f app
Datenbankmigrationen laufen beim Start automatisch. Downgrades werden nicht unterstützt: Um zurückzugehen, stellen Sie das vor dem Upgrade erstellte Backup wieder her, zusammen mit der alten Image-Version.
Vorabversions-Images liefen als Benutzer mit einer zufälligen ID. Die App läuft jetzt als uid und gid 1001; ändern Sie daher einmalig den Besitzer der Dateien, die sie schreibt, bevor Sie die neue Version starten:
docker compose run --rm --no-deps -u root --entrypoint chown app -R 1001:1001 /data/uploads
# ein Verzeichnis des Hosts statt eines Volumes:
sudo chown -R 1001:1001 /srv/sol2flow/uploads
PostgreSQL aktualisieren
sol2flow unterstützt PostgreSQL 16, 17 und 18; 18 wird empfohlen und läuft in der Beispiel-compose.yml. Eine
Installation auf 16 oder 17 funktioniert weiter, Sie wechseln also, wann es Ihnen passt. Eine neue Hauptversion kann ein
älteres Datenverzeichnis nicht öffnen: Lassen Sie Ihren db-Dienst unverändert (Image und den Mount
/var/lib/postgresql/data), bis Sie die Daten per Dump und Restore umziehen.
-
Stoppen Sie die App und erstellen Sie einen Dump der Datenbank:
cd /srv/sol2flowdocker compose stop appdocker compose exec -T db pg_dump -U sol2flow -Fc sol2flow > backup/sol2flow-before-pg18.dumpdocker compose down -
Stellen Sie in der
compose.ymldendb-Dienst auf 18 um, mit einem neuen Volume, gemountet unter/var/lib/postgresql(ab 18 legt das Image seine Daten in/var/lib/postgresql/18/dockerab, nicht mehr in…/data):db:image: postgres:18-alpinevolumes: [pgdata18:/var/lib/postgresql]volumes: { pgdata: {}, pgdata18: {}, uploads: {} } -
Starten Sie zuerst nur die Datenbank, spielen Sie den Dump ein und starten Sie dann alles:
docker compose up -d --wait dbdocker compose exec -T db pg_restore -U sol2flow -d sol2flow --no-owner < backup/sol2flow-before-pg18.dumpdocker compose up -d
Das alte Volume pgdata bleibt unberührt: Um zurückzugehen, stellen Sie die alten db-Zeilen wieder her. Entfernen Sie
es, sobald 18 zuverlässig läuft (docker volume rm sol2flow_pgdata).
pg_upgradeist bei großen Datenbanken schneller, braucht aber die Programme beider Versionen. PostgreSQL 18 schaltet Datenprüfsummen für neue Cluster ein; hat der alte Cluster keine (Standard bis 17), legen Sie den neuen mitinitdb --no-data-checksumsan.- Auf einem eigenen PostgreSQL-18-Server sind MD5-Passwörter veraltet: Nutzen Sie SCRAM
(
password_encryption = scram-sha-256, Standard seit 14) und setzen Sie das Passwort neu, falls es als MD5 gespeichert war.
Verschlüsselungsschlüssel rotieren
APP_ENCRYPTION_KEY schützt Secrets, die in der Datenbank gespeichert sind. Ändern Sie ihn nur, wenn er offengelegt
wurde, und wissen Sie, was dann passiert:
- Client-Secrets für Single Sign-on werden unlesbar: Geben Sie das Client-Secret jedes Providers neu ein.
- Secrets und Wiederherstellungscodes der Zwei-Faktor-Authentifizierung werden ungültig: Betroffene Personen brauchen einen Zwei-Faktor-Reset durch Staff (Benutzer und Registrierung).
- API-Schlüssel funktionieren nicht mehr: Die Personen legen neue an.
- Signatur-Secrets für Webhooks werden unlesbar: Rotieren Sie sie.
So rotieren Sie den Schlüssel:
- Erzeugen Sie einen neuen Schlüssel:
openssl rand -base64 32. - Setzen Sie
APP_ENCRYPTION_KEYin der.envdarauf und führen Siedocker compose up -daus. - Bearbeiten Sie unter Admin → Authentifizierung jeden OIDC-Provider und geben Sie sein Client-Secret neu ein.
- Teilen Sie Ihren Benutzern mit, dass API-Schlüssel neu angelegt und Webhook-Secrets rotiert werden müssen, und setzen Sie die Zwei-Faktor-Authentifizierung für alle zurück, die darum bitten.
Logs
Die App schreibt JSON-Zeilen auf die Standardausgabe: docker compose logs app. Den Detailgrad legen Sie mit LOG_LEVEL
fest. Secrets wie Passwörter und Tokens werden aus Log-Einträgen entfernt.
Um das Log zusätzlich in Dateien aufzubewahren, setzen Sie LOG_FILE=/data/logs/app.log mit dem Volume logs aus dem
Beispiel: Die App schreibt eine Datei pro Tag (app-2026-09-30.log,
UTC-Tage) und behält die letzten zehn (Einstellungen). Verfolgen Sie es mit
docker compose exec app tail -F /data/logs/app.log, oder sichern Sie das Volume wie die Uploads. Um über Fehler
informiert zu werden, statt Logs zu lesen, schalten Sie die Fehlerverfolgung ein.