syncova-backup/docs/agent-installation.md
Jerrit Fritzsche 610719c316
Some checks failed
CI / Backend (Go) (push) Failing after 3m7s
CI / Frontend (React/TypeScript) (push) Successful in 37s
CI / Sicherheitsprüfungen (push) Successful in 44s
Syncova Backups V1
Enterprise-Backup-, Recovery-, Verification-, Security- und
Monitoring-Plattform fuer Proxmox VE, Windows, Linux und Dateisysteme.

Der Leitsatz, der fast jede Entscheidung erklaert: Ein Backup gilt erst als
vertrauenswuerdig, wenn Integritaet geprueft und Wiederherstellbarkeit
nachgewiesen wurde. Deshalb steigt ein Wiederherstellungspunkt erst nach einem
tatsaechlich durchgefuehrten Restore-Test auf "recoverable", und Unbekanntes
geht in keine Bewertung als "gut" ein.

Umfang (Phasen 0-23):

- Repository Engine: inhaltsadressierte Bloecke, atomares Commit-Protokoll,
  Katalogaufbau allein aus den Manifesten — ohne Datenbank
- Backup Engine: inhaltsabhaengiges Chunking, Deduplizierung trotz
  Verschluesselung, zstd, AES-256-GCM, Streaming mit Gegendruck
- Agenten fuer Windows und Linux mit Auftragsabholung (Pull-Modell)
- Proxmox-Provider mit beiden Zugriffswegen auf die Sicherungsarchive
- Scheduler, Recovery Engine mit Pruefpunkt, Verification, Unveraenderlichkeit
- Weboberflaeche, Kennzahlen, Meldungen, Berichte, Security Center,
  Ransomware-Heuristik (meldet, handelt nie)
- Disaster Recovery, Haertung, Leistungsmessung, Chaos Testing
- Eingefrorene Vertraege fuer API, Migrationen, Backup-Format und Repository
- Auslieferungspaket fuer linux/amd64, linux/arm64 und windows/amd64

Nicht enthalten und als solches gekennzeichnet: Kapazitaetsprognose, Backup
Copy, Changed Block Tracking bei Proxmox, erweiterte Attribute und ACLs.

Gebaut, aber nie auf echter Hardware gefahren: der Windows-Dienst, die
systemd-Einheit und der verpflichtende Proxmox-Meilenstein — ob eine
wiederhergestellte VM startet, ist ungeprueft. Einzelheiten in CHANGELOG.md
und docs/release-candidate.md.

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

7.6 KiB
Raw Blame History

Agent installieren (Windows und Linux)

Diese Anleitung beschreibt, was auf einem zu sichernden System einzurichten ist.

Der Windows-Dienst ist geschrieben, aber nie ausgeführt worden. Er übersetzt für Windows — make cross-build prüft das bei jedem Lauf —, wurde aber auf einem macOS-System entwickelt. Der Kommandozeilenweg und die gesamte Auftragsausführung sind plattformunabhängig und nachgewiesen; der Dienstwrapper ist der einzige ungeprüfte Teil.

Was der Agent braucht

Netzverbindung ausgehend zum Control-Server. Keine eingehende Freigabe nötig — der Agent holt seine Aufträge ab
Repositoryzugriff schreibend, siehe unten
Rechte Lesezugriff auf alles, was gesichert werden soll
Schlüsselmaterial SYNCOVA_ENCRYPTION_KEYS, sofern verschlüsselt gesichert wird

Der Punkt, der am häufigsten übersehen wird

Der Agent schreibt selbst ins Repository. Der Auftrag enthält dessen Pfad; der Agent öffnet ihn direkt.

  • Läuft der Agent auf demselben Rechner wie der Control-Server: der lokale Pfad genügt.
  • Läuft er auf einem anderen Rechner: Das Repository muss dort eingehängt sein — als SMB-Freigabe, NFS-Einhängepunkt oder verbundenes Laufwerk.

Erreicht der Agent das Repository nicht, meldet er REPOSITORY_UNREACHABLE mit dem Hinweis auf die Freigabe. Er liefert keine leere Sicherung ab.

Bauen

# Für Windows
GOOS=windows GOARCH=amd64 go build -o syncova-agent.exe ./apps/agent/cmd/syncova-agent

# Für Linux
GOOS=linux GOARCH=amd64 go build -o syncova-agent ./apps/agent/cmd/syncova-agent

Windows

1. Aufnahme-Token am Server erzeugen

curl -X POST https://<server>/api/v1/agents/enrollment-tokens \
  -H "Authorization: Bearer <token>" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"agent_name":"WINSRV01"}'

Der Name steht im Token, nicht in der Anmeldung des Agenten: Ein Agent bestimmt seinen Namen nicht selbst, sonst könnte er sich als ein anderes System ausgeben. Das Token gilt eine Stunde und nur einmal.

2. Agent aufnehmen

New-Item -ItemType Directory -Force -Path C:\ProgramData\Syncova

.\syncova-agent.exe register `
  --server https://<server> `
  --token <aufnahme-token> `
  --state C:\ProgramData\Syncova\agent.json

Die Zustandsdatei enthält das Betriebstoken. Sie gehört geschützt:

icacls C:\ProgramData\Syncova\agent.json /inheritance:r /grant:r "SYSTEM:(R)"

3. Als Dienst einrichten

sc.exe create SyncovaAgent `
  binPath= "C:\Program Files\Syncova\syncova-agent.exe run --state C:\ProgramData\Syncova\agent.json" `
  start= auto `
  DisplayName= "Syncova Backup Agent"

