syncova-backup/.gitea/ISSUE_TEMPLATE/fehler.yaml
Jerrit Fritzsche 4762fa29c3
Some checks failed
CI / Backend (Go) (push) Failing after 31s
CI / Frontend (React/TypeScript) (push) Successful in 34s
CI / Sicherheitsprüfungen (push) Successful in 24s
Fehlervorlage und ein Diagnoseskript, das sie fuellt
Eine Vorlage allein bringt wenig — sie stellt Fragen, die der Meldende meist
nicht beantworten kann. Deshalb zwei Teile:

diagnose.sh sammelt in einem Zug, was zur Analyse gebraucht wird: Fassungen
aller acht Programme, Betriebssystem, Container ja/nein, Dateisystem des
Repositorys, PostgreSQL-Fassung, Schemastand, Dienstzustand, Gesundheitsbericht
(der auch bei 503 den vollstaendigen Bericht traegt), Bestand, die letzten nicht
erfolgreichen Laeufe mit Fehlercode UND Fehlerklasse, die gemessene
Durchsetzungsstufe und die letzten Fehlerzeilen. Es liest nur.

Geheimnisse kommen nicht hinein, und der Weg dahin ist umgekehrt: Es gibt eine
Liste der Werte, die gezeigt werden duerfen. Eine Sperrliste vergaesse den
naechsten neuen Wert. Zusaetzlich werden die tatsaechlichen Geheimnisse gelesen
und aus JEDER Ausgabe entfernt — auch aus Protokollzeilen, in die sie auf einem
unvorhergesehenen Weg geraten sind. Real geprueft: weder Datenbankpasswort noch
Schluessel noch Administratorpasswort stehen im Bericht.

Die Vorlage beginnt mit sieben Faellen, die wie ein Fehler aussehen und gewolltes
Verhalten sind — "advisory" statt "filesystem", ein Teilfehler, "geloescht aber
nichts frei", 503 mit vollstaendigem Bericht. Das ist keine Abwehr, sondern
spart beiden Seiten einen halben Tag. Pflichtfelder sind Beobachtung, Erwartung,
Schritte, Bereich, Datenrisiko, Haeufigkeit und der Diagnosebericht; Fehlercode
und request_id stehen eigens da, weil sie die beiden wertvollsten Angaben sind.

Beim Erproben zwei Funde:

- Die Installationsanleitung verlangte PostgreSQL 17. setup.sh installiert auf
  Debian 12 aber 15 — und alles lief, bis hin zu einem echten Sicherungslauf.
  Die Anforderung lautet jetzt 15 (geprueft gegen 17 in CI und Entwicklung,
  gegen 15 auf Debian 12), und setup.sh lehnt aeltere Fassungen ab statt sie
  stillschweigend zu nehmen.
- Ein Repository auf der Platte, das nicht in der Control Plane eingetragen ist,
  faellt niemandem auf: Die Sicherung laeuft nie, weil der Server das Ziel nicht
  kennt. Der Bericht benennt diesen Fall jetzt ausdruecklich.

Gegen das echte v1.0.0-rc1-Paket gefahren: Installation, erzeugte Stoerung
(ALL_SOURCES_FAILED / source), Bericht zeigt Code, Klasse, "overlayfs" und
"nie gemessen".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 15:58:00 +02:00

200 lines
7.3 KiB
YAML

