• v1.0.0-rc9 d94debac4d

    V1 Release Candidate 9 — Sicherungsart je Auftrag
    Some checks failed
    CI / Backend (Go) (push) Failing after 30s
    CI / Frontend (React/TypeScript) (push) Successful in 46s
    CI / Sicherheitsprüfungen (push) Successful in 27s
    Pre-Release

    jf released this 2026-08-18 15:48:06 +00:00 | 0 commits to main since this release

    Sicherungsart je Auftrag

    Bisher entschied die Anlage allein: Liegt ein Elternbackup vor, wird inkrementell gesichert. Jetzt wählbar —

    Einstellung Wirkung
    Inkrementell Erster Lauf voll, danach nur Geändertes. Standard
    Immer voll Jeder Lauf liest die gesamte Quelle
    Fester Volltag Inkrementell, zusätzlich an einem Wochentag voll — etwa „immer freitags"

    Der Platzbedarf steigt bei „immer voll" nicht nennenswert — unveränderte Blöcke werden dedupliziert und liegen weiterhin nur einmal im Repository. Was steigt, ist die Laufzeit: Jeder Lauf liest, hasht, komprimiert und verschlüsselt alles neu. Das steht so in der Maske, weil es die häufigste Verwechslung ist.

    Der Wochentag wird in der Zeitzone des Zeitplans bestimmt. Rechnete der Server in UTC, bekäme ein Betreiber in Berlin seine Vollsicherung am Donnerstagabend und wunderte sich, warum sie freitags fehlt. Vier Tests halten das fest, der entscheidende durch Mutation als fangend bestätigt.

    Migration 000014 mit drei CHECKs. Der dritte lehnt „immer voll" zusammen mit einem Wochentag ab: Dann ist ohnehin jeder Lauf voll. Die Regel steht in der Datenbank, weil im Code jede Stelle sie einhalten müsste — eine vergisst es.

    Behoben

    Das Aufnahme-Token eines Agenten zeigte „undefined". Das Feld heißt token, nicht enrollment_token — Letzteres ist der Name im Anfragekörper der Registrierung.

    Das war der dritte Formfehler dieser Art (nach /retention-policies und dem Integritätslauf). Alle konsumierten Endpunkte sind jetzt gegen den laufenden Dienst abgeglichen, statt aus der Struktur abgeleitet.

    Aufnahmedialog mit Anleitung

    Vollständige Anleitung für Linux und Windows, umschaltbar, mit fertig ausgefüllten Befehlen — Serveradresse und Token bereits eingesetzt, jeder Schritt einzeln kopierbar. Eine Anleitung mit Platzhaltern führt zuverlässig dazu, dass jemand <token> wörtlich einsetzt und dann eine Fehlermeldung sucht, die nichts mit seinem Problem zu tun hat.

    Linux: Paket, Dienstkonto, Aufnahme, systemd-Einheit. Windows: PowerShell mit New-Service — mit dem Hinweis, dass der Windows-Dienst nie auf echter Hardware lief.

    Dazu die beiden Stolperstellen: --state erwartet eine Datei, kein Verzeichnis (mit einem Verzeichnis hält sich der Agent für registriert und läuft ohne Token), und der Agent braucht Schreibzugriff auf das Repository.

    update.sh rüstet die Wiederherstellungsfläche nach

    Sie kam mit rc8 dazu; eine Anlage aus einer älteren Fassung hat sie nicht. Ohne sie scheitert jede Wiederherstellung an ProtectSystem=strict.

    update.sh legt /srv/syncova-restore jetzt an und trägt es in ReadWritePaths ein. Der Schritt aus den rc8-Notizen entfällt damit — ein Schritt, den man von Hand ausführen muss, wird übersehen und fällt erst im Ernstfall auf.

    Aktualisieren

    sudo /opt/syncova/update.sh
    

    Migration 000014 wird dabei angewandt. Bestehende Aufträge bleiben unverändert: Ohne Angabe gilt incremental — das bisherige Verhalten.


    Unverändert offen: Windows-Dienst, systemd-Einheit des Agenten und der Proxmox-Bootmeilenstein sind gebaut, aber nie auf echter Hardware gefahren.

    Downloads
  • v1.0.0-rc8 b78a6fb51c

    V1 Release Candidate 8 — Datei- und Ordnerwiederherstellung
    Some checks failed
    CI / Backend (Go) (push) Failing after 32s
    CI / Frontend (React/TypeScript) (push) Successful in 46s
    CI / Sicherheitsprüfungen (push) Successful in 28s
    Pre-Release

    jf released this 2026-08-18 13:55:52 +00:00 | 2 commits to main since this release

    Wiederherstellung von Dateien und Ordnern mit Auswahl statt Textfeld — und die Erklärung, warum vorher gar keine Wiederherstellung funktionierte.

    Warum keine Wiederherstellung ging

    Nicht die Rechte des Zielverzeichnisses, sondern die Härtung des Dienstes: Er läuft mit ProtectSystem=strict und ReadWritePaths nur auf Repository und Sicherungsordner. Jedes Ziel außerhalb endete mit mkdir: permission denied — und zwar nach der Vorabprüfung, an der unangenehmsten Stelle.

    /tmp scheiterte anders: Mit PrivateTmp=yes hat der Dienst ein eigenes /tmp. Was dort landet, ist von außen unsichtbar.

    Ort Ergebnis
    /srv/syncova-restore ✓ von setup.sh angelegt und eingetragen
    weitere aus --wiederherstellungsziel ✓
    /tmp/… ✗ privater Namensraum, von außen unsichtbar
    /etc, /usr, /var/lib, /root … ✗ vom Zielschutz gesperrt
    alles andere ✗ schreibgeschützt durch ProtectSystem=strict

    Der Ort liegt unter /srv, weil /var/lib auf der Sperrliste des Zielschutzes steht — beide Regeln zugleich zu erfüllen lässt genau /srv übrig.

    Auswahl statt Textfeld

    • Ordnerbaum für das Ziel. Er meldet je Verzeichnis, ob der Dienst dort schreiben darf — gemessen durch eine Probedatei, nicht aus den Rechtebits abgeleitet. Unter ProtectSystem=strict sagen die Bits nichts über den Namensraum aus. Gesperrte Orte werden gezeigt, nicht versteckt: Sonst bliebe offen, warum ein Pfad fehlt.
    • Browser für den Backup-Inhalt. Ordner und einzelne Dateien lassen sich zurückholen. Der Baum entsteht aus den Pfaden, nicht aus Verzeichniseinträgen — ein Manifest kann eine Datei enthalten, deren Elternordner nicht als eigener Eintrag vorliegt, und wer nur directory-Einträge auflistet, verliert ganze Teilbäume.

    Zwei neue Endpunkte, der eingefrorene Vertrag ist entsprechend erweitert: GET /filesystem/browse und GET /backups/{id}/contents.

    Behoben

    „can't access property toLocaleString, chunks_checked is undefined" beim Integritätslauf. Die Ergebnisse liegen unter details, und die Felder heißen missing_chunks/corrupted_chunks, nicht umgekehrt. Betrifft alle vier Prüfendpunkte — sie tragen dieselbe Hülle.

    Derselbe Fehler wie zuvor bei /retention-policies: die Antwortform angenommen statt geprüft. Alle konsumierten Endpunkte sind jetzt gegen den laufenden Dienst abgeglichen.

    Geist Mono liegt im Paket

    Drei Schnitte, 128 KB, OFL-Lizenz dabei. Ausgeliefert vom eigenen Ursprung — das verlangt die CSP, und ein Backup-Server, dessen Oberfläche von der Erreichbarkeit eines CDN abhängt, wäre auch ohne CSP falsch. font-display: swap, damit der Text sofort steht.

    Nachgewiesen

    Gegen Debian 12 mit echtem PostgreSQL und nginx: Vollwiederherstellung (5 Dateien), nur ein Ordner (2 Dateien), nur eine Datei (1 Datei) — alle drei bitgenau. Der Server nennt /srv/syncova-restore als beschreibbar und /etc, /usr, /var als gesperrt.

    Aktualisieren

    sudo /opt/syncova/update.sh
    

    Bei einer bestehenden Installation fehlt die Wiederherstellungsfläche, weil sie erst setup.sh anlegt. Nachholen:

    sudo install -d -m 0750 -o syncova -g syncova /srv/syncova-restore
    sudo systemctl edit syncova-api      # ReadWritePaths= um /srv/syncova-restore ergänzen
    sudo systemctl restart syncova-api
    

    Bekannte Grenze

    Eine Auswahl je Lauf, kein Mehrfachhaken. Eine Liste ausgewählter Pfade kennt die API nicht; mehrere Läufe hintereinander ergäben mehrere Ausgänge, und ein „teilweise fehlgeschlagen" ließe sich dann nicht mehr erklären.


    Unverändert offen: Windows-Dienst, systemd-Einheit des Agenten und der Proxmox-Bootmeilenstein sind gebaut, aber nie auf echter Hardware gefahren.

    Downloads
  • v1.0.0-rc7 053e9ae817

    V1 Release Candidate 7 — Preset, Sitzung, Blackscreen behoben
    Some checks failed
    CI / Backend (Go) (push) Failing after 30s
    CI / Frontend (React/TypeScript) (push) Successful in 43s
    CI / Sicherheitsprüfungen (push) Successful in 26s
    Pre-Release

    jf released this 2026-08-18 13:10:17 +00:00 | 4 commits to main since this release

    Behebt einen Absturz, macht die Sitzung brauchbar und stellt das Aussehen um.

    Behoben

    • /retention zeigte einen schwarzen Bildschirm. GET /retention-policies liefert ein Objekt {policies, predefined} — als einziger von zehn geprüften Listenendpunkten. Die Oberfläche behandelte es als Array; map gibt es auf einem Objekt nicht, React hängte den ganzen Baum aus. Der Regressionstest füttert jetzt die echte Antwortform; ein Test mit einem Array hätte den Fehler nie gefunden, und genau das war passiert.
    • Jedes Neuladen führte zurück zur Anmeldung. Die Tokens lagen nur im Arbeitsspeicher.
    • Ein Fehler in einer Komponente schwärzte die ganze Konsole. Jetzt sitzt eine Fehlergrenze um den Seiteninhalt: Menü und Kopfzeile bleiben stehen, der Fehlertext ist lesbar und kopierbar.

    Sitzung

    Sie überlebt ein Neuladen und endet nach 30 Minuten — gerechnet als frühere von zwei Grenzen:

    Harte Obergrenze 30 Minuten ab Anmeldung, durch keine Interaktion verschiebbar
    Untätigkeitsgrenze 30 Minuten ohne Eingabe

    Die verbleibende Zeit läuft neben „Abmelden" und wird unter fünf Minuten auffällig.

    Dass die Tokens überhaupt abgelegt werden, kehrt eine frühere Entscheidung um. Was den Rest trägt, ist nicht der Speicherort (sessionStorage, stirbt mit dem Tab), sondern der sofortige serverseitige Widerruf: Die Tokens sind opak, kein JWT, und genau dafür wurden sie gewählt.

    Sechs Tests halten die Grenzen fest, zwei davon durch Mutation als fangend bestätigt: Wer beim Vermerken einer Interaktion die Obergrenze mitverschiebt, macht aus „30 Minuten" ein „unbegrenzt, solange die Maus wackelt".

    Aussehen

    Farben, Radien, Schatten und Schrift aus dem Preset b5vnF8SMi: violett als Handlungsfarbe, Radius 0, schattenlos, durchgehend Geist Mono.

    Drei begründete Abweichungen:

    • Die Statusfarben bleiben. Das Preset kennt nur destructive und fünf Diagrammfarben; ohne die fünf Bedeutungen ließe sich ein Teilfehler nicht von einem Erfolg unterscheiden — die eine Aussage, auf die es in dieser Konsole ankommt.
    • Das dunkle Thema hängt an [data-theme='dark'], nicht an .dark. .dark funktioniert zusätzlich.
    • Geist Mono lädt nicht nach. Sie steht zuerst im Stapel; liegt sie nicht auf dem Gerät, greift die System-Monospace. Eine Schrift von einem fremden Host zu holen verbietet die CSP — und ein Backup-Server, der für seine Oberfläche ins Internet greift, wäre auch ohne CSP falsch.

    Dazu Umlaute auf allen Seiten (vorher durchgehend ae/oe/ue/ss), 33 Erläuterungen von Absätzen auf einen Satz gekürzt und neue Module: acht Schnellzugriffe auf der Übersicht sowie sechs mitgelieferte Aufbewahrungsvorlagen als Kacheln — die lieferte der Server schon immer mit, die Oberfläche warf sie bisher weg.

    Nachgewiesen

    Gegen Debian 12 mit echtem PostgreSQL und nginx: alle 18 Seiten liefern 200, das ausgelieferte CSS trägt Akzent, Radius 0 und Geist Mono, /retention zeigt 0 eigene Regeln und 6 anklickbare Vorlagen.

    84 Tests grün, tsc sauber, eslint ohne Warnung. CSS 28,7 KB.

    Aktualisieren

    sudo /opt/syncova/update.sh
    

    Sichert zuerst Datenbank und Konfiguration, tauscht dann die Programme. Kommt der Dienst nicht hoch, holt es die vorige Fassung zurück. Repository und Verschlüsselungsschlüssel werden nie angefasst.


    Unverändert offen: Windows-Dienst, systemd-Einheit des Agenten und der Proxmox-Bootmeilenstein sind gebaut, aber nie auf echter Hardware gefahren. Geist Mono wird nicht mitgeliefert; ohne die Schrift auf dem Gerät greift die System-Monospace.

    Downloads
  • v1.0.0-rc6 698f3a17d9

    V1 Release Candidate 6 — vollständige Verwaltungskonsole
    Some checks failed
    CI / Backend (Go) (push) Failing after 31s
    CI / Frontend (React/TypeScript) (push) Successful in 44s
    CI / Sicherheitsprüfungen (push) Successful in 27s
    Pre-Release

    jf released this 2026-08-18 12:05:15 +00:00 | 8 commits to main since this release

    Die Weboberfläche ist eine vollständige Verwaltungskonsole geworden.

    Vorher erreichte sie 23 von 95 fachlichen Endpunkten; schreibend waren es neun, vier davon An- und Abmeldung. Real verwaltbar war: einen Auftrag anlegen, einen Bericht erzeugen, eine Meldung bestätigen. Das war ein Leseinstrument mit Assistent, keine Konsole.

    Jetzt sind es 89 von 95.

    Neu bedienbar

    • Wiederherstellung als vierstufiger Assistent — vorher nur über curl. Die Vorabprüfung ist ein eigener Schritt, weil sie den Unterschied zwischen Hoffnung und Nachweis macht: Sie schreibt nichts und stellt fest, ob jeder benötigte Block noch da ist. Ein Manifest allein belegt nur, dass jemand einmal etwas gesichert hat.
    • Wiederherstellungspunkte mit Bewertung, Legal Hold, Fristverlängerung, Löschung und Ransomware-Einschätzung.
    • Prüfung mit allen fünf Prüfarten. Zustand und Ergebnis stehen nebeneinander: Eine gescheiterte Prüfung ist kein Befund am Backup.
    • Repositories mit Integritätslauf, Katalog-Neuaufbau, Gesundheitsprüfung und gemessener Durchsetzungsstufe.
    • Aufbewahrung mit Regeln und Vorschau vor dem Löschen.
    • Proxmox — neun Endpunkte, die vorher gar keine Oberfläche hatten — und Agenten samt einmaliger Anzeige des Aufnahme-Tokens.
    • Benutzer, Rollen, Benachrichtigungswege, eigener zweiter Faktor.

    Neues Design

    Tailwind v4 und Radix-Primitive nach shadcn-Muster, alles gebündelt (keine externen Ressourcen — die CSP lässt sie ohnehin nicht zu). Dark Mode, einklappbare Seitenleiste, Bedienung auf Tablets. Achtzehn Seiten in fünf Bereichen.

    Die tragende Entscheidung ist keine Frage des Aussehens: Die Zuordnung der Fachbegriffe auf die fünf Statusfarben liegt an genau einer Stelle. Verteilt über die Seiten erschiene früher oder später irgendwo partial_failure grün — und ein Betreiber hält einen Teilfehler dann für einen Erfolg. Ein unbekannter Serverzustand wird neutral dargestellt, niemals grün.

    Die drei Hürden vor dem Überschreiben

    Der Wiederherstellungs-Assistent setzt sie sichtbar um: das Kennzeichen, die eigene Berechtigung restores.overwrite (nicht in restores.execute enthalten) und der wörtlich wiederholte Zielpfad. Läuft die dritte ins Leere, weil das Ziel leer ist, entfällt sie — ein Ritual ohne Anlass gewöhnt das Wegklicken an.

    Funde beim Nachweis

    • Die Einstufung heißt successful, nicht unverified. Das ist die gefährlichste Stelle der Oberfläche: successful bedeutet „der Lauf ist durchgelaufen" — nicht „wiederherstellbar". Es ist deshalb neutral, nicht grün. Regressionstest, durch Mutation als fangend bestätigt.
    • describeApiError warf die genauere Servermeldung weg. Ein SERVICE_UNAVAILABLE mit „Für diesen Bericht ist keine Sicherheitsprüfung eingerichtet" wurde zu „Der Dienst ist derzeit nicht vollständig verfügbar" — der Betreiber hätte den Fehler bei seiner Anlage gesucht statt bei der Einrichtung dieses einen Berichts. Jetzt hat die Servermeldung Vorrang.
    • Einem Fehler nach einer Handlung fehlte role="alert". Ein Screenreader hätte ihn nicht angesagt.
    • Der Geheimnis-Scanner griff korrekt beim Platzhaltertext des SSH-Schlüsselfelds. Gekennzeichnet, statt das Muster aufzuweichen.

    Aufgeräumt

    Ein Stylesheet statt sieben; das ausgelieferte CSS fällt von 54 auf 30 KB. Entfernt, weil ersetzt: JobsPanel, StatusIndicator, PageState.

    Nachgewiesen

    Gegen Debian 12 mit echtem PostgreSQL und nginx, über genau die Aufrufe, die die Konsole macht: Repository übernommen, Durchsetzungsstufe gemessen (advisory — auf overlayfs richtig), Auftrag angelegt, Lauf 202, zweiter Anstoß 409, Sicherung erfolgreich (3.000.006 Byte, 0 übergangen), Blockprüfung clean, Vorabprüfung „wiederherstellbar: 2 Dateien, 2,9 MiB", Wiederherstellung nach /etc abgewiesen. Alle 18 Seiten liefern über HTTPS 200.

    76 Tests grün, tsc sauber, eslint ohne Warnung.

    Aktualisieren

    sudo /opt/syncova/update.sh
    

    Es sichert zuerst Datenbank und Konfiguration, hält den Dienst an, tauscht die Programme, migriert und startet. Kommt der Dienst nicht hoch, holt es die vorige Fassung zurück. Repository und Verschlüsselungsschlüssel werden nie angefasst.


    Unverändert offen: Windows-Dienst, systemd-Einheit des Agenten und der Proxmox-Bootmeilenstein sind gebaut, aber nie auf echter Hardware gefahren. Dazu ohne Oberfläche: sechs Detail-Endpunkte (ihre Daten stehen in den Listen), Live-Fortschritt (/api/v1/events/stream ist auch serverseitig nicht umgesetzt) und der Simple Mode.

    Downloads
  • v1.0.0-rc5 b6668c600d

    V1 Release Candidate 5 — Weboberfläche richtet sich mit ein
    Some checks failed
    CI / Backend (Go) (push) Failing after 29s
    CI / Frontend (React/TypeScript) (push) Successful in 33s
    CI / Sicherheitsprüfungen (push) Successful in 24s
    Pre-Release

    jf released this 2026-08-18 06:53:20 +00:00 | 12 commits to main since this release

    Die Oberfläche richtet sich jetzt mit ein.

    Bisher endete setup.sh mit einer laufenden API auf 127.0.0.1:8080 und der Aufgabe, einen Webserver von Hand davorzusetzen — der häufigste Punkt, an dem eine Einrichtung liegen blieb.

    Neu

    • setup.sh richtet nginx und ein selbst signiertes Zertifikat ein. Es gilt für den Rechnernamen, den vollständigen Namen und jede globale IPv4-Adresse des Servers (subjectAltName — moderne Browser lesen den CN nicht mehr), 3650 Tage. Der SHA-256-Fingerabdruck wird genannt, damit er sich beim ersten Aufruf im Browser vergleichen lässt.
    • Die API bleibt an 127.0.0.1:8080 gebunden. Erreichbar ist sie nur durch nginx hindurch. Sie stattdessen auf alle Schnittstellen zu legen wäre der kürzere Weg und der falsche: Die Verschlüsselung ließe sich dann umgehen, indem man Port 8080 direkt anspricht.
    • Die Firewall wird gemeldet, nicht geändert. ufw und firewalld werden erkannt und ihr Zustand ausgegeben; geöffnet wird nichts. Eine Einrichtung, die selbsttätig einen Port ins Netz öffnet, hebelt genau die Entscheidung aus, für die jemand die Firewall aufgesetzt hat.
    • Scheitert die Oberfläche, scheitert nicht die Einrichtung. Geprüft wird mit nginx -t, bevor die Konfiguration übernommen wird; hält sie nicht, wird sie entfernt, der Grund genannt und der Nachholweg gezeigt.

    Auf einer bestehenden Anlage nachholen

    sudo /opt/syncova/setup.sh --weboberflaeche
    

    Auslassen: --ohne-weboberflaeche.

    Port 443 geben Sie selbst frei — das nimmt Ihnen die Einrichtung bewusst nicht ab:

    sudo ufw allow 443/tcp                                  # ufw
    sudo firewall-cmd --permanent --add-service=https       # firewalld
    sudo firewall-cmd --reload
    

    Zwei Funde beim Erproben

    • http2 on; gibt es erst ab nginx 1.25.1. Debian 12 liefert 1.22, wo HTTP/2 ein Parameter von listen ist. Die neue Schreibweise ergibt dort „unknown directive http2", und nginx startet nicht. Die Fassung wird jetzt gelesen.
    • setup.sh kopierte nur diagnose.sh neben die Programme. Der eigene Hinweis „Später nachholen: /opt/syncova/setup.sh" verwies damit auf eine Datei, die es nicht gab. Schwerer wiegt uninstall.sh: Wer das ausgepackte Paket aufräumte, hätte die Anlage nie wieder entfernen können. Jetzt kommen alle vier Skripte mit.

    Nachgewiesen

    Im Container gegen Debian 12 mit nginx 1.22: Neuinstallation von Grund auf, Oberfläche und /api/ von außen über HTTPS erreichbar (200), SPA-Fallback trägt, Anmeldung und Repository-Anlage durch nginx hindurch, Durchsetzungsstufe gemessen, HTTP leitet mit 301 auf HTTPS, Fingerabdruck stimmt mit dem genannten überein, Neuausstellung des Zertifikats geprüft.

    Regressionstests für beide Funde, beide durch Mutation als fangend bestätigt.

    Selbst signiertes Zertifikat

    Es schützt gegen Mitlesen, nicht gegen einen Mittelsmann — niemand bestätigt, dass es zu diesem Server gehört. Vergleichen Sie den Fingerabdruck beim ersten Aufruf; danach ist die Browserwarnung unbedenklich. Für den Dauerbetrieb gehört ein Zertifikat einer Zertifizierungsstelle nach /etc/syncova/tls/.


    Unverändert offen: Windows-Dienst, systemd-Einheit des Agenten und der Proxmox-Meilenstein sind gebaut, aber nie auf echter Hardware gefahren. Siehe docs/release-candidate.md.

    Downloads
  • v1.0.0-rc4 22763f927f

    Syncova Backups V1 — Release Candidate 4
    Some checks failed
    CI / Backend (Go) (push) Failing after 31s
    CI / Frontend (React/TypeScript) (push) Successful in 33s
    CI / Sicherheitsprüfungen (push) Successful in 23s
    Pre-Release

    jf released this 2026-08-18 06:22:47 +00:00 | 13 commits to main since this release

    Vierter Auslieferungskandidat. Er behebt #2 — die Einrichtung brach ab, obwohl der Dienst einwandfrei lief.

    Was passiert war

    setup.sh prüfte die Betriebsbereitschaft ausschließlich mit curl. Auf einem schlanken Serverabbild ist der nicht installiert — das ist der Normalfall, nicht die Ausnahme.

    Die Prüfung kam nicht an den Dienst heran, hielt das für einen gescheiterten Start und baute eine funktionierende Anlage zurück.

    Im Protokoll des Meldenden stand der Beleg: Der Dienst startete vollständig, und genau fünfzehn Sekunden später beendete ihn der Rückbau — fünfzehn Sekunden sind fünfzehn Prüfversuche.

    Behoben

    Die Prüfung nimmt jetzt curl, sonst wget, sonst /dev/tcp der Bash. Das letzte gehört zur Shell selbst und ist damit überall vorhanden.

    Ein Einrichtungsskript darf nicht voraussetzen, was es nicht selbst mitbringt.

    Betrifft setup.sh, update.sh und diagnose.sh. Der Diagnosebericht nennt jetzt zusätzlich, womit er gemessen hat:

    Abgefragt mit: Bash /dev/tcp (weder curl noch wget vorhanden)
    

    Real nachgewiesen auf einem System ohne curl und ohne wget: rc3 bricht ab, rc4 läuft durch. Regressionstest vorhanden und als fangend geprüft.

    Aktualisieren

    tar -xzf syncova-v1.0.0-rc4-linux-amd64.tar.gz
    cd syncova-v1.0.0-rc4-linux-amd64
    shasum -a 256 -c SHA256SUMS
    sudo ./setup.sh           # Neuinstallation
    sudo ./update.sh          # aus rc1, rc2 oder rc3
    

    Unverändert: warum RC und nicht 1.0.0

    Drei Zusagen sind gebaut, aber nie auf echter Hardware gefahren: der Windows-Dienst, die systemd-Einheit des Agenten und der Proxmox-Meilenstein — ob eine wiederhergestellte VM startet, ist ungeprüft.

    CHANGELOG.md · docs/release-candidate.md

    Downloads
  • v1.0.0-rc3 a37631c501

    Syncova Backups V1 — Release Candidate 3
    Some checks failed
    CI / Backend (Go) (push) Failing after 32s
    CI / Frontend (React/TypeScript) (push) Successful in 35s
    CI / Sicherheitsprüfungen (push) Successful in 24s
    Pre-Release

    jf released this 2026-08-17 14:14:41 +00:00 | 14 commits to main since this release

    Dritter Auslieferungskandidat. Er behebt #1 — die Einrichtung brach ab, wenn das Repository unter /tmp liegen sollte.

    Was passiert war

    Die Diensteinheit setzt PrivateTmp=yes. Der Dienst bekommt damit ein eigenes /tmp; der in ReadWritePaths genannte Ablageort existiert in seiner Sicht nicht, und systemd bricht ab, bevor das Programm überhaupt läuft:

    syncova-api.service: Failed to set up mount namespacing:
        /tmp/syncova-repository: No such file or directory
    status=226/NAMESPACE
    

    Was daran der größere Fehler war

    Nicht der Startfehler, sondern dass setup.sh einen Ablageort unter /tmp überhaupt angenommen hat. systemd-tmpfiles räumt dort regelmäßig auf, und auf einem tmpfs ist nach einem Neustart nichts mehr da. Die Sicherungen wären von selbst verschwunden — ohne Meldung, bis jemand sie braucht.

    Ein Backupsystem, das jede Nacht Erfolg meldet und keine Daten hat, ist schlimmer als gar keines.

    Behoben

    • Flüchtige Ablageorte werden abgelehnt: /tmp, /var/tmp, /dev/shm, /run und jedes tmpfs oder ramfs. Geprüft wird vor der Datenbankeinrichtung — ein unbeaufsichtigter Lauf scheitert damit in Sekunden statt nach Minuten und einem Rückbau.
    • Ausdrückliche Freigabe für Wegwerf-Umgebungen: SYNCOVA_SETUP_ALLOW_VOLATILE_REPOSITORY=ja. Dann wird PrivateTmp abgeschaltet, sonst startete der Dienst nie.
    • Der Abbruch zeigt den Grund. Kommt der Dienst nicht hoch, liefert setup.sh die letzten Journalzeilen gleich mit und erklärt 226/NAMESPACE. Der bloße Verweis auf journalctl war wertlos: Beim Rückbau ist der Dienst weg.

    Regressionstest vorhanden und als fangend geprüft.

    Aktualisieren

    Betrifft nur die Einrichtung; eine laufende Anlage ist nicht betroffen.

    tar -xzf syncova-v1.0.0-rc3-linux-amd64.tar.gz
    cd syncova-v1.0.0-rc3-linux-amd64
    shasum -a 256 -c SHA256SUMS
    sudo ./update.sh          # aus rc1 oder rc2
    sudo ./setup.sh           # Neuinstallation
    

    Unverändert: warum RC und nicht 1.0.0

    Drei Zusagen sind gebaut, aber nie auf echter Hardware gefahren: der Windows-Dienst, die systemd-Einheit des Agenten und der Proxmox-Meilenstein — ob eine wiederhergestellte VM startet, ist ungeprüft.

    Vollständige Liste: CHANGELOG.md · docs/release-candidate.md

    Downloads
  • v1.0.0-rc2 0b5ce96c51

    Syncova Backups V1 — Release Candidate 2
    Some checks failed
    CI / Backend (Go) (push) Failing after 30s
    CI / Frontend (React/TypeScript) (push) Successful in 34s
    CI / Sicherheitsprüfungen (push) Successful in 24s
    Pre-Release

    jf released this 2026-08-17 14:00:53 +00:00 | 15 commits to main since this release

    Zweiter Auslieferungskandidat von Syncova Backups V1.

    rc1 bleibt abrufbar, ist aber überholt. Wer neu installiert, nimmt diese Fassung.

    Neu gegenüber rc1

    diagnose.sh liegt jetzt im Paket und wird von setup.sh und update.sh nach /opt/syncova/diagnose.sh gelegt.

    sudo /opt/syncova/diagnose.sh
    

    Es sammelt in einem Zug, was für eine Fehlersuche gebraucht wird: Fassungen aller Programme, Betriebssystem, Container ja/nein, Dateisystem des Repositorys, PostgreSQL-Fassung, Schemastand, Dienstzustand, Gesundheitsbericht, Bestand, die letzten nicht erfolgreichen Läufe mit Fehlercode und Fehlerklasse, die gemessene Durchsetzungsstufe und die letzten Fehlerzeilen.

    Es liest nur und verändert nichts. Geheimnisse entfernt es selbsttätig — über eine Erlaubnisliste, nicht über eine Sperrliste: Ein künftiger neuer Wert fällt damit von selbst heraus.

    Dazu eine Fehlervorlage unter .gitea/ISSUE_TEMPLATE/. Sie beginnt mit sieben Fällen, die wie ein Fehler aussehen und gewolltes Verhalten sind — das spart beiden Seiten Zeit.

    Zwei Korrekturen

    Beide beim Erproben gefunden, beide betreffen die Anleitung und nicht die Software:

    • PostgreSQL 15 genügt. Die Installationsanleitung verlangte 17. Debian 12 liefert 15, und darauf läuft alles bis zum echten Sicherungslauf. setup.sh prüft die vorgefundene Fassung jetzt und lehnt ältere als 15 ab, statt sie stillschweigend zu nehmen.
    • SYNCOVA_ADMIN_PASSWORD gibt es nicht. Die Anleitung nannte diese Umgebungsvariable; das Passwort kommt über die Standardeingabe — Aufrufparameter stünden in der Prozessliste.

    Unverändert: warum RC und nicht 1.0.0

    Drei Zusagen sind vollständig gebaut, aber nie auf echter Hardware gefahren:

    • Der Windows-Dienst. Übersetzt für Windows, vet-sauber, nie geladen.
    • Die systemd-Einheit des Agenten. Inhaltlich korrigiert, nie geladen.
    • Proxmox. Entdecken, Sichern, Prüfen und bitgenaues Zurückschreiben laufen durch — gegen einen Nachbau der API. Ob eine wiederhergestellte VM startet, ist ungeprüft.

    Installation

    tar -xzf syncova-v1.0.0-rc2-linux-amd64.tar.gz
    cd syncova-v1.0.0-rc2-linux-amd64
    shasum -a 256 -c SHA256SUMS
    sudo ./setup.sh
    

    Aktualisieren aus rc1: sudo ./update.sh aus dem neuen Paket. Es sichert vorher Datenbank und Konfiguration und holt die vorige Fassung zurück, wenn der Dienst danach nicht hochkommt.

    Skript Wofür
    setup.sh Vollständige Einrichtung; baut bei Abbruch zurück, was dieser Lauf angelegt hat
    update.sh Sichert zuerst; Rückweg bei Fehlschlag
    uninstall.sh Entfernt standardmäßig nur Dienst und Programme
    diagnose.sh Zustandsbericht für eine Fehlermeldung

    docs/installation.md · docs/recovery-runbook.md · docs/troubleshooting.md · docs/release-howto.md

    Nicht enthalten

    Kapazitätsprognose, Backup Copy, Changed Block Tracking bei Proxmox, erweiterte Attribute und POSIX-ACLs, harte Verknüpfungen. VMware, Hyper-V, Kubernetes, M365 und Object Storage sind nicht Teil dieser Fassung.

    Pakete

    Paket Inhalt
    linux-amd64, linux-arm64 Server, Oberfläche, Agent, alle Werkzeuge, vier Betriebsskripte
    windows-amd64 Agent und syncova-repo

    Statisch gebunden (CGO_ENABLED=0); geprüft in einem leeren debian:12-slim. Prüfsummen liegen im Paket und zusätzlich als SHA256SUMS daneben.

    Downloads
  • v1.0.0-rc1 0c5a106a83

    Syncova Backups V1 — Release Candidate 1
    Some checks failed
    CI / Backend (Go) (push) Failing after 31s
    CI / Frontend (React/TypeScript) (push) Successful in 33s
    CI / Sicherheitsprüfungen (push) Successful in 24s
    Pre-Release

    jf released this 2026-08-17 13:36:53 +00:00 | 17 commits to main since this release

    Erster Auslieferungskandidat von Syncova Backups V1.

    Alle 24 Phasen des Umsetzungsplans sind gebaut. 32 von 38 Zeilen der Akzeptanzmatrix sind gefahren — abgehakt ist nur, was tatsächlich ausgeführt wurde.

    Warum RC und nicht 1.0.0

    Drei Zusagen sind vollständig gebaut, aber nie auf echter Hardware gefahren:

    • Der Windows-Dienst. Er übersetzt für Windows und ist vet-sauber, wurde aber nie geladen. Kommandozeilenweg und Auftragsausführung sind plattformunabhängig nachgewiesen.
    • Die systemd-Einheit des Agenten. Inhaltlich korrigiert, nie auf einem Linux-System geladen.
    • Proxmox. Entdecken, Sichern, Prüfen und bitgenaues Zurückschreiben laufen durch — gegen einen Nachbau der API. Ob eine wiederhergestellte VM startet, ist ungeprüft.

    Solange das offen ist, wäre eine 1.0.0 eine Zusage, die diese Punkte nicht deckt.

    Installation

    tar -xzf syncova-v1.0.0-rc1-linux-amd64.tar.gz
    cd syncova-v1.0.0-rc1-linux-amd64
    shasum -a 256 -c SHA256SUMS
    sudo ./setup.sh
    

    Das Paket bringt drei Betriebsskripte mit:

    setup.sh Vollständige Einrichtung. Bricht ein Schritt ab, wird zurückgebaut, was dieser Lauf angelegt hat
    update.sh Sichert zuerst Datenbank und Konfiguration; holt die vorige Fassung zurück, wenn der Dienst nicht hochkommt
    uninstall.sh Entfernt standardmäßig nur Dienst und Programme. Datenbank, Repository und Konfiguration bleiben liegen

    Ausführlich: docs/installation.md · Im Ernstfall: docs/recovery-runbook.md · Bei Störungen: docs/troubleshooting.md

    Der Schritt, den die meisten auslassen

    Erst ein durchgeführter Wiederherstellungstest hebt einen Punkt auf recoverable. Alles davor ist ein Indiz, kein Nachweis — docs/release-howto.md führt in vier Stufen durch die Prüfung einer frischen Anlage.

    Nicht enthalten

    Kapazitätsprognose, Backup Copy, Changed Block Tracking bei Proxmox, erweiterte Attribute und POSIX-ACLs, harte Verknüpfungen (der Inhalt kommt zurück, die Verknüpfung nicht). VMware, Hyper-V, Kubernetes, M365 und Object Storage sind nicht Teil dieser Fassung.

    Eingefrorene Verträge

    API (102 Endpunkte), Migrationen, Backup-Format und Repository-Protokoll sind ab dieser Fassung festgeschrieben. Jede Abweichung schlägt in einer Prüfung an.

    Pakete

    Paket Inhalt
    linux-amd64, linux-arm64 Server, Oberfläche, Agent, alle Werkzeuge, Betriebsskripte
    windows-amd64 Agent und syncova-repo

    Statisch gebunden (CGO_ENABLED=0); geprüft in einem leeren debian:12-slim. Prüfsummen liegen im Paket und zusätzlich als SHA256SUMS daneben.

    Einzelheiten: CHANGELOG.md · docs/release-candidate.md

    Downloads