feat(admin): name a switched-off dump and a newly listed kit key plainly

A switched-off scheduled dump is attention now, sent once and never
reminded, with how to turn it back on (DB_BACKUP_ENABLED). Dumps are on
by default, so off is a choice that leaves no copy able to rebuild the
host. An install that never wrote a dump and has nowhere to write one
stays quiet.

The out-of-date kit notice says what changed: the kit now also lists a
key the last confirmation did not cover, for example API_TOKEN_HMAC_KEY
on an instance upgraded from the one-key step, and that nothing broke.

The French kit and readiness strings use vous, the form the rest of the
French bundle uses.
This commit is contained in:
Marc-André Bombeck committed 2026-10-25 14:09:41 +01:00
1 parent 726a73fcad
commit 0a053d6884
11 files changed
+77 -46

No files matched your search

+3 -3
View File
@@ -8605,7 +8605,7 @@
"stale": "Das Kit hat sich geändert, seit die Seite geladen wurde. Prüfe die Schlüssel, die es jetzt aufführt, und bestätige erneut.",
"confirmedAt": "Bestätigt am {date}.",
"confirmedAtBy": "Bestätigt am {date} von {who}.",
"dueAgain": "Das Kit wurde am {date} bestätigt, führt jetzt aber Schlüssel auf, die diese Bestätigung nicht abdeckt: {keys}."
"dueAgain": "Das Kit wurde am {date} bestätigt. Es führt jetzt auch {keys} auf, was diese Bestätigung nicht abgedeckt hat. Sichere von jedem eine Kopie und bestätige erneut."
},
"recoveryReadiness": {
"title": "Wiederherstellbarkeit",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "Diese Version legt keinen geplanten Datenbank-Dump an.",
"disabled": "Der geplante Datenbank-Dump ist ausgeschaltet.",
"disabled": "Der geplante Datenbank-Dump ist ausgeschaltet, daher kann keine Kopie diesen Server wieder aufbauen. Zum Wiedereinschalten DB_BACKUP_ENABLED entfernen oder auf true setzen und HealthLog neu starten.",
"unreadable": "Der Zustand des Datenbank-Dumps konnte nicht gelesen werden.",
"never_succeeded": "Noch kein Datenbank-Dump ist gelungen, und der letzte Versuch ist fehlgeschlagen.",
"never_ran": "In den {hours} Stunden, seit Dumps eingeschaltet sind, wurde kein Datenbank-Dump geschrieben.",
@@ -8682,7 +8682,7 @@
},
"recovery_kit": {
"confirmed": "Von jedem Schlüssel, den eine Wiederherstellung braucht, gibt es eine Kopie.",
"out_of_date": "Das Wiederherstellungs-Kit führt Schlüssel auf, für die niemand eine Kopie bestätigt hat: {keys}.",
"out_of_date": "Das Wiederherstellungs-Kit führt jetzt auch {keys} auf, was die letzte Bestätigung nicht abgedeckt hat. Nichts ist kaputt: Sichere eine Kopie und bestätige das Kit erneut.",
"no_admin": "Es gibt noch kein Admin-Konto.",
"not_confirmed": "Niemand hat eine Kopie der Schlüssel bestätigt, die eine Wiederherstellung braucht: {keys}.",
"not_confirmed_grace": "Sichere eine Kopie der Schlüssel, die eine Wiederherstellung braucht: {keys}."
+3 -3
View File
@@ -8605,7 +8605,7 @@
"stale": "The kit changed since this page loaded. Check the keys it lists now, then confirm again.",
"confirmedAt": "Confirmed on {date}.",
"confirmedAtBy": "Confirmed on {date} by {who}.",
"dueAgain": "The kit was confirmed on {date}, but it now lists keys that confirmation does not cover: {keys}."
"dueAgain": "The kit was confirmed on {date}. It now also lists {keys}, which that confirmation did not cover. Save a copy of each and confirm again."
},
"recoveryReadiness": {
"title": "Recovery readiness",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "This version does not schedule a database dump.",
"disabled": "The scheduled database dump is switched off.",
"disabled": "The scheduled database dump is switched off, so no copy can rebuild this server. To turn it back on, remove DB_BACKUP_ENABLED or set it to true, then restart HealthLog.",
"unreadable": "The status of the database dump could not be read.",
"never_succeeded": "No database dump has succeeded yet, and the last attempt failed.",
"never_ran": "No database dump has been written in the {hours} hours since dumps were switched on.",
@@ -8682,7 +8682,7 @@
},
"recovery_kit": {
"confirmed": "A copy of every key a restore needs is kept.",
"out_of_date": "The recovery kit lists keys nobody has confirmed a copy of: {keys}.",
"out_of_date": "The recovery kit now also lists {keys}, which the last confirmation did not cover. Nothing is broken: save a copy and confirm the kit again.",
"no_admin": "There is no admin account yet.",
"not_confirmed": "Nobody has confirmed a copy of the keys a restore needs: {keys}.",
"not_confirmed_grace": "Save a copy of the keys a restore needs: {keys}."
+3 -3
View File
@@ -8605,7 +8605,7 @@
"stale": "El kit cambió desde que se cargó esta página. Revisa las claves que muestra ahora y vuelve a confirmar.",
"confirmedAt": "Confirmado el {date}.",
"confirmedAtBy": "Confirmado el {date} por {who}.",
"dueAgain": "El kit se confirmó el {date}, pero ahora muestra claves que esa confirmación no cubre: {keys}."
"dueAgain": "El kit se confirmó el {date}. Ahora también incluye {keys}, que esa confirmación no cubría. Guarda una copia de cada una y vuelve a confirmar."
},
"recoveryReadiness": {
"title": "Preparación para la recuperación",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "Esta versión no programa un volcado de la base de datos.",
"disabled": "El volcado programado de la base de datos está desactivado.",
"disabled": "El volcado programado de la base de datos está desactivado, así que ninguna copia puede reconstruir este servidor. Para volver a activarlo, quita DB_BACKUP_ENABLED o ponlo en true y reinicia HealthLog.",
"unreadable": "No se pudo leer el estado del volcado de la base de datos.",
"never_succeeded": "Ningún volcado de la base de datos ha salido bien todavía, y el último intento falló.",
"never_ran": "No se ha escrito ningún volcado de la base de datos en las {hours} horas transcurridas desde que se activaron los volcados.",
@@ -8682,7 +8682,7 @@
},
"recovery_kit": {
"confirmed": "Se guarda una copia de cada clave que necesita una restauración.",
"out_of_date": "El kit de recuperación muestra claves de las que nadie ha confirmado una copia: {keys}.",
"out_of_date": "El kit de recuperación ahora también incluye {keys}, que la última confirmación no cubría. No hay nada roto: guarda una copia y vuelve a confirmar el kit.",
"no_admin": "Todavía no hay ninguna cuenta de administrador.",
"not_confirmed": "Nadie ha confirmado una copia de las claves que necesita una restauración: {keys}.",
"not_confirmed_grace": "Guarda una copia de las claves que necesita una restauración: {keys}."
+19 -19
View File
@@ -781,7 +781,7 @@
"quickAddSymptom": "Noter un symptôme",
"todayCardVisible": "Afficher la carte du haut",
"recoveryKitBanner": {
"title": "Sauvegarde ton kit de récupération",
"title": "Sauvegardez votre kit de récupération",
"body": "Sans copies des clés utilisées par ce serveur, ses données ne peuvent pas être récupérées après une réinstallation. Ça prend quelques minutes.",
"action": "Ouvrir le kit"
}
@@ -8540,7 +8540,7 @@
"recoveryKit": {
"title": "Kit de récupération",
"description": "Chaque clé nécessaire à la restauration de ce serveur, avec son ID et son empreinte.",
"intro": "Garde une copie de chaque clé ci-dessous en dehors de ce serveur, par exemple dans un gestionnaire de mots de passe. Sans elles, ni un dump de la base de données ni une copie de sauvegarde ne peuvent être relus, et HealthLog refuse de démarrer s'il manque une clé dont il a besoin.",
"intro": "Gardez une copie de chaque clé ci-dessous en dehors de ce serveur, par exemple dans un gestionnaire de mots de passe. Sans elles, ni un dump de la base de données ni une copie de sauvegarde ne peuvent être relus, et HealthLog refuse de démarrer s'il manque une clé dont il a besoin.",
"loading": "Chargement du kit de récupération…",
"loadError": "Impossible de charger le kit de récupération.",
"badgeDue": "À faire",
@@ -8571,41 +8571,41 @@
"notConfigured": "Absente de ce serveur",
"unreadable": "Clé non valide"
},
"notConfiguredHint": "Une sauvegarde a encore besoin de cette clé et ce serveur ne l'a pas. Seule une copie que tu conserves ailleurs peut lire ces sauvegardes. Confirme le kit une fois que tu as cette copie.",
"unreadableHint": "La variable est définie mais ne contient pas de clé valide. Corrige-la avant de te fier aux copies hors hôte.",
"fingerprintHint": "L'empreinte correspond aux 12 premiers caractères du hachage SHA-256 d'une clé. Elle identifie la clé sans la révéler, pour que tu puisses la comparer à ta copie.",
"notConfiguredHint": "Une sauvegarde a encore besoin de cette clé et ce serveur ne l'a pas. Seule une copie que vous conservez ailleurs peut lire ces sauvegardes. Confirmez le kit une fois que vous avez cette copie.",
"unreadableHint": "La variable est définie mais ne contient pas de clé valide. Corrigez-la avant de vous fier aux copies hors hôte.",
"fingerprintHint": "L'empreinte correspond aux 12 premiers caractères du hachage SHA-256 d'une clé. Elle identifie la clé sans la révéler, pour que vous puissiez la comparer à votre copie.",
"whereTitle": "Où les clés sont définies",
"platform": {
"composeLabel": "Compose",
"composeWhere": "Les clés se trouvent dans le fichier .env à côté de docker-compose.yml : ENCRYPTION_KEY ou ENCRYPTION_KEYS, API_TOKEN_HMAC_KEY et, avec les copies hors hôte, BACKUP_ENCRYPTION_KEY.",
"truenasLabel": "TrueNAS",
"truenasWhere": "Ouvre Apps, sélectionne HealthLog et choisis Edit. Les clés se trouvent sous HealthLog Configuration ; pour une app installée via YAML, ce sont ENCRYPTION_KEY, API_TOKEN_HMAC_KEY et BACKUP_ENCRYPTION_KEY dans les paramètres d'environnement.",
"truenasWhere": "Ouvrez Apps, sélectionnez HealthLog et choisissez Edit. Les clés se trouvent sous HealthLog Configuration ; pour une app installée via YAML, ce sont ENCRYPTION_KEY, API_TOKEN_HMAC_KEY et BACKUP_ENCRYPTION_KEY dans les paramètres d'environnement.",
"coolifyLabel": "Coolify",
"coolifyWhere": "Ouvre l'application dans Coolify et copie ENCRYPTION_KEY, API_TOKEN_HMAC_KEY et BACKUP_ENCRYPTION_KEY depuis ses Environment Variables.",
"coolifyWhere": "Ouvrez l'application dans Coolify et copiez ENCRYPTION_KEY, API_TOKEN_HMAC_KEY et BACKUP_ENCRYPTION_KEY depuis ses Environment Variables.",
"unraidLabel": "Unraid",
"unraidWhere": "Dans l'onglet Docker, modifie le conteneur HealthLog et copie ENCRYPTION_KEY, API_TOKEN_HMAC_KEY et BACKUP_ENCRYPTION_KEY depuis le modèle, ou depuis le .env de ta pile Compose Manager.",
"unraidWhere": "Dans l'onglet Docker, modifiez le conteneur HealthLog et copiez ENCRYPTION_KEY, API_TOKEN_HMAC_KEY et BACKUP_ENCRYPTION_KEY depuis le modèle, ou depuis le .env de votre pile Compose Manager.",
"portainerLabel": "Portainer",
"portainerWhere": "Ouvre la pile HealthLog dans Portainer et copie ENCRYPTION_KEY, API_TOKEN_HMAC_KEY et BACKUP_ENCRYPTION_KEY depuis ses variables d'environnement."
"portainerWhere": "Ouvrez la pile HealthLog dans Portainer et copiez ENCRYPTION_KEY, API_TOKEN_HMAC_KEY et BACKUP_ENCRYPTION_KEY depuis ses variables d'environnement."
},
"restoreTitle": "Restaurer ce serveur",
"restoreBody": "Installe HealthLog avec les mêmes clés, restaure le dump de la base de données le plus récent dans une base vide, puis démarre l'app. Le guide détaille chaque étape.",
"restoreBody": "Installez HealthLog avec les mêmes clés, restaurez le dump de la base de données le plus récent dans une base vide, puis démarrez l'app. Le guide détaille chaque étape.",
"restoreLink": "Guide de reprise après sinistre",
"checkLabel": "Vérifier ma copie",
"checkKeyLabel": "Clé à vérifier",
"checkValueLabel": "Ta copie de la clé",
"checkValueLabel": "Votre copie de la clé",
"checkButton": "Vérifier",
"checkNote": "La clé collée est comparée à celle que détient ce serveur puis oubliée. Elle n'est jamais stockée ni journalisée.",
"checkInsecureNote": "Cette page n'est pas servie en https://, donc la clé collée traverse le réseau en clair, comme ton mot de passe. Elle est comparée puis oubliée, jamais stockée ni journalisée.",
"checkMatches": "Ta copie correspond à cette clé.",
"checkNoMatch": "Ta copie ne correspond pas à cette clé. Vérifie que tu as copié toute la valeur.",
"checkInsecureNote": "Cette page n'est pas servie en https://, donc la clé collée traverse le réseau en clair, comme votre mot de passe. Elle est comparée puis oubliée, jamais stockée ni journalisée.",
"checkMatches": "Votre copie correspond à cette clé.",
"checkNoMatch": "Votre copie ne correspond pas à cette clé. Vérifiez que vous avez copié toute la valeur.",
"checkFailed": "La vérification a échoué.",
"confirmButton": "J'ai une copie de chaque clé",
"confirmed": "Kit de récupération confirmé.",
"confirmFailed": "Impossible d'enregistrer la confirmation.",
"stale": "Le kit a changé depuis le chargement de cette page. Vérifie les clés qu'il liste maintenant, puis confirme à nouveau.",
"stale": "Le kit a changé depuis le chargement de cette page. Vérifiez les clés qu'il liste maintenant, puis confirmez à nouveau.",
"confirmedAt": "Confirmé le {date}.",
"confirmedAtBy": "Confirmé le {date} par {who}.",
"dueAgain": "Le kit a été confirmé le {date}, mais il liste maintenant des clés que cette confirmation ne couvre pas : {keys}."
"dueAgain": "Le kit a été confirmé le {date}. Il liste désormais aussi {keys}, que cette confirmation ne couvrait pas. Sauvegardez une copie de chacune et confirmez à nouveau."
},
"recoveryReadiness": {
"title": "Capacité de restauration",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "Cette version ne planifie pas de dump de la base de données.",
"disabled": "Le dump planifié de la base de données est désactivé.",
"disabled": "Le dump planifié de la base de données est désactivé, donc aucune copie ne peut reconstruire ce serveur. Pour le réactiver, supprimez DB_BACKUP_ENABLED ou mettez-le à true, puis redémarrez HealthLog.",
"unreadable": "L'état du dump de la base de données n'a pas pu être lu.",
"never_succeeded": "Aucun dump de la base de données n'a encore réussi, et la dernière tentative a échoué.",
"never_ran": "Aucun dump de la base de données n'a été écrit dans les {hours} heures écoulées depuis l'activation des dumps.",
@@ -8682,10 +8682,10 @@
},
"recovery_kit": {
"confirmed": "Une copie de chaque clé nécessaire à une restauration est conservée.",
"out_of_date": "Le kit de récupération liste des clés dont personne n'a confirmé de copie : {keys}.",
"out_of_date": "Le kit de récupération liste désormais aussi {keys}, que la dernière confirmation ne couvrait pas. Rien n'est cassé : sauvegardez une copie et confirmez à nouveau le kit.",
"no_admin": "Il n'y a pas encore de compte administrateur.",
"not_confirmed": "Personne n'a confirmé de copie des clés nécessaires à une restauration : {keys}.",
"not_confirmed_grace": "Sauvegarde une copie des clés nécessaires à une restauration : {keys}."
"not_confirmed_grace": "Sauvegardez une copie des clés nécessaires à une restauration : {keys}."
}
},
"recovered": {
+3 -3
View File
@@ -8605,7 +8605,7 @@
"stale": "Il kit è cambiato da quando questa pagina è stata caricata. Controlla le chiavi che elenca ora, poi conferma di nuovo.",
"confirmedAt": "Confermato il {date}.",
"confirmedAtBy": "Confermato il {date} da {who}.",
"dueAgain": "Il kit è stato confermato il {date}, ma ora elenca chiavi che quella conferma non copre: {keys}."
"dueAgain": "Il kit è stato confermato il {date}. Ora elenca anche {keys}, che quella conferma non copriva. Salva una copia di ciascuna e conferma di nuovo."
},
"recoveryReadiness": {
"title": "Preparazione al ripristino",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "Questa versione non pianifica un dump del database.",
"disabled": "Il dump pianificato del database è disattivato.",
"disabled": "Il dump pianificato del database è disattivato, quindi nessuna copia può ricostruire questo server. Per riattivarlo, rimuovi DB_BACKUP_ENABLED o impostalo su true, poi riavvia HealthLog.",
"unreadable": "Non è stato possibile leggere lo stato del dump del database.",
"never_succeeded": "Nessun dump del database è ancora riuscito, e l'ultimo tentativo non è andato a buon fine.",
"never_ran": "Nelle {hours} ore trascorse da quando i dump sono stati attivati non è stato scritto alcun dump del database.",
@@ -8682,7 +8682,7 @@
},
"recovery_kit": {
"confirmed": "Esiste una copia di ogni chiave necessaria per un ripristino.",
"out_of_date": "Il kit di recupero elenca chiavi di cui nessuno ha confermato una copia: {keys}.",
"out_of_date": "Il kit di ripristino ora elenca anche {keys}, che l'ultima conferma non copriva. Non c'è nulla di rotto: salva una copia e conferma di nuovo il kit.",
"no_admin": "Non esiste ancora un account amministratore.",
"not_confirmed": "Nessuno ha confermato una copia delle chiavi necessarie per un ripristino: {keys}.",
"not_confirmed_grace": "Salva una copia delle chiavi necessarie per un ripristino: {keys}."
+3 -3
View File
@@ -8605,7 +8605,7 @@
"stale": "이 페이지를 연 뒤 키트가 바뀌었습니다. 지금 표시된 키를 확인한 뒤 다시 확인하세요.",
"confirmedAt": "{date}에 확인됨.",
"confirmedAtBy": "{date}에 {who}님이 확인함.",
"dueAgain": "키트는 {date}에 확인되었지만 지금은 그 확인에 포함되지 않은 키가 있습니다: {keys}."
"dueAgain": "키트는 {date}에 확인되었습니다. 이제 {keys}도 포함되며, 그 확인은 이를 다루지 않았습니다. 각각의 사본을 저장하고 다시 확인하십시오."
},
"recoveryReadiness": {
"title": "복구 준비 상태",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "이 버전은 데이터베이스 덤프를 예약하지 않습니다.",
"disabled": "예약된 데이터베이스 덤프가 꺼져 있습니다.",
"disabled": "예약된 데이터베이스 덤프가 꺼져 있어 이 서버를 다시 구축할 수 있는 사본이 없습니다. 다시 켜려면 DB_BACKUP_ENABLED를 제거하거나 true로 설정한 뒤 HealthLog를 다시 시작하십시오.",
"unreadable": "데이터베이스 덤프 상태를 읽지 못했습니다.",
"never_succeeded": "아직 성공한 데이터베이스 덤프가 없으며 마지막 시도도 실패했습니다.",
"never_ran": "덤프를 켠 뒤 {hours}시간 동안 데이터베이스 덤프가 기록되지 않았습니다.",
@@ -8682,7 +8682,7 @@
},
"recovery_kit": {
"confirmed": "복원에 필요한 모든 키의 사본이 보관되어 있습니다.",
"out_of_date": "복구 키트에 아무도 사본을 확인하지 않은 키가 있습니다: {keys}.",
"out_of_date": "복구 키트에 이제 {keys}도 포함되며, 마지막 확인은 이를 다루지 않았습니다. 고장 난 것은 없습니다. 사본을 저장하고 키트를 다시 확인하십시오.",
"no_admin": "아직 관리자 계정이 없습니다.",
"not_confirmed": "복원에 필요한 키의 사본을 아무도 확인하지 않았습니다: {keys}.",
"not_confirmed_grace": "복원에 필요한 키의 사본을 보관하세요: {keys}."
+3 -3
View File
@@ -8605,7 +8605,7 @@
"stale": "De kit is gewijzigd sinds deze pagina is geladen. Controleer de sleutels die er nu in staan en bevestig daarna opnieuw.",
"confirmedAt": "Bevestigd op {date}.",
"confirmedAtBy": "Bevestigd op {date} door {who}.",
"dueAgain": "De kit is bevestigd op {date}, maar bevat nu sleutels die niet onder die bevestiging vallen: {keys}."
"dueAgain": "De kit is bevestigd op {date}. Hij vermeldt nu ook {keys}, die die bevestiging niet dekte. Bewaar van elk een kopie en bevestig opnieuw."
},
"recoveryReadiness": {
"title": "Herstelbaarheid",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "Deze versie plant geen databasedump in.",
"disabled": "De geplande databasedump is uitgeschakeld.",
"disabled": "De geplande databasedump staat uit, dus geen enkele kopie kan deze server opnieuw opbouwen. Verwijder DB_BACKUP_ENABLED of zet het op true en herstart HealthLog om hem weer aan te zetten.",
"unreadable": "De status van de databasedump kon niet worden gelezen.",
"never_succeeded": "Er is nog geen databasedump gelukt, en de laatste poging is mislukt.",
"never_ran": "In de {hours} uur sinds dumps zijn ingeschakeld, is er geen databasedump geschreven.",
@@ -8682,7 +8682,7 @@
},
"recovery_kit": {
"confirmed": "Van elke sleutel die een herstel nodig heeft, wordt een kopie bewaard.",
"out_of_date": "De herstelkit bevat sleutels waarvan niemand een kopie heeft bevestigd: {keys}.",
"out_of_date": "De herstelkit vermeldt nu ook {keys}, die de laatste bevestiging niet dekte. Er is niets kapot: bewaar een kopie en bevestig de kit opnieuw.",
"no_admin": "Er is nog geen beheerdersaccount.",
"not_confirmed": "Niemand heeft een kopie bevestigd van de sleutels die een herstel nodig heeft: {keys}.",
"not_confirmed_grace": "Bewaar een kopie van de sleutels die een herstel nodig heeft: {keys}."
+3 -3
View File
@@ -8605,7 +8605,7 @@
"stale": "Zestaw zmienił się od wczytania tej strony. Sprawdź klucze, które teraz wymienia, a potem potwierdź ponownie.",
"confirmedAt": "Potwierdzono {date}.",
"confirmedAtBy": "Potwierdzono {date}, potwierdził(a): {who}.",
"dueAgain": "Zestaw potwierdzono {date}, ale teraz wymienia klucze, których to potwierdzenie nie obejmuje: {keys}."
"dueAgain": "Zestaw potwierdzono {date}. Zawiera teraz także {keys}, czego to potwierdzenie nie obejmowało. Zapisz kopię każdego i potwierdź ponownie."
},
"recoveryReadiness": {
"title": "Gotowość do odzyskiwania",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "Ta wersja nie planuje zrzutu bazy danych.",
"disabled": "Zaplanowany zrzut bazy danych jest wyłączony.",
"disabled": "Zaplanowany zrzut bazy danych jest wyłączony, więc żadna kopia nie odtworzy tego serwera. Aby go włączyć, usuń DB_BACKUP_ENABLED lub ustaw na true i uruchom HealthLog ponownie.",
"unreadable": "Nie udało się odczytać stanu zrzutu bazy danych.",
"never_succeeded": "Żaden zrzut bazy danych jeszcze się nie udał, a ostatnia próba zakończyła się błędem.",
"never_ran": "Od włączenia zrzutów minęło {hours} h, a nie zapisano żadnego zrzutu bazy danych.",
@@ -8682,7 +8682,7 @@
},
"recovery_kit": {
"confirmed": "Istnieje kopia każdego klucza potrzebnego do przywrócenia.",
"out_of_date": "Zestaw odzyskiwania wymienia klucze, których kopii nikt nie potwierdził: {keys}.",
"out_of_date": "Zestaw odzyskiwania zawiera teraz także {keys}, czego ostatnie potwierdzenie nie obejmowało. Nic się nie zepsuło: zapisz kopię i potwierdź zestaw ponownie.",
"no_admin": "Nie ma jeszcze konta administratora.",
"not_confirmed": "Nikt nie potwierdził kopii kluczy potrzebnych do przywrócenia: {keys}.",
"not_confirmed_grace": "Zapisz kopię kluczy potrzebnych do przywrócenia: {keys}."
+3 -3
View File
@@ -8605,7 +8605,7 @@
"stale": "O kit mudou desde que esta página carregou. Verifique as chaves que ele lista agora e confirme novamente.",
"confirmedAt": "Confirmado em {date}.",
"confirmedAtBy": "Confirmado em {date} por {who}.",
"dueAgain": "O kit foi confirmado em {date}, mas agora lista chaves que essa confirmação não cobre: {keys}."
"dueAgain": "O kit foi confirmado em {date}. Agora ele também lista {keys}, que essa confirmação não cobria. Guarde uma cópia de cada uma e confirme de novo."
},
"recoveryReadiness": {
"title": "Prontidão para recuperação",
@@ -8644,7 +8644,7 @@
"reason": {
"database_dump": {
"not_available": "Esta versão não agenda um dump do banco de dados.",
"disabled": "O dump agendado do banco de dados está desativado.",
"disabled": "O dump agendado do banco de dados está desligado, então nenhuma cópia consegue reconstruir este servidor. Para religá-lo, remova DB_BACKUP_ENABLED ou defina-o como true e reinicie o HealthLog.",
"unreadable": "Não foi possível ler o status do dump do banco de dados.",
"never_succeeded": "Nenhum dump do banco de dados foi concluído com sucesso ainda, e a última tentativa falhou.",
"never_ran": "Nenhum dump do banco de dados foi gravado nas {hours} horas desde que os dumps foram ativados.",
@@ -8682,7 +8682,7 @@
},
"recovery_kit": {
"confirmed": "Há uma cópia guardada de cada chave de que uma restauração precisa.",
"out_of_date": "O kit de recuperação lista chaves das quais ninguém confirmou uma cópia: {keys}.",
"out_of_date": "O kit de recuperação agora também lista {keys}, que a última confirmação não cobria. Nada quebrou: guarde uma cópia e confirme o kit de novo.",
"no_admin": "Ainda não há uma conta de administrador.",
"not_confirmed": "Ninguém confirmou uma cópia das chaves de que uma restauração precisa: {keys}.",
"not_confirmed_grace": "Guarde uma cópia das chaves de que uma restauração precisa: {keys}."
@@ -92,15 +92,35 @@ describe("database dump", () => {
const evalDump = (d: ReadinessInputs["dump"], watched: Date | null = null) =>
evaluateDatabaseDump({ now: NOW, dump: d, dumpWatchedSince: watched });
it("does not apply while no dump is scheduled, or while it is switched off", () => {
it("does not apply while no dump is scheduled", () => {
expect(evalDump(null)).toMatchObject({
state: "inactive",
reason: "not_available",
});
});
it("calls a switched-off dump attention, once, unless it could never write one", () => {
expect(evalDump(dump({ enabled: false }))).toMatchObject({
state: "inactive",
state: "attention",
reason: "disabled",
});
// Never ran, but a bucket could take it: still a choice worth naming.
expect(
evalDump(
dump({
enabled: false,
lastGoodAt: null,
localDirWritable: false,
offhostConfigured: true,
}),
).state,
).toBe("attention");
// Never ran and nowhere to write: switched off what it could not do.
expect(
evalDump(
dump({ enabled: false, lastGoodAt: null, localDirWritable: false }),
),
).toMatchObject({ state: "inactive", reason: "disabled" });
});
it("fails when its status cannot be read", () => {
+12 -1
View File
@@ -177,8 +177,19 @@ export function evaluateDatabaseDump(
const id = "database_dump";
if (dump === null) return signal(id, "inactive", "not_available", null);
if (dump === "unreadable") return signal(id, "failing", "unreadable", null);
if (!dump.enabled) return signal(id, "inactive", "disabled", null);
const lastGoodAt = dump.lastGood ? new Date(dump.lastGood.at) : null;
if (!dump.enabled) {
// Dumps are on by default, so off is a choice someone made, and it
// leaves no copy that rebuilds the host: worth one notice. An install
// that never wrote a dump and has nowhere to write one (no writable
// directory, no bucket) switched off what it could not do, which is not
// news.
const neverUsed = dump.lastGood === null && dump.lastFailure === null;
const cannotWrite = !dump.localDirWritable && !dump.offhostConfigured;
return neverUsed && cannotWrite
? signal(id, "inactive", "disabled", null)
: signal(id, "attention", "disabled", lastGoodAt);
}
const lastFailureAt = dump.lastFailure ? new Date(dump.lastFailure.at) : null;
const failureReason = dump.lastFailure?.error ?? null;
// A directory this process cannot write is a valid setup when the dumps go