dorfteich/packages/shared/i18n/en/system.json
Claude Fable 5 394d1c811d
All checks were successful
CI / Lint, typecheck, test (pull_request) Successful in 4m52s
CI / Build container images (pull_request) Successful in 3m54s
CI / Auth e2e pack (pull_request) Successful in 8m4s
CI / Import/export fidelity gate (pull_request) Successful in 56s
CD / Build and push images (push) Successful in 19s
CD / Deploy to Test (push) Successful in 13s
CD / Smoke tests against Test (push) Successful in 1m14s
CD / Promote to Int (push) Successful in 11s
CI / Lint, typecheck, test (push) Successful in 5m0s
CI / Build container images (push) Has been skipped
CI / Auth e2e pack (push) Successful in 7m41s
CI / Import/export fidelity gate (push) Successful in 56s
#192: deploy-level backup target allowlist
BACKUP_ALLOWED_TARGETS (comma-separated destination hosts) constrains
where backups may go, enforced twice: the api rejects settings writes
and connection tests towards non-allowlisted hosts with admin-visible
error codes and resolves a non-allowlisted configured target to null,
and the sidecar enforces the same policy at the point of egress for the
WebDAV upload and the rsync mirror alike (shared policy helpers in
packages/shared/src/backup-target-policy.ts).

BREAKING: the empty default disables every remote target - backups stay
local only, the VS-NfD reference configuration (ADR 0026). Existing
deployments with a remote target must list its host or uploads and
mirror stop. The admin UI distinguishes unavailable-by-policy from
unconfigured (i18n de+en) and shows the permitted hosts.

Refs #192 (ADR 0026)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0168Ph5uBmHm8X28CSVpbpnJ
2026-07-30 12:17:14 +02:00

203 lines
7.4 KiB
JSON

