dorfteich/packages/shared/i18n/en/mails.json
Claude Fable 5 52192eb05f
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
Backup mirror to BASEL: rsync of the sets after every successful run (#84)
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
2026-07-12 12:20:32 +02:00

65 lines
3.2 KiB
JSON

{
"common": {
"greeting": "Hello {{displayName}},",
"signoff": "Your Dorfteich",
"ignoreHint": "If you did not request this e-mail, you can safely ignore it."
},
"verifyEmail": {
"subject": "Confirm your e-mail address",
"body": "welcome to Dorfteich! Please confirm your e-mail address to activate your account:",
"action": "Confirm e-mail address",
"expiry": "The link is valid for 24 hours."
},
"resetPassword": {
"subject": "Reset your password",
"body": "someone (hopefully you) requested a password reset for your account. Use this link to set a new password:",
"action": "Set new password",
"expiry": "The link is valid for one hour. Your current password stays valid until you set a new one."
},
"smtpTest": {
"subject": "SMTP test message",
"body": "this test message confirms that your Dorfteich can send e-mail through the configured SMTP server. You can reach your instance here:",
"action": "Open Dorfteich",
"expiry": "You can simply delete this e-mail."
},
"backupFailed": {
"subject": "[{{instance}}] Backup failed ({{backupId}})",
"intro": "The nightly backup run on {{instance}} failed.",
"backupId": "Backup id: {{backupId}}",
"error": "Error: {{error}}",
"lastSuccess": "Last successful backup: {{finishedAt}}",
"lastSuccessNever": "Last successful backup: none yet",
"hint": "Check the sidecar logs (docker compose logs backup) and status.json on the backups volume."
},
"backupUploadFailed": {
"subject": "[{{instance}}] Backup upload to Nextcloud failed ({{backupId}})",
"intro": "The local backup on {{instance}} succeeded, but uploading it to the Nextcloud target failed.",
"backupId": "Backup id: {{backupId}}",
"error": "Error: {{error}}",
"lastSuccess": "Last successful upload: {{finishedAt}}",
"lastSuccessNever": "Last successful upload: none yet",
"hint": "Check the Nextcloud connection settings in the admin panel (test connection) and the sidecar logs (docker compose logs backup)."
},
"backupMirrorFailed": {
"subject": "[{{instance}}] Backup mirror to the private host failed",
"intro": "The local backup on {{instance}} succeeded, but mirroring the sets via rsync failed.",
"backupId": "Component: rsync mirror (issue #84)",
"error": "Error: {{error}}",
"lastSuccess": "Last successful mirror: {{finishedAt}}",
"lastSuccessNever": "Last successful mirror: none yet",
"hint": "Check the tunnel to the mirror host, the SSH key in the secrets volume, and the sidecar logs (docker compose logs backup). Setup: deploy/backup-basel.md."
},
"digest": {
"subject": "Dorfteich: {{count}} updates for you",
"intro": "Here is what happened on pages you watch ({{count}} updates):",
"changes_one": "{{count}} change",
"changes_other": "{{count}} changes",
"comments_one": "{{count}} comment",
"comments_other": "{{count}} comments",
"openApp": "Open Dorfteich: {{link}}",
"unsubscribe": "Stop these digest mails: {{link}}",
"unsubscribedTitle": "Digest mails disabled",
"unsubscribedBody": "You will no longer receive notification digests. You can re-enable them anytime in your account settings after signing in."
}
}