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>
167 lines
4.9 KiB
YAML
167 lines
4.9 KiB
YAML
# Continuous Integration für Syncova.
|
|
#
|
|
# Die Pipeline muss jede Änderung prüfen, bevor sie in den Hauptzweig gelangt
|
|
# (SYNCOVA_IMPLEMENTATION_PLAN.md Phase 0).
|
|
|
|
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
# Ein laufender Durchlauf wird abgebrochen, sobald ein neuerer Commit erscheint.
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
# Standardmäßig nur Lesezugriff: die Pipeline braucht keine Schreibrechte.
|
|
permissions:
|
|
contents: read
|
|
|
|
env:
|
|
GO_VERSION: '1.26'
|
|
NODE_VERSION: '22'
|
|
|
|
jobs:
|
|
backend:
|
|
name: Backend (Go)
|
|
runs-on: ubuntu-latest
|
|
|
|
services:
|
|
# Die Tests laufen gegen eine echte PostgreSQL-Instanz, nicht gegen eine Attrappe.
|
|
postgres:
|
|
image: postgres:17-alpine
|
|
env:
|
|
POSTGRES_DB: syncova_test
|
|
POSTGRES_USER: syncova_test
|
|
# Nur für diesen kurzlebigen CI-Container; die Datenbank ist von außen nicht erreichbar.
|
|
POSTGRES_PASSWORD: ci-only-ephemeral-password
|
|
ports:
|
|
- 5432:5432
|
|
options: >-
|
|
--health-cmd "pg_isready -U syncova_test -d syncova_test"
|
|
--health-interval 5s
|
|
--health-timeout 5s
|
|
--health-retries 10
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version: ${{ env.GO_VERSION }}
|
|
cache: true
|
|
|
|
- name: Formatierung prüfen
|
|
run: |
|
|
UNFORMATTED_FILES="$(gofmt -l apps/api packages migrations)"
|
|
if [ -n "$UNFORMATTED_FILES" ]; then
|
|
echo "Nicht formatierte Dateien gefunden:"
|
|
echo "$UNFORMATTED_FILES"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Statische Analyse
|
|
run: |
|
|
# node_modules ausschliessen: NPM-Pakete koennen eigenen Go-Code enthalten.
|
|
go vet $(go list ./... | grep -v '/node_modules/')
|
|
|
|
- name: Modulabhängigkeiten prüfen
|
|
run: |
|
|
go mod tidy
|
|
# Eine Änderung an go.mod/go.sum bedeutet: die Abhängigkeiten sind nicht eingecheckt.
|
|
git diff --exit-code go.mod go.sum
|
|
|
|
- name: Tests mit Race-Detector
|
|
env:
|
|
SYNCOVA_ENV: test
|
|
SYNCOVA_DB_HOST: 127.0.0.1
|
|
SYNCOVA_DB_PORT: '5432'
|
|
SYNCOVA_DB_NAME: syncova_test
|
|
SYNCOVA_DB_USER: syncova_test
|
|
SYNCOVA_DB_PASSWORD: ci-only-ephemeral-password
|
|
SYNCOVA_DB_SSLMODE: disable
|
|
# Nur für diesen CI-Lauf; schützt keine echten Daten.
|
|
SYNCOVA_ENCRYPTION_KEYS: 'v1:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='
|
|
run: go test -race -coverprofile=coverage.out $(go list ./... | grep -v '/node_modules/')
|
|
|
|
- name: Migrationen gegen echte Datenbank prüfen
|
|
env:
|
|
SYNCOVA_ENV: test
|
|
SYNCOVA_DB_HOST: 127.0.0.1
|
|
SYNCOVA_DB_PORT: '5432'
|
|
SYNCOVA_DB_NAME: syncova_test
|
|
SYNCOVA_DB_USER: syncova_test
|
|
SYNCOVA_DB_PASSWORD: ci-only-ephemeral-password
|
|
SYNCOVA_DB_SSLMODE: disable
|
|
# Nur für diesen CI-Lauf; schützt keine echten Daten.
|
|
SYNCOVA_ENCRYPTION_KEYS: 'v1:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='
|
|
run: |
|
|
# Der vollständige Zyklus belegt, dass Migrationen umkehrbar sind.
|
|
go run ./apps/api/cmd/syncova-migrate up
|
|
go run ./apps/api/cmd/syncova-migrate status
|
|
go run ./apps/api/cmd/syncova-migrate down
|
|
go run ./apps/api/cmd/syncova-migrate up
|
|
|
|
- name: Binaries bauen
|
|
run: go build $(go list ./... | grep -v '/node_modules/')
|
|
|
|
frontend:
|
|
name: Frontend (React/TypeScript)
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
working-directory: apps/web
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
cache: npm
|
|
cache-dependency-path: apps/web/package-lock.json
|
|
|
|
- name: Abhängigkeiten installieren
|
|
run: npm ci
|
|
|
|
- name: Statische Analyse
|
|
run: npm run lint
|
|
|
|
- name: Tests
|
|
run: npm run test
|
|
|
|
- name: Auslieferungs-Build
|
|
run: npm run build
|
|
|
|
security:
|
|
name: Sicherheitsprüfungen
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version: ${{ env.GO_VERSION }}
|
|
cache: true
|
|
|
|
- name: Bekannte Schwachstellen in Go-Abhängigkeiten
|
|
run: |
|
|
go install golang.org/x/vuln/cmd/govulncheck@latest
|
|
govulncheck $(go list ./... | grep -v '/node_modules/')
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
cache: npm
|
|
cache-dependency-path: apps/web/package-lock.json
|
|
|
|
- name: Bekannte Schwachstellen in NPM-Abhängigkeiten
|
|
working-directory: apps/web
|
|
run: |
|
|
npm ci
|
|
# Nur hohe und kritische Befunde brechen den Lauf ab.
|
|
npm audit --audit-level=high
|