{
"title": "System",
"backLink": "Back to settings",
"settingsLink": "System panel",
"jobs": {
"title": "Maintenance jobs",
"columns": {
"job": "Job",
"cadence": "Cadence",
"lastRun": "Last run",
"duration": "Duration",
"outcome": "Outcome",
"actions": "Actions"
},
"names": {
"trash-purge": "Trash purge",
"version-thinning": "Version thinning",
"page-compaction": "Page compaction",
"data-export-purge": "Data-export purge"
},
"outcome": {
"ok": "OK",
"running": "Running",
"failed": "Failed",
"never": "Never ran"
},
"unregistered": "No longer registered in this build",
"run": "Run now",
"runPending": "Running…",
"triggered": {
"succeeded": "Run finished successfully.",
"failed": "Run failed — see the error in the row.",
"already_running": "Already running elsewhere — try again in a moment."
},
"cadence": {
"days_one": "every day",
"days_other": "every {{count}} days",
"hours_one": "hourly",
"hours_other": "every {{count}} hours",
"minutes_one": "every minute",
"minutes_other": "every {{count}} minutes",
"seconds_other": "every {{count}} seconds"
}
},
"backup": {
"title": "Backups",
"fresh": "Fresh",
"stale": "Stale — older than {{hours}} h",
"unavailable": "No backup status found. The backup sidecar has not run yet (or is not deployed) — see deploy/monitoring.md.",
"lastSuccess": "Last successful backup",
"lastRun": "Last run",
"outcome": {
"succeeded": "succeeded",
"failed": "failed"
},
"never": "none yet",
"sizes": "Dump {{dump}}, files {{archive}}",
"retention": "Retention: {{days}} days",
"error": "Last error",
"runNow": "Back up now",
"runPending": "Requesting…",
"runRequested": "Backup requested — the sidecar is running it in the background. This card refreshes automatically.",
"remote": {
"title": "Nextcloud target",
"notConfigured": "No Nextcloud target configured — backups stay on this host only.",
"lastUpload": "Last upload",
"lastSuccessfulUpload": "Last successful upload",
"bundleSize": "bundle {{size}}"
},
"settings": {
"title": "Backup settings",
"localRetention": "Local retention (days)",
"localRetentionHint": "Empty = keep the container default (BACKUP_RETENTION_DAYS).",
"remoteRetention": "Nextcloud retention (days)",
"enabled": "Upload backups to Nextcloud",
"baseUrl": "Nextcloud address (URL)",
"baseUrlHint": "The plain server address, e.g. https://cloud.example.com — the WebDAV path is derived.",
"username": "Username",
"password": "App password",
"passwordStored": "Stored — leave empty to keep it",
"passwordHint": "Create one in Nextcloud under Settings → Security → Devices & sessions.",
"folder": "Folder",
"schedule": "Upload schedule",
"scheduleOptions": {
"off": "Manual only",
"daily": "After every backup (daily)",
"weekly": "Weekly"
},
"test": "Test connection",
"testPending": "Testing…",
"testOk": "Connection ok — folder is reachable.",
"save": "Save backup settings",
"savePending": "Saving…",
"saved": "Backup settings saved.",
"remoteDisabledByPolicy": "Remote backup targets are disabled by deployment policy (BACKUP_ALLOWED_TARGETS is empty) — backups stay local. This is a deliberate operator setting, not a missing configuration.",
"allowedTargets": "Destination hosts permitted by deployment policy: {{hosts}}"
},
"restore": {
"title": "Restore",
"open": "Restore a backup…",
"warning": "Restoring replaces ALL current content, files and settings of this instance with the state of the selected backup. The instance goes into maintenance mode while the restore runs.",
"loading": "Loading backup sets…",
"localTitle": "On this host",
"remoteTitle": "On Nextcloud",
"empty": "No restorable sets found.",
"remoteError": "The Nextcloud sets could not be listed: {{error}}",
"confirmLabel": "Type the backup id to confirm: {{id}}",
"button": "Restore this backup",
"pending": "Requesting restore…",
"requested": "Restore requested — the instance is entering maintenance mode.",
"status": {
"running": "Restore of {{id}} is running (started {{startedAt}})…",
"succeeded": "Restore of {{id}} succeeded ({{finishedAt}}).",
"failed": "Restore of {{id}} failed: {{error}}"
}
},
"mirror": {
"title": "Private mirror",
"lastSuccess": "Last successful mirror",
"failed": "last run failed"
}
},
"audit": {
"title": "Audit log",
"filters": {
"actor": "Actor (username)",
"action": "Action",
"actionAny": "All actions",
"from": "From",
"to": "Until",
"apply": "Filter"
},
"columns": {
"time": "Time",
"actor": "Actor",
"action": "Action",
"target": "Target",
"details": "Details"
},
"systemActor": "System",
"empty": "No entries match the filter.",
"pager": "Page {{page}} of {{pageCount}} ({{total}} entries)",
"previous": "Previous",
"next": "Next",
"actions": {
"grant.created": "Access rule created",
"grant.deleted": "Access rule deleted",
"member.added": "Member added",
"member.role_changed": "Member role changed",
"member.removed": "Member removed",
"user.disabled_set": "User disabled/enabled",
"user.verification_resent": "Verification mail resent",
"user.deleted": "User deleted",
"user.site_admin_set": "Site-Admin role changed",
"user.pseudonymized": "User pseudonymized",
"quota.override_set": "Quota override set",
"quota.override_cleared": "Quota override cleared",
"plugin.installed": "Plugin installed",
"plugin.mode_set": "Plugin mode changed",
"plugin.uninstalled": "Plugin uninstalled",
"plugin.pond_toggled": "Pond plugin toggled",
"settings.changed": "Instance setting changed",
"setup.preseeded": "Setup pre-seeded",
"setup.admin_created": "Setup: admin created",
"setup.smtp_stored": "Setup: SMTP stored",
"setup.completed": "Setup completed",
"auth.signup": "Sign-up",
"auth.email_verified": "E-mail verified",
"auth.login_failed": "Login failed",
"auth.login_succeeded": "Login",
"auth.password_reset": "Password reset",
"job.triggered": "Job triggered manually",
"backup.settings_changed": "Backup settings changed",
"backup.run_triggered": "Manual backup triggered",
"backup.restore_requested": "Backup restore requested",
"api.token_created": "API token created",
"api.token_revoked": "API token revoked",
"api.write": "Write via public API"
}
},
"storage": {
"title": "Storage",
"total": "Total usage: {{total}}",
"columns": {
"pond": "Pond",
"type": "Type",
"used": "Used"
},
"types": {
"personal": "personal",
"shared": "shared"
},
"empty": "No usage recorded yet."
},
"maintenance": {
"title": "Maintenance mode",
"body": "A backup is being restored. The instance is temporarily unavailable.",
"waiting": "Waiting for the instance to come back…",
"failed": "The restore failed: {{error}}",
"reload": "Reload"
}
}