sc.exe description SyncovaAgent "Sichert dieses System über den Syncova Control Server."
sc.exe failure SyncovaAgent reset= 86400 actions= restart/60000/restart/60000/restart/300000

sc.exe start SyncovaAgent

Der Dienstname muss SyncovaAgent lauten. Er ist im Programm festgeschrieben (windowsServiceName); weicht er ab, meldet sich der Prozess beim Dienstverwalter nicht an, und Windows beendet ihn nach der Startfrist — mit einer Meldung, die wie ein Absturz aussieht.

4. Schlüsselmaterial hinterlegen

Der Dienst liest es aus seiner Umgebung:

# Als Registry-Wert des Dienstes, damit es nicht in einem Skript steht
$env = @("SYNCOVA_ENCRYPTION_KEYS=v1:<base64-schluessel>")
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SyncovaAgent" `
  -Name Environment -Value $env -Type MultiString
Restart-Service SyncovaAgent

Ohne Schlüsselmaterial startet der Agent, lehnt aber jeden Auftrag mit verlangter Verschlüsselung ab. Er führt ihn nicht unverschlüsselt aus: Ein Backup, das der Server für verschlüsselt hält und das es nicht ist, wäre eine Zusicherung ins Leere.

5. Dienstkonto

Standardmäßig läuft der Dienst als LocalSystem. Das genügt zum Lesen der meisten Dateien und ist der Grund, warum es funktioniert — aber es ist mehr Recht, als nötig. Für ein eigenes Dienstkonto:

sc.exe config SyncovaAgent obj= "DOMAIN\svc_syncova" password= "<passwort>"

Das Konto braucht dann Leserechte auf alle zu sichernden Pfade und Schreib‑ rechte auf das Repository. Fehlt eines davon, meldet der Agent es als übergangenes Objekt — der Lauf wird zum Teilfehler, nicht zum stillen Erfolg.

Linux

sudo useradd --system --no-create-home --shell /usr/sbin/nologin syncova
sudo install -m 0755 syncova-agent /usr/local/bin/
sudo install -d -m 0700 -o syncova -g syncova /etc/syncova

sudo -u syncova /usr/local/bin/syncova-agent register \
  --server https://<server> --token <aufnahme-token> \
  --state /etc/syncova/agent.json

Die mitgelieferte Einheit liegt unter deployment/syncova-agent.service:

sudo cp deployment/syncova-agent.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now syncova-agent

Das Schlüsselmaterial gehört in eine Datei, die nur root liest:

sudo install -m 0600 /dev/null /etc/syncova/agent.env
echo "SYNCOVA_ENCRYPTION_KEYS=v1:<base64-schluessel>" | sudo tee /etc/syncova/agent.env >/dev/null
# In der Unit: EnvironmentFile=/etc/syncova/agent.env

Auch deployment/syncova-agent.service ist auf macOS geschrieben und ungeprüft — systemd-analyze verify gibt es dort nicht.

Auftrag einrichten

Der Auftrag entsteht am Server. Entscheidend ist die Zuweisung der Quelle an den Agenten:

{
  "name": "Dateiserver täglich",
  "repository_id": "<repository>",
  "schedule": { "type": "daily", "time": "02:00", "time_zone": "Europe/Berlin" },
  "sources": [{
    "type": "filesystem",
    "id": "D:\\Daten",
    "name": "Dateiserver D:",
    "agent_id": "<agent-kennung>"
  }]
}

Ohne agent_id sichert der Control-Server selbst — und scheitert, weil er das Dateisystem des fremden Rechners nicht erreicht.

Prüfen, ob es läuft

# Meldet sich der Agent?
curl -H "Authorization: Bearer <token>" https://<server>/api/v1/agents

# Was hat er zuletzt getan?
curl -H "Authorization: Bearer <token>" https://<server>/api/v1/agents/<id>/health

Windows-Ereignisprotokoll: Der Dienst schreibt seine Meldungen auf die Standardausgabe. Für das Ereignisprotokoll empfiehlt sich eine Umleitung in eine Datei über den binPath oder ein Dienstwrapper wie NSSM.

Fehlerbilder

Meldung Ursache
REPOSITORY_UNREACHABLE Der Agent erreicht das Repository nicht. Freigabe eingehängt? Rechte des Dienstkontos?
ENCRYPTION_KEY_MISSING Auftrag verlangt Verschlüsselung, dem Agenten fehlt der Schlüssel
RESTORE_TARGET_FORBIDDEN Das Wiederherstellungsziel liegt in einem Systemverzeichnis
AGENT_LOST Der Agent meldete sich während eines Auftrags nicht mehr. Der Auftrag wird nicht selbsttätig wiederholt — er könnte bereits Blöcke geschrieben haben
UNKNOWN_TASK_TYPE Der Server kennt eine Auftragsart, die dieser Agent nicht hat. Agent aktualisieren
Dienst startet und endet sofort Zustandsdatei fehlt oder ist unlesbar. syncova-agent register erneut ausführen

Was der Agent nicht tut

  • Er entscheidet nicht über Wiederherstellungen. Recht und wörtliche Bestätigung des Zielpfads prüft der Server, bevor ein Auftrag entsteht. Was der Agent sehr wohl prüft, ist der Zielpfad gegen die Systemverzeichnisse seines Systems — das kann der Server nicht, er kennt sie nicht.
  • Er sendet keine Daten an den Server. Er schreibt unmittelbar ins Repository. Ein Streaming-Protokoll verdoppelte den Datenweg und machte den Control-Server zum Engpass jeder Sicherung.
  • Er nimmt keine eingehenden Verbindungen an. Alle Verbindungen gehen von ihm aus.