name: Fehler melden
about: Etwas verhält sich anders, als es soll
title: "[Fehler] "
body:
- type: markdown
attributes:
value: |
## Bevor Sie schreiben: ist es wirklich ein Fehler?
Sieben Dinge sehen wie ein Fehler aus und sind gewolltes Verhalten. Ein
Blick darauf spart Ihnen und mir einen halben Tag:
| Beobachtung | Warum es richtig ist |
| --- | --- |
| Durchsetzungsstufe `advisory` statt `filesystem` | Ihr Dateisystem setzt den Löschschutz nicht durch — overlayfs, NFS oder fehlendes `CAP_LINUX_IMMUTABLE`. Die Stufe wird **gemessen**, nicht behauptet |
| `PARTIAL FAILURE` bei nicht lesbarer Datei | Dort fehlen Daten. Ein Teilfehler ist kein Erfolg und wird bewusst nicht wiederholt |
| Sockets, Pipes, Gerätedateien werden übergangen | Sie haben keinen sicherbaren Inhalt. Das ist ein Vermerk, kein Fehler |
| „Gelöscht, aber nichts frei geworden" | Deduplizierung: Die Blöcke werden von einem anderen Backup gebraucht |
| Erfolgsquote meldet `warning` bei 100 % | Es gab keine Läufe. Ohne Lauf gibt es keine Quote |
| `503` mit vollständigem `data`-Bericht | Absicht: Monitoring schlägt an, die Oberfläche kann trotzdem zeigen, *was* kaputt ist |
| Punkt bleibt `unverified` trotz sauberem Scan | Nur ein durchgeführter Wiederherstellungstest hebt auf `recoverable`. Alles davor ist ein Indiz |
Weitere Fälle nach Symptom: [`docs/troubleshooting.md`](../src/branch/main/docs/troubleshooting.md)
---
## Keine Geheimnisse einfügen
**Niemals** in ein Issue: `SYNCOVA_ENCRYPTION_KEYS`, `SYNCOVA_DB_PASSWORD`,
API-Tokens, Zugangsdaten der Virtualisierungsverbünde.
Das Diagnoseskript unten entfernt sie selbsttätig. Sehen Sie den Bericht
trotzdem durch, bevor Sie ihn einfügen — er ist danach öffentlich.
- type: textarea
id: beobachtung
attributes:
label: Was ist passiert?
description: Was haben Sie gesehen — möglichst mit der genauen Meldung.
placeholder: |
Beim nächtlichen Lauf des Auftrags "Dateiserver täglich" bricht die
Sicherung nach etwa zwei Minuten ab. Die Oberfläche zeigt den Lauf als
"failed" mit dem Code REPOSITORY_FULL, obwohl auf dem Ziel 400 GB frei sind.
validations:
required: true
- type: textarea
id: erwartung
attributes:
label: Was haben Sie erwartet?
description: |
Bitte ausfüllen, auch wenn es offensichtlich scheint. Oft liegt genau
hier der Unterschied zwischen einem Fehler und einer Erwartung, die die
Anlage bewusst nicht erfüllt.
placeholder: Der Lauf sollte durchlaufen; es ist genug Platz vorhanden.
validations:
required: true
- type: textarea
id: schritte
attributes:
label: Wie lässt es sich auslösen?
description: |
Schritt für Schritt. Wenn es nur sporadisch auftritt, schreiben Sie das
— auch „nur nachts, etwa jeder dritte Lauf" ist eine brauchbare Angabe.
placeholder: |
1. Auftrag mit Quelle /srv/daten und Repository /mnt/backup anlegen
2. Lauf über POST /api/v1/jobs/<id>/run anstoßen
3. Nach ~2 Minuten steht der Lauf auf failed
validations:
required: true
- type: input
id: fehlercode
attributes:
label: Fehlercode und request_id
description: |
**Die beiden wertvollsten Angaben überhaupt.** Der Code steht in
`error.code` jeder API-Antwort und im Lauf; die `request_id` steht in
**jeder** Antwort — auch der erfolgreichen. Ohne sie bleibt „es hat
nicht funktioniert".
placeholder: "REPOSITORY_FULL, request_id 7f900328-a7db-4c54-ae6e-9ace38353224"
- type: dropdown
id: bereich
attributes:
label: Welcher Bereich?
description: Grobe Zuordnung genügt — sie grenzt die Suche stark ein.
options:
- Weiß ich nicht
- Sicherung (Scheduler, Backup Engine)
- Wiederherstellung
- Repository (Integrität, Katalog, Löschschutz)
- Agent (Windows oder Linux)
- Proxmox
- Oberfläche
- API
- Anmeldung, Rollen, zweiter Faktor
- Meldungen und Benachrichtigungen
- Kennzahlen und Berichte
- Installation, Update, Deinstallation
validations:
required: true
- type: dropdown
id: datenrisiko
attributes:
label: Sind Daten in Gefahr?
description: |
Bestimmt die Reihenfolge der Bearbeitung. Bitte ehrlich einschätzen —
„weiß ich nicht" ist eine zulässige und nützliche Antwort.
options:
- Nein — es ist unschön, aber nichts geht verloren
- Weiß ich nicht
- Ja — eine Sicherung fehlt oder ist unvollständig
- Ja — eine Wiederherstellung liefert falsche oder fehlende Daten
- Ja — Daten wurden gelöscht oder sind unlesbar
validations:
required: true
- type: dropdown
id: haeufigkeit
attributes:
label: Wie oft tritt es auf?
options:
- Jedes Mal
- Häufig, aber nicht immer
- Selten
- Genau einmal
validations:
required: true
- type: textarea
id: diagnose
attributes:
label: Diagnosebericht
description: |
Auf dem betroffenen Server ausführen und die **vollständige** Ausgabe
hier einfügen:
```bash
sudo /opt/syncova/diagnose.sh
```
Liegt das Skript nicht dort, steht es im entpackten Paket neben
`setup.sh`. Es liest nur und **verändert nichts**; Geheimnisse entfernt
es selbsttätig.
Es sammelt in einem Zug: Fassungen aller Programme, Betriebssystem,
Container ja/nein, **Dateisystem des Repositorys**, PostgreSQL-Fassung,
Schemastand, Dienstzustand, Gesundheitsbericht, Bestand, die letzten
nicht erfolgreichen Läufe mit Fehlercode, gemessene Durchsetzungsstufe
und die letzten Fehlerzeilen.
Ohne diesen Bericht folgen als Erstes Rückfragen nach genau diesen Werten.
render: text
validations:
required: true
- type: textarea
id: protokoll
attributes:
label: Protokollzeilen zum Vorfall
description: |
Wenn Sie die `request_id` haben, ist das die kürzeste Suche:
```bash
journalctl -u syncova-api --no-pager | grep <request-id>
```
Sonst die Zeilen um den Zeitpunkt herum:
```bash
journalctl -u syncova-api --since "2026-08-17 02:00" --until "2026-08-17 02:10" --no-pager
```
Prüfen Sie die Zeilen auf Pfade und Namen, die nicht öffentlich werden sollen.
render: text
- type: textarea
id: sonstiges
attributes:
label: Sonstiges
description: |
Was Ihnen sonst auffiel. Besonders nützlich: Hat es früher funktioniert?
Wurde etwas geändert — Update, neue Platte, neues Netz, Umzug des
Repositorys?
- type: checkboxes
id: bestaetigung
attributes:
label: Vor dem Absenden
options:
- label: Ich habe die Tabelle oben durchgesehen; es ist keiner dieser Fälle
required: true
- label: Der Bericht enthält keine Passwörter, Schlüssel oder Tokens
required: true
- label: Ich verwende die Fassung, die im Diagnosebericht steht
required: true