docs: Export, Import und Sicherung dokumentieren
README bekommt einen eigenen Abschnitt mit den vier Wegen, den drei Importstrategien und beiden Sicherungsarten - samt der Empfehlung, eine Sicherung einmal in eine Wegwerf-Datenbank zurueckzuspielen. FEATURES beschreibt dasselbe ausfuehrlicher. In der ROADMAP wandert Export und Import zu den erledigten Punkten, mit den getroffenen Entscheidungen: keine Tokens, keine Snapshots, Voll-Sicherung nur fuer Administratoren. Die folgenden Punkte ruecken auf. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+36
@@ -215,6 +215,42 @@ Dateneinsicht. Ein Administrator sieht dadurch weiterhin keine fremden Projekte.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 4a. Export, Import und Sicherung
|
||||||
|
|
||||||
|
### Projekte mitnehmen
|
||||||
|
|
||||||
|
- **JSON-Export** einzeln oder für alle Projekte: Stammdaten, Notizen, Tags,
|
||||||
|
Repo-Verknüpfung. **Ohne Access Tokens** — die Verbindung wird nur beschrieben, das
|
||||||
|
Token muss beim Import neu hinterlegt werden. Auch ohne Snapshots (reproduzierbar) und
|
||||||
|
ohne Datenbank-IDs (gelten nur in der Quellinstanz).
|
||||||
|
- **Markdown-Export** eines Projekts: Beschreibung, Kennzahlen, Notizen und der letzte
|
||||||
|
bekannte Git-Stand als lesbare Datei.
|
||||||
|
- **Import mit Vorschau.** Die Datei wird streng geprüft, bevor irgendetwas passiert.
|
||||||
|
Abgeglichen wird über den Slug; bei Treffern stehen drei Strategien bereit:
|
||||||
|
|
||||||
|
| Strategie | Wirkung |
|
||||||
|
| --- | --- |
|
||||||
|
| Überspringen | Vorhandene bleiben unverändert |
|
||||||
|
| Zusätzlich anlegen | Kopie mit freiem Slug (`nebula` → `nebula-2`) |
|
||||||
|
| Ersetzen | Stammdaten überschreiben, Notizen austauschen |
|
||||||
|
|
||||||
|
Die Vorschau zeigt je Projekt, was geschähe, und weist auf fehlende Git-Verbindungen
|
||||||
|
hin. Erst ein zweiter Klick schreibt.
|
||||||
|
|
||||||
|
### Sicherung
|
||||||
|
|
||||||
|
- **JSON-Sicherung** im Adminbereich: Einstellungen, Konten, Verbindungen, Projekte und
|
||||||
|
Notizen in einer Datei. Passwörter als scrypt-Hash, Git-Tokens als Chiffrat — ohne
|
||||||
|
dasselbe `APP_SECRET` wertlos. Sitzungen und Passkeys bleiben draußen: erstere sind
|
||||||
|
kurzlebig, letztere hängen an Gerät und rpID.
|
||||||
|
- **Datenbank-Sicherung** über `scripts/backup.*`: `pg_dump` im Container, mit
|
||||||
|
`--clean --if-exists`, also für sich allein einspielbar. Gegenstück ist
|
||||||
|
`scripts/restore.*`, das vor dem Überschreiben nachfragt und sich über einen Parameter
|
||||||
|
auf eine Wegwerf-Datenbank umlenken lässt — damit sich eine Sicherung prüfen lässt,
|
||||||
|
ohne die echte anzufassen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 5. Oberfläche
|
## 5. Oberfläche
|
||||||
|
|
||||||
- **Dark Glassmorphism**: milchige Glasflächen, driftende Nebel im Hintergrund, feines
|
- **Dark Glassmorphism**: milchige Glasflächen, driftende Nebel im Hintergrund, feines
|
||||||
|
|||||||
@@ -199,6 +199,63 @@ Wer lieber von außen taktet, lässt den Automatismus aus und ruft
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Export, Import und Sicherung
|
||||||
|
|
||||||
|
### Projekte mitnehmen
|
||||||
|
|
||||||
|
| Weg | Wo | Inhalt |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **Alle Projekte als JSON** | Dashboard → Datenbank-Symbol | Stammdaten, Notizen, Repo-Verknüpfung |
|
||||||
|
| **Ein Projekt als JSON** | Projektseite → Download-Symbol | dasselbe, für ein Projekt |
|
||||||
|
| **Ein Projekt als Markdown** | Projektseite → Download-Symbol | lesbar, inklusive letztem Git-Stand |
|
||||||
|
| **Import** | Dashboard → Datenbank-Symbol | JSON einlesen, mit Vorschau |
|
||||||
|
|
||||||
|
**Access Tokens sind nie enthalten.** Die Git-Verbindung wird nur beschrieben (Name,
|
||||||
|
System, Basis-URL); nach dem Import muss das Token neu hinterlegt werden. Verweist eine
|
||||||
|
importierte Datei auf eine hier unbekannte Verbindung, wird das Projekt ohne Verknüpfung
|
||||||
|
angelegt und in der Vorschau angezeigt.
|
||||||
|
|
||||||
|
Beim Import wird über den Slug abgeglichen. Für Treffer gibt es drei Strategien:
|
||||||
|
|
||||||
|
- **Überspringen** — Vorhandene bleiben unverändert
|
||||||
|
- **Zusätzlich anlegen** — Kopie mit freiem Slug (`nebula` → `nebula-2`)
|
||||||
|
- **Ersetzen** — Stammdaten überschreiben, Notizen austauschen
|
||||||
|
|
||||||
|
Vor dem Schreiben zeigt eine Vorschau, was passieren würde. Erst dann wird geschrieben.
|
||||||
|
|
||||||
|
### Sicherung
|
||||||
|
|
||||||
|
Zwei Wege, mit unterschiedlichem Zweck:
|
||||||
|
|
||||||
|
**JSON-Sicherung** (Admin-Einstellungen → Sicherung) enthält Einstellungen, Konten,
|
||||||
|
Verbindungen, Projekte und Notizen. Gut zum Umziehen. Passwörter liegen als scrypt-Hash
|
||||||
|
vor, Git-Tokens als Chiffrat — ohne dasselbe `APP_SECRET` sind sie wertlos. Trotzdem
|
||||||
|
vertraulich behandeln.
|
||||||
|
|
||||||
|
**Datenbank-Sicherung** über `pg_dump` — das, was man zum Wiederherstellen einer kaputten
|
||||||
|
Instanz braucht:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
.\scripts\backup.ps1 # → .\backups\nebula-<datum>.sql
|
||||||
|
.\scripts\restore.ps1 -File .\backups\nebula-....sql
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/backup.sh # → ./backups/nebula-<datum>.sql
|
||||||
|
./scripts/restore.sh backups/nebula-....sql
|
||||||
|
```
|
||||||
|
|
||||||
|
Die Skripte lesen Benutzer und Datenbankname aus der `.env` und führen `pg_dump` im
|
||||||
|
Container aus — auf dem Rechner selbst muss nichts installiert sein.
|
||||||
|
|
||||||
|
> Eine Sicherung ist erst dann eine Sicherung, wenn du sie einmal zurückgespielt hast.
|
||||||
|
> Das geht ohne Risiko in eine Wegwerf-Datenbank:
|
||||||
|
>
|
||||||
|
> ```powershell
|
||||||
|
> docker exec nebula-db psql -U nebula -d postgres -c "CREATE DATABASE nebula_test"
|
||||||
|
> .\scripts\restore.ps1 -File .\backups\nebula-....sql -Database nebula_test -Force
|
||||||
|
> ```
|
||||||
|
|
||||||
## Projektstruktur
|
## Projektstruktur
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -271,6 +328,10 @@ ausschließlich Daten des angemeldeten Kontos.
|
|||||||
| `GET` `POST` | `/api/admin/users` | Konten auflisten / anlegen (Admin) |
|
| `GET` `POST` | `/api/admin/users` | Konten auflisten / anlegen (Admin) |
|
||||||
| `PATCH` `DELETE` | `/api/admin/users/:id` | Konto ändern / löschen (Admin) |
|
| `PATCH` `DELETE` | `/api/admin/users/:id` | Konto ändern / löschen (Admin) |
|
||||||
| `GET` `POST` | `/api/projects` | Projekte auflisten / anlegen |
|
| `GET` `POST` | `/api/projects` | Projekte auflisten / anlegen |
|
||||||
|
| `GET` | `/api/projects/export` | Alle eigenen Projekte als JSON |
|
||||||
|
| `GET` | `/api/projects/:id/export` | Ein Projekt (`?format=md` für Markdown) |
|
||||||
|
| `POST` | `/api/projects/import` | Import, mit `dryRun` für die Vorschau |
|
||||||
|
| `GET` | `/api/admin/backup` | Vollständige Sicherung als JSON (Admin) |
|
||||||
| `GET` `PATCH` `DELETE` | `/api/projects/:id` | Projekt lesen / ändern / löschen |
|
| `GET` `PATCH` `DELETE` | `/api/projects/:id` | Projekt lesen / ändern / löschen |
|
||||||
| `POST` | `/api/projects/:id/sync` | Repo-Daten vom Git-System holen |
|
| `POST` | `/api/projects/:id/sync` | Repo-Daten vom Git-System holen |
|
||||||
| `GET` `POST` | `/api/projects/:id/notes` | Notizen des Projekts |
|
| `GET` `POST` | `/api/projects/:id/notes` | Notizen des Projekts |
|
||||||
|
|||||||
+9
-24
@@ -11,28 +11,7 @@ Was bereits steht, listet [FEATURES.md](FEATURES.md).
|
|||||||
|
|
||||||
## 1 · Als Nächstes empfohlen
|
## 1 · Als Nächstes empfohlen
|
||||||
|
|
||||||
### 1.1 Export und Import `M`
|
### 1.1 Markdown in Beschreibung und Notizen `S`
|
||||||
|
|
||||||
Dein Vorschlag, in vier Stufen — jede für sich nutzbar:
|
|
||||||
|
|
||||||
| Stufe | Inhalt |
|
|
||||||
| --- | --- |
|
|
||||||
| **Projekt-Export** | Ein Projekt oder alle als JSON: Stammdaten, Notizen, Repo-Verknüpfung. Ein Klick auf der Projektseite, einer im Dashboard für alles. |
|
|
||||||
| **Projekt-Import** | JSON hochladen, Vorschau, dann übernehmen. Konfliktstrategie wählbar: überspringen · umbenennen · überschreiben. |
|
|
||||||
| **Markdown-Export** | Ein Projekt als lesbares `.md` — Beschreibung, Notizen, aktueller Git-Stand. Gut zum Archivieren oder für ein README. |
|
|
||||||
| **Voll-Backup** | `pg_dump` aus dem Container heraus, per Knopf im Adminbereich als Datei. Plus dokumentierter Rückweg. |
|
|
||||||
|
|
||||||
**Offene Fragen, die wir klären sollten:**
|
|
||||||
- **Git-Tokens mitexportieren?** Mein Vorschlag: **nein**. Die Verbindung wird
|
|
||||||
mitexportiert (Name, System, Basis-URL), das Token muss beim Import neu
|
|
||||||
hinterlegt werden. Ein Export-JSON landet sonst schnell irgendwo, wo es
|
|
||||||
nicht hingehört.
|
|
||||||
- **Reichweite:** Export der eigenen Daten für jeden — Voll-Backup nur für
|
|
||||||
Administratoren?
|
|
||||||
- **Snapshots mitnehmen?** Ich würde sie weglassen: sie sind reproduzierbar
|
|
||||||
und blähen die Datei auf. Ein Sync nach dem Import holt sie zurück.
|
|
||||||
|
|
||||||
### 1.2 Markdown in Beschreibung und Notizen `S`
|
|
||||||
|
|
||||||
Heute wird alles als reiner Text dargestellt. Mit Markdown werden aus
|
Heute wird alles als reiner Text dargestellt. Mit Markdown werden aus
|
||||||
`- [ ] Aufgabe` echte Checklisten, Codeblöcke bekommen Hervorhebung, Links
|
`- [ ] Aufgabe` echte Checklisten, Codeblöcke bekommen Hervorhebung, Links
|
||||||
@@ -41,13 +20,13 @@ werden klickbar.
|
|||||||
Zu beachten: HTML muss beim Rendern entfernt werden, sonst reißt es ein
|
Zu beachten: HTML muss beim Rendern entfernt werden, sonst reißt es ein
|
||||||
XSS-Loch. Mit `react-markdown` plus `rehype-sanitize` ist das sauber lösbar.
|
XSS-Loch. Mit `react-markdown` plus `rehype-sanitize` ist das sauber lösbar.
|
||||||
|
|
||||||
### 1.3 Volltextsuche über Notizen `S`
|
### 1.2 Volltextsuche über Notizen `S`
|
||||||
|
|
||||||
Die Suche im Board deckt Namen, Kurzbeschreibung und Tags ab — Notizen nicht.
|
Die Suche im Board deckt Namen, Kurzbeschreibung und Tags ab — Notizen nicht.
|
||||||
Postgres kann das nativ (`tsvector` mit deutscher Konfiguration), also ohne
|
Postgres kann das nativ (`tsvector` mit deutscher Konfiguration), also ohne
|
||||||
zusätzlichen Dienst.
|
zusätzlichen Dienst.
|
||||||
|
|
||||||
### 1.4 Kanban-Board mit Drag & Drop `M`
|
### 1.3 Kanban-Board mit Drag & Drop `M`
|
||||||
|
|
||||||
Die gruppierte Ansicht gibt es schon, aber Statuswechsel geht nur über das
|
Die gruppierte Ansicht gibt es schon, aber Statuswechsel geht nur über das
|
||||||
Menü. Spalten mit Ziehen und Ablegen wären der natürlichere Weg.
|
Menü. Spalten mit Ziehen und Ablegen wären der natürlichere Weg.
|
||||||
@@ -176,3 +155,9 @@ Damit klar ist, was **nicht** kommt und warum:
|
|||||||
| Härtung: CSRF, CSP, SSRF, Ratenbegrenzung, Datentrennung | ✓ |
|
| Härtung: CSRF, CSP, SSRF, Ratenbegrenzung, Datentrennung | ✓ |
|
||||||
| Docker- und Standalone-Betrieb | ✓ |
|
| Docker- und Standalone-Betrieb | ✓ |
|
||||||
| Automatischer Abgleich mit Zeitplan | ✓ |
|
| Automatischer Abgleich mit Zeitplan | ✓ |
|
||||||
|
| Export, Import und Sicherung | ✓ |
|
||||||
|
|
||||||
|
Zur Entscheidung beim Export: Git-Tokens gehen **nicht** mit. Die Verbindung wird nur
|
||||||
|
beschrieben, das Token ist nach dem Import neu zu hinterlegen. Snapshots bleiben
|
||||||
|
ebenfalls draußen — sie sind reproduzierbar. Der Projekt-Export steht jedem Konto für
|
||||||
|
seine eigenen Daten offen, die Voll-Sicherung nur Administratoren.
|
||||||
|
|||||||
Reference in New Issue
Block a user