All checks were successful
CD / Build and push images (push) Successful in 3m51s
CI / Lint, typecheck, test (push) Successful in 4m5s
CD / Deploy to Test (push) Successful in 11s
CI / Build container images (push) Has been skipped
CD / Smoke tests against Test (push) Successful in 1m11s
CD / Promote to Int (push) Successful in 12s
CI / Auth e2e pack (push) Successful in 5m52s
CI / Import/export fidelity gate (push) Successful in 47s
The operator-level extra beside the admin-configured Nextcloud target (#103), unblocked now that the ONE→BASEL tunnel is stable again. - sidecar: optional mirror step (mirror.ts) driven purely by env — BACKUP_MIRROR_TARGET (rsync-over-ssh), BACKUP_MIRROR_SSH_KEY (private key on the secrets volume, never in image or repo), BACKUP_MIRROR_SSH_PORT. Runs after the prune of every successful run, so --delete aligns the remote retention with the local one (the newest-complete-set guarantee carries over). Only set files travel (db-*.dump, files-*.tar.gz); status files and bundles stay local. Host key pinned via accept-new into .mirror_known_hosts on the backups volume; fixed remote modes (dirs 750, files 640, symbolic --chmod — octal needs rsync ≥ 3, macOS dev machines ship 2.6.9). rsync + openssh-client added to the sidecar image. - status: additive `mirror` block in status.json (outcome, transferred count, lastSuccessAt carried across failures) — shown on the admin backup card; failures alert via a new backupMirrorFailed mail (de+en) while the local run still counts as succeeded. - deploy/backup-basel.md: complete BASEL-side walkthrough — dedicated user dorfteich-backup with a /home/ home and a bash login shell, explicitly avoiding the Debian backup-user (UID 34) pitfalls (nologin shell rejects rsync sessions, /var/backups home), key placement through the api container onto the secrets volume, .env values, on-demand verification. - tests: rsync-arg/stats-parsing units plus an integration suite against the real rsync binary (local target; skips where rsync is absent) — transfer, idempotent re-run (0 files), retention alignment, failure path carrying lastSuccessAt. Verified live against the real BASEL host from a native sidecar run: initial transfer, host-key pinning, retention alignment after a local prune, idempotency, and the failure path (surfaced in status.json while the local run stayed green). BASEL side provisioned per the doc. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwZ4jR4KFAPvpjWevfUGX1
65 lines
3.5 KiB
JSON
65 lines
3.5 KiB
JSON
{
|
|
"common": {
|
|
"greeting": "Hallo {{displayName}},",
|
|
"signoff": "Dein Dorfteich",
|
|
"ignoreHint": "Falls du diese E-Mail nicht angefordert hast, kannst du sie einfach ignorieren."
|
|
},
|
|
"verifyEmail": {
|
|
"subject": "Bestätige deine E-Mail-Adresse",
|
|
"body": "willkommen im Dorfteich! Bitte bestätige deine E-Mail-Adresse, um dein Konto zu aktivieren:",
|
|
"action": "E-Mail-Adresse bestätigen",
|
|
"expiry": "Der Link ist 24 Stunden gültig."
|
|
},
|
|
"resetPassword": {
|
|
"subject": "Passwort zurücksetzen",
|
|
"body": "jemand (hoffentlich du) hat das Zurücksetzen des Passworts für dein Konto angefordert. Über diesen Link kannst du ein neues Passwort setzen:",
|
|
"action": "Neues Passwort setzen",
|
|
"expiry": "Der Link ist eine Stunde gültig. Dein aktuelles Passwort bleibt gültig, bis du ein neues gesetzt hast."
|
|
},
|
|
"smtpTest": {
|
|
"subject": "SMTP-Testnachricht",
|
|
"body": "diese Testnachricht bestätigt, dass dein Dorfteich E-Mails über den konfigurierten SMTP-Server versenden kann. Deine Instanz erreichst du hier:",
|
|
"action": "Dorfteich öffnen",
|
|
"expiry": "Du kannst diese E-Mail einfach löschen."
|
|
},
|
|
"backupFailed": {
|
|
"subject": "[{{instance}}] Backup fehlgeschlagen ({{backupId}})",
|
|
"intro": "Der nächtliche Backup-Lauf auf {{instance}} ist fehlgeschlagen.",
|
|
"backupId": "Backup-ID: {{backupId}}",
|
|
"error": "Fehler: {{error}}",
|
|
"lastSuccess": "Letztes erfolgreiches Backup: {{finishedAt}}",
|
|
"lastSuccessNever": "Letztes erfolgreiches Backup: noch keines",
|
|
"hint": "Prüfe die Sidecar-Logs (docker compose logs backup) und die status.json auf dem Backups-Volume."
|
|
},
|
|
"backupUploadFailed": {
|
|
"subject": "[{{instance}}] Backup-Upload zu Nextcloud fehlgeschlagen ({{backupId}})",
|
|
"intro": "Das lokale Backup auf {{instance}} war erfolgreich, aber der Upload zum Nextcloud-Ziel ist fehlgeschlagen.",
|
|
"backupId": "Backup-ID: {{backupId}}",
|
|
"error": "Fehler: {{error}}",
|
|
"lastSuccess": "Letzter erfolgreicher Upload: {{finishedAt}}",
|
|
"lastSuccessNever": "Letzter erfolgreicher Upload: noch keiner",
|
|
"hint": "Prüfe die Nextcloud-Verbindungseinstellungen im Admin-Bereich (Verbindungstest) und die Sidecar-Logs (docker compose logs backup)."
|
|
},
|
|
"backupMirrorFailed": {
|
|
"subject": "[{{instance}}] Backup-Spiegelung zum privaten Host fehlgeschlagen",
|
|
"intro": "Das lokale Backup auf {{instance}} war erfolgreich, aber die Spiegelung der Sets per rsync ist fehlgeschlagen.",
|
|
"backupId": "Komponente: rsync-Mirror (Issue #84)",
|
|
"error": "Fehler: {{error}}",
|
|
"lastSuccess": "Letzte erfolgreiche Spiegelung: {{finishedAt}}",
|
|
"lastSuccessNever": "Letzte erfolgreiche Spiegelung: noch keine",
|
|
"hint": "Prüfe den Tunnel zum Mirror-Host, den SSH-Key im Secrets-Volume und die Sidecar-Logs (docker compose logs backup). Einrichtung: deploy/backup-basel.md."
|
|
},
|
|
"digest": {
|
|
"subject": "Dorfteich: {{count}} Neuigkeiten für dich",
|
|
"intro": "Das ist auf von dir beobachteten Seiten passiert ({{count}} Neuigkeiten):",
|
|
"changes_one": "{{count}} Änderung",
|
|
"changes_other": "{{count}} Änderungen",
|
|
"comments_one": "{{count}} Kommentar",
|
|
"comments_other": "{{count}} Kommentare",
|
|
"openApp": "Dorfteich öffnen: {{link}}",
|
|
"unsubscribe": "Diese Digest-Mails abbestellen: {{link}}",
|
|
"unsubscribedTitle": "Digest-Mails deaktiviert",
|
|
"unsubscribedBody": "Du erhältst keine Benachrichtigungs-Digests mehr. In den Konto-Einstellungen kannst du sie nach der Anmeldung jederzeit wieder aktivieren."
|
|
}
|
|
